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, ¶m)) 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(), ¶ms); 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(), ¶ms); 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