2 * Copyright (C) 2009, 2012 Google Inc. All rights reserved.
3 * Copyright (C) 2011 Apple Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #include "web/FrameLoaderClientImpl.h"
35 #include "bindings/core/v8/ScriptController.h"
36 #include "core/HTMLNames.h"
37 #include "core/dom/Document.h"
38 #include "core/dom/Fullscreen.h"
39 #include "core/events/MessageEvent.h"
40 #include "core/events/MouseEvent.h"
41 #include "core/frame/FrameView.h"
42 #include "core/frame/Settings.h"
43 #include "core/html/HTMLAppletElement.h"
44 #include "core/loader/DocumentLoader.h"
45 #include "core/loader/FrameLoadRequest.h"
46 #include "core/loader/FrameLoader.h"
47 #include "core/loader/HistoryItem.h"
48 #include "core/page/Chrome.h"
49 #include "core/page/EventHandler.h"
50 #include "core/page/Page.h"
51 #include "core/page/WindowFeatures.h"
52 #include "core/rendering/HitTestResult.h"
53 #include "modules/device_light/DeviceLightController.h"
54 #include "modules/device_orientation/DeviceMotionController.h"
55 #include "modules/device_orientation/DeviceOrientationController.h"
56 #include "modules/gamepad/NavigatorGamepad.h"
57 #include "modules/serviceworkers/NavigatorServiceWorker.h"
58 #include "platform/MIMETypeRegistry.h"
59 #include "platform/RuntimeEnabledFeatures.h"
60 #include "platform/UserGestureIndicator.h"
61 #include "platform/exported/WrappedResourceRequest.h"
62 #include "platform/exported/WrappedResourceResponse.h"
63 #include "platform/network/HTTPParsers.h"
64 #include "platform/plugins/PluginData.h"
65 #include "public/platform/Platform.h"
66 #include "public/platform/WebApplicationCacheHost.h"
67 #include "public/platform/WebMimeRegistry.h"
68 #include "public/platform/WebRTCPeerConnectionHandler.h"
69 #include "public/platform/WebServiceWorkerProvider.h"
70 #include "public/platform/WebServiceWorkerProviderClient.h"
71 #include "public/platform/WebURL.h"
72 #include "public/platform/WebURLError.h"
73 #include "public/platform/WebVector.h"
74 #include "public/web/WebAutofillClient.h"
75 #include "public/web/WebCachedURLRequest.h"
76 #include "public/web/WebDOMEvent.h"
77 #include "public/web/WebDocument.h"
78 #include "public/web/WebFormElement.h"
79 #include "public/web/WebFrameClient.h"
80 #include "public/web/WebNode.h"
81 #include "public/web/WebPermissionClient.h"
82 #include "public/web/WebPlugin.h"
83 #include "public/web/WebPluginParams.h"
84 #include "public/web/WebPluginPlaceholder.h"
85 #include "public/web/WebSecurityOrigin.h"
86 #include "public/web/WebViewClient.h"
87 #include "web/PluginPlaceholderImpl.h"
88 #include "web/SharedWorkerRepositoryClientImpl.h"
89 #include "web/WebDataSourceImpl.h"
90 #include "web/WebDevToolsAgentPrivate.h"
91 #include "web/WebLocalFrameImpl.h"
92 #include "web/WebPluginContainerImpl.h"
93 #include "web/WebPluginLoadObserver.h"
94 #include "web/WebViewImpl.h"
95 #include "wtf/StringExtras.h"
96 #include "wtf/text/CString.h"
97 #include "wtf/text/WTFString.h"
102 FrameLoaderClientImpl::FrameLoaderClientImpl(WebLocalFrameImpl* frame)
107 FrameLoaderClientImpl::~FrameLoaderClientImpl()
111 void FrameLoaderClientImpl::dispatchDidClearWindowObjectInMainWorld()
113 if (m_webFrame->client()) {
114 m_webFrame->client()->didClearWindowObject(m_webFrame);
115 Document* document = m_webFrame->frame()->document();
117 DeviceMotionController::from(*document);
118 DeviceOrientationController::from(*document);
119 if (RuntimeEnabledFeatures::deviceLightEnabled())
120 DeviceLightController::from(*document);
121 NavigatorGamepad::from(*document);
122 if (RuntimeEnabledFeatures::serviceWorkerEnabled())
123 NavigatorServiceWorker::from(*document);
128 void FrameLoaderClientImpl::documentElementAvailable()
130 if (m_webFrame->client())
131 m_webFrame->client()->didCreateDocumentElement(m_webFrame);
134 void FrameLoaderClientImpl::didCreateScriptContext(v8::Handle<v8::Context> context, int extensionGroup, int worldId)
136 WebViewImpl* webview = m_webFrame->viewImpl();
137 if (webview->devToolsAgentPrivate())
138 webview->devToolsAgentPrivate()->didCreateScriptContext(m_webFrame, worldId);
139 if (m_webFrame->client())
140 m_webFrame->client()->didCreateScriptContext(m_webFrame, context, extensionGroup, worldId);
143 void FrameLoaderClientImpl::willReleaseScriptContext(v8::Handle<v8::Context> context, int worldId)
145 if (m_webFrame->client())
146 m_webFrame->client()->willReleaseScriptContext(m_webFrame, context, worldId);
149 bool FrameLoaderClientImpl::allowScriptExtension(const String& extensionName,
153 if (m_webFrame->permissionClient())
154 return m_webFrame->permissionClient()->allowScriptExtension(extensionName, extensionGroup, worldId);
159 void FrameLoaderClientImpl::didChangeScrollOffset()
161 if (m_webFrame->client())
162 m_webFrame->client()->didChangeScrollOffset(m_webFrame);
165 void FrameLoaderClientImpl::didUpdateCurrentHistoryItem()
167 if (m_webFrame->client())
168 m_webFrame->client()->didUpdateCurrentHistoryItem(m_webFrame);
171 void FrameLoaderClientImpl::didRemoveAllPendingStylesheet()
173 WebViewImpl* webview = m_webFrame->viewImpl();
175 webview->didRemoveAllPendingStylesheet(m_webFrame);
178 bool FrameLoaderClientImpl::allowScript(bool enabledPerSettings)
180 if (m_webFrame->permissionClient())
181 return m_webFrame->permissionClient()->allowScript(enabledPerSettings);
183 return enabledPerSettings;
186 bool FrameLoaderClientImpl::allowScriptFromSource(bool enabledPerSettings, const KURL& scriptURL)
188 if (m_webFrame->permissionClient())
189 return m_webFrame->permissionClient()->allowScriptFromSource(enabledPerSettings, scriptURL);
191 return enabledPerSettings;
194 bool FrameLoaderClientImpl::allowPlugins(bool enabledPerSettings)
196 if (m_webFrame->permissionClient())
197 return m_webFrame->permissionClient()->allowPlugins(enabledPerSettings);
199 return enabledPerSettings;
202 bool FrameLoaderClientImpl::allowImage(bool enabledPerSettings, const KURL& imageURL)
204 if (m_webFrame->permissionClient())
205 return m_webFrame->permissionClient()->allowImage(enabledPerSettings, imageURL);
207 return enabledPerSettings;
210 bool FrameLoaderClientImpl::allowMedia(const KURL& mediaURL)
212 if (m_webFrame->permissionClient())
213 return m_webFrame->permissionClient()->allowMedia(mediaURL);
218 bool FrameLoaderClientImpl::allowDisplayingInsecureContent(bool enabledPerSettings, SecurityOrigin* context, const KURL& url)
220 if (m_webFrame->permissionClient())
221 return m_webFrame->permissionClient()->allowDisplayingInsecureContent(enabledPerSettings, WebSecurityOrigin(context), WebURL(url));
223 return enabledPerSettings;
226 bool FrameLoaderClientImpl::allowRunningInsecureContent(bool enabledPerSettings, SecurityOrigin* context, const KURL& url)
228 if (m_webFrame->permissionClient())
229 return m_webFrame->permissionClient()->allowRunningInsecureContent(enabledPerSettings, WebSecurityOrigin(context), WebURL(url));
231 return enabledPerSettings;
234 void FrameLoaderClientImpl::didNotAllowScript()
236 if (m_webFrame->permissionClient())
237 m_webFrame->permissionClient()->didNotAllowScript();
240 void FrameLoaderClientImpl::didNotAllowPlugins()
242 if (m_webFrame->permissionClient())
243 m_webFrame->permissionClient()->didNotAllowPlugins();
247 bool FrameLoaderClientImpl::hasWebView() const
249 return m_webFrame->viewImpl();
252 Frame* FrameLoaderClientImpl::opener() const
254 return toCoreFrame(m_webFrame->opener());
257 void FrameLoaderClientImpl::setOpener(Frame* opener)
259 m_webFrame->setOpener(WebFrame::fromFrame(opener));
262 Frame* FrameLoaderClientImpl::parent() const
264 return toCoreFrame(m_webFrame->parent());
267 Frame* FrameLoaderClientImpl::top() const
269 return toCoreFrame(m_webFrame->top());
272 Frame* FrameLoaderClientImpl::previousSibling() const
274 return toCoreFrame(m_webFrame->previousSibling());
277 Frame* FrameLoaderClientImpl::nextSibling() const
279 return toCoreFrame(m_webFrame->nextSibling());
282 Frame* FrameLoaderClientImpl::firstChild() const
284 return toCoreFrame(m_webFrame->firstChild());
287 Frame* FrameLoaderClientImpl::lastChild() const
289 return toCoreFrame(m_webFrame->lastChild());
292 void FrameLoaderClientImpl::detached()
294 // Alert the client that the frame is being detached. This is the last
295 // chance we have to communicate with the client.
296 RefPtrWillBeRawPtr<WebLocalFrameImpl> protector(m_webFrame);
298 WebFrameClient* client = m_webFrame->client();
302 m_webFrame->willDetachParent();
304 // Signal that no further communication with WebFrameClient should take
305 // place at this point since we are no longer associated with the Page.
306 m_webFrame->setClient(0);
308 client->frameDetached(m_webFrame);
309 // Clear our reference to LocalFrame at the very end, in case the client
311 m_webFrame->setCoreFrame(nullptr);
314 void FrameLoaderClientImpl::dispatchWillSendRequest(
315 DocumentLoader* loader, unsigned long identifier, ResourceRequest& request,
316 const ResourceResponse& redirectResponse)
318 // Give the WebFrameClient a crack at the request.
319 if (m_webFrame->client()) {
320 WrappedResourceRequest webreq(request);
321 WrappedResourceResponse webresp(redirectResponse);
322 m_webFrame->client()->willSendRequest(
323 m_webFrame, identifier, webreq, webresp);
327 void FrameLoaderClientImpl::dispatchDidReceiveResponse(DocumentLoader* loader,
328 unsigned long identifier,
329 const ResourceResponse& response)
331 if (m_webFrame->client()) {
332 WrappedResourceResponse webresp(response);
333 m_webFrame->client()->didReceiveResponse(m_webFrame, identifier, webresp);
337 void FrameLoaderClientImpl::dispatchDidChangeResourcePriority(unsigned long identifier, ResourceLoadPriority priority, int intraPriorityValue)
339 if (m_webFrame->client())
340 m_webFrame->client()->didChangeResourcePriority(m_webFrame, identifier, static_cast<WebURLRequest::Priority>(priority), intraPriorityValue);
343 // Called when a particular resource load completes
344 void FrameLoaderClientImpl::dispatchDidFinishLoading(DocumentLoader* loader,
345 unsigned long identifier)
347 if (m_webFrame->client())
348 m_webFrame->client()->didFinishResourceLoad(m_webFrame, identifier);
351 void FrameLoaderClientImpl::dispatchDidFinishDocumentLoad()
353 if (m_webFrame->client())
354 m_webFrame->client()->didFinishDocumentLoad(m_webFrame);
357 void FrameLoaderClientImpl::dispatchDidLoadResourceFromMemoryCache(const ResourceRequest& request, const ResourceResponse& response)
359 if (m_webFrame->client())
360 m_webFrame->client()->didLoadResourceFromMemoryCache(m_webFrame, WrappedResourceRequest(request), WrappedResourceResponse(response));
363 void FrameLoaderClientImpl::dispatchDidHandleOnloadEvents()
365 if (m_webFrame->client())
366 m_webFrame->client()->didHandleOnloadEvents(m_webFrame);
369 void FrameLoaderClientImpl::dispatchDidReceiveServerRedirectForProvisionalLoad()
371 if (m_webFrame->client())
372 m_webFrame->client()->didReceiveServerRedirectForProvisionalLoad(m_webFrame);
375 void FrameLoaderClientImpl::dispatchDidNavigateWithinPage(HistoryItem* item, HistoryCommitType commitType)
377 bool shouldCreateHistoryEntry = commitType == StandardCommit;
378 m_webFrame->viewImpl()->didCommitLoad(shouldCreateHistoryEntry, true);
379 if (m_webFrame->client())
380 m_webFrame->client()->didNavigateWithinPage(m_webFrame, WebHistoryItem(item), static_cast<WebHistoryCommitType>(commitType));
383 void FrameLoaderClientImpl::dispatchWillClose()
385 if (m_webFrame->client())
386 m_webFrame->client()->willClose(m_webFrame);
389 void FrameLoaderClientImpl::dispatchDidStartProvisionalLoad(bool isTransitionNavigation)
391 if (m_webFrame->client())
392 m_webFrame->client()->didStartProvisionalLoad(m_webFrame, isTransitionNavigation);
395 void FrameLoaderClientImpl::dispatchDidReceiveTitle(const String& title)
397 if (m_webFrame->client())
398 m_webFrame->client()->didReceiveTitle(m_webFrame, title, WebTextDirectionLeftToRight);
401 void FrameLoaderClientImpl::dispatchDidChangeIcons(IconType type)
403 if (m_webFrame->client())
404 m_webFrame->client()->didChangeIcon(m_webFrame, static_cast<WebIconURL::Type>(type));
407 void FrameLoaderClientImpl::dispatchDidCommitLoad(LocalFrame* frame, HistoryItem* item, HistoryCommitType commitType)
409 m_webFrame->viewImpl()->didCommitLoad(commitType == StandardCommit, false);
410 if (m_webFrame->client())
411 m_webFrame->client()->didCommitProvisionalLoad(m_webFrame, WebHistoryItem(item), static_cast<WebHistoryCommitType>(commitType));
414 void FrameLoaderClientImpl::dispatchDidFailProvisionalLoad(
415 const ResourceError& error)
417 OwnPtr<WebPluginLoadObserver> observer = pluginLoadObserver(m_webFrame->frame()->loader().provisionalDocumentLoader());
418 m_webFrame->didFail(error, true);
420 observer->didFailLoading(error);
423 void FrameLoaderClientImpl::dispatchDidFailLoad(const ResourceError& error)
425 OwnPtr<WebPluginLoadObserver> observer = pluginLoadObserver(m_webFrame->frame()->loader().documentLoader());
426 m_webFrame->didFail(error, false);
428 observer->didFailLoading(error);
430 // Don't clear the redirect chain, this will happen in the middle of client
431 // redirects, and we need the context. The chain will be cleared when the
432 // provisional load succeeds or fails, not the "real" one.
435 void FrameLoaderClientImpl::dispatchDidFinishLoad()
437 OwnPtr<WebPluginLoadObserver> observer = pluginLoadObserver(m_webFrame->frame()->loader().documentLoader());
439 if (m_webFrame->client())
440 m_webFrame->client()->didFinishLoad(m_webFrame);
443 observer->didFinishLoading();
445 // Don't clear the redirect chain, this will happen in the middle of client
446 // redirects, and we need the context. The chain will be cleared when the
447 // provisional load succeeds or fails, not the "real" one.
450 void FrameLoaderClientImpl::dispatchDidFirstVisuallyNonEmptyLayout()
452 if (m_webFrame->client())
453 m_webFrame->client()->didFirstVisuallyNonEmptyLayout(m_webFrame);
456 void FrameLoaderClientImpl::dispatchDidChangeThemeColor()
458 if (m_webFrame->client())
459 m_webFrame->client()->didChangeThemeColor();
462 NavigationPolicy FrameLoaderClientImpl::decidePolicyForNavigation(const ResourceRequest& request, DocumentLoader* loader, NavigationPolicy policy, bool isTransitionNavigation)
464 if (!m_webFrame->client())
465 return NavigationPolicyIgnore;
466 WebDataSourceImpl* ds = WebDataSourceImpl::fromDocumentLoader(loader);
468 WrappedResourceRequest wrappedResourceRequest(request);
469 WebFrameClient::NavigationPolicyInfo navigationInfo(wrappedResourceRequest);
470 navigationInfo.frame = m_webFrame;
471 navigationInfo.extraData = ds->extraData();
472 navigationInfo.navigationType = ds->navigationType();
473 navigationInfo.defaultPolicy = static_cast<WebNavigationPolicy>(policy);
474 navigationInfo.isRedirect = ds->isRedirect();
475 navigationInfo.isTransitionNavigation = isTransitionNavigation;
477 WebNavigationPolicy webPolicy = m_webFrame->client()->decidePolicyForNavigation(navigationInfo);
478 return static_cast<NavigationPolicy>(webPolicy);
481 void FrameLoaderClientImpl::dispatchAddNavigationTransitionData(const String& allowedDestinationOrigin, const String& selector, const String& markup)
483 if (m_webFrame->client())
484 m_webFrame->client()->addNavigationTransitionData(allowedDestinationOrigin, selector, markup);
487 void FrameLoaderClientImpl::dispatchWillRequestResource(FetchRequest* request)
489 if (m_webFrame->client()) {
490 WebCachedURLRequest urlRequest(request);
491 m_webFrame->client()->willRequestResource(m_webFrame, urlRequest);
495 void FrameLoaderClientImpl::dispatchWillSendSubmitEvent(HTMLFormElement* form)
497 if (m_webFrame->client())
498 m_webFrame->client()->willSendSubmitEvent(m_webFrame, WebFormElement(form));
501 void FrameLoaderClientImpl::dispatchWillSubmitForm(HTMLFormElement* form)
503 if (m_webFrame->client())
504 m_webFrame->client()->willSubmitForm(m_webFrame, WebFormElement(form));
507 void FrameLoaderClientImpl::didStartLoading(LoadStartType loadStartType)
509 if (m_webFrame->client())
510 m_webFrame->client()->didStartLoading(loadStartType == NavigationToDifferentDocument);
513 void FrameLoaderClientImpl::progressEstimateChanged(double progressEstimate)
515 if (m_webFrame->client())
516 m_webFrame->client()->didChangeLoadProgress(progressEstimate);
519 void FrameLoaderClientImpl::didStopLoading()
521 if (m_webFrame->client())
522 m_webFrame->client()->didStopLoading();
525 void FrameLoaderClientImpl::loadURLExternally(const ResourceRequest& request, NavigationPolicy policy, const String& suggestedName)
527 if (m_webFrame->client()) {
528 ASSERT(m_webFrame->frame()->document());
529 Fullscreen::fullyExitFullscreen(*m_webFrame->frame()->document());
530 WrappedResourceRequest webreq(request);
531 m_webFrame->client()->loadURLExternally(
532 m_webFrame, webreq, static_cast<WebNavigationPolicy>(policy), suggestedName);
536 bool FrameLoaderClientImpl::navigateBackForward(int offset) const
538 WebViewImpl* webview = m_webFrame->viewImpl();
539 if (!webview->client())
543 if (offset > webview->client()->historyForwardListCount())
545 if (offset < -webview->client()->historyBackListCount())
547 webview->client()->navigateBackForwardSoon(offset);
551 void FrameLoaderClientImpl::didAccessInitialDocument()
553 if (m_webFrame->client())
554 m_webFrame->client()->didAccessInitialDocument(m_webFrame);
557 void FrameLoaderClientImpl::didDisplayInsecureContent()
559 if (m_webFrame->client())
560 m_webFrame->client()->didDisplayInsecureContent(m_webFrame);
563 void FrameLoaderClientImpl::didRunInsecureContent(SecurityOrigin* origin, const KURL& insecureURL)
565 if (m_webFrame->client())
566 m_webFrame->client()->didRunInsecureContent(m_webFrame, WebSecurityOrigin(origin), insecureURL);
569 void FrameLoaderClientImpl::didDetectXSS(const KURL& insecureURL, bool didBlockEntirePage)
571 if (m_webFrame->client())
572 m_webFrame->client()->didDetectXSS(m_webFrame, insecureURL, didBlockEntirePage);
575 void FrameLoaderClientImpl::didDispatchPingLoader(const KURL& url)
577 if (m_webFrame->client())
578 m_webFrame->client()->didDispatchPingLoader(m_webFrame, url);
581 void FrameLoaderClientImpl::selectorMatchChanged(const Vector<String>& addedSelectors, const Vector<String>& removedSelectors)
583 if (WebFrameClient* client = m_webFrame->client())
584 client->didMatchCSS(m_webFrame, WebVector<WebString>(addedSelectors), WebVector<WebString>(removedSelectors));
587 PassRefPtr<DocumentLoader> FrameLoaderClientImpl::createDocumentLoader(LocalFrame* frame, const ResourceRequest& request, const SubstituteData& data)
589 RefPtr<WebDataSourceImpl> ds = WebDataSourceImpl::create(frame, request, data);
590 if (m_webFrame->client())
591 m_webFrame->client()->didCreateDataSource(m_webFrame, ds.get());
595 String FrameLoaderClientImpl::userAgent(const KURL& url)
597 WebString override = m_webFrame->client()->userAgentOverride(m_webFrame, WebURL(url));
598 if (!override.isEmpty())
601 return Platform::current()->userAgent();
604 String FrameLoaderClientImpl::doNotTrackValue()
606 WebString doNotTrack = m_webFrame->client()->doNotTrackValue(m_webFrame);
607 if (!doNotTrack.isEmpty())
612 // Called when the FrameLoader goes into a state in which a new page load
614 void FrameLoaderClientImpl::transitionToCommittedForNewPage()
616 m_webFrame->createFrameView();
619 PassRefPtrWillBeRawPtr<LocalFrame> FrameLoaderClientImpl::createFrame(
621 const AtomicString& name,
622 HTMLFrameOwnerElement* ownerElement)
624 FrameLoadRequest frameRequest(m_webFrame->frame()->document(), url, name);
625 return m_webFrame->createChildFrame(frameRequest, ownerElement);
628 bool FrameLoaderClientImpl::canCreatePluginWithoutRenderer(const String& mimeType) const
630 if (!m_webFrame->client())
633 return m_webFrame->client()->canCreatePluginWithoutRenderer(mimeType);
636 PassOwnPtrWillBeRawPtr<PluginPlaceholder> FrameLoaderClientImpl::createPluginPlaceholder(
639 const Vector<String>& paramNames,
640 const Vector<String>& paramValues,
641 const String& mimeType,
644 if (!m_webFrame->client())
647 WebPluginParams params;
649 params.mimeType = mimeType;
650 params.attributeNames = paramNames;
651 params.attributeValues = paramValues;
652 params.loadManually = loadManually;
654 OwnPtr<WebPluginPlaceholder> webPluginPlaceholder = adoptPtr(
655 m_webFrame->client()->createPluginPlaceholder(m_webFrame, params));
656 if (!webPluginPlaceholder)
659 return PluginPlaceholderImpl::create(webPluginPlaceholder.release(), document);
662 PassRefPtrWillBeRawPtr<Widget> FrameLoaderClientImpl::createPlugin(
663 HTMLPlugInElement* element,
665 const Vector<String>& paramNames,
666 const Vector<String>& paramValues,
667 const String& mimeType,
669 DetachedPluginPolicy policy)
671 if (!m_webFrame->client())
674 WebPluginParams params;
676 params.mimeType = mimeType;
677 params.attributeNames = paramNames;
678 params.attributeValues = paramValues;
679 params.loadManually = loadManually;
681 WebPlugin* webPlugin = m_webFrame->client()->createPlugin(m_webFrame, params);
685 // The container takes ownership of the WebPlugin.
686 RefPtrWillBeRawPtr<WebPluginContainerImpl> container =
687 WebPluginContainerImpl::create(element, webPlugin);
689 if (!webPlugin->initialize(container.get())) {
691 container->dispose();
696 if (policy != AllowDetachedPlugin && !element->renderer()) {
698 container->dispose();
706 PassRefPtrWillBeRawPtr<Widget> FrameLoaderClientImpl::createJavaAppletWidget(
707 HTMLAppletElement* element,
708 const KURL& /* baseURL */,
709 const Vector<String>& paramNames,
710 const Vector<String>& paramValues)
712 return createPlugin(element, KURL(), paramNames, paramValues,
713 "application/x-java-applet", false, FailOnDetachedPlugin);
716 ObjectContentType FrameLoaderClientImpl::objectContentType(
718 const String& explicitMimeType,
719 bool shouldPreferPlugInsForImages)
721 // This code is based on Apple's implementation from
722 // WebCoreSupport/WebFrameBridge.mm.
724 String mimeType = explicitMimeType;
725 if (mimeType.isEmpty()) {
726 // Try to guess the MIME type based off the extension.
727 String filename = url.lastPathComponent();
728 int extensionPos = filename.reverseFind('.');
729 if (extensionPos >= 0) {
730 String extension = filename.substring(extensionPos + 1);
731 mimeType = MIMETypeRegistry::getMIMETypeForExtension(extension);
732 if (mimeType.isEmpty()) {
733 // If there's no mimetype registered for the extension, check to see
734 // if a plugin can handle the extension.
735 mimeType = getPluginMimeTypeFromExtension(extension);
739 if (mimeType.isEmpty())
740 return ObjectContentFrame;
743 // If Chrome is started with the --disable-plugins switch, pluginData is 0.
744 PluginData* pluginData = m_webFrame->frame()->page()->pluginData();
745 bool plugInSupportsMIMEType = pluginData && pluginData->supportsMimeType(mimeType);
747 if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType))
748 return shouldPreferPlugInsForImages && plugInSupportsMIMEType ? ObjectContentNetscapePlugin : ObjectContentImage;
750 if (plugInSupportsMIMEType)
751 return ObjectContentNetscapePlugin;
753 if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
754 return ObjectContentFrame;
756 return ObjectContentNone;
759 PassOwnPtr<WebPluginLoadObserver> FrameLoaderClientImpl::pluginLoadObserver(DocumentLoader* loader)
761 return WebDataSourceImpl::fromDocumentLoader(loader)->releasePluginLoadObserver();
764 WebCookieJar* FrameLoaderClientImpl::cookieJar() const
766 if (!m_webFrame->client())
768 return m_webFrame->client()->cookieJar(m_webFrame);
771 bool FrameLoaderClientImpl::willCheckAndDispatchMessageEvent(
772 SecurityOrigin* target, MessageEvent* event, LocalFrame* sourceFrame) const
774 if (!m_webFrame->client())
776 return m_webFrame->client()->willCheckAndDispatchMessageEvent(
777 WebLocalFrameImpl::fromFrame(sourceFrame), m_webFrame, WebSecurityOrigin(target), WebDOMMessageEvent(event));
780 void FrameLoaderClientImpl::didChangeName(const String& name)
782 if (!m_webFrame->client())
784 m_webFrame->client()->didChangeName(m_webFrame, name);
787 void FrameLoaderClientImpl::dispatchWillOpenWebSocket(WebSocketHandle* handle)
789 m_webFrame->client()->willOpenWebSocket(handle);
792 void FrameLoaderClientImpl::dispatchWillStartUsingPeerConnectionHandler(WebRTCPeerConnectionHandler* handler)
794 m_webFrame->client()->willStartUsingPeerConnectionHandler(webFrame(), handler);
797 void FrameLoaderClientImpl::didRequestAutocomplete(HTMLFormElement* form)
799 if (m_webFrame->viewImpl() && m_webFrame->viewImpl()->autofillClient())
800 m_webFrame->viewImpl()->autofillClient()->didRequestAutocomplete(WebFormElement(form));
803 bool FrameLoaderClientImpl::allowWebGL(bool enabledPerSettings)
805 if (m_webFrame->client())
806 return m_webFrame->client()->allowWebGL(m_webFrame, enabledPerSettings);
808 return enabledPerSettings;
811 void FrameLoaderClientImpl::didLoseWebGLContext(int arbRobustnessContextLostReason)
813 if (m_webFrame->client())
814 m_webFrame->client()->didLoseWebGLContext(m_webFrame, arbRobustnessContextLostReason);
817 void FrameLoaderClientImpl::dispatchWillInsertBody()
819 if (m_webFrame->client())
820 m_webFrame->client()->willInsertBody(m_webFrame);
822 if (m_webFrame->viewImpl())
823 m_webFrame->viewImpl()->willInsertBody(m_webFrame);
826 PassOwnPtr<WebServiceWorkerProvider> FrameLoaderClientImpl::createServiceWorkerProvider()
828 if (!m_webFrame->client())
830 return adoptPtr(m_webFrame->client()->createServiceWorkerProvider(m_webFrame));
833 bool FrameLoaderClientImpl::isControlledByServiceWorker(DocumentLoader& loader)
835 return m_webFrame->client() && m_webFrame->client()->isControlledByServiceWorker(*WebDataSourceImpl::fromDocumentLoader(&loader));
838 int64_t FrameLoaderClientImpl::serviceWorkerID(DocumentLoader& loader)
840 if (!m_webFrame->client())
842 return m_webFrame->client()->serviceWorkerID(*WebDataSourceImpl::fromDocumentLoader(&loader));
845 SharedWorkerRepositoryClient* FrameLoaderClientImpl::sharedWorkerRepositoryClient()
847 return m_webFrame->sharedWorkerRepositoryClient();
850 PassOwnPtr<WebApplicationCacheHost> FrameLoaderClientImpl::createApplicationCacheHost(WebApplicationCacheHostClient* client)
852 if (!m_webFrame->client())
854 return adoptPtr(m_webFrame->client()->createApplicationCacheHost(m_webFrame, client));
857 void FrameLoaderClientImpl::didStopAllLoaders()
859 if (m_webFrame->client())
860 m_webFrame->client()->didAbortLoading(m_webFrame);
863 void FrameLoaderClientImpl::dispatchDidChangeManifest()
865 if (m_webFrame->client())
866 m_webFrame->client()->didChangeManifest(m_webFrame);
869 unsigned FrameLoaderClientImpl::backForwardLength()
871 WebViewImpl* webview = m_webFrame->viewImpl();
872 if (!webview || !webview->client())
874 return webview->client()->historyBackListCount() + 1 + webview->client()->historyForwardListCount();