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