1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* 2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 32bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Apple Inc. All rights reserved. 4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without 6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met: 8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions of source code must retain the above copyright 10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer. 11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions in binary form must reproduce the above 12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer 13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the 14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution. 15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Neither the name of Google Inc. nor the names of its 16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from 17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission. 18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */ 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h" 33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameLoaderClientImpl.h" 34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "BackForwardListChromium.h" 36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Chrome.h" 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Document.h" 38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "DocumentLoader.h" 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FormState.h" 40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameLoader.h" 41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameLoadRequest.h" 425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "FrameNetworkingContextImpl.h" 43f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "FrameView.h" 44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTTPParsers.h" 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HistoryItem.h" 46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HitTestResult.h" 47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLAppletElement.h" 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLFormElement.h" // needed by FormState.h 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLNames.h" 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "MIMETypeRegistry.h" 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "MouseEvent.h" 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Page.h" 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PlatformString.h" 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PluginData.h" 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PluginDataChromium.h" 566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "ProgressTracker.h" 57f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "Settings.h" 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "StringExtras.h" 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebDataSourceImpl.h" 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebDevToolsAgentPrivate.h" 61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFormElement.h" 62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFrameClient.h" 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFrameImpl.h" 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebKit.h" 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebKitClient.h" 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebMimeRegistry.h" 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebNode.h" 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebPlugin.h" 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebPluginContainerImpl.h" 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebPluginLoadObserver.h" 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebPluginParams.h" 72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebSecurityOrigin.h" 73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURL.h" 74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURLError.h" 75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebVector.h" 76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebViewClient.h" 77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebViewImpl.h" 78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WindowFeatures.h" 79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WrappedResourceRequest.h" 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WrappedResourceResponse.h" 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h> 82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WebCore; 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit { 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Domain for internal error codes. 88643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic const char internalErrorDomain[] = "WebKit"; 89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// An internal error code. Used to note a policy change error resulting from 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDecidePolicyForMIMEType not passing the PolicyUse option. 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockenum { 93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PolicyChangeError = -10000, 94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}; 95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 96643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockFrameLoaderClientImpl::FrameLoaderClientImpl(WebFrameImpl* frame) 97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : m_webFrame(frame) 98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_hasRepresentation(false) 99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_sentInitialResponseToPlugin(false) 100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_nextNavigationPolicy(WebNavigationPolicyIgnore) 101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 104643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockFrameLoaderClientImpl::~FrameLoaderClientImpl() 105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::frameLoaderDestroyed() 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // When the WebFrame was created, it had an extra reference given to it on 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // behalf of the Frame. Since the WebFrame owns us, this extra ref also 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // serves to keep us alive until the FrameLoader is done with us. The 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FrameLoader calls this method when it's going away. Therefore, we balance 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // out that extra reference, which may cause 'this' to be deleted. 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->closing(); 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->deref(); 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 119643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld*) 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didClearWindowObject(m_webFrame); 123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebViewImpl* webview = m_webFrame->viewImpl(); 125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (webview->devToolsAgentPrivate()) 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webview->devToolsAgentPrivate()->didClearWindowObject(m_webFrame); 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 129643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::documentElementAvailable() 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didCreateDocumentElement(m_webFrame); 133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 135643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::didCreateScriptContextForFrame() 136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didCreateScriptContext(m_webFrame); 139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::didDestroyScriptContextForFrame() 142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didDestroyScriptContext(m_webFrame); 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 147643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::didCreateIsolatedScriptContext() 148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didCreateIsolatedScriptContext(m_webFrame); 151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool FrameLoaderClientImpl::allowScriptExtension(const String& extensionName, 154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen int extensionGroup) 155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 156bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (m_webFrame->client()) 157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return m_webFrame->client()->allowScriptExtension(m_webFrame, extensionName, extensionGroup); 158bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return false; 159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 161643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::didPerformFirstNavigation() const 162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 165643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::registerForIconNotification(bool) 166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 167643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::didChangeScrollOffset() 170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didChangeScrollOffset(m_webFrame); 173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 175643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::allowJavaScript(bool enabledPerSettings) 176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_webFrame->client()->allowScript(m_webFrame, enabledPerSettings); 179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return enabledPerSettings; 181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 183d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool FrameLoaderClientImpl::allowPlugins(bool enabledPerSettings) 184d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 185d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_webFrame->client()) 186d0825bca7fe65beaee391d30da42e937db621564Steve Block return m_webFrame->client()->allowPlugins(m_webFrame, enabledPerSettings); 187d0825bca7fe65beaee391d30da42e937db621564Steve Block 188d0825bca7fe65beaee391d30da42e937db621564Steve Block return enabledPerSettings; 189d0825bca7fe65beaee391d30da42e937db621564Steve Block} 190d0825bca7fe65beaee391d30da42e937db621564Steve Block 191d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool FrameLoaderClientImpl::allowImages(bool enabledPerSettings) 192d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 193d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_webFrame->client()) 194d0825bca7fe65beaee391d30da42e937db621564Steve Block return m_webFrame->client()->allowImages(m_webFrame, enabledPerSettings); 195d0825bca7fe65beaee391d30da42e937db621564Steve Block 196d0825bca7fe65beaee391d30da42e937db621564Steve Block return enabledPerSettings; 197d0825bca7fe65beaee391d30da42e937db621564Steve Block} 198d0825bca7fe65beaee391d30da42e937db621564Steve Block 199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoaderClientImpl::didNotAllowScript() 200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_webFrame->client()) 202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webFrame->client()->didNotAllowScript(m_webFrame); 203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoaderClientImpl::didNotAllowPlugins() 206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_webFrame->client()) 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webFrame->client()->didNotAllowPlugins(m_webFrame); 209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 211643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::hasWebView() const 212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_webFrame->viewImpl(); 214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 216643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::hasFrameView() const 217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The Mac port has this notion of a WebFrameView, which seems to be 219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // some wrapper around an NSView. Since our equivalent is HWND, I guess 220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we have a "frameview" whenever we have the toplevel HWND. 221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_webFrame->viewImpl(); 222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 224643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::makeDocumentView() 225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->createFrameView(); 227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 229643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::makeRepresentation(DocumentLoader*) 230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_hasRepresentation = true; 232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 234643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::forceLayout() 235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 239643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::forceLayoutForNonHTML() 240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 244643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::setCopiesOnScroll() 245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 249643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::detachedFromParent2() 250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Nothing to do here. 252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 254643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::detachedFromParent3() 255643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 256643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Close down the proxy. The purpose of this change is to make the 257643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // call to ScriptController::clearWindowShell a no-op when called from 258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Frame::pageDestroyed. Without this change, this call to clearWindowShell 259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // will cause a crash. If you remove/modify this, just ensure that you can 260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // go to a page and then navigate to a new page without getting any asserts 261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // or crashes. 262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->frame()->script()->proxy()->clearForClose(); 263f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 264f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Alert the client that the frame is being detached. This is the last 265f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // chance we have to communicate with the client. 266f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (m_webFrame->client()) 267f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_webFrame->client()->frameDetached(m_webFrame); 268f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Stop communicating with the WebFrameClient at this point since we are no 270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // longer associated with the Page. 271692e5dbf12901edacf14812a6fae25462920af42Steve Block m_webFrame->setClient(0); 272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// This function is responsible for associating the |identifier| with a given 275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// subresource load. The following functions that accept an |identifier| are 276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// called for each subresource, so they should not be dispatched to the 277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebFrame. 278643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::assignIdentifierToInitialRequest( 279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block unsigned long identifier, DocumentLoader* loader, 280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest& request) 281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceRequest webreq(request); 284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->assignIdentifierToRequest( 285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, identifier, webreq); 286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// If the request being loaded by |loader| is a frame, update the ResourceType. 290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// A subresource in this context is anything other than a frame -- 291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// this includes images and xmlhttp requests. It is important to note that a 292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// subresource is NOT limited to stuff loaded through the frame's subresource 293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// loader. Synchronous xmlhttp requests for example, do not go through the 29428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu// subresource loader, but we still label them as TargetIsSubresource. 295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// The important edge cases to consider when modifying this function are 297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// how synchronous resource loads are treated during load/unload threshold. 298643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void setTargetTypeFromLoader(ResourceRequest& request, DocumentLoader* loader) 299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (loader == loader->frameLoader()->provisionalDocumentLoader()) { 301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceRequest::TargetType type; 302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (loader->frameLoader()->isLoadingMainFrame()) 303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block type = ResourceRequest::TargetIsMainFrame; 304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else 305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block type = ResourceRequest::TargetIsSubframe; 306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setTargetType(type); 307643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 310643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchWillSendRequest( 311643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DocumentLoader* loader, unsigned long identifier, ResourceRequest& request, 312643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceResponse& redirectResponse) 313643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 314643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (loader) { 315643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // We want to distinguish between a request for a document to be loaded into 316643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // the main frame, a sub-frame, or the sub-objects in that document. 317643ca7872b450ea4efacab6188849e5aac2ba161Steve Block setTargetTypeFromLoader(request, loader); 318643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 319643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Avoid repeating a form submission when navigating back or forward. 320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (loader == loader->frameLoader()->provisionalDocumentLoader() 321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block && request.httpMethod() == "POST" 322643ca7872b450ea4efacab6188849e5aac2ba161Steve Block && isBackForwardLoadType(loader->frameLoader()->loadType())) 323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReturnCacheDataDontLoad); 324643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 325643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FrameLoader::loadEmptyDocumentSynchronously() creates an empty document 327643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // with no URL. We don't like that, so we'll rename it to about:blank. 328643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (request.url().isEmpty()) 329643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setURL(KURL(ParsedURLString, "about:blank")); 330643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (request.firstPartyForCookies().isEmpty()) 331643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setFirstPartyForCookies(KURL(ParsedURLString, "about:blank")); 332643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 333643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Give the WebFrameClient a crack at the request. 334643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 335643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceRequest webreq(request); 336643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceResponse webresp(redirectResponse); 337643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->willSendRequest( 338643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, identifier, webreq, webresp); 339643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 340643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 341643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 342643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::shouldUseCredentialStorage( 343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DocumentLoader*, unsigned long identifier) 344643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 346643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Intended to pass through to a method on the resource load delegate. 347643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If implemented, that method controls whether the browser should ask the 348643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // networking layer for a stored default credential for the page (say from 349643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // the Mac OS keychain). If the method returns false, the user should be 350643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // presented with an authentication challenge whether or not the networking 351643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // layer has a credential stored. 352643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This returns true for backward compatibility: the ability to override the 353643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // system credential store is new. (Actually, not yet fully implemented in 354643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // WebKit, as of this writing.) 355643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return true; 356643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 357643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 358643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidReceiveAuthenticationChallenge( 359643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&) 360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 361643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 362643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 363643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 364643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidCancelAuthenticationChallenge( 365643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DocumentLoader*, unsigned long identifier, const AuthenticationChallenge&) 366643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 367643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 368643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 369643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 370643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidReceiveResponse(DocumentLoader* loader, 371643ca7872b450ea4efacab6188849e5aac2ba161Steve Block unsigned long identifier, 372643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceResponse& response) 373643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 374643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 375643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceResponse webresp(response); 376643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didReceiveResponse(m_webFrame, identifier, webresp); 377643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 378643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 379643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 380643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidReceiveContentLength( 381643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DocumentLoader* loader, 382643ca7872b450ea4efacab6188849e5aac2ba161Steve Block unsigned long identifier, 3832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int dataLength) 384643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 385643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 386643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 387643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Called when a particular resource load completes 388643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidFinishLoading(DocumentLoader* loader, 389643ca7872b450ea4efacab6188849e5aac2ba161Steve Block unsigned long identifier) 390643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 391643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 392643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didFinishResourceLoad(m_webFrame, identifier); 393643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 394643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 395643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidFailLoading(DocumentLoader* loader, 396643ca7872b450ea4efacab6188849e5aac2ba161Steve Block unsigned long identifier, 397643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceError& error) 398643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 399643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 400643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didFailResourceLoad(m_webFrame, identifier, error); 401643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 403643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidFinishDocumentLoad() 404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 405643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // A frame may be reused. This call ensures we don't hold on to our password 406643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // listeners and their associated HTMLInputElements. 407643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->clearPasswordListeners(); 408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 409643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 410643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didFinishDocumentLoad(m_webFrame); 411643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 412643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 413643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::dispatchDidLoadResourceFromMemoryCache( 414643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DocumentLoader* loader, 415643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest& request, 416643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceResponse& response, 417643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int length) 418643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 419643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 420643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceRequest webreq(request); 421643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceResponse webresp(response); 422643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didLoadResourceFromMemoryCache( 423643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, webreq, webresp); 424643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 425643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; // Do not suppress remaining notifications 426643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 427643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 428643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidHandleOnloadEvents() 429643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 430643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 431643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didHandleOnloadEvents(m_webFrame); 432643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 434643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Redirect Tracking 435643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ================= 436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// We want to keep track of the chain of redirects that occur during page 437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// loading. There are two types of redirects, server redirects which are HTTP 438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// response codes, and client redirects which are document.location= and meta 439643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// refreshes. 440643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 441643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// This outlines the callbacks that we get in different redirect situations, 442643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// and how each call modifies the redirect chain. 443643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 444643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Normal page load 445643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ---------------- 446643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> adds URL to the redirect list 447643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCommitLoad() -> DISPATCHES & clears list 448643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 449643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Server redirect (success) 450643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ------------------------- 451643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> adds source URL 452643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidReceiveServerRedirectForProvisionalLoad() -> adds dest URL 453643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCommitLoad() -> DISPATCHES 454643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 455643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Client redirect (success) 456643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ------------------------- 457643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// (on page) 458643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchWillPerformClientRedirect() -> saves expected redirect 459643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> appends redirect source (since 460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// it matches the expected redirect) 461643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// and the current page as the dest) 462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCancelClientRedirect() -> clears expected redirect 463643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCommitLoad() -> DISPATCHES 464643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 465643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Client redirect (cancelled) 466643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// (e.g meta-refresh trumped by manual doc.location change, or just cancelled 467643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// because a link was clicked that requires the meta refresh to be rescheduled 468643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// (the SOURCE URL may have changed). 469643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// --------------------------- 470643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCancelClientRedirect() -> clears expected redirect 471643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> adds only URL to redirect list 472643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCommitLoad() -> DISPATCHES & clears list 473643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// rescheduled ? dispatchWillPerformClientRedirect() -> saves expected redirect 474643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// : nothing 475643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 476643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Client redirect (failure) 477643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ------------------------- 478643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// (on page) 479643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchWillPerformClientRedirect() -> saves expected redirect 480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> appends redirect source (since 481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// it matches the expected redirect) 482643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// and the current page as the dest) 483643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCancelClientRedirect() 484643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidFailProvisionalLoad() 485643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 486643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Load 1 -> Server redirect to 2 -> client redirect to 3 -> server redirect to 4 487643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ------------------------------------------------------------------------------ 488643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> adds source URL 1 489643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidReceiveServerRedirectForProvisionalLoad() -> adds dest URL 2 490643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCommitLoad() -> DISPATCHES 1+2 491643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// -- begin client redirect and NEW DATA SOURCE 492643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchWillPerformClientRedirect() -> saves expected redirect 493643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> appends URL 2 and URL 3 494643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidReceiveServerRedirectForProvisionalLoad() -> appends destination URL 4 495643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCancelClientRedirect() -> clears expected redirect 496643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCommitLoad() -> DISPATCHES 497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Interesting case with multiple location changes involving anchors. 499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Load page 1 containing future client-redirect (back to 1, e.g meta refresh) > Click 500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// on a link back to the same page (i.e an anchor href) > 501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// client-redirect finally fires (with new source, set to 1#anchor) 502643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ----------------------------------------------------------------------------- 503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchWillPerformClientRedirect(non-zero 'interval' param) -> saves expected redirect 504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// -- click on anchor href 505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCancelClientRedirect() -> clears expected redirect 506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> adds 1#anchor source 507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCommitLoad() -> DISPATCHES 1#anchor 508643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchWillPerformClientRedirect() -> saves exp. source (1#anchor) 509643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// -- redirect timer fires 510643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidStartProvisionalLoad() -> appends 1#anchor (src) and 1 (dest) 511643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCancelClientRedirect() -> clears expected redirect 512643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// dispatchDidCommitLoad() -> DISPATCHES 1#anchor + 1 513643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// 514643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidReceiveServerRedirectForProvisionalLoad() 515643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 516643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebDataSourceImpl* ds = m_webFrame->provisionalDataSourceImpl(); 517643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!ds) { 518643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Got a server redirect when there is no provisional DS! 519643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 520643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 521643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 522643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 523643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The server redirect may have been blocked. 524643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (ds->request().isNull()) 525643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 526643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 527643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // A provisional load should have started already, which should have put an 528643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // entry in our redirect chain. 529643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(ds->hasRedirectChain()); 530643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 531643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The URL of the destination is on the provisional data source. We also need 532643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // to update the redirect chain to account for this addition (we do this 533643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // before the callback so the callback can look at the redirect chain to see 534643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // what happened). 535643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ds->appendRedirect(ds->request().url()); 536643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 537643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 538643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didReceiveServerRedirectForProvisionalLoad(m_webFrame); 539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 540643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 541643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Called on both success and failure of a client redirect. 542643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidCancelClientRedirect() 543643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 544643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // No longer expecting a client redirect. 545643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 546643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_expectedClientRedirectSrc = KURL(); 547643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_expectedClientRedirectDest = KURL(); 548643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didCancelClientRedirect(m_webFrame); 549643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 551643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // No need to clear the redirect chain, since that data source has already 552643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // been deleted by the time this function is called. 553643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 554643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 555643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchWillPerformClientRedirect( 556643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const KURL& url, 557643ca7872b450ea4efacab6188849e5aac2ba161Steve Block double interval, 558643ca7872b450ea4efacab6188849e5aac2ba161Steve Block double fireDate) 559643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 560643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Tells dispatchDidStartProvisionalLoad that if it sees this item it is a 561643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // redirect and the source item should be added as the start of the chain. 562643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_expectedClientRedirectSrc = m_webFrame->url(); 563643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_expectedClientRedirectDest = url; 564643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 565643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: bug 1135512. Webkit does not properly notify us of cancelling 566643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // http > file client redirects. Since the FrameLoader's policy is to never 567643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // carry out such a navigation anyway, the best thing we can do for now to 568643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // not get confused is ignore this notification. 569643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_expectedClientRedirectDest.isLocalFile() 570643ca7872b450ea4efacab6188849e5aac2ba161Steve Block && m_expectedClientRedirectSrc.protocolInHTTPFamily()) { 571643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_expectedClientRedirectSrc = KURL(); 572643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_expectedClientRedirectDest = KURL(); 573643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 574643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 575643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 576643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 577643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->willPerformClientRedirect( 578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, 579643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_expectedClientRedirectSrc, 580643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_expectedClientRedirectDest, 581643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static_cast<unsigned int>(interval), 582643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static_cast<unsigned int>(fireDate)); 583643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 584643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 585643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoaderClientImpl::dispatchDidNavigateWithinPage() 587643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 588643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Anchor fragment navigations are not normal loads, so we need to synthesize 589643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // some events for our delegate. 590643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebViewImpl* webView = m_webFrame->viewImpl(); 591643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 592643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Flag of whether frame loader is completed. Generate didStartLoading and 593643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // didStopLoading only when loader is completed so that we don't fire 594643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // them for fragment redirection that happens in window.onload handler. 595643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // See https://bugs.webkit.org/show_bug.cgi?id=31838 596643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool loaderCompleted = 597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block !webView->page()->mainFrame()->loader()->activeDocumentLoader()->isLoadingInAPISense(); 598643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 599643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Generate didStartLoading if loader is completed. 600643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (webView->client() && loaderCompleted) 601643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webView->client()->didStartLoading(); 602643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // We need to classify some hash changes as client redirects. 604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // FIXME: It seems wrong that the currentItem can sometimes be null. 605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HistoryItem* currentItem = m_webFrame->frame()->loader()->history()->currentItem(); 606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isHashChange = !currentItem || !currentItem->stateObject(); 607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 608643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebDataSourceImpl* ds = m_webFrame->dataSourceImpl(); 609643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(ds); // Should not be null when navigating to a reference fragment! 610643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (ds) { 611643ca7872b450ea4efacab6188849e5aac2ba161Steve Block KURL url = ds->request().url(); 612643ca7872b450ea4efacab6188849e5aac2ba161Steve Block KURL chainEnd; 613643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (ds->hasRedirectChain()) { 614643ca7872b450ea4efacab6188849e5aac2ba161Steve Block chainEnd = ds->endOfRedirectChain(); 615643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ds->clearRedirectChain(); 616643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 617643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 618dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (isHashChange) { 619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Figure out if this location change is because of a JS-initiated 620dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // client redirect (e.g onload/setTimeout document.location.href=). 621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // FIXME: (b/1085325, b/1046841) We don't get proper redirect 622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // performed/cancelled notifications across anchor navigations, so the 623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // other redirect-tracking code in this class (see 624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // dispatch*ClientRedirect() and dispatchDidStartProvisionalLoad) is 625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // insufficient to catch and properly flag these transitions. Once a 626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // proper fix for this bug is identified and applied the following 627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // block may no longer be required. 628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool wasClientRedirect = 629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block (url == m_expectedClientRedirectDest && chainEnd == m_expectedClientRedirectSrc) 630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block || !m_webFrame->isProcessingUserGesture(); 631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 632dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (wasClientRedirect) { 633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_webFrame->client()) 634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webFrame->client()->didCompleteClientRedirect(m_webFrame, chainEnd); 635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ds->appendRedirect(chainEnd); 636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Make sure we clear the expected redirect since we just effectively 637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // completed it. 638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_expectedClientRedirectSrc = KURL(); 639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_expectedClientRedirectDest = KURL(); 640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 643643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Regardless of how we got here, we are navigating to a URL so we need to 644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // add it to the redirect chain. 645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ds->appendRedirect(url); 646643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 647643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool isNewNavigation; 649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webView->didCommitLoad(&isNewNavigation); 65021939df44de1705786c545cd1bf519d47250322dBen Murdoch if (m_webFrame->client()) 651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webFrame->client()->didNavigateWithinPage(m_webFrame, isNewNavigation); 652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 653643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Generate didStopLoading if loader is completed. 654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (webView->client() && loaderCompleted) 655643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webView->client()->didStopLoading(); 656643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 657643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoaderClientImpl::dispatchDidChangeLocationWithinPage() 659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_webFrame) 661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webFrame->client()->didChangeLocationWithinPage(m_webFrame); 662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 664643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidPushStateWithinPage() 665643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dispatchDidNavigateWithinPage(); 667643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 668643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 669643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidReplaceStateWithinPage() 670643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dispatchDidNavigateWithinPage(); 672643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 673643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 674643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidPopStateWithinPage() 675643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Ignored since dispatchDidNavigateWithinPage was already called. 677643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 678643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 679643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchWillClose() 680643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 681643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 682643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->willClose(m_webFrame); 683643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 684643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 685643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidReceiveIcon() 686643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 687643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The icon database is disabled, so this should never be called. 688643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 689643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 690643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 691643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidStartProvisionalLoad() 692643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 693643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // In case a redirect occurs, we need this to be set so that the redirect 694643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // handling code can tell where the redirect came from. Server redirects 695643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // will occur on the provisional load, so we need to keep track of the most 696643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // recent provisional load URL. 697643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // See dispatchDidReceiveServerRedirectForProvisionalLoad. 698643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebDataSourceImpl* ds = m_webFrame->provisionalDataSourceImpl(); 699643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!ds) { 700643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 701643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 702643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 703643ca7872b450ea4efacab6188849e5aac2ba161Steve Block KURL url = ds->request().url(); 704643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 705643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Since the provisional load just started, we should have not gotten 706643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // any redirects yet. 707643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!ds->hasRedirectChain()); 708643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 709643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If this load is what we expected from a client redirect, treat it as a 710643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // redirect from that original page. The expected redirect urls will be 711643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // cleared by DidCancelClientRedirect. 712643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool completingClientRedirect = false; 713643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_expectedClientRedirectSrc.isValid()) { 714643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // m_expectedClientRedirectDest could be something like 715643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // "javascript:history.go(-1)" thus we need to exclude url starts with 716643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // "javascript:". See bug: 1080873 7172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (m_expectedClientRedirectDest.protocolIs("javascript") 7182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch || m_expectedClientRedirectDest == url) { 7192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ds->appendRedirect(m_expectedClientRedirectSrc); 7202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch completingClientRedirect = true; 7212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else { 7222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Any pending redirect is no longer in progress. This can happen 7232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // if the navigation was canceled with PolicyIgnore, or if the 7242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // redirect was scheduled on the wrong frame (e.g., due to a form 7252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // submission targeted to _blank, as in http://webkit.org/b/44079). 7262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_expectedClientRedirectSrc = KURL(); 7272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_expectedClientRedirectDest = KURL(); 7282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 729643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 730643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ds->appendRedirect(url); 731643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 732643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 733643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Whatever information didCompleteClientRedirect contains should only 734643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // be considered relevant until the next provisional load has started. 735643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // So we first tell the client that the load started, and then tell it 736643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // about the client redirect the load is responsible for completing. 737643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didStartProvisionalLoad(m_webFrame); 738643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (completingClientRedirect) { 739643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didCompleteClientRedirect( 740643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, m_expectedClientRedirectSrc); 741643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 742643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 743643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 744643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 7452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid FrameLoaderClientImpl::dispatchDidReceiveTitle(const StringWithDirection& title) 746643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 747643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 7482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_webFrame->client()->didReceiveTitle(m_webFrame, title.string(), title.direction() == LTR ? WebTextDirectionLeftToRight : WebTextDirectionRightToLeft); 749643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 750643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 75121939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FrameLoaderClientImpl::dispatchDidChangeIcons() 75221939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 75321939df44de1705786c545cd1bf519d47250322dBen Murdoch if (m_webFrame->client()) 75421939df44de1705786c545cd1bf519d47250322dBen Murdoch m_webFrame->client()->didChangeIcons(m_webFrame); 75521939df44de1705786c545cd1bf519d47250322dBen Murdoch} 75621939df44de1705786c545cd1bf519d47250322dBen Murdoch 757643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidCommitLoad() 758643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 759643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebViewImpl* webview = m_webFrame->viewImpl(); 760643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool isNewNavigation; 761643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webview->didCommitLoad(&isNewNavigation); 762643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 763643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 764643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didCommitProvisionalLoad(m_webFrame, isNewNavigation); 765643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 766643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 767643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidFailProvisionalLoad( 768643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceError& error) 769643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 770643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 771643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If a policy change occured, then we do not want to inform the plugin 772643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // delegate. See http://b/907789 for details. FIXME: This means the 773643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // plugin won't receive NPP_URLNotify, which seems like it could result in 774643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // a memory leak in the plugin!! 775643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (error.domain() == internalErrorDomain 776643ca7872b450ea4efacab6188849e5aac2ba161Steve Block && error.errorCode() == PolicyChangeError) { 777643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->didFail(cancelledError(error.failingURL()), true); 778643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 779643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 780643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 781643ca7872b450ea4efacab6188849e5aac2ba161Steve Block OwnPtr<WebPluginLoadObserver> observer = pluginLoadObserver(); 782643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->didFail(error, true); 783643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (observer) 784643ca7872b450ea4efacab6188849e5aac2ba161Steve Block observer->didFailLoading(error); 785643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 786643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 787643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidFailLoad(const ResourceError& error) 788643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 789643ca7872b450ea4efacab6188849e5aac2ba161Steve Block OwnPtr<WebPluginLoadObserver> observer = pluginLoadObserver(); 790643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->didFail(error, false); 791643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (observer) 792643ca7872b450ea4efacab6188849e5aac2ba161Steve Block observer->didFailLoading(error); 793643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 794643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Don't clear the redirect chain, this will happen in the middle of client 795643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // redirects, and we need the context. The chain will be cleared when the 796643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // provisional load succeeds or fails, not the "real" one. 797643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 798643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 799643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidFinishLoad() 800643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 801643ca7872b450ea4efacab6188849e5aac2ba161Steve Block OwnPtr<WebPluginLoadObserver> observer = pluginLoadObserver(); 802643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 803643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 804643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didFinishLoad(m_webFrame); 805643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 806643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (observer) 807643ca7872b450ea4efacab6188849e5aac2ba161Steve Block observer->didFinishLoading(); 808643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 809643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Don't clear the redirect chain, this will happen in the middle of client 810643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // redirects, and we need the context. The chain will be cleared when the 811643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // provisional load succeeds or fails, not the "real" one. 812643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 813643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 814643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidFirstLayout() 815643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 81621939df44de1705786c545cd1bf519d47250322dBen Murdoch if (m_webFrame->client()) 81721939df44de1705786c545cd1bf519d47250322dBen Murdoch m_webFrame->client()->didFirstLayout(m_webFrame); 818643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 819643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 820643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidFirstVisuallyNonEmptyLayout() 821643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 82221939df44de1705786c545cd1bf519d47250322dBen Murdoch if (m_webFrame->client()) 82321939df44de1705786c545cd1bf519d47250322dBen Murdoch m_webFrame->client()->didFirstVisuallyNonEmptyLayout(m_webFrame); 824643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 825643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 826e14391e94c850b8bd03680c23b38978db68687a8John ReckFrame* FrameLoaderClientImpl::dispatchCreatePage(const NavigationAction& action) 827643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 828643ca7872b450ea4efacab6188849e5aac2ba161Steve Block struct WindowFeatures features; 829643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Page* newPage = m_webFrame->frame()->page()->chrome()->createWindow( 830f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_webFrame->frame(), FrameLoadRequest(m_webFrame->frame()->document()->securityOrigin()), 831f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch features, action); 832643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 833643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Make sure that we have a valid disposition. This should have been set in 834643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // the preceeding call to dispatchDecidePolicyForNewWindowAction. 835643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_nextNavigationPolicy != WebNavigationPolicyIgnore); 836643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebNavigationPolicy policy = m_nextNavigationPolicy; 837643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_nextNavigationPolicy = WebNavigationPolicyIgnore; 838643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 839643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // createWindow can return null (e.g., popup blocker denies the window). 840643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!newPage) 841643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 842643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 843643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebViewImpl::fromPage(newPage)->setInitialNavigationPolicy(policy); 844643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return newPage->mainFrame(); 845643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 846643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 847643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchShow() 848643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 849643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebViewImpl* webView = m_webFrame->viewImpl(); 850643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (webView && webView->client()) 851643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webView->client()->show(webView->initialNavigationPolicy()); 852643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 853643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 85481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid FrameLoaderClientImpl::dispatchDecidePolicyForResponse( 855643ca7872b450ea4efacab6188849e5aac2ba161Steve Block FramePolicyFunction function, 85681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const ResourceResponse& response, 857643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest&) 858643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 859643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PolicyAction action; 860643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 861643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int statusCode = response.httpStatusCode(); 862643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (statusCode == 204 || statusCode == 205) { 863643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The server does not want us to replace the page contents. 864643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = PolicyIgnore; 865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else if (WebCore::contentDispositionType(response.httpHeaderField("Content-Disposition")) == WebCore::ContentDispositionAttachment) { 866643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The server wants us to download instead of replacing the page contents. 867643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Downloading is handled by the embedder, but we still get the initial 868643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // response so that we can ignore it and clean up properly. 869643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = PolicyIgnore; 87081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } else if (!canShowMIMEType(response.mimeType())) { 871643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Make sure that we can actually handle this type internally. 872643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = PolicyIgnore; 873643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else { 874643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // OK, we will render this page. 875643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = PolicyUse; 876643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 877643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 878643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // NOTE: PolicyChangeError will be generated when action is not PolicyUse. 879643ca7872b450ea4efacab6188849e5aac2ba161Steve Block (m_webFrame->frame()->loader()->policyChecker()->*function)(action); 880643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 881643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 882643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDecidePolicyForNewWindowAction( 883643ca7872b450ea4efacab6188849e5aac2ba161Steve Block FramePolicyFunction function, 884643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const NavigationAction& action, 885643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest& request, 886643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PassRefPtr<FormState> formState, 887643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const String& frameName) 888643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 889643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebNavigationPolicy navigationPolicy; 890643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!actionSpecifiesNavigationPolicy(action, &navigationPolicy)) 891643ca7872b450ea4efacab6188849e5aac2ba161Steve Block navigationPolicy = WebNavigationPolicyNewForegroundTab; 892643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 893643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PolicyAction policyAction; 894643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (navigationPolicy == WebNavigationPolicyDownload) 895643ca7872b450ea4efacab6188849e5aac2ba161Steve Block policyAction = PolicyDownload; 896643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else { 897643ca7872b450ea4efacab6188849e5aac2ba161Steve Block policyAction = PolicyUse; 898643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 899643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Remember the disposition for when dispatchCreatePage is called. It is 900643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // unfortunate that WebCore does not provide us with any context when 901643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // creating or showing the new window that would allow us to avoid having 902643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // to keep this state. 903643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_nextNavigationPolicy = navigationPolicy; 904643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 905643ca7872b450ea4efacab6188849e5aac2ba161Steve Block (m_webFrame->frame()->loader()->policyChecker()->*function)(policyAction); 906643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 907643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 908643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDecidePolicyForNavigationAction( 909643ca7872b450ea4efacab6188849e5aac2ba161Steve Block FramePolicyFunction function, 910643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const NavigationAction& action, 911643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest& request, 912643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PassRefPtr<FormState> formState) { 913643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PolicyAction policyAction = PolicyIgnore; 914643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 915643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // It is valid for this function to be invoked in code paths where the 916643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // the webview is closed. 917643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The null check here is to fix a crash that seems strange 918643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // (see - https://bugs.webkit.org/show_bug.cgi?id=23554). 919643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client() && !request.url().isNull()) { 920dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebNavigationPolicy navigationPolicy = WebNavigationPolicyCurrentTab; 921dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block actionSpecifiesNavigationPolicy(action, &navigationPolicy); 922dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Give the delegate a chance to change the navigation policy. 924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const WebDataSourceImpl* ds = m_webFrame->provisionalDataSourceImpl(); 925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (ds) { 926dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block KURL url = ds->request().url(); 927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(!url.protocolIs(backForwardNavigationScheme)); 928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isRedirect = ds->hasRedirectChain(); 930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebNavigationType webnavType = 932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebDataSourceImpl::toWebNavigationType(action.type()); 933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RefPtr<Node> node; 935dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (const Event* event = action.event(); event; event = event->underlyingEvent()) { 936dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (event->isMouseEvent()) { 937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const MouseEvent* mouseEvent = 938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static_cast<const MouseEvent*>(event); 939dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block node = m_webFrame->frame()->eventHandler()->hitTestResultAtPoint( 940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block mouseEvent->absoluteLocation(), false).innerNonSharedNode(); 941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebNode originatingNode(node); 945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block navigationPolicy = m_webFrame->client()->decidePolicyForNavigation( 947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webFrame, ds->request(), webnavType, originatingNode, 948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block navigationPolicy, isRedirect); 949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (navigationPolicy == WebNavigationPolicyCurrentTab) 952dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block policyAction = PolicyUse; 953dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else if (navigationPolicy == WebNavigationPolicyDownload) 954dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block policyAction = PolicyDownload; 955dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else { 956dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (navigationPolicy != WebNavigationPolicyIgnore) { 957dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WrappedResourceRequest webreq(request); 958dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_webFrame->client()->loadURLExternally(m_webFrame, webreq, navigationPolicy); 959dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 960dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block policyAction = PolicyIgnore; 961dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 962643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 963643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 964643ca7872b450ea4efacab6188849e5aac2ba161Steve Block (m_webFrame->frame()->loader()->policyChecker()->*function)(policyAction); 965643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 966643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 967643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::cancelPolicyCheck() 968643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 969643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 970643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 971643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 972643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchUnableToImplementPolicy(const ResourceError& error) 973643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 974643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->unableToImplementPolicyWithError(m_webFrame, error); 975643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 976643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 97721939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FrameLoaderClientImpl::dispatchWillSendSubmitEvent(HTMLFormElement* form) 97821939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 97921939df44de1705786c545cd1bf519d47250322dBen Murdoch if (m_webFrame->client()) 98021939df44de1705786c545cd1bf519d47250322dBen Murdoch m_webFrame->client()->willSendSubmitEvent(m_webFrame, WebFormElement(form)); 98121939df44de1705786c545cd1bf519d47250322dBen Murdoch} 98221939df44de1705786c545cd1bf519d47250322dBen Murdoch 983643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchWillSubmitForm(FramePolicyFunction function, 984643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PassRefPtr<FormState> formState) 985643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 986643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 987643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->willSubmitForm(m_webFrame, WebFormElement(formState->form())); 988643ca7872b450ea4efacab6188849e5aac2ba161Steve Block (m_webFrame->frame()->loader()->policyChecker()->*function)(PolicyUse); 989643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 990643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 991643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidLoadMainResource(DocumentLoader*) 992643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 993643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 994643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 995643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 996643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::revertToProvisionalState(DocumentLoader*) 997643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 998643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_hasRepresentation = true; 999643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1000643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1001643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::setMainDocumentError(DocumentLoader*, 1002643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceError& error) 1003643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1004643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_pluginWidget.get()) { 1005643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_sentInitialResponseToPlugin) { 1006643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_pluginWidget->didFailLoading(error); 1007643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_sentInitialResponseToPlugin = false; 1008643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1009643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_pluginWidget = 0; 1010643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1011643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1012643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1013643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::postProgressStartedNotification() 1014643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1015643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebViewImpl* webview = m_webFrame->viewImpl(); 1016643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (webview && webview->client()) 1017643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webview->client()->didStartLoading(); 1018643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1019643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1020643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::postProgressEstimateChangedNotification() 1021643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 10226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner WebViewImpl* webview = m_webFrame->viewImpl(); 10236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (webview && webview->client()) { 10246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner webview->client()->didChangeLoadProgress( 10256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_webFrame, m_webFrame->frame()->page()->progress()->estimatedProgress()); 10266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 10276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1028643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1029643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1030643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::postProgressFinishedNotification() 1031643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1032643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: why might the webview be null? http://b/1234461 1033643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebViewImpl* webview = m_webFrame->viewImpl(); 1034643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (webview && webview->client()) 1035643ca7872b450ea4efacab6188849e5aac2ba161Steve Block webview->client()->didStopLoading(); 1036643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1037643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1038643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::setMainFrameDocumentReady(bool ready) 1039643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1040643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1041643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1042643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1043643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Creates a new connection and begins downloading from that (contrast this 1044643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// with |download|). 1045643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::startDownload(const ResourceRequest& request) 1046643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1047643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 1048643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WrappedResourceRequest webreq(request); 1049643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->loadURLExternally( 1050643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, webreq, WebNavigationPolicyDownload); 1051643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1052643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1053643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1054643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::willChangeTitle(DocumentLoader*) 1055643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1056643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1057643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1058643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1059643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::didChangeTitle(DocumentLoader*) 1060643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1061643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1062643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1063643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1064643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Called whenever data is received. 1065643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::committedLoad(DocumentLoader* loader, const char* data, int length) 1066643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1067643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_pluginWidget.get()) { 1068643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) { 1069643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool preventDefault = false; 1070643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didReceiveDocumentData(m_webFrame, data, length, preventDefault); 1071643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!preventDefault) 1072643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->commitDocumentData(data, length); 1073643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1074643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1075643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1076643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If we are sending data to MediaDocument, we should stop here 1077643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // and cancel the request. 107868513a70bcd92384395513322f1b801e7bf9c729Steve Block if (m_webFrame->frame()->document()->isMediaDocument()) 1079643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loader->cancelMainResourceLoad(pluginWillHandleLoadError(loader->response())); 1080643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1081643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The plugin widget could have been created in the m_webFrame->DidReceiveData 1082643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // function. 1083643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_pluginWidget.get()) { 1084643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_sentInitialResponseToPlugin) { 1085643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_sentInitialResponseToPlugin = true; 1086643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_pluginWidget->didReceiveResponse( 1087643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->frame()->loader()->activeDocumentLoader()->response()); 1088643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1089a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 1090a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // It's possible that the above call removed the pointer to the plugin, so 1091a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // check before calling it. 1092a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (m_pluginWidget.get()) 1093a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_pluginWidget->didReceiveData(data, length); 1094643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1095643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1096643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1097643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::finishedLoading(DocumentLoader* dl) 1098643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1099643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_pluginWidget.get()) { 1100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_pluginWidget->didFinishLoading(); 1101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_pluginWidget = 0; 1102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_sentInitialResponseToPlugin = false; 1103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } else { 1104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This is necessary to create an empty document. See bug 634004. 1105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // However, we only want to do this if makeRepresentation has been called, to 1106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // match the behavior on the Mac. 1107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_hasRepresentation) 11082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block dl->writer()->setEncoding("", false); 1109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1112643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::updateGlobalHistory() 1113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1116643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::updateGlobalHistoryRedirectLinks() 1117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool FrameLoaderClientImpl::shouldGoToHistoryItem(HistoryItem* item) const 1121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const KURL& url = item->url(); 1123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!url.protocolIs(backForwardNavigationScheme)) 1124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return true; 1125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Else, we'll punt this history navigation to the embedder. It is 1127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // necessary that we intercept this here, well before the FrameLoader 1128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // has made any state changes for this history traversal. 1129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool ok; 1131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int offset = url.lastPathComponent().toIntStrict(&ok); 1132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!ok) { 1133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT_NOT_REACHED(); 1134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 1135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebViewImpl* webview = m_webFrame->viewImpl(); 1138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (webview->client()) 1139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block webview->client()->navigateBackForwardSoon(offset); 1140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 1142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 114481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool FrameLoaderClientImpl::shouldStopLoadingForHistoryItem(HistoryItem* targetItem) const 114581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 114681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Don't stop loading for pseudo-back-forward URLs, since they will get 114781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // translated and then pass through again. 114881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const KURL& url = targetItem->url(); 114981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return !url.protocolIs(backForwardNavigationScheme); 115081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 115181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 1152643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidAddBackForwardItem(HistoryItem*) const 1153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1156643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidRemoveBackForwardItem(HistoryItem*) const 1157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1160643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::dispatchDidChangeBackForwardIndex() const 1161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1164643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::didDisplayInsecureContent() 1165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 1167643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didDisplayInsecureContent(m_webFrame); 1168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 11702fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid FrameLoaderClientImpl::didRunInsecureContent(SecurityOrigin* origin, const KURL& insecureURL) 1171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 11732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_webFrame->client()->didRunInsecureContent(m_webFrame, WebSecurityOrigin(origin), insecureURL); 1174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1176643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceError FrameLoaderClientImpl::blockedError(const ResourceRequest&) 1177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ResourceError(); 1180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1182643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceError FrameLoaderClientImpl::cancelledError(const ResourceRequest& request) 1183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_webFrame->client()) 1185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ResourceError(); 1186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_webFrame->client()->cancelledError( 1188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, WrappedResourceRequest(request)); 1189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1191643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceError FrameLoaderClientImpl::cannotShowURLError(const ResourceRequest& request) 1192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_webFrame->client()) 1194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ResourceError(); 1195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_webFrame->client()->cannotHandleRequestError( 1197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, WrappedResourceRequest(request)); 1198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1200643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceError FrameLoaderClientImpl::interruptForPolicyChangeError( 1201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest& request) 1202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ResourceError(internalErrorDomain, PolicyChangeError, 1204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.url().string(), String()); 1205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1207643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceError FrameLoaderClientImpl::cannotShowMIMETypeError(const ResourceResponse&) 1208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ResourceError(); 1211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1213643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceError FrameLoaderClientImpl::fileDoesNotExistError(const ResourceResponse&) 1214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ResourceError(); 1217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1219643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockResourceError FrameLoaderClientImpl::pluginWillHandleLoadError(const ResourceResponse&) 1220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ResourceError(); 1223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1225643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::shouldFallBack(const ResourceError& error) 1226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This method is called when we fail to load the URL for an <object> tag 1228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // that has fallback content (child elements) and is being loaded as a frame. 1229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The error parameter indicates the reason for the load failure. 1230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // We should let the fallback content load only if this wasn't a cancelled 1231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // request. 1232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Note: The mac version also has a case for "WebKitErrorPluginWillHandleLoad" 1233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceError c = cancelledError(ResourceRequest()); 1234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return error.errorCode() != c.errorCode() || error.domain() != c.domain(); 1235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1237643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::canHandleRequest(const ResourceRequest& request) const 1238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_webFrame->client()->canHandleRequest( 1240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame, WrappedResourceRequest(request)); 1241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 124368513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool FrameLoaderClientImpl::canShowMIMETypeAsHTML(const String& MIMEType) const 124468513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 124568513a70bcd92384395513322f1b801e7bf9c729Steve Block notImplemented(); 124668513a70bcd92384395513322f1b801e7bf9c729Steve Block return false; 124768513a70bcd92384395513322f1b801e7bf9c729Steve Block} 124868513a70bcd92384395513322f1b801e7bf9c729Steve Block 1249643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::canShowMIMEType(const String& mimeType) const 1250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This method is called to determine if the media type can be shown 1252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // "internally" (i.e. inside the browser) regardless of whether or not the 1253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // browser or a plugin is doing the rendering. 1254643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1255643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // mimeType strings are supposed to be ASCII, but if they are not for some 1256643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // reason, then it just means that the mime type will fail all of these "is 1257643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // supported" checks and go down the path of an unhandled mime type. 1258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (webKitClient()->mimeRegistry()->supportsMIMEType(mimeType) == WebMimeRegistry::IsSupported) 1259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return true; 1260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If Chrome is started with the --disable-plugins switch, pluginData is null. 1262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PluginData* pluginData = m_webFrame->frame()->page()->pluginData(); 1263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // See if the type is handled by an installed plugin, if so, we can show it. 1265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: (http://b/1085524) This is the place to stick a preference to 1266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // disable full page plugins (optionally for certain types!) 1267643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return !mimeType.isEmpty() && pluginData && pluginData->supportsMimeType(mimeType); 1268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1270643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::representationExistsForURLScheme(const String&) const 1271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; 1274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1276643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockString FrameLoaderClientImpl::generatedMIMETypeForURLScheme(const String& scheme) const 1277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This appears to generate MIME types for protocol handlers that are handled 1279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // internally. The only place I can find in the WebKit code that uses this 1280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // function is WebView::registerViewClass, where it is used as part of the 1281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // process by which custom view classes for certain document representations 1282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // are registered. 1283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block String mimeType("x-apple-web-kit/"); 1284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block mimeType.append(scheme.lower()); 1285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return mimeType; 1286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1288643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::frameLoadCompleted() 1289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: the mac port also conditionally calls setDrawsBackground:YES on 1291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // it's ScrollView here. 1292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This comment from the Mac port: 1294643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Note: Can be called multiple times. 1295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Even if already complete, we might have set a previous item on a frame that 1296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // didn't do any data loading on the past transaction. Make sure to clear these out. 1297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: setPreviousHistoryItem() no longer exists. http://crbug.com/8566 1299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // m_webFrame->frame()->loader()->setPreviousHistoryItem(0); 1300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1302643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::saveViewStateToItem(HistoryItem*) 1303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1307643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::restoreViewState() 1308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: probably scrolls to last position when you go back or forward 1310643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1311643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1312643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::provisionalLoadStarted() 1313643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1314643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: On mac, this does various caching stuff 1315643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1316643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1317643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::didFinishLoad() 1318643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1319643ca7872b450ea4efacab6188849e5aac2ba161Steve Block OwnPtr<WebPluginLoadObserver> observer = pluginLoadObserver(); 1320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (observer) 1321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block observer->didFinishLoading(); 1322643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1324643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::prepareForDataSourceReplacement() 1325643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1327643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1328643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1329643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassRefPtr<DocumentLoader> FrameLoaderClientImpl::createDocumentLoader( 1330643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest& request, 1331643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const SubstituteData& data) 1332643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1333643ca7872b450ea4efacab6188849e5aac2ba161Steve Block RefPtr<WebDataSourceImpl> ds = WebDataSourceImpl::create(request, data); 1334643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_webFrame->client()) 1335643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->client()->didCreateDataSource(m_webFrame, ds.get()); 1336643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ds.release(); 1337643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1338643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 13392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid FrameLoaderClientImpl::setTitle(const StringWithDirection& title, const KURL& url) 1340643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1341643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: inform consumer of changes to the title. 1342643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1344643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockString FrameLoaderClientImpl::userAgent(const KURL& url) 1345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1346643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return webKitClient()->userAgent(url); 1347643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1348643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1349643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::savePlatformDataToCachedFrame(CachedFrame*) 1350643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1351643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The page cache should be disabled. 1352643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 1353643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1354643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1355643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::transitionToCommittedFromCachedFrame(CachedFrame*) 1356643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1357643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 1358643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1359643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Called when the FrameLoader goes into a state in which a new page load 1361643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// will occur. 1362643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::transitionToCommittedForNewPage() 1363643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1364643ca7872b450ea4efacab6188849e5aac2ba161Steve Block makeDocumentView(); 1365643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1366643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1367cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid FrameLoaderClientImpl::didSaveToPageCache() 1368cad810f21b803229eb11403f9209855525a25d57Steve Block{ 1369cad810f21b803229eb11403f9209855525a25d57Steve Block} 1370cad810f21b803229eb11403f9209855525a25d57Steve Block 1371cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid FrameLoaderClientImpl::didRestoreFromPageCache() 1372cad810f21b803229eb11403f9209855525a25d57Steve Block{ 1373cad810f21b803229eb11403f9209855525a25d57Steve Block} 1374cad810f21b803229eb11403f9209855525a25d57Steve Block 1375e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FrameLoaderClientImpl::dispatchDidBecomeFrameset(bool) 1376e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 1377e14391e94c850b8bd03680c23b38978db68687a8John Reck} 1378e14391e94c850b8bd03680c23b38978db68687a8John Reck 1379643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::canCachePage() const 1380643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1381643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Since we manage the cache, always report this page as non-cacheable to 1382643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FrameLoader. 1383643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; 1384643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1385643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1386643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Downloading is handled in the browser process, not WebKit. If we get to this 1387643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// point, our download detection code in the ResourceDispatcherHost is broken! 1388643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::download(ResourceHandle* handle, 1389643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest& request, 1390643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceRequest& initialRequest, 1391643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const ResourceResponse& response) 1392643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1393643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 1394643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1395643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1396643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassRefPtr<Frame> FrameLoaderClientImpl::createFrame( 1397643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const KURL& url, 1398643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const String& name, 1399643ca7872b450ea4efacab6188849e5aac2ba161Steve Block HTMLFrameOwnerElement* ownerElement, 1400643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const String& referrer, 1401643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool allowsScrolling, 1402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int marginWidth, 1403643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int marginHeight) 1404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1405f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch FrameLoadRequest frameRequest(m_webFrame->frame()->document()->securityOrigin(), 1406f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ResourceRequest(url, referrer), name); 1407643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return m_webFrame->createChildFrame(frameRequest, ownerElement); 1408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1409643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1410bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid FrameLoaderClientImpl::didTransferChildFrameToNewDocument(Page*) 1411692e5dbf12901edacf14812a6fae25462920af42Steve Block{ 1412692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT(m_webFrame->frame()->ownerElement()); 1413692e5dbf12901edacf14812a6fae25462920af42Steve Block 1414692e5dbf12901edacf14812a6fae25462920af42Steve Block WebFrameImpl* newParent = static_cast<WebFrameImpl*>(m_webFrame->parent()); 1415692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!newParent || !newParent->client()) 1416692e5dbf12901edacf14812a6fae25462920af42Steve Block return; 1417692e5dbf12901edacf14812a6fae25462920af42Steve Block 1418692e5dbf12901edacf14812a6fae25462920af42Steve Block // Replace the client since the old client may be destroyed when the 1419692e5dbf12901edacf14812a6fae25462920af42Steve Block // previous page is closed. 1420692e5dbf12901edacf14812a6fae25462920af42Steve Block m_webFrame->setClient(newParent->client()); 1421692e5dbf12901edacf14812a6fae25462920af42Steve Block} 1422692e5dbf12901edacf14812a6fae25462920af42Steve Block 142328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid FrameLoaderClientImpl::transferLoadingResourceFromPage(unsigned long identifier, DocumentLoader* loader, const ResourceRequest& request, Page* oldPage) 1424e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 142528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu assignIdentifierToInitialRequest(identifier, loader, request); 142628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 142728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu WebFrameImpl* oldWebFrame = WebFrameImpl::fromFrame(oldPage->mainFrame()); 142828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (oldWebFrame && oldWebFrame->client()) 142928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu oldWebFrame->client()->removeIdentifierForRequest(identifier); 1430e14391e94c850b8bd03680c23b38978db68687a8John Reck} 1431e14391e94c850b8bd03680c23b38978db68687a8John Reck 1432643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassRefPtr<Widget> FrameLoaderClientImpl::createPlugin( 1433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const IntSize& size, // FIXME: how do we use this? 1434643ca7872b450ea4efacab6188849e5aac2ba161Steve Block HTMLPlugInElement* element, 1435643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const KURL& url, 1436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const Vector<String>& paramNames, 1437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const Vector<String>& paramValues, 1438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const String& mimeType, 1439643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool loadManually) 1440643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1441643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_webFrame->client()) 1442643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1443643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1444643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebPluginParams params; 1445643ca7872b450ea4efacab6188849e5aac2ba161Steve Block params.url = url; 1446643ca7872b450ea4efacab6188849e5aac2ba161Steve Block params.mimeType = mimeType; 1447643ca7872b450ea4efacab6188849e5aac2ba161Steve Block params.attributeNames = paramNames; 1448643ca7872b450ea4efacab6188849e5aac2ba161Steve Block params.attributeValues = paramValues; 1449643ca7872b450ea4efacab6188849e5aac2ba161Steve Block params.loadManually = loadManually; 1450643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1451643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebPlugin* webPlugin = m_webFrame->client()->createPlugin(m_webFrame, params); 1452643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!webPlugin) 1453643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1454643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1455643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The container takes ownership of the WebPlugin. 1456643ca7872b450ea4efacab6188849e5aac2ba161Steve Block RefPtr<WebPluginContainerImpl> container = 1457643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebPluginContainerImpl::create(element, webPlugin); 1458643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1459643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!webPlugin->initialize(container.get())) 1460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1461643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // The element might have been removed during plugin initialization! 1463643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!element->renderer()) 1464643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return 0; 1465643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1466643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return container; 1467643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1468643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1469643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// This method gets called when a plugin is put in place of html content 1470643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// (e.g., acrobat reader). 1471643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoaderClientImpl::redirectDataToPlugin(Widget* pluginWidget) 1472643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1473a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (pluginWidget->isPluginContainer()) 1474a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_pluginWidget = static_cast<WebPluginContainerImpl*>(pluginWidget); 1475643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(m_pluginWidget.get()); 1476643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1477643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1478643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassRefPtr<Widget> FrameLoaderClientImpl::createJavaAppletWidget( 1479643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const IntSize& size, 1480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block HTMLAppletElement* element, 1481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const KURL& /* baseURL */, 1482643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const Vector<String>& paramNames, 1483643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const Vector<String>& paramValues) 1484643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1485643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return createPlugin(size, element, KURL(), paramNames, paramValues, 1486643ca7872b450ea4efacab6188849e5aac2ba161Steve Block "application/x-java-applet", false); 1487643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1488643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1489643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockObjectContentType FrameLoaderClientImpl::objectContentType( 1490643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const KURL& url, 14912bde8e466a4451c7319e3a072d118917957d6554Steve Block const String& explicitMimeType, 14922bde8e466a4451c7319e3a072d118917957d6554Steve Block bool shouldPreferPlugInsForImages) 1493643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1494643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This code is based on Apple's implementation from 1495643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // WebCoreSupport/WebFrameBridge.mm. 1496643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block String mimeType = explicitMimeType; 1498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (mimeType.isEmpty()) { 1499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Try to guess the MIME type based off the extension. 1500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block String filename = url.lastPathComponent(); 1501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int extensionPos = filename.reverseFind('.'); 1502643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (extensionPos >= 0) { 1503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block String extension = filename.substring(extensionPos + 1); 1504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block mimeType = MIMETypeRegistry::getMIMETypeForExtension(extension); 1505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (mimeType.isEmpty()) { 1506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If there's no mimetype registered for the extension, check to see 1507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // if a plugin can handle the extension. 1508643ca7872b450ea4efacab6188849e5aac2ba161Steve Block mimeType = getPluginMimeTypeFromExtension(extension); 1509643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1510643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1511643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1512643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (mimeType.isEmpty()) 1513643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ObjectContentFrame; 1514643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1515643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1516643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If Chrome is started with the --disable-plugins switch, pluginData is 0. 1517643ca7872b450ea4efacab6188849e5aac2ba161Steve Block PluginData* pluginData = m_webFrame->frame()->page()->pluginData(); 15182bde8e466a4451c7319e3a072d118917957d6554Steve Block bool plugInSupportsMIMEType = pluginData && pluginData->supportsMimeType(mimeType); 15192bde8e466a4451c7319e3a072d118917957d6554Steve Block 15202bde8e466a4451c7319e3a072d118917957d6554Steve Block if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType)) 15212bde8e466a4451c7319e3a072d118917957d6554Steve Block return shouldPreferPlugInsForImages && plugInSupportsMIMEType ? ObjectContentNetscapePlugin : ObjectContentImage; 15222bde8e466a4451c7319e3a072d118917957d6554Steve Block 15232bde8e466a4451c7319e3a072d118917957d6554Steve Block if (plugInSupportsMIMEType) 1524643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ObjectContentNetscapePlugin; 1525643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1526643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType)) 1527643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ObjectContentFrame; 1528643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1529643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ObjectContentNone; 1530643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1531643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1532643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockString FrameLoaderClientImpl::overrideMediaType() const 1533643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1534643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 1535643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return String(); 1536643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1537643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1538643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool FrameLoaderClientImpl::actionSpecifiesNavigationPolicy( 1539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const NavigationAction& action, 1540643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebNavigationPolicy* policy) 1541643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const MouseEvent* event = 0; 1543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (action.type() == NavigationTypeLinkClicked 1544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && action.event()->isMouseEvent()) 1545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block event = static_cast<const MouseEvent*>(action.event()); 1546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else if (action.type() == NavigationTypeFormSubmitted 1547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && action.event() 1548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && action.event()->underlyingEvent() 1549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && action.event()->underlyingEvent()->isMouseEvent()) 1550dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block event = static_cast<const MouseEvent*>(action.event()->underlyingEvent()); 1551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!event) 1553643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; 1554643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1555643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return WebViewImpl::navigationPolicyFromMouseEvent( 1556643ca7872b450ea4efacab6188849e5aac2ba161Steve Block event->button(), event->ctrlKey(), event->shiftKey(), event->altKey(), 1557643ca7872b450ea4efacab6188849e5aac2ba161Steve Block event->metaKey(), policy); 1558643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1559643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1560643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassOwnPtr<WebPluginLoadObserver> FrameLoaderClientImpl::pluginLoadObserver() 1561643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1562643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebDataSourceImpl* ds = WebDataSourceImpl::fromDocumentLoader( 1563643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_webFrame->frame()->loader()->activeDocumentLoader()); 1564db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block if (!ds) { 1565db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block // We can arrive here if a popstate event handler detaches this frame. 1566db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block // FIXME: Remove this code once http://webkit.org/b/36202 is fixed. 1567db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block ASSERT(!m_webFrame->frame()->page()); 1568db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block return 0; 1569db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block } 1570643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return ds->releasePluginLoadObserver(); 1571643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 1572643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 15735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickPassRefPtr<FrameNetworkingContext> FrameLoaderClientImpl::createNetworkingContext() 15745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 15755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return FrameNetworkingContextImpl::create(m_webFrame->frame()); 15765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 15775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit 1579