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