1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/render_frame_impl.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <map> 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <string> 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/command_line.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/i18n/char_iterator.h" 12bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/strings/utf_string_conversions.h" 13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/time/time.h" 14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/child/appcache/appcache_dispatcher.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/child/plugin_messages.h" 16bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/child/quota_dispatcher.h" 17bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/child/request_extra_data.h" 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/child/service_worker/web_service_worker_provider_impl.h" 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/frame_messages.h" 20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/common/socket_stream_handle_data.h" 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/common/swapped_out_messages.h" 22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/common/view_messages.h" 23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/common/content_constants.h" 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/common/content_switches.h" 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/common/url_constants.h" 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/renderer/content_renderer_client.h" 27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/renderer/document_state.h" 28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/renderer/navigation_state.h" 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer.h" 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/accessibility/renderer_accessibility.h" 31bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/browser_plugin/browser_plugin.h" 32bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/browser_plugin/browser_plugin_manager.h" 33bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/internal_document_state_data.h" 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/renderer/npapi/plugin_channel_host.h" 35bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/render_thread_impl.h" 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/render_view_impl.h" 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/render_widget_fullscreen_pepper.h" 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/renderer/renderer_webapplicationcachehost_impl.h" 39bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/websharedworker_proxy.h" 40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "net/base/net_errors.h" 41bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "net/http/http_util.h" 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" 43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebString.h" 44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebURL.h" 45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebURLError.h" 46bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebURLResponse.h" 47bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/platform/WebVector.h" 48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebDocument.h" 49bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebFrame.h" 50bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebNavigationPolicy.h" 51bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebPlugin.h" 52bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebPluginParams.h" 53bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebSearchableFormData.h" 54bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebSecurityOrigin.h" 55bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebView.h" 57bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "webkit/child/weburlresponse_extradata_impl.h" 58bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/npapi/webplugin_impl.h" 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/pepper/pepper_browser_connection.h" 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/pepper/pepper_webplugin_impl.h" 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/pepper/plugin_module.h" 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_WEBRTC) 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/renderer/media/rtc_peer_connection_handler.h" 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDataSource; 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDocument; 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame; 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebNavigationPolicy; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginParams; 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebReferrerPolicy; 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSearchableFormData; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSecurityOrigin; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebServiceWorkerProvider; 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebStorageQuotaCallbacks; 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURL; 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLError; 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLResponse; 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebUserGestureIndicator; 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector; 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebView; 89bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochusing base::Time; 90bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochusing base::TimeDelta; 91bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochusing webkit_glue::WebURLResponseExtraDataImpl; 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap; 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::LazyInstance<FrameMap> g_child_frame_map = LAZY_INSTANCE_INITIALIZER; 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NULL; 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochRenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int32 routing_id) { 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(routing_id != MSG_ROUTING_NONE); 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (g_create_render_frame_impl) 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return g_create_render_frame_impl(render_view, routing_id); 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return new RenderFrameImpl(render_view, routing_id); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderFrameImpl::InstallCreateHook( 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(!g_create_render_frame_impl); 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch g_create_render_frame_impl = create_render_frame_impl; 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// RenderFrameImpl ---------------------------------------------------------- 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : render_view_(render_view), 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) routing_id_(routing_id), 127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_swapped_out_(false), 128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_detaching_(false) { 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderThread::Get()->AddRoute(routing_id_, this); 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new PepperBrowserConnection(this); 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetContentClient()->renderer()->RenderFrameCreated(this); 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)RenderFrameImpl::~RenderFrameImpl() { 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderThread::Get()->RemoveRoute(routing_id_); 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderWidget* RenderFrameImpl::GetRenderWidget() { 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_; 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) { 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidCreatePepperPlugin(host)); 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperInstanceCreated( 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) active_pepper_instances_.insert(instance); 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperInstanceDeleted( 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) active_pepper_instances_.erase(instance); 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (render_view_->pepper_last_mouse_event_target() == instance) 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->set_pepper_last_mouse_event_target(NULL); 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (render_view_->focused_pepper_plugin() == instance) 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperFocusChanged(instance, false); 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperDidChangeCursor( 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance, 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebCursorInfo& cursor) { 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Update the cursor appearance immediately if the requesting plugin is the 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // one which receives the last mouse event. Otherwise, the new cursor won't be 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // picked up until the plugin gets the next input event. That is bad if, e.g., 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the plugin would like to set an invisible cursor when there isn't any user 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // input for a while. 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance == render_view_->pepper_last_mouse_event_target()) 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->didChangeCursor(cursor); 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperDidReceiveMouseEvent( 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->set_pepper_last_mouse_event_target(instance); 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperFocusChanged(PepperPluginInstanceImpl* instance, 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool focused) { 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (focused) 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->set_focused_pepper_plugin(instance); 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (render_view_->focused_pepper_plugin() == instance) 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->set_focused_pepper_plugin(NULL); 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->UpdateTextInputType(); 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->UpdateSelectionBounds(); 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperTextInputTypeChanged( 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance != render_view_->focused_pepper_plugin()) 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->UpdateTextInputType(); 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (render_view_->renderer_accessibility()) { 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->renderer_accessibility()->FocusedNodeChanged( 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebNode()); 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperCaretPositionChanged( 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance != render_view_->focused_pepper_plugin()) 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->UpdateSelectionBounds(); 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperCancelComposition( 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance != render_view_->focused_pepper_plugin()) 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new ViewHostMsg_ImeCancelComposition(render_view_->GetRoutingID()));; 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->UpdateCompositionInfo(true); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PepperSelectionChanged( 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance) { 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (instance != render_view_->focused_pepper_plugin()) 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->SyncSelectionIfRequired(); 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer( 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* plugin) { 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GURL active_url; 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (render_view_->webview() && render_view_->webview()->mainFrame()) 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) active_url = GURL(render_view_->webview()->mainFrame()->document().url()); 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderWidgetFullscreenPepper* widget = RenderWidgetFullscreenPepper::Create( 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->routing_id(), plugin, active_url, 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->screenInfo()); 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) widget->show(blink::WebNavigationPolicyIgnore); 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return widget; 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool RenderFrameImpl::IsPepperAcceptingCompositionEvents() const { 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!render_view_->focused_pepper_plugin()) 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_->focused_pepper_plugin()-> 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IsPluginAcceptingCompositionEvents(); 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PluginCrashed(const base::FilePath& plugin_path, 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::ProcessId plugin_pid) { 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(jam): dispatch this IPC in RenderFrameHost and switch to use 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // routing_id_ as a result. 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new FrameHostMsg_PluginCrashed(routing_id_, plugin_path, plugin_pid)); 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::DidInitiatePaint() { 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Notify all instances that we painted. The same caveats apply as for 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // ViewFlushedPaint regarding instances closing themselves, so we take 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // similar precautions. 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginSet plugins = active_pepper_instances_; 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) { 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (active_pepper_instances_.find(*i) != active_pepper_instances_.end()) 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*i)->ViewInitiatedPaint(); 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::DidFlushPaint() { 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Notify all instances that we flushed. This will call into the plugin, and 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // we it may ask to close itself as a result. This will, in turn, modify our 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // set, possibly invalidating the iterator. So we iterate on a copy that 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // won't change out from under us. 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginSet plugins = active_pepper_instances_; 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) { 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The copy above makes sure our iterator is never invalid if some plugins 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // are destroyed. But some plugin may decide to close all of its views in 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // response to a paint in one of them, so we need to make sure each one is 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // still "current" before using it. 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // It's possible that a plugin was destroyed, but another one was created 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // with the same address. In this case, we'll call ViewFlushedPaint on that 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // new plugin. But that's OK for this particular case since we're just 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // notifying all of our instances that the view flushed, and the new one is 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // one of our instances. 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // What about the case where a new one is created in a callback at a new 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // address and we don't issue the callback? We're still OK since this 289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // callback is used for flush callbacks and we could not have possibly 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // started a new paint for the new plugin while processing a previous paint 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // for an existing one. 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (active_pepper_instances_.find(*i) != active_pepper_instances_.end()) 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*i)->ViewFlushedPaint(); 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PepperPluginInstanceImpl* RenderFrameImpl::GetBitmapForOptimizedPluginPaint( 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Rect& paint_bounds, 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TransportDIB** dib, 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect* location, 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect* clip, 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float* scale_factor) { 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) i != active_pepper_instances_.end(); ++i) { 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperPluginInstanceImpl* instance = *i; 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // In Flash fullscreen , the plugin contents should be painted onto the 307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // fullscreen widget instead of the web page. 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance->FlashIsFullscreenOrPending() && 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) instance->GetBitmapForOptimizedPluginPaint(paint_bounds, dib, location, 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) clip, scale_factor)) 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return *i; 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::PageVisibilityChanged(bool shown) { 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Inform PPAPI plugins that their page is no longer visible. 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) i != active_pepper_instances_.end(); ++i) 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*i)->PageVisibilityChanged(shown); 321bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 322bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::OnSetFocus(bool enable) { 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Notify all Pepper plugins. 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (PepperPluginSet::iterator i = active_pepper_instances_.begin(); 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) i != active_pepper_instances_.end(); ++i) 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*i)->SetContentAreaFocus(enable); 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::WillHandleMouseEvent(const blink::WebMouseEvent& event) { 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This method is called for every mouse event that the render view receives. 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // And then the mouse event is forwarded to WebKit, which dispatches it to the 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // event target. Potentially a Pepper plugin will receive the event. 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // In order to tell whether a plugin gets the last mouse event and which it 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // is, we set |pepper_last_mouse_event_target_| to NULL here. If a plugin gets 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the event, it will notify us via DidReceiveMouseEvent() and set itself as 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |pepper_last_mouse_event_target_|. 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->set_pepper_last_mouse_event_target(NULL); 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::SimulateImeSetComposition( 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<blink::WebCompositionUnderline>& underlines, 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int selection_start, 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int selection_end) { 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->OnImeSetComposition( 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) text, underlines, selection_start, selection_end); 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::SimulateImeConfirmComposition( 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Range& replacement_range) { 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->OnImeConfirmComposition(text, replacement_range, false); 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::OnImeSetComposition( 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<blink::WebCompositionUnderline>& underlines, 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int selection_start, 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int selection_end) { 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When a PPAPI plugin has focus, we bypass WebKit. 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!IsPepperAcceptingCompositionEvents()) { 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_composition_text_ = text; 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(kinaba) currently all composition events are sent directly to 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // plugins. Use DOM event mechanism after WebKit is made aware about 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // plugins that support composition. 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The code below mimics the behavior of WebCore::Editor::setComposition. 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Empty -> nonempty: composition started. 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pepper_composition_text_.empty() && !text.empty()) { 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleCompositionStart( 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Nonempty -> empty: composition canceled. 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!pepper_composition_text_.empty() && text.empty()) { 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleCompositionEnd( 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_composition_text_ = text; 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Nonempty: composition is ongoing. 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!pepper_composition_text_.empty()) { 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleCompositionUpdate( 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_composition_text_, underlines, selection_start, 386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) selection_end); 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::OnImeConfirmComposition( 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Range& replacement_range, 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool keep_selection) { 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When a PPAPI plugin has focus, we bypass WebKit. 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Here, text.empty() has a special meaning. It means to commit the last 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // update of composition text (see 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RenderWidgetHost::ImeConfirmComposition()). 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& last_text = text.empty() ? pepper_composition_text_ 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : text; 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // last_text is empty only when both text and pepper_composition_text_ is. 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ignore it. 404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (last_text.empty()) 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!IsPepperAcceptingCompositionEvents()) { 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::i18n::UTF16CharIterator iterator(&last_text); 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int32 i = 0; 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (iterator.Advance()) { 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebKeyboardEvent char_event; 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.type = blink::WebInputEvent::Char; 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.timeStampSeconds = base::Time::Now().ToDoubleT(); 414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.modifiers = 0; 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.windowsKeyCode = last_text[i]; 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.nativeKeyCode = last_text[i]; 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const int32 char_start = i; 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (; i < iterator.array_pos(); ++i) { 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.text[i - char_start] = last_text[i]; 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) char_event.unmodifiedText[i - char_start] = last_text[i]; 422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (GetRenderWidget()->webwidget()) 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRenderWidget()->webwidget()->handleInputEvent(char_event); 426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Mimics the order of events sent by WebKit. 429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See WebCore::Editor::setComposition() for the corresponding code. 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleCompositionEnd(last_text); 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_->focused_pepper_plugin()->HandleTextInput(last_text); 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_composition_text_.clear(); 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // ENABLE_PLUGINS 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool RenderFrameImpl::Send(IPC::Message* message) { 439424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (is_detaching_ || 4408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ((is_swapped_out_ || render_view_->is_swapped_out()) && 441424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) !SwappedOutMessages::CanSendWhileSwappedOut(message))) { 442424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delete message; 443424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 444424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 445424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 446424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return RenderThread::Get()->Send(message); 447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ObserverListBase<RenderFrameObserver>::Iterator it(observers_); 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameObserver* observer; 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while ((observer = it.GetNext()) != NULL) { 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (observer->OnMessageReceived(msg)) 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 457424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // TODO(ajwong): Fill in with message handlers as various components 458424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // are migrated over to understand frames. 459424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderView* RenderFrameImpl::GetRenderView() { 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_; 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int RenderFrameImpl::GetRoutingID() { 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return routing_id_; 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebPreferences& RenderFrameImpl::GetWebkitPreferences() { 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_->GetWebkitPreferences(); 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int RenderFrameImpl::ShowContextMenu(ContextMenuClient* client, 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const ContextMenuParams& params) { 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_->ShowContextMenu(client, params); 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::CancelContextMenu(int request_id) { 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_->CancelContextMenu(request_id); 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)blink::WebPlugin* RenderFrameImpl::CreatePlugin( 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const WebPluginInfo& info, 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebPluginParams& params) { 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(ENABLE_PLUGINS) 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool pepper_plugin_was_registered = false; 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_refptr<PluginModule> pepper_module(PluginModule::Create( 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, info, &pepper_plugin_was_registered)); 491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pepper_plugin_was_registered) { 492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pepper_module.get()) { 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(jam): change to take RenderFrame. 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return new PepperWebPluginImpl( 495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pepper_module.get(), params, render_view_->AsWeakPtr(), this); 496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_CHROMEOS) 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(WARNING) << "Pepper module/plugin creation failed."; 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(jam): change to take RenderFrame. 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return new WebPluginImpl(frame, params, info.path, render_view_->AsWeakPtr(), 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this); 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::LoadURLExternally( 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebURLRequest& request, 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebNavigationPolicy policy) { 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) loadURLExternally(frame, request, policy); 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// blink::WebFrameClient implementation ---------------------------------------- 5197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebPlugin* RenderFrameImpl::createPlugin( 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebPluginParams& params) { 523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPlugin* plugin = NULL; 524bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (GetContentClient()->renderer()->OverrideCreatePlugin( 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, frame, params, &plugin)) { 526bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return plugin; 527bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 528bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 529bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (UTF16ToASCII(params.mimeType) == kBrowserPluginMimeType) { 530bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_, frame); 532bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 533bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 535bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebPluginInfo info; 536bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch std::string mime_type; 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool found = false; 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new FrameHostMsg_GetPluginInfo( 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) routing_id_, params.url, frame->top()->document().url(), 540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.mimeType.utf8(), &found, &info, &mime_type)); 541bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!found) 542bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return NULL; 543bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 544bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebPluginParams params_to_use = params; 545bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch params_to_use.mimeType = WebString::fromUTF8(mime_type); 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return CreatePlugin(frame, info, params_to_use); 547bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#else 548bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return NULL; 549bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif // defined(ENABLE_PLUGINS) 5507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer( 553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url, 555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayerClient* client) { 556bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Moving the implementation here involves moving a few media 557bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // related client objects here or referencing them in the RenderView. Needs 558bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // more work to understand where the proper place for those objects is. 559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_view_->CreateMediaPlayer(this, frame, url, client); 5607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost( 563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebApplicationCacheHostClient* client) { 565bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!frame || !frame->view()) 566bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return NULL; 567bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return new RendererWebApplicationCacheHostImpl( 568bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderViewImpl::FromWebView(frame->view()), client, 569bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderThreadImpl::current()->appcache_dispatcher()->backend_proxy()); 5707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebWorkerPermissionClientProxy* 5730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)RenderFrameImpl::createWorkerPermissionClientProxy(WebFrame* frame) { 5740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!frame || !frame->view()) 5750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return NULL; 5760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return GetContentClient()->renderer()->CreateWorkerPermissionClientProxy( 5770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) RenderViewImpl::FromWebView(frame->view()), frame); 5780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 5790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebCookieJar* RenderFrameImpl::cookieJar(blink::WebFrame* frame) { 5817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return render_view_->cookieJar(frame); 5827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebServiceWorkerProvider* RenderFrameImpl::createServiceWorkerProvider( 585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebServiceWorkerProviderClient* client) { 5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return new WebServiceWorkerProviderImpl( 5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ChildThread::current()->thread_safe_sender(), 5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) make_scoped_ptr(client)); 5901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 5911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { 5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didAccessInitialDocument(frame); 5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebFrame* RenderFrameImpl::createChildFrame( 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* parent, 598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& name) { 5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RenderFrameImpl* child_render_frame = this; 6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); 6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Synchronously notify the browser of a child frame creation to get the 6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // routing_id for the RenderFrame. 6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int routing_id; 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new FrameHostMsg_CreateChildFrame(routing_id_, 6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) parent->identifier(), 6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) child_frame_identifier, 6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UTF16ToUTF8(name), 6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &routing_id)); 6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); 6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* web_frame = WebFrame::create(child_render_frame, 614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) child_frame_identifier); 6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) g_child_frame_map.Get().insert( 6184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::make_pair(web_frame, child_render_frame)); 6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return web_frame; 6227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { 6257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didDisownOpener(frame); 6267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { 629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // NOTE: This function is called on the frame that is being detached and not 630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the parent frame. This is different from createChildFrame() which is 631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // called on the parent frame. 632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(!is_detaching_); 633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int64 parent_frame_id = -1; 635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (frame->parent()) 636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) parent_frame_id = frame->parent()->identifier(); 637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id, 639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) frame->identifier())); 640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 641424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Currently multiple WebCore::Frames can send frameDetached to a single 642424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served 643424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // as a shared WebFrameClient for multiple Webcore::Frame objects. It also 644424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // prevents this class from entering the |is_detaching_| state because 645424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // even though one WebCore::Frame may have detached itself, others will 646424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // still need to use this object. 647424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be 649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // sent before setting |is_detaching_| to true. In contrast, Observers 650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // should only be notified afterwards so they cannot call back into and 651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // have IPCs fired off. 652424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_detaching_ = true; 653424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 654424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 655bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Call back to RenderViewImpl for observers to be notified. 656bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Remove once we have RenderFrameObserver. 6577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->frameDetached(frame); 6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) frame->close(); 660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If the frame does not have a parent, it is the main frame. The main 663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // frame is owned by the containing RenderViewHost so it does not require 664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // any cleanup here. 665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (frame->parent()) { 666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FrameMap::iterator it = g_child_frame_map.Get().find(frame); 667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(it != g_child_frame_map.Get().end()); 668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK_EQ(it->second, this); 669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_child_frame_map.Get().erase(it); 670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delete this; 671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Object is invalid after this point. 672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::willClose(blink::WebFrame* frame) { 677bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Call back to RenderViewImpl for observers to be notified. 678bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Remove once we have RenderFrameObserver. 6797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->willClose(frame); 6807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didChangeName(blink::WebFrame* frame, 683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& name) { 684bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!render_view_->renderer_preferences_.report_frame_name_changes) 685bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 686bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 687424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send( 688424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new ViewHostMsg_UpdateFrameName(render_view_->GetRoutingID(), 689424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) frame->identifier(), 690424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) !frame->parent(), 691424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) UTF16ToUTF8(name))); 6927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void RenderFrameImpl::didMatchCSS( 695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<blink::WebString>& newly_matching_selectors, 697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<blink::WebString>& stopped_matching_selectors) { 6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) render_view_->didMatchCSS( 6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame, newly_matching_selectors, stopped_matching_selectors); 7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::loadURLExternally(blink::WebFrame* frame, 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLRequest& request, 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNavigationPolicy policy) { 705bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch loadURLExternally(frame, request, policy, WebString()); 7067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::loadURLExternally( 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLRequest& request, 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNavigationPolicy policy, 712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& suggested_name) { 713bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch Referrer referrer(RenderViewImpl::GetReferrerFromRequest(frame, request)); 714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (policy == blink::WebNavigationPolicyDownload) { 715424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DownloadUrl(render_view_->GetRoutingID(), 716424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request.url(), referrer, 717424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) suggested_name)); 718bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } else { 719bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch render_view_->OpenURL(frame, request.url(), referrer, policy); 720bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 7217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( 724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDataSource::ExtraData* extra_data, 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLRequest& request, 727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNavigationType type, 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNavigationPolicy default_policy, 7293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_redirect) { 7303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return render_view_->decidePolicyForNavigation( 7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) frame, extra_data, request, type, default_policy, is_redirect); 7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation( 735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLRequest& request, 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNavigationType type, 738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNavigationPolicy default_policy, 7397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool is_redirect) { 7407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return render_view_->decidePolicyForNavigation( 7417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) frame, request, type, default_policy, is_redirect); 7427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::willSendSubmitEvent(blink::WebFrame* frame, 745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebFormElement& form) { 7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Call back to RenderViewImpl for observers to be notified. 7473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(nasko): Remove once we have RenderFrameObserver. 7483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) render_view_->willSendSubmitEvent(frame, form); 7497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::willSubmitForm(blink::WebFrame* frame, 752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebFormElement& form) { 753bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState* document_state = 754bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState::FromDataSource(frame->provisionalDataSource()); 755bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NavigationState* navigation_state = document_state->navigation_state(); 756bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData* internal_data = 757bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData::FromDocumentState(document_state); 758bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 759bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (PageTransitionCoreTypeIs(navigation_state->transition_type(), 760bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PAGE_TRANSITION_LINK)) { 761bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_state->set_transition_type(PAGE_TRANSITION_FORM_SUBMIT); 762bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 763bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 764bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Save these to be processed when the ensuing navigation is committed. 765bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebSearchableFormData web_searchable_form_data(form); 766bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->set_searchable_form_url(web_searchable_form_data.url()); 767bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->set_searchable_form_encoding( 768bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch web_searchable_form_data.encoding().utf8()); 769bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 770bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Call back to RenderViewImpl for observers to be notified. 771bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Remove once we have RenderFrameObserver. 7727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->willSubmitForm(frame, form); 7737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didCreateDataSource(blink::WebFrame* frame, 776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDataSource* datasource) { 777bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 778bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * pending_navigation_params_ 779bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * webview 780bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Needed methods: 781bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * PopulateDocumentStateFromPending 782bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * CreateNavigationStateFromPending 7837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didCreateDataSource(frame, datasource); 7847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didStartProvisionalLoad(blink::WebFrame* frame) { 7878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebDataSource* ds = frame->provisionalDataSource(); 7888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // In fast/loader/stop-provisional-loads.html, we abort the load before this 7908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // callback is invoked. 7918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!ds) 7928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 7938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DocumentState* document_state = DocumentState::FromDataSource(ds); 7958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // We should only navigate to swappedout:// when is_swapped_out_ is true. 7978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CHECK((ds->request().url() != GURL(kSwappedOutURL)) || 7988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) render_view_->is_swapped_out()) << 7998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) "Heard swappedout:// when not swapped out."; 8008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Update the request time if WebKit has better knowledge of it. 8028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (document_state->request_time().is_null()) { 8038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) double event_time = ds->triggeringEventTime(); 8048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (event_time != 0.0) 8058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) document_state->set_request_time(Time::FromDoubleT(event_time)); 8068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 8078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Start time is only set after request time. 8098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) document_state->set_start_load_time(Time::Now()); 8108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool is_top_most = !frame->parent(); 8128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_top_most) { 8138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) render_view_->set_navigation_gesture( 8148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebUserGestureIndicator::isProcessingUserGesture() ? 8158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NavigationGestureUser : NavigationGestureAuto); 8168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else if (ds->replacesCurrentHistoryItem()) { 8178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Subframe navigations that don't add session history items must be 8188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we 8198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // handle loading of error pages. 8208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) document_state->navigation_state()->set_transition_type( 8218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) PAGE_TRANSITION_AUTO_SUBFRAME); 8228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 8238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FOR_EACH_OBSERVER( 8258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderViewObserver, render_view_->observers(), 8268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DidStartProvisionalLoad(frame)); 8278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Send(new FrameHostMsg_DidStartProvisionalLoadForFrame( 8298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) routing_id_, frame->identifier(), 8308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->parent() ? frame->parent()->identifier() : -1, 8318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) is_top_most, ds->request().url())); 8327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( 835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame) { 836bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 837bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * page_id_ 8387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didReceiveServerRedirectForProvisionalLoad(frame); 8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didFailProvisionalLoad( 842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLError& error) { 844bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 845bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * page_id_ 846bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * pending_navigation_params_ 847bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Needed methods 848bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * MaybeLoadAlternateErrorPage 849bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * LoadNavigationErrorPage 8507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didFailProvisionalLoad(frame, error); 8517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didCommitProvisionalLoad(blink::WebFrame* frame, 8547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool is_new_navigation) { 855bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 856bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * page_id_ 857bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * next_page_id_ 858bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * history_list_offset_ 859bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * history_list_length_ 860bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * history_page_ids_ 861bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Needed methods 862bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * webview 863bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * UpdateSessionHistory 864bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * GetLoadingUrl 8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didCommitProvisionalLoad(frame, is_new_navigation); 8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didClearWindowObject(blink::WebFrame* frame) { 869bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 870bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * enabled_bindings_ 871bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * dom_automation_controller_ 872bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * stats_collection_controller_ 8737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didClearWindowObject(frame); 8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didCreateDocumentElement(blink::WebFrame* frame) { 877bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Notify the browser about non-blank documents loading in the top frame. 878bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL url = frame->document().url(); 879bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (url.is_valid() && url.spec() != kAboutBlankURL) { 880bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Check if webview()->mainFrame() is the same as the 881bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // frame->tree()->top(). 882424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (frame == render_view_->webview()->mainFrame()) { 883424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DocumentAvailableInMainFrame( 884424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID())); 885424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 886bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 887bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 888bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Call back to RenderViewImpl for observers to be notified. 889bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Remove once we have RenderFrameObserver. 8907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didCreateDocumentElement(frame); 8917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didReceiveTitle(blink::WebFrame* frame, 894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& title, 895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebTextDirection direction) { 896bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Investigate wheather implementation should move here. 8977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didReceiveTitle(frame, title, direction); 8987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didChangeIcon(blink::WebFrame* frame, 901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIconURL::Type icon_type) { 902bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Investigate wheather implementation should move here. 9037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didChangeIcon(frame, icon_type); 9047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didFinishDocumentLoad(blink::WebFrame* frame) { 907bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. No state needed, just observers 908bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // notification in before updating encoding. 9097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didFinishDocumentLoad(frame); 9107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 912f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didHandleOnloadEvents(blink::WebFrame* frame) { 913bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 914bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * page_id_ 9157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didHandleOnloadEvents(frame); 9167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didFailLoad(blink::WebFrame* frame, 919f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLError& error) { 920bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. No state needed. 9217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didFailLoad(frame, error); 9227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didFinishLoad(blink::WebFrame* frame) { 925bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. No state needed, just observers 926bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // notification before sending message to the browser process. 9277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didFinishLoad(frame); 9287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didNavigateWithinPage(blink::WebFrame* frame, 9317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool is_new_navigation) { 932bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. No state needed, just observers 933bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // notification before sending message to the browser process. 9347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didNavigateWithinPage(frame, is_new_navigation); 9357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didUpdateCurrentHistoryItem(blink::WebFrame* frame) { 938bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed methods: 939bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * StartNavStateSyncTimerIfNecessary 9407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didUpdateCurrentHistoryItem(frame); 9417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 9427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 943558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid RenderFrameImpl::willRequestAfterPreconnect( 944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLRequest& request) { 946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebReferrerPolicy referrer_policy = blink::WebReferrerPolicyDefault; 947558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebString custom_user_agent; 948558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 949558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (request.extraData()) { 950558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // This will only be called before willSendRequest, so only ExtraData 951558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // members we have to copy here is on WebURLRequestExtraDataImpl. 952558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch webkit_glue::WebURLRequestExtraDataImpl* old_extra_data = 953558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch static_cast<webkit_glue::WebURLRequestExtraDataImpl*>( 954558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch request.extraData()); 955558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 956558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch referrer_policy = old_extra_data->referrer_policy(); 957558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch custom_user_agent = old_extra_data->custom_user_agent(); 958558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 959558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 960558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool was_after_preconnect_request = true; 961558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The args after |was_after_preconnect_request| are not used, and set to 962558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // correct values at |willSendRequest|. 963558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch request.setExtraData(new webkit_glue::WebURLRequestExtraDataImpl( 964558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch referrer_policy, custom_user_agent, was_after_preconnect_request)); 965558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 966558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 9677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::willSendRequest( 968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 9697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned identifier, 970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLRequest& request, 971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& redirect_response) { 972bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // The request my be empty during tests. 973bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (request.url().isEmpty()) 974bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 975bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 976bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebFrame* top_frame = frame->top(); 977bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!top_frame) 978bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch top_frame = frame; 979bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDataSource* provisional_data_source = top_frame->provisionalDataSource(); 980bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDataSource* top_data_source = top_frame->dataSource(); 981bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDataSource* data_source = 982bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch provisional_data_source ? provisional_data_source : top_data_source; 983bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 984bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PageTransition transition_type = PAGE_TRANSITION_LINK; 985bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState* document_state = DocumentState::FromDataSource(data_source); 986bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(document_state); 987bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData* internal_data = 988bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData::FromDocumentState(document_state); 989bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch NavigationState* navigation_state = document_state->navigation_state(); 990bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch transition_type = navigation_state->transition_type(); 991bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 992bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL request_url(request.url()); 993bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL new_url; 994bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (GetContentClient()->renderer()->WillSendRequest( 995bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch frame, 996bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch transition_type, 997bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request_url, 998bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.firstPartyForCookies(), 999bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch &new_url)) { 1000bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setURL(WebURL(new_url)); 1001bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1002bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1003bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (internal_data->is_cache_policy_override_set()) 1004bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setCachePolicy(internal_data->cache_policy_override()); 1005bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1006f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebReferrerPolicy referrer_policy; 1007bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (internal_data->is_referrer_policy_set()) { 1008bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch referrer_policy = internal_data->referrer_policy(); 1009bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->clear_referrer_policy(); 1010bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } else { 1011bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch referrer_policy = frame->document().referrerPolicy(); 1012bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1013bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1014bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // The request's extra data may indicate that we should set a custom user 1015bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // agent. This needs to be done here, after WebKit is through with setting the 1016bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // user agent on its own. 1017bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebString custom_user_agent; 1018558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool was_after_preconnect_request = false; 1019bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (request.extraData()) { 1020bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch webkit_glue::WebURLRequestExtraDataImpl* old_extra_data = 1021bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch static_cast<webkit_glue::WebURLRequestExtraDataImpl*>( 1022bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.extraData()); 1023bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch custom_user_agent = old_extra_data->custom_user_agent(); 1024558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch was_after_preconnect_request = 1025558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch old_extra_data->was_after_preconnect_request(); 1026bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1027bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!custom_user_agent.isNull()) { 1028bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (custom_user_agent.isEmpty()) 1029bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.clearHTTPHeaderField("User-Agent"); 1030bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch else 1031bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setHTTPHeaderField("User-Agent", custom_user_agent); 1032bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1033bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1034bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1035f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Attach |should_replace_current_entry| state to requests so that, should 1036f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // this navigation later require a request transfer, all state is preserved 1037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // when it is re-created in the new process. 1038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool should_replace_current_entry = false; 1039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (navigation_state->is_content_initiated()) { 1040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_replace_current_entry = data_source->replacesCurrentHistoryItem(); 1041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 1042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If the navigation is browser-initiated, the NavigationState contains the 1043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // correct value instead of the WebDataSource. 1044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(davidben): Avoid this awkward duplication of state. See comment on 1046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // NavigationState::should_replace_current_entry(). 1047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_replace_current_entry = 1048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) navigation_state->should_replace_current_entry(); 1049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1050bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setExtraData( 1051bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch new RequestExtraData(referrer_policy, 1052bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch custom_user_agent, 1053558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch was_after_preconnect_request, 1054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) routing_id_, 1055bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch (frame == top_frame), 1056bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch frame->identifier(), 1057424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GURL(frame->document().securityOrigin().toString()), 1058bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch frame->parent() == top_frame, 1059bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch frame->parent() ? frame->parent()->identifier() : -1, 1060bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_state->allow_download(), 1061bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch transition_type, 1062f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_replace_current_entry, 1063bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_state->transferred_request_child_id(), 1064bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_state->transferred_request_request_id())); 1065bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1066bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState* top_document_state = 1067bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState::FromDataSource(top_data_source); 1068558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (top_document_state) { 1069558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // TODO(gavinp): separate out prefetching and prerender field trials 1070558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // if the rel=prerender rel type is sticking around. 1071558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (request.targetType() == WebURLRequest::TargetIsPrefetch) 1072558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch top_document_state->set_was_prefetcher(true); 1073558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1074558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (was_after_preconnect_request) 1075558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch top_document_state->set_was_after_preconnect_request(true); 1076558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 1077bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1078bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // This is an instance where we embed a copy of the routing id 1079bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // into the data portion of the message. This can cause problems if we 1080bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // don't register this id on the browser side, since the download manager 1081bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // expects to find a RenderViewHost based off the id. 1082424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request.setRequestorID(render_view_->GetRoutingID()); 1083bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setHasUserGesture(WebUserGestureIndicator::isProcessingUserGesture()); 1084bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1085bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!navigation_state->extra_headers().empty()) { 1086bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch for (net::HttpUtil::HeadersIterator i( 1087bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_state->extra_headers().begin(), 1088bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_state->extra_headers().end(), "\n"); 1089bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch i.GetNext(); ) { 1090bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.setHTTPHeaderField(WebString::fromUTF8(i.name()), 1091bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebString::fromUTF8(i.values())); 1092bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1093bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1094bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1095bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!render_view_->renderer_preferences_.enable_referrers) 1096bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.clearHTTPHeaderField("Referer"); 10977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 10987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didReceiveResponse( 1100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 11017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned identifier, 1102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response) { 1103bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Only do this for responses that correspond to a provisional data source 1104bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // of the top-most frame. If we have a provisional data source, then we 1105bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // can't have any sub-resources yet, so we know that this response must 1106bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // correspond to a frame load. 1107bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!frame->provisionalDataSource() || frame->parent()) 1108bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 1109bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1110bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // If we are in view source mode, then just let the user see the source of 1111bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // the server's error page. 1112bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (frame->isViewSourceModeEnabled()) 1113bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 1114bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1115bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState* document_state = 1116bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DocumentState::FromDataSource(frame->provisionalDataSource()); 1117bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int http_status_code = response.httpStatusCode(); 1118bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Record page load flags. 1120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebURLResponseExtraDataImpl* extra_data = 1121bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RenderViewImpl::GetExtraDataFromResponse(response); 1122bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (extra_data) { 1123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_was_fetched_via_spdy( 1124bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->was_fetched_via_spdy()); 1125bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_was_npn_negotiated( 1126bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->was_npn_negotiated()); 1127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_npn_negotiated_protocol( 1128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->npn_negotiated_protocol()); 1129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_was_alternate_protocol_available( 1130bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->was_alternate_protocol_available()); 1131bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_connection_info( 1132bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->connection_info()); 1133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch document_state->set_was_fetched_via_proxy( 1134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch extra_data->was_fetched_via_proxy()); 1135bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1136bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData* internal_data = 1137bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData::FromDocumentState(document_state); 1138bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->set_http_status_code(http_status_code); 1139bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Whether or not the http status code actually corresponds to an error is 1140bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // only checked when the page is done loading, if |use_error_page| is 1141bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // still true. 1142bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch internal_data->set_use_error_page(true); 11437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didFinishResourceLoad(blink::WebFrame* frame, 11467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned identifier) { 1147bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 1148bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * devtools_agent_ 1149bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Needed methods: 1150bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * LoadNavigationErrorPage 11517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didFinishResourceLoad(frame, identifier); 11527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didLoadResourceFromMemoryCache( 1155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 1156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLRequest& request, 1157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response) { 1158bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // The recipients of this message have no use for data: URLs: they don't 1159bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // affect the page's insecure content list and are not in the disk cache. To 1160bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // prevent large (1M+) data: URLs from crashing in the IPC system, we simply 1161bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // filter them out here. 1162bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL url(request.url()); 1163bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (url.SchemeIs("data")) 1164bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 1165bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1166bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Let the browser know we loaded a resource from the memory cache. This 1167bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // message is needed to display the correct SSL indicators. 1168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DidLoadResourceFromMemoryCache( 1169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), 1170bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch url, 1171bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch response.securityInfo(), 1172bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch request.httpMethod().utf8(), 1173bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch response.mimeType().utf8(), 1174bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ResourceType::FromTargetType(request.targetType()))); 11757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didDisplayInsecureContent(blink::WebFrame* frame) { 1178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DidDisplayInsecureContent( 1179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID())); 11807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didRunInsecureContent( 1183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebSecurityOrigin& origin, 1185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& target) { 1186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DidRunInsecureContent( 1187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), 1188bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch origin.toString().utf8(), 1189bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch target)); 11907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didAbortLoading(blink::WebFrame* frame) { 11934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (frame != render_view_->webview()->mainFrame()) 11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PluginChannelHost::Broadcast( 11974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new PluginHostMsg_DidAbortLoading(render_view_->GetRoutingID())); 11984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 11994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 12004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::didExhaustMemoryAvailableForScript( 1202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame) { 1203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_JSOutOfMemory( 1204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID())); 12057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didCreateScriptContext(blink::WebFrame* frame, 12087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) v8::Handle<v8::Context> context, 12097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int extension_group, 12107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int world_id) { 1211bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GetContentClient()->renderer()->DidCreateScriptContext( 12127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) frame, context, extension_group, world_id); 12137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::willReleaseScriptContext(blink::WebFrame* frame, 12167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) v8::Handle<v8::Context> context, 12177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int world_id) { 1218bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GetContentClient()->renderer()->WillReleaseScriptContext( 1219bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch frame, context, world_id); 12207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didFirstVisuallyNonEmptyLayout(blink::WebFrame* frame) { 12237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didFirstVisuallyNonEmptyLayout(frame); 12247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didChangeContentsSize(blink::WebFrame* frame, 1227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebSize& size) { 1228bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 1229bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * cached_has_main_frame_horizontal_scrollbar_ 1230bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * cached_has_main_frame_vertical_scrollbar_ 12317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didChangeContentsSize(frame, size); 12327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didChangeScrollOffset(blink::WebFrame* frame) { 1235bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed methods: 1236bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * StartNavStateSyncTimerIfNecessary 12377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_view_->didChangeScrollOffset(frame); 12387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::willInsertBody(blink::WebFrame* frame) { 1241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!frame->parent()) { 1242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_WillInsertBody( 1243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID())); 1244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 12457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::reportFindInPageMatchCount(int request_id, 12487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int count, 12497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool final_update) { 1250bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int active_match_ordinal = -1; // -1 = don't update active match ordinal 1251bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!count) 1252bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch active_match_ordinal = 0; 1253bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_Find_Reply( 1255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), request_id, count, 1256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) gfx::Rect(), active_match_ordinal, final_update)); 1257bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 1258bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1259bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid RenderFrameImpl::reportFindInPageSelection( 1260bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int request_id, 1261bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int active_match_ordinal, 1262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRect& selection_rect) { 1263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_Find_Reply( 1264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), request_id, -1, selection_rect, 1265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) active_match_ordinal, false)); 12667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::requestStorageQuota( 1269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 1270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebStorageQuotaType type, 12717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned long long requested_size, 1272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebStorageQuotaCallbacks* callbacks) { 1273bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(frame); 1274bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebSecurityOrigin origin = frame->document().securityOrigin(); 1275bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (origin.isUnique()) { 1276bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Unique origins cannot store persistent state. 1277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callbacks->didFail(blink::WebStorageQuotaErrorAbort); 1278bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 1279bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1280bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ChildThread::current()->quota_dispatcher()->RequestStorageQuota( 1281424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), GURL(origin.toString()), 1282bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch static_cast<quota::StorageType>(type), requested_size, 1283bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(callbacks)); 12847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::willOpenSocketStream( 1287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSocketStreamHandle* handle) { 1288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SocketStreamHandleData::AddToHandle(handle, render_view_->GetRoutingID()); 12897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void RenderFrameImpl::willStartUsingPeerConnectionHandler( 1292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 1293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCPeerConnectionHandler* handler) { 1294bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#if defined(ENABLE_WEBRTC) 1295bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch static_cast<RTCPeerConnectionHandler*>(handler)->associateWithFrame(frame); 1296bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif 12977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 12987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool RenderFrameImpl::willCheckAndDispatchMessageEvent( 1300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* sourceFrame, 1301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* targetFrame, 1302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSecurityOrigin targetOrigin, 1303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDOMMessageEvent event) { 1304bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // TODO(nasko): Move implementation here. Needed state: 1305bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // * is_swapped_out_ 13067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return render_view_->willCheckAndDispatchMessageEvent( 13077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) sourceFrame, targetFrame, targetOrigin, event); 13087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 13097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString RenderFrameImpl::userAgentOverride( 1311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 1312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url) { 1313bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!render_view_->webview() || !render_view_->webview()->mainFrame() || 1314bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch render_view_->renderer_preferences_.user_agent_override.empty()) { 1315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return blink::WebString(); 1316bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1317bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1318bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // If we're in the middle of committing a load, the data source we need 1319bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // will still be provisional. 1320bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebFrame* main_frame = render_view_->webview()->mainFrame(); 1321bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDataSource* data_source = NULL; 1322bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (main_frame->provisionalDataSource()) 1323bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_source = main_frame->provisionalDataSource(); 1324bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch else 1325bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_source = main_frame->dataSource(); 1326bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1327bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData* internal_data = data_source ? 1328bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch InternalDocumentStateData::FromDataSource(data_source) : NULL; 1329bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (internal_data && internal_data->is_overriding_user_agent()) 1330bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return WebString::fromUTF8( 1331bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch render_view_->renderer_preferences_.user_agent_override); 1332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return blink::WebString(); 13337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 13347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString RenderFrameImpl::doNotTrackValue(blink::WebFrame* frame) { 1336bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (render_view_->renderer_preferences_.enable_do_not_track) 1337bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return WebString::fromUTF8("1"); 1338bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return WebString(); 13397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 13407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool RenderFrameImpl::allowWebGL(blink::WebFrame* frame, bool default_value) { 1342bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!default_value) 1343bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return false; 1344bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1345bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch bool blocked = true; 1346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_Are3DAPIsBlocked( 1347424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->GetRoutingID(), 1348bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL(frame->top()->document().securityOrigin().toString()), 1349bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch THREE_D_API_TYPE_WEBGL, 1350bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch &blocked)); 1351bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return !blocked; 13527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 13537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderFrameImpl::didLoseWebGLContext(blink::WebFrame* frame, 13557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int arb_robustness_status_code) { 1356424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) render_view_->Send(new ViewHostMsg_DidLose3DContext( 1357bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch GURL(frame->top()->document().securityOrigin().toString()), 1358bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch THREE_D_API_TYPE_WEBGL, 1359bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch arb_robustness_status_code)); 13607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 13617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { 1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_.AddObserver(observer); 1364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { 1367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observer->RenderFrameGone(); 1368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observers_.RemoveObserver(observer); 1369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 1372