1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/renderer/browser_plugin_delegate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/content_renderer_client.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/child_frame_compositing_helper.h"
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/renderer/cursor_utils.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/drop_data_builder.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h"
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/renderer/sad_plugin.h"
249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "third_party/WebKit/public/platform/WebRect.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h"
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h"
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "third_party/skia/include/core/SkCanvas.h"
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCanvas;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginContainer;
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPoint;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRect;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURL;
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef std::map<blink::WebPluginContainer*, content::BrowserPlugin*>
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PluginContainerMap;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic base::LazyInstance<PluginContainerMap> g_plugin_container_map =
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LAZY_INSTANCE_INITIALIZER;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBrowserPlugin* BrowserPlugin::GetFromNode(blink::WebNode& node) {
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  blink::WebPluginContainer* container = node.pluginContainer();
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!container)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PluginContainerMap* browser_plugins = g_plugin_container_map.Pointer();
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PluginContainerMap::iterator it = browser_plugins->find(container);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return it == browser_plugins->end() ? NULL : it->second;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             blink::WebFrame* frame,
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             scoped_ptr<BrowserPluginDelegate> delegate)
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : attached_(false),
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      attach_pending_(false),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_(render_view->AsWeakPtr()),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_routing_id_(render_view->GetRoutingID()),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      container_(NULL),
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      last_device_scale_factor_(GetDeviceScaleFactor()),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sad_guest_(NULL),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      guest_crashed_(false),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_focused_(false),
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visible_(true),
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      mouse_locked_(false),
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser_plugin_manager_(render_view->GetBrowserPluginManager()),
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_(browser_plugin::kInstanceIDNone),
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      contents_opaque_(true),
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_(delegate.Pass()),
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this) {
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  browser_plugin_instance_id_ = browser_plugin_manager()->GetNextInstanceID();
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delegate_)
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->SetElementInstanceID(browser_plugin_instance_id_);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPlugin::~BrowserPlugin() {
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser_plugin_manager()->RemoveBrowserPlugin(browser_plugin_instance_id_);
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!ready())
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_PluginDestroyed(render_view_routing_id_,
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               browser_plugin_instance_id_));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool handled = true;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_Attach_ACK, OnAttachACK)
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_AdvanceFocus, OnAdvanceFocus)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginMsg_CompositorFrameSwapped,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                OnCompositorFrameSwapped(message))
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_CopyFromCompositingSurface,
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        OnCopyFromCompositingSurface)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestGone, OnGuestGone)
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetContentsOpaque, OnSetContentsOpaque)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetCursor, OnSetCursor)
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetMouseLock, OnSetMouseLock)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_ShouldAcceptTouchEvents,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnShouldAcceptTouchEvents)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC_END_MESSAGE_MAP()
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return handled;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateDOMAttribute(const std::string& attribute_name,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       const std::string& attribute_value) {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container())
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebElement element = container()->element();
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebString web_attribute_name =
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebString::fromUTF8(attribute_name);
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  element.setAttribute(web_attribute_name,
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blink::WebString::fromUTF8(attribute_value));
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPlugin::Attach() {
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (ready()) {
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    attached_ = false;
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    guest_crashed_ = false;
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EnableCompositing(false);
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (compositing_helper_.get()) {
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      compositing_helper_->OnContainerDestroy();
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      compositing_helper_ = NULL;
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(fsamuel): Add support for reattachment.
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserPluginHostMsg_Attach_Params attach_params;
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  attach_params.focused = ShouldGuestBeFocused();
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  attach_params.visible = visible_;
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  attach_params.origin = plugin_rect().origin();
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Size view_size(width(), height());
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!view_size.IsEmpty()) {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PopulateResizeGuestParameters(view_size,
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  &attach_params.resize_guest_params);
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_Attach(
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      render_view_routing_id_,
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      attach_params));
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  attach_pending_ = true;
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::DidCommitCompositorFrame() {
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (compositing_helper_.get())
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    compositing_helper_->DidCommitCompositorFrame();
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPlugin::OnAdvanceFocus(int browser_plugin_instance_id,
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   bool reverse) {
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(render_view_);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view_->GetWebView()->advanceFocus(reverse);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPlugin::OnAttachACK(int browser_plugin_instance_id) {
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(!attached());
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attached_ = true;
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  attach_pending_ = false;
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnCompositorFrameSwapped(const IPC::Message& message) {
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserPluginMsg_CompositorFrameSwapped::Param param;
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!BrowserPluginMsg_CompositorFrameSwapped::Read(&message, &param))
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Note that there is no need to send ACK for this message.
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If the guest has updated pixels then it is no longer crashed.
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  guest_crashed_ = false;
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  param.b.frame.AssignTo(frame.get());
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnableCompositing(true);
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  compositing_helper_->OnCompositorFrameSwapped(frame.Pass(),
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                param.b.producing_route_id,
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                param.b.output_surface_id,
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                param.b.producing_host_id,
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                param.b.shared_memory_handle);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPlugin::OnCopyFromCompositingSurface(int browser_plugin_instance_id,
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                 int request_id,
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                 gfx::Rect source_rect,
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                 gfx::Size dest_size) {
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!compositing_helper_.get()) {
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    browser_plugin_manager()->Send(
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        new BrowserPluginHostMsg_CopyFromCompositingSurfaceAck(
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            render_view_routing_id_,
20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            browser_plugin_instance_id_,
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            request_id,
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            SkBitmap()));
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  compositing_helper_->CopyFromCompositingSurface(request_id, source_rect,
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                  dest_size);
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPlugin::OnGuestGone(int browser_plugin_instance_id) {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  guest_crashed_ = true;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Turn off compositing so we can display the sad graphic. Changes to
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // compositing state will show up at a later time after a layout and commit.
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EnableCompositing(false);
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Queue up showing the sad graphic to give content embedders an opportunity
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // to fire their listeners and potentially overlay the webview with custom
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // behavior. If the BrowserPlugin is destroyed in the meantime, then the
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // task will not be executed.
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::MessageLoop::current()->PostTask(
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FROM_HERE,
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&BrowserPlugin::ShowSadGraphic,
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 weak_ptr_factory_.GetWeakPtr()));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserPlugin::OnSetContentsOpaque(int browser_plugin_instance_id,
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        bool opaque) {
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (contents_opaque_ == opaque)
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  contents_opaque_ = opaque;
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (compositing_helper_.get())
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    compositing_helper_->SetContentsOpaque(opaque);
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPlugin::OnSetCursor(int browser_plugin_instance_id,
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                const WebCursor& cursor) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursor_ = cursor;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPlugin::OnSetMouseLock(int browser_plugin_instance_id,
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                   bool enable) {
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (enable) {
244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (mouse_locked_)
245ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return;
246ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    render_view_->mouse_lock_dispatcher()->LockMouse(this);
247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } else {
248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!mouse_locked_) {
249ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      OnLockMouseACK(false);
250ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return;
251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    render_view_->mouse_lock_dispatcher()->UnlockMouse(this);
253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void BrowserPlugin::OnShouldAcceptTouchEvents(int browser_plugin_instance_id,
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                              bool accept) {
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (container()) {
25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    container()->requestTouchEventType(
26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        accept ? WebPluginContainer::TouchEventRequestTypeRaw
26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               : WebPluginContainer::TouchEventRequestTypeNone);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserPlugin::ShowSadGraphic() {
2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If the BrowserPlugin is scheduled to be deleted, then container_ will be
2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // NULL so we shouldn't attempt to access it.
2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (container_)
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    container_->invalidate();
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float BrowserPlugin::GetDeviceScaleFactor() const {
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!render_view_)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 1.0f;
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return render_view_->GetWebView()->deviceScaleFactor();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserPlugin::UpdateDeviceScaleFactor() {
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (last_device_scale_factor_ == GetDeviceScaleFactor())
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserPluginHostMsg_ResizeGuest_Params params;
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PopulateResizeGuestParameters(plugin_size(), &params);
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view_routing_id_,
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      params));
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateGuestFocusState() {
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!ready())
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool should_be_focused = ShouldGuestBeFocused();
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_routing_id_,
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      should_be_focused));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::ShouldGuestBeFocused() const {
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool embedder_focused = false;
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (render_view_)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    embedder_focused = render_view_->has_focus();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return plugin_focused_ && embedder_focused;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)WebPluginContainer* BrowserPlugin::container() const {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container_;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::initialize(WebPluginContainer* container) {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container_ = container;
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container_->setWantsWheelEvents(true);
31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  g_plugin_container_map.Get().insert(std::make_pair(container_, this));
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // This is a way to notify observers of our attributes that this plugin is
32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // available in render tree.
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(lazyboy): This should be done through the delegate instead. Perhaps
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // by firing an event from there.
32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  UpdateDOMAttribute("internalinstanceid",
32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     base::IntToString(browser_plugin_instance_id_));
32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  browser_plugin_manager()->AddBrowserPlugin(browser_plugin_instance_id_, this);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::EnableCompositing(bool enable) {
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool enabled = !!compositing_helper_.get();
3335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (enabled == enable)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (enable) {
3375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK(!compositing_helper_.get());
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!compositing_helper_.get()) {
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      compositing_helper_ = ChildFrameCompositingHelper::CreateForBrowserPlugin(
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          weak_ptr_factory_.GetWeakPtr());
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  compositing_helper_->EnableCompositing(enable);
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  compositing_helper_->SetContentsOpaque(contents_opaque_);
3455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!enable) {
3475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK(compositing_helper_.get());
3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    compositing_helper_->OnContainerDestroy();
3495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    compositing_helper_ = NULL;
3505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::destroy() {
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (container_) {
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    //container_->clearScriptObjects();
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The BrowserPlugin's WebPluginContainer is deleted immediately after this
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // call returns, so let's not keep a reference to it around.
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    g_plugin_container_map.Get().erase(container_);
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (compositing_helper_.get())
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositing_helper_->OnContainerDestroy();
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  container_ = NULL;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Will be a no-op if the mouse is not currently locked.
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (render_view_)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_view_->mouse_lock_dispatcher()->OnLockTargetDestroyed(this);
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::supportsKeyboardFocus() const {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserPlugin::supportsEditCommands() const {
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BrowserPlugin::supportsInputMethod() const {
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::canProcessDrag() const {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::paint(WebCanvas* canvas, const WebRect& rect) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (guest_crashed_) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!sad_guest_)  // Lazily initialize bitmap.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sad_guest_ = content::GetContentClient()->renderer()->
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSadWebViewBitmap();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // content_shell does not have the sad plugin bitmap, so we'll paint black
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // instead to make it clear that something went wrong.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sad_guest_) {
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      PaintSadPlugin(canvas, plugin_rect_, *sad_guest_);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkAutoCanvasRestore auto_restore(canvas, true);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->translate(plugin_rect_.x(), plugin_rect_.y());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkRect image_data_rect = SkRect::MakeXYWH(
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkIntToScalar(0),
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkIntToScalar(0),
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkIntToScalar(plugin_rect_.width()),
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkIntToScalar(plugin_rect_.height()));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->clipRect(image_data_rect);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paint black or white in case we have nothing in our backing store or we
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to show a gutter.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkPaint paint;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  paint.setStyle(SkPaint::kFill_Style);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  paint.setColor(guest_crashed_ ? SK_ColorBLACK : SK_ColorWHITE);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->drawRect(image_data_rect, paint);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ShouldForwardToBrowserPlugin(
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const IPC::Message& message) {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (message.type()) {
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case BrowserPluginMsg_Attach_ACK::ID:
42003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case BrowserPluginMsg_AdvanceFocus::ID:
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case BrowserPluginMsg_CompositorFrameSwapped::ID:
422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case BrowserPluginMsg_CopyFromCompositingSurface::ID:
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_GuestGone::ID:
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case BrowserPluginMsg_SetContentsOpaque::ID:
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_SetCursor::ID:
426ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case BrowserPluginMsg_SetMouseLock::ID:
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_ShouldAcceptTouchEvents::ID:
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateGeometry(
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebRect& window_rect,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebRect& clip_rect,
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebVector<WebRect>& cut_outs_rects,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_visible) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int old_width = width();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int old_height = height();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_rect_ = window_rect;
4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!attached())
44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
44590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (old_width == window_rect.width && old_height == window_rect.height) {
44790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Let the browser know about the updated view rect.
44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateGeometry(
44903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        render_view_routing_id_, browser_plugin_instance_id_, plugin_rect_));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginHostMsg_ResizeGuest_Params params;
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PopulateResizeGuestParameters(plugin_size(), &params);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_routing_id_,
45703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params));
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PopulateResizeGuestParameters(
462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const gfx::Size& view_size,
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BrowserPluginHostMsg_ResizeGuest_Params* params) {
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  params->view_size = view_size;
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params->scale_factor = GetDeviceScaleFactor();
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (last_device_scale_factor_ != params->scale_factor) {
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    last_device_scale_factor_ = params->scale_factor;
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    params->repaint = true;
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateFocus(bool focused) {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_focused_ = focused;
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateGuestFocusState();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateVisibility(bool visible) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (visible_ == visible)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visible_ = visible;
48203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!ready())
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (compositing_helper_.get())
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositing_helper_->UpdateVisibility(visible);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetVisibility(
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_routing_id_,
49003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visible));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::acceptsInputEvents() {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::handleInputEvent(const blink::WebInputEvent& event,
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     blink::WebCursorInfo& cursor_info) {
50003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (guest_crashed_ || !ready())
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (event.type == blink::WebInputEvent::ContextMenu)
5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return true;
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (blink::WebInputEvent::isKeyboardEventType(event.type) &&
507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      !edit_commands_.empty()) {
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    browser_plugin_manager()->Send(
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent(
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            render_view_routing_id_,
51103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            browser_plugin_instance_id_,
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            edit_commands_));
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    edit_commands_.clear();
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_,
51803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                browser_plugin_instance_id_,
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                plugin_rect_,
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                &event));
521a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GetWebKitCursorInfo(cursor_, &cursor_info);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::handleDragStatusUpdate(blink::WebDragStatus drag_status,
526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                           const blink::WebDragData& drag_data,
527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                           blink::WebDragOperationsMask mask,
528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                           const blink::WebPoint& position,
529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                           const blink::WebPoint& screen) {
53003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (guest_crashed_ || !ready())
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new BrowserPluginHostMsg_DragStatusUpdate(
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view_routing_id_,
53503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        browser_plugin_instance_id_,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        drag_status,
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        DropDataBuilder::Build(drag_data),
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mask,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        position));
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didReceiveResponse(
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebURLResponse& response) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didReceiveData(const char* data, int data_length) {
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delegate_)
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->DidReceiveData(data, data_length);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFinishLoading() {
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delegate_)
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->DidFinishLoading();
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BrowserPlugin::didFailLoading(const blink::WebURLError& error) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BrowserPlugin::didFinishLoadingFrameRequest(const blink::WebURL& url,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 void* notify_data) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFailLoadingFrameRequest(
565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebURL& url,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void* notify_data,
567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebURLError& error) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::executeEditCommand(const blink::WebString& name) {
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_ExecuteEditCommand(
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view_routing_id_,
57303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      name.utf8()));
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // BrowserPlugin swallows edit commands.
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::executeEditCommand(const blink::WebString& name,
581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       const blink::WebString& value) {
582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  edit_commands_.push_back(EditCommand(name.utf8(), value.utf8()));
583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // BrowserPlugin swallows edit commands.
584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BrowserPlugin::setComposition(
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebString& text,
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebVector<blink::WebCompositionUnderline>& underlines,
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int selectionStart,
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int selectionEnd) {
59203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!ready())
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<blink::WebCompositionUnderline> std_underlines;
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < underlines.size(); ++i) {
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std_underlines.push_back(underlines[i]);
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeSetComposition(
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_view_routing_id_,
60003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      text.utf8(),
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std_underlines,
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      selectionStart,
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      selectionEnd));
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(kochi): This assumes the IPC handling always succeeds.
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BrowserPlugin::confirmComposition(
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebString& text,
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blink::WebWidget::ConfirmCompositionBehavior selectionBehavior) {
61203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!ready())
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool keep_selection = (selectionBehavior == blink::WebWidget::KeepSelection);
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeConfirmComposition(
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_view_routing_id_,
61703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      text.utf8(),
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      keep_selection));
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(kochi): This assumes the IPC handling always succeeds.
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPlugin::extendSelectionAndDelete(int before, int after) {
62503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!ready())
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  browser_plugin_manager()->Send(
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new BrowserPluginHostMsg_ExtendSelectionAndDelete(
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          render_view_routing_id_,
63003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          browser_plugin_instance_id_,
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          before,
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          after));
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLockMouseACK(bool succeeded) {
636ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  mouse_locked_ = succeeded;
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_LockMouse_ACK(
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_routing_id_,
63903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_,
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      succeeded));
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnMouseLockLost() {
644ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  mouse_locked_ = false;
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_UnlockMouse_ACK(
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_routing_id_,
64703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser_plugin_instance_id_));
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::HandleMouseLockedInputEvent(
651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebMouseEvent& event) {
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_,
65403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                browser_plugin_instance_id_,
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                plugin_rect_,
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                &event));
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
661