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" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_string_value_serializer.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/content_renderer_client.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_bindings.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_compositing_helper.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/renderer/cursor_utils.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/drop_data_builder.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_process_impl.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h" 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/renderer/sad_plugin.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/v8_value_converter_impl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h" 299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "third_party/WebKit/public/platform/WebRect.h" 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebBindings.h" 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDOMCustomEvent.h" 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h" 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginParams.h" 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined (OS_WIN) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sys_info.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCanvas; 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginContainer; 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginParams; 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPoint; 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRect; 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURL; 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static std::string GetInternalEventName(const char* event_name) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::StringPrintf("-internal-%s", event_name); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef std::map<blink::WebPluginContainer*, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPlugin*> PluginContainerMap; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<PluginContainerMap> g_plugin_container_map = 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view, 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame) 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : guest_instance_id_(browser_plugin::kInstanceIDNone), 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attached_(false), 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_(render_view->AsWeakPtr()), 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_(render_view->GetRoutingID()), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_(NULL), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_buffer_sequence_id_(0), 77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) paint_ack_received_(true), 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) last_device_scale_factor_(1.0f), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sad_guest_(NULL), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guest_crashed_(false), 81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_auto_size_state_dirty_(false), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) persist_storage_(false), 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valid_partition_id_(true), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_window_routing_id_(MSG_ROUTING_NONE), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_focused_(false), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible_(true), 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) before_first_navigation_(true), 88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch mouse_locked_(false), 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager_(render_view->GetBrowserPluginManager()), 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_enabled_(false), 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) embedder_frame_url_(frame->document().url()), 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_(this) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPlugin::~BrowserPlugin() { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the BrowserPlugin has never navigated then the browser process and 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowserPluginManager don't know about it and so there is nothing to do 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // here. 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_PluginDestroyed(render_view_routing_id_, 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_)); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*static*/ 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPlugin* BrowserPlugin::FromContainer( 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer* container) { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginContainerMap* browser_plugins = g_plugin_container_map.Pointer(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginContainerMap::iterator it = browser_plugins->find(container); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return it == browser_plugins->end() ? NULL : it->second; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool handled = true; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_AdvanceFocus, OnAdvanceFocus) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_Attach_ACK, OnAttachACK) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_BuffersSwapped, OnBuffersSwapped) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginMsg_CompositorFrameSwapped, 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnCompositorFrameSwapped(message)) 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_CopyFromCompositingSurface, 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnCopyFromCompositingSurface) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestContentWindowReady, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnGuestContentWindowReady) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestGone, OnGuestGone) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetCursor, OnSetCursor) 129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetMouseLock, OnSetMouseLock) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_ShouldAcceptTouchEvents, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnShouldAcceptTouchEvents) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_UpdatedName, OnUpdatedName) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_UpdateRect, OnUpdateRect) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_END_MESSAGE_MAP() 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return handled; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateDOMAttribute(const std::string& attribute_name, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& attribute_value) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container()) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebElement element = container()->element(); 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString web_attribute_name = 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(attribute_name); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!HasDOMAttribute(attribute_name) || 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (std::string(element.getAttribute(web_attribute_name).utf8()) != 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attribute_value)) { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element.setAttribute(web_attribute_name, 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(attribute_value)); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RemoveDOMAttribute(const std::string& attribute_name) { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container()) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container()->element().removeAttribute( 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(attribute_name)); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetDOMAttributeValue( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& attribute_name) const { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container()) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container()->element().getAttribute( 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(attribute_name)).utf8(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::HasDOMAttribute(const std::string& attribute_name) const { 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container()) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container()->element().hasAttribute( 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(attribute_name)); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetNameAttribute() const { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetDOMAttributeValue(browser_plugin::kAttributeName); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserPlugin::GetAllowTransparencyAttribute() const { 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HasDOMAttribute(browser_plugin::kAttributeAllowTransparency); 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetSrcAttribute() const { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetDOMAttributeValue(browser_plugin::kAttributeSrc); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::GetAutoSizeAttribute() const { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HasDOMAttribute(browser_plugin::kAttributeAutoSize); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMaxHeightAttribute() const { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_height; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxHeight), 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &max_height); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_height; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMaxWidthAttribute() const { 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_width; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxWidth), 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &max_width); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_width; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMinHeightAttribute() const { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_height; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinHeight), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &min_height); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return min_height; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMinWidthAttribute() const { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_width; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinWidth), 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &min_width); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return min_width; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMaxHeight() const { 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_height = GetMaxHeightAttribute(); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_height ? max_height : height(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMaxWidth() const { 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_width = GetMaxWidthAttribute(); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_width ? max_width : width(); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMinHeight() const { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_height = GetMinHeightAttribute(); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FrameView.cpp does not allow this value to be <= 0, so when the value is 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unset (or set to 0), we set it to the container size. 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_height = min_height ? min_height : height(); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For autosize, minHeight should not be bigger than maxHeight. 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::min(min_height, GetAdjustedMaxHeight()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMinWidth() const { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_width = GetMinWidthAttribute(); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FrameView.cpp does not allow this value to be <= 0, so when the value is 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unset (or set to 0), we set it to the container size. 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_width = min_width ? min_width : width(); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For autosize, minWidth should not be bigger than maxWidth. 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::min(min_width, GetAdjustedMaxWidth()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetPartitionAttribute() const { 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetDOMAttributeValue(browser_plugin::kAttributePartition); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseNameAttribute() { 257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_SetName(render_view_routing_id_, 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNameAttribute())); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BrowserPlugin::ParseAllowTransparencyAttribute() { 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!HasGuestInstanceID()) 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool opaque = !GetAllowTransparencyAttribute(); 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (compositing_helper_) 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) compositing_helper_->SetContentsOpaque(opaque); 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetContentsOpaque( 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_routing_id_, 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) guest_instance_id_, 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) opaque)); 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ParseSrcAttribute(std::string* error_message) { 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!valid_partition_id_) { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error_message = browser_plugin::kErrorInvalidPartition; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string src = GetSrcAttribute(); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (src.empty()) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we haven't created the guest yet, do so now. We will navigate it right 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // after creation. If |src| is empty, we can delay the creation until we 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // actually need it. 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On initial navigation, we request an instance ID from the browser 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // process. We essentially ignore all subsequent calls to SetSrcAttribute 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // until we receive an instance ID. |before_first_navigation_| 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // prevents BrowserPlugin from allocating more than one instance ID. 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Upon receiving an instance ID from the browser process, we continue 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the process of navigation by populating the 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // BrowserPluginHostMsg_Attach_Params with the current state of 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowserPlugin and sending a BrowserPluginHostMsg_CreateGuest to the 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // browser process in order to create a new guest. 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (before_first_navigation_) { 3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) browser_plugin_manager()->AllocateInstanceID( 3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()); 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) before_first_navigation_ = false; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_NavigateGuest(render_view_routing_id_, 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src)); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseAutoSizeAttribute() { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_view_size_ = plugin_rect_.size(); 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) is_auto_size_state_dirty_ = true; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateGuestAutoSizeState(GetAutoSizeAttribute()); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PopulateAutoSizeParameters( 324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) BrowserPluginHostMsg_AutoSize_Params* params, bool auto_size_enabled) { 325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) params->enable = auto_size_enabled; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No need to populate the params if autosize is off. 327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (auto_size_enabled) { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->max_size = gfx::Size(GetAdjustedMaxWidth(), GetAdjustedMaxHeight()); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->min_size = gfx::Size(GetAdjustedMinWidth(), GetAdjustedMinHeight()); 330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 331424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (max_auto_size_ != params->max_size) 332424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_auto_size_state_dirty_ = true; 333424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 334424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) max_auto_size_ = params->max_size; 335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else { 336424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) max_auto_size_ = gfx::Size(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void BrowserPlugin::UpdateGuestAutoSizeState(bool auto_size_enabled) { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we haven't yet heard back from the guest about the last resize request, 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // then we don't issue another request until we do in 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowserPlugin::UpdateRect. 34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!HasGuestInstanceID() || !paint_ack_received_) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_AutoSize_Params auto_size_params; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params; 349424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (auto_size_enabled) { 350424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetDamageBufferWithSizeParams(&auto_size_params, 351424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &resize_guest_params, 352424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) true); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 354424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetDamageBufferWithSizeParams(NULL, &resize_guest_params, true); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 356424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) paint_ack_received_ = false; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_SetAutoSize(render_view_routing_id_, 359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_params, 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_guest_params)); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::UsesDamageBuffer( 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserPluginMsg_UpdateRect_Params& params) { 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return params.damage_buffer_sequence_id != 0 || params.needs_ack; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::UsesPendingDamageBuffer( 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserPluginMsg_UpdateRect_Params& params) { 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!pending_damage_buffer_) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return damage_buffer_sequence_id_ == params.damage_buffer_sequence_id; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3779ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochvoid BrowserPlugin::OnInstanceIDAllocated(int guest_instance_id) { 378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(guest_instance_id != browser_plugin::kInstanceIDNone); 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) before_first_navigation_ = false; 380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_ = guest_instance_id; 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::map<std::string, base::Value*> props; 384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch props[browser_plugin::kWindowID] = 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new base::FundamentalValue(guest_instance_id); 3869ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch TriggerEvent(browser_plugin::kEventInternalInstanceIDAllocated, &props); 3879ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch} 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3899ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochvoid BrowserPlugin::Attach(scoped_ptr<base::DictionaryValue> extra_params) { 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BrowserPluginHostMsg_Attach_Params attach_params; 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attach_params.focused = ShouldGuestBeFocused(); 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attach_params.visible = visible_; 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) attach_params.opaque = !GetAllowTransparencyAttribute(); 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attach_params.name = GetNameAttribute(); 395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attach_params.storage_partition_id = storage_partition_id_; 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attach_params.persist_storage = persist_storage_; 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch attach_params.src = GetSrcAttribute(); 39868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) attach_params.embedder_frame_url = embedder_frame_url_; 399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetDamageBufferWithSizeParams(&attach_params.auto_size_params, 400424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &attach_params.resize_guest_params, 401424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) false); 402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new BrowserPluginHostMsg_Attach(render_view_routing_id_, 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch guest_instance_id_, attach_params, 4069ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch *extra_params)); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::DidCommitCompositorFrame() { 410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (compositing_helper_.get()) 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compositing_helper_->DidCommitCompositorFrame(); 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnAdvanceFocus(int guest_instance_id, bool reverse) { 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(render_view_.get()); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_->GetWebView()->advanceFocus(reverse); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnAttachACK( 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int guest_instance_id, 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BrowserPluginMsg_Attach_ACK_Params& params) { 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update BrowserPlugin attributes to match the state of the guest. 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.name.empty()) 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnUpdatedName(guest_instance_id, params.name); 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.storage_partition_id.empty()) { 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string partition_name = 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (params.persist_storage ? browser_plugin::kPersistPrefix : "") + 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.storage_partition_id; 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDOMAttribute(browser_plugin::kAttributePartition, partition_name); 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attached_ = true; 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid BrowserPlugin::OnBuffersSwapped( 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int guest_instance_id, 436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const BrowserPluginMsg_BuffersSwapped_Params& params) { 437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(guest_instance_id == guest_instance_id_); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnableCompositing(true); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch compositing_helper_->OnBuffersSwapped(params.size, 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.mailbox_name, 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.route_id, 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.host_id, 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDeviceScaleFactor()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnCompositorFrameSwapped(const IPC::Message& message) { 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserPluginMsg_CompositorFrameSwapped::Param param; 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!BrowserPluginMsg_CompositorFrameSwapped::Read(&message, ¶m)) 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) param.b.AssignTo(frame.get()); 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnableCompositing(true); 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) param.c /* route_id */, 457ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch param.d /* output_surface_id */, 458ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch param.e /* host_id */); 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BrowserPlugin::OnCopyFromCompositingSurface(int guest_instance_id, 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int request_id, 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect source_rect, 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size dest_size) { 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!compositing_enabled_) { 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser_plugin_manager()->Send( 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new BrowserPluginHostMsg_CopyFromCompositingSurfaceAck( 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view_routing_id_, 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) guest_instance_id_, 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) request_id, 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkBitmap())); 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) compositing_helper_->CopyFromCompositingSurface(request_id, source_rect, 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dest_size); 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnGuestContentWindowReady(int guest_instance_id, 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int content_window_routing_id) { 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(content_window_routing_id != MSG_ROUTING_NONE); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_window_routing_id_ = content_window_routing_id; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserPlugin::OnGuestGone(int guest_instance_id) { 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) guest_crashed_ = true; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Turn off compositing so we can display the sad graphic. Changes to 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // compositing state will show up at a later time after a layout and commit. 489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EnableCompositing(false); 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (compositing_helper_) { 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) compositing_helper_->OnContainerDestroy(); 492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) compositing_helper_ = NULL; 493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Queue up showing the sad graphic to give content embedders an opportunity 4967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // to fire their listeners and potentially overlay the webview with custom 4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // behavior. If the BrowserPlugin is destroyed in the meantime, then the 4987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // task will not be executed. 4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::MessageLoop::current()->PostTask( 5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, 5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&BrowserPlugin::ShowSadGraphic, 5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch weak_ptr_factory_.GetWeakPtr())); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnSetCursor(int guest_instance_id, 506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const WebCursor& cursor) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_ = cursor; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 510ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid BrowserPlugin::OnSetMouseLock(int guest_instance_id, 511ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool enable) { 512ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (enable) { 513ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (mouse_locked_) 514ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 515ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch render_view_->mouse_lock_dispatcher()->LockMouse(this); 516ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else { 517ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!mouse_locked_) { 518ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch OnLockMouseACK(false); 519ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 520ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 521ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch render_view_->mouse_lock_dispatcher()->UnlockMouse(this); 522ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 523ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 524ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnShouldAcceptTouchEvents(int guest_instance_id, 526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool accept) { 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (container()) { 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container()->requestTouchEventType(accept ? 529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer::TouchEventRequestTypeRaw : 530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer::TouchEventRequestTypeNone); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnUpdatedName(int guest_instance_id, 535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& name) { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDOMAttribute(browser_plugin::kAttributeName, name); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnUpdateRect( 540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int guest_instance_id, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BrowserPluginMsg_UpdateRect_Params& params) { 5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // If the guest has updated pixels then it is no longer crashed. 5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch guest_crashed_ = false; 5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_new_damage_buffer = !backing_store_; 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_AutoSize_Params auto_size_params; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we have a pending damage buffer, and the guest has begun to use the 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // damage buffer then we know the guest will no longer use the current 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // damage buffer. At this point, we drop the current damage buffer, and 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mark the pending damage buffer as the current damage buffer. 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (UsesPendingDamageBuffer(params)) { 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SwapDamageBuffers(); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_new_damage_buffer = true; 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool auto_size = GetAutoSizeAttribute(); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We receive a resize ACK in regular mode, but not in autosize. 559424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // In SW, |paint_ack_received_| is reset in SwapDamageBuffers(). 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In HW mode, we need to do it here so we can continue sending 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resize messages when needed. 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.is_resize_ack || 563424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) (!params.needs_ack && (auto_size || is_auto_size_state_dirty_))) { 564424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) paint_ack_received_ = true; 5653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 567424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool was_auto_size_state_dirty = auto_size && is_auto_size_state_dirty_; 568424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) is_auto_size_state_dirty_ = false; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((!auto_size && (width() != params.view_size.width() || 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) height() != params.view_size.height())) || 572424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) (auto_size && was_auto_size_state_dirty) || 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetDeviceScaleFactor() != params.scale_factor) { 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We are HW accelerated, render widget does not expect an ack, 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but we still need to update the size. 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params.needs_ack) { 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateGuestAutoSizeState(auto_size); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 581424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!paint_ack_received_) { 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The guest has not yet responded to the last resize request, and 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so we don't want to do anything at this point other than ACK the guest. 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PopulateAutoSizeParameters(&auto_size_params, auto_size); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we have no pending damage buffer, then the guest has not caught up 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with the BrowserPlugin container. We now tell the guest about the new 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // container size. 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size) { 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDamageBufferWithSizeParams(&auto_size_params, 592424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &resize_guest_params, 593424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) was_auto_size_state_dirty); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 595424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetDamageBufferWithSizeParams(NULL, 596424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &resize_guest_params, 597424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) was_auto_size_state_dirty); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK( 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 603a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) true, 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_params, 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_guest_params)); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size && (params.view_size != last_view_size_)) { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (backing_store_) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backing_store_->Clear(SK_ColorWHITE); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_view_size_ = params.view_size; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (UsesDamageBuffer(params)) { 616a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If we are seeing damage buffers, HW compositing should be turned off. 618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableCompositing(false); 619a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If we are now using a new damage buffer, then that means that the guest 621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // has updated its size state in response to a resize request. We change 622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the backing store's size to accomodate the new damage buffer size. 623a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (use_new_damage_buffer) { 624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int backing_store_width = auto_size ? GetAdjustedMaxWidth() : width(); 625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int backing_store_height = auto_size ? GetAdjustedMaxHeight(): height(); 626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) backing_store_.reset( 627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new BrowserPluginBackingStore( 628a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::Size(backing_store_width, backing_store_height), 629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.scale_factor)); 630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If we just transitioned from the compositing path to the software path 633a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // then we might not yet have a damage buffer. 634a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (current_damage_buffer_) { 635a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Update the backing store. 636a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!params.scroll_rect.IsEmpty()) { 637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) backing_store_->ScrollBackingStore(params.scroll_delta, 638a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.scroll_rect, 639a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.view_size); 640a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 641a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) backing_store_->PaintToBackingStore(params.bitmap_rect, 642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.copy_rects, 643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) current_damage_buffer_->memory()); 644a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Invalidate the container. 645a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If the BrowserPlugin is scheduled to be deleted, then container_ will 646a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // be NULL so we shouldn't attempt to access it. 647a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (container_) 648a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) container_->invalidate(); 649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // BrowserPluginHostMsg_UpdateRect_ACK is used by both the compositing and 653a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // software paths to piggyback updated autosize parameters. 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size) 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PopulateAutoSizeParameters(&auto_size_params, auto_size); 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK( 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 659a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UsesDamageBuffer(params), 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_params, 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_guest_params)); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseSizeContraintsChanged() { 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool auto_size = GetAutoSizeAttribute(); 66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (auto_size) { 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) is_auto_size_state_dirty_ = true; 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateGuestAutoSizeState(true); 66958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::InAutoSizeBounds(const gfx::Size& size) const { 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return size.width() <= GetAdjustedMaxWidth() && 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size.height() <= GetAdjustedMaxHeight(); 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NPObject* BrowserPlugin::GetContentWindow() const { 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (content_window_routing_id_ == MSG_ROUTING_NONE) 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderViewImpl* guest_render_view = RenderViewImpl::FromRoutingID( 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_window_routing_id_); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!guest_render_view) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* guest_frame = guest_render_view->GetWebView()->mainFrame(); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest_frame->windowObject(); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::AttachWindowTo(const blink::WebNode& node, int window_id) { 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (node.isNull()) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!node.isElementNode()) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebElement shim_element = node.toConst<blink::WebElement>(); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The shim containing the BrowserPlugin must be attached to a document. 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shim_element.document().isNull()) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNode shadow_root = shim_element.shadowRoot(); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shadow_root.isNull() || !shadow_root.hasChildNodes()) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebNode plugin_element = shadow_root.firstChild(); 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer* plugin_container = 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_element.pluginContainer(); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!plugin_container) 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPlugin* browser_plugin = 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPlugin::FromContainer(plugin_container); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser_plugin) 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the BrowserPlugin has already begun to navigate then we shouldn't allow 717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // attaching a different guest. 718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigation happens in two stages. 720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 1. BrowserPlugin requests an instance ID from the browser process. 721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 2. The browser process returns an instance ID and BrowserPlugin is 722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // "Attach"ed to that instance ID. 723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the instance ID is new then a new guest will be created. 724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the instance ID corresponds to an unattached guest then BrowserPlugin 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // is attached to that guest. 726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Between step 1, and step 2, BrowserPlugin::AttachWindowTo may be called. 728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The check below ensures that BrowserPlugin:Attach does not get called with 729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // a different instance ID after step 1 has happened. 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(fsamuel): We may wish to support reattaching guests in the future: 731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://crbug.com/156219. 732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (browser_plugin->HasNavigated()) 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7359ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch browser_plugin->OnInstanceIDAllocated(window_id); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserPlugin::HasNavigated() const { 740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return !before_first_navigation_; 741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserPlugin::HasGuestInstanceID() const { 744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return guest_instance_id_ != browser_plugin::kInstanceIDNone; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ParsePartitionAttribute(std::string* error_message) { 748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (HasNavigated()) { 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error_message = browser_plugin::kErrorAlreadyNavigated; 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string input = GetPartitionAttribute(); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since the "persist:" prefix is in ASCII, StartsWith will work fine on 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // UTF-8 encoded |partition_id|. If the prefix is a match, we can safely 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // remove the prefix without splicing in the middle of a multi-byte codepoint. 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We can use the rest of the string as UTF-8 encoded one. 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (StartsWithASCII(input, browser_plugin::kPersistPrefix, true)) { 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t index = input.find(":"); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(index != std::string::npos); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It is safe to do index + 1, since we tested for the full prefix above. 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input = input.substr(index + 1); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (input.empty()) { 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valid_partition_id_ = false; 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error_message = browser_plugin::kErrorInvalidPartition; 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) persist_storage_ = true; 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) persist_storage_ = false; 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valid_partition_id_ = true; 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage_partition_id_ = input; 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::CanRemovePartitionAttribute(std::string* error_message) { 780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (HasGuestInstanceID()) 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error_message = browser_plugin::kErrorCannotRemovePartition; 782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return !HasGuestInstanceID(); 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserPlugin::ShowSadGraphic() { 7867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // We won't paint the contents of the current backing store again so we might 7877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // as well toss it out and save memory. 7887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch backing_store_.reset(); 7897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // If the BrowserPlugin is scheduled to be deleted, then container_ will be 7907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // NULL so we shouldn't attempt to access it. 7917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (container_) 7927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch container_->invalidate(); 7937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 7947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseAttributes() { 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(mthiesse): Handle errors here? 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParsePartitionAttribute(&error); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Parse the 'src' attribute last, as it will set the has_navigated_ flag to 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // true, which prevents changing the 'partition' attribute. 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseSrcAttribute(&error); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float BrowserPlugin::GetDeviceScaleFactor() const { 806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!render_view_.get()) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1.0f; 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_view_->GetWebView()->deviceScaleFactor(); 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::UpdateDeviceScaleFactor(float device_scale_factor) { 812424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (last_device_scale_factor_ == device_scale_factor || !paint_ack_received_) 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params params; 816424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PopulateResizeGuestParameters(¶ms, plugin_rect(), false); 817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest( 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view_routing_id_, 819868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params)); 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::TriggerEvent(const std::string& event_name, 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*>* props) { 825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!container()) 826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame = container()->element().document().frame(); 829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!frame) 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 83258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v8::Local<v8::Context> context = frame->mainWorldScriptContext(); 834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v8::Context::Scope context_scope(context); 835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string json_string; 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (props) { 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue dict; 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::map<std::string, base::Value*>::iterator iter = props->begin(), 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = props->end(); iter != end; ++iter) { 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.Set(iter->first, iter->second); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JSONStringValueSerializer serializer(&json_string); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!serializer.Serialize(dict)) 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDOMEvent dom_event = frame->document().createEvent("CustomEvent"); 850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDOMCustomEvent event = dom_event.to<blink::WebDOMCustomEvent>(); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The events triggered directly from the plugin <object> are internal events 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // whose implementation details can (and likely will) change over time. The 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wrapper/shim (e.g. <webview> tag) should receive these events, and expose a 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // more appropriate (and stable) event to the consumers as part of the API. 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.initCustomEvent( 857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(GetInternalEventName(event_name.c_str())), 858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) false, 859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) false, 860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSerializedScriptValue::serialize( 861a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v8::String::NewFromUtf8(context->GetIsolate(), 862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) json_string.c_str(), 863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v8::String::kNormalString, 864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) json_string.size()))); 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container()->element().dispatchEvent(event); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateGuestFocusState() { 869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_be_focused = ShouldGuestBeFocused(); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus( 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_be_focused)); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::ShouldGuestBeFocused() const { 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool embedder_focused = false; 880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (render_view_.get()) 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) embedder_focused = render_view_->has_focus(); 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return plugin_focused_ && embedder_focused; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebPluginContainer* BrowserPlugin::container() const { 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container_; 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::initialize(WebPluginContainer* container) { 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container) 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetContentClient()->renderer()->AllowBrowserPlugin(container)) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 89690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Tell |container| to allow this plugin to use script objects. 89790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) npp_.reset(new NPP_t); 89890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) container->allowScriptObjects(); 89990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bindings_.reset(new BrowserPluginBindings(this)); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_ = container; 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWantsWheelEvents(true); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseAttributes(); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_plugin_container_map.Get().insert(std::make_pair(container_, this)); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::EnableCompositing(bool enable) { 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (compositing_enabled_ == enable) 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_enabled_ = enable; 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enable) { 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No need to keep the backing store and damage buffer around if we're now 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // compositing. 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_store_.reset(); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_damage_buffer_.reset(); 918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!compositing_helper_.get()) { 919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) compositing_helper_ = 920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new BrowserPluginCompositingHelper(container_, 921868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_plugin_manager(), 922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view_routing_id_); 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (paint_ack_received_) { 927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We're switching back to the software path. We create a new damage 928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // buffer that can accommodate the current size of the container. 929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params params; 930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Request a full repaint from the guest even if its size is not actually 931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // changing. 932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PopulateResizeGuestParameters(¶ms, 933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) plugin_rect(), 934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) true /* needs_repaint */); 935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint_ack_received_ = false; 936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest( 937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) render_view_routing_id_, 938f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) guest_instance_id_, 939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) params)); 940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_helper_->EnableCompositing(enable); 943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) compositing_helper_->SetContentsOpaque(!GetAllowTransparencyAttribute()); 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::destroy() { 94790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If the plugin was initialized then it has a valid |npp_| identifier, and 94890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the |container_| must clear references to the plugin's script objects. 94990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!npp_ || container_); 95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (container_) 95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) container_->clearScriptObjects(); 95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The BrowserPlugin's WebPluginContainer is deleted immediately after this 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call returns, so let's not keep a reference to it around. 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_plugin_container_map.Get().erase(container_); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_ = NULL; 957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (compositing_helper_.get()) 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_helper_->OnContainerDestroy(); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Will be a no-op if the mouse is not currently locked. 960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (render_view_.get()) 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_->mouse_lock_dispatcher()->OnLockTargetDestroyed(this); 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObject* BrowserPlugin::scriptableObject() { 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!bindings_) 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPObject* browser_plugin_np_object(bindings_->np_object()); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The object is expected to be retained before it is returned. 971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebBindings::retainObject(browser_plugin_np_object); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_np_object; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NPP BrowserPlugin::pluginNPP() { 97690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return npp_.get(); 97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 97890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::supportsKeyboardFocus() const { 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserPlugin::supportsEditCommands() const { 984868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 987d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)bool BrowserPlugin::supportsInputMethod() const { 988d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) return true; 989d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)} 990d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::canProcessDrag() const { 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::paint(WebCanvas* canvas, const WebRect& rect) { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (guest_crashed_) { 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sad_guest_) // Lazily initialize bitmap. 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sad_guest_ = content::GetContentClient()->renderer()-> 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSadWebViewBitmap(); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content_shell does not have the sad plugin bitmap, so we'll paint black 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instead to make it clear that something went wrong. 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sad_guest_) { 1003ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PaintSadPlugin(canvas, plugin_rect_, *sad_guest_); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkAutoCanvasRestore auto_restore(canvas, true); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->translate(plugin_rect_.x(), plugin_rect_.y()); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRect image_data_rect = SkRect::MakeXYWH( 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(0), 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(0), 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(plugin_rect_.width()), 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(plugin_rect_.height())); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->clipRect(image_data_rect); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paint black or white in case we have nothing in our backing store or we 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to show a gutter. 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPaint paint; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setStyle(SkPaint::kFill_Style); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setColor(guest_crashed_ ? SK_ColorBLACK : SK_ColorWHITE); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawRect(image_data_rect, paint); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stay a solid color if we have never set a non-empty src, or we don't have a 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // backing store. 1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_.get() || !HasGuestInstanceID()) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float inverse_scale_factor = 1.0f / backing_store_->GetScaleFactor(); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->scale(inverse_scale_factor, inverse_scale_factor); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawBitmap(backing_store_->GetBitmap(), 0, 0); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::InBounds(const gfx::Point& position) const { 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that even for plugins that are rotated using rotate transformations, 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we use the the |plugin_rect_| provided by updateGeometry, which means we 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will be off if |position| is within the plugin rect but does not fall 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // within the actual plugin boundary. Not supporting such edge case is OK 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // since this function should not be used for making security-sensitive 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // decisions. 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This also does not take overlapping plugins into account. 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = position.x() >= plugin_rect_.x() && 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.x() < plugin_rect_.x() + plugin_rect_.width() && 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.y() >= plugin_rect_.y() && 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.y() < plugin_rect_.y() + plugin_rect_.height(); 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Point BrowserPlugin::ToLocalCoordinates(const gfx::Point& point) const { 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (container_) 1047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return container_->windowToLocalPoint(blink::WebPoint(point)); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Point(point.x() - plugin_rect_.x(), point.y() - plugin_rect_.y()); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ShouldForwardToBrowserPlugin( 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& message) { 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (message.type()) { 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_AdvanceFocus::ID: 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case BrowserPluginMsg_Attach_ACK::ID: 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_BuffersSwapped::ID: 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case BrowserPluginMsg_CompositorFrameSwapped::ID: 1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case BrowserPluginMsg_CopyFromCompositingSurface::ID: 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_GuestContentWindowReady::ID: 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_GuestGone::ID: 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_SetCursor::ID: 1063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case BrowserPluginMsg_SetMouseLock::ID: 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_ShouldAcceptTouchEvents::ID: 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_UpdatedName::ID: 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_UpdateRect::ID: 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateGeometry( 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& window_rect, 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& clip_rect, 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebVector<WebRect>& cut_outs_rects, 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible) { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_width = width(); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_height = height(); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_rect_ = window_rect; 10823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!attached()) 108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In AutoSize mode, guests don't care when the BrowserPlugin container is 1086424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // resized. If |!paint_ack_received_|, then we are still waiting on a 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // previous resize to be ACK'ed and so we don't issue additional resizes 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // until the previous one is ACK'ed. 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(mthiesse): Assess the performance of calling GetAutoSizeAttribute() on 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resize. 1091424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!paint_ack_received_ || 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (old_width == window_rect.width && old_height == window_rect.height) || 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetAutoSizeAttribute()) { 109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Let the browser know about the updated view rect. 109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateGeometry( 1096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view_routing_id_, guest_instance_id_, plugin_rect_)); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params params; 1101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PopulateResizeGuestParameters(¶ms, plugin_rect(), false); 1102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) paint_ack_received_ = false; 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest( 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_routing_id_, 1105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params)); 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::SwapDamageBuffers() { 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_damage_buffer_.reset(pending_damage_buffer_.release()); 1111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) paint_ack_received_ = true; 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PopulateResizeGuestParameters( 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params* params, 1116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const gfx::Rect& view_rect, 1117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool needs_repaint) { 1118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch params->size_changed = true; 111990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params->view_rect = view_rect; 1120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) params->repaint = needs_repaint; 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->scale_factor = GetDeviceScaleFactor(); 1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (last_device_scale_factor_ != params->scale_factor){ 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->repaint = true; 1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) last_device_scale_factor_ = params->scale_factor; 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In HW compositing mode, we do not need a damage buffer. 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (compositing_enabled_) 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 113190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const size_t stride = skia::PlatformCanvasStrideForWidth(view_rect.width()); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the size of the damage buffer is at least four bytes so that we 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can fit in a magic word to verify that the memory is shared correctly. 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size = 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(sizeof(unsigned int), 113690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static_cast<size_t>(view_rect.height() * 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stride * 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDeviceScaleFactor() * 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDeviceScaleFactor())); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->damage_buffer_size = size; 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_damage_buffer_.reset( 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateDamageBuffer(size, ¶ms->damage_buffer_handle)); 1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!pending_damage_buffer_) 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->damage_buffer_sequence_id = ++damage_buffer_sequence_id_; 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::GetDamageBufferWithSizeParams( 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_AutoSize_Params* auto_size_params, 1151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params* resize_guest_params, 1152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool needs_repaint) { 1153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (auto_size_params) { 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PopulateAutoSizeParameters(auto_size_params, GetAutoSizeAttribute()); 1155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else { 1156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) max_auto_size_ = gfx::Size(); 1157424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size view_size = (auto_size_params && auto_size_params->enable) ? 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_params->max_size : gfx::Size(width(), height()); 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_size.IsEmpty()) 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) paint_ack_received_ = false; 116390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect view_rect = gfx::Rect(plugin_rect_.origin(), view_size); 1164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PopulateResizeGuestParameters(resize_guest_params, view_rect, needs_repaint); 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_POSIX) 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::SharedMemory* BrowserPlugin::CreateDamageBuffer( 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t size, 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SharedMemoryHandle* damage_buffer_handle) { 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::SharedMemory> shared_buf( 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderThread::Get()->HostAllocateSharedMemoryBuffer( 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size).release()); 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shared_buf) { 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shared_buf->Map(size)) { 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Insert the magic word. 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef; 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shared_buf->ShareToProcess(base::GetCurrentProcessHandle(), 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_buffer_handle); 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shared_buf.release(); 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN) 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::SharedMemory* BrowserPlugin::CreateDamageBuffer( 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t size, 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SharedMemoryHandle* damage_buffer_handle) { 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::SharedMemory> shared_buf(new base::SharedMemory()); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!shared_buf->CreateAndMapAnonymous(size)) { 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Buffer allocation failed"; 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert the magic word. 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef; 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shared_buf->ShareToProcess(base::GetCurrentProcessHandle(), 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_buffer_handle)) 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shared_buf.release(); 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateFocus(bool focused) { 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_focused_ == focused) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_guest_focus_state = ShouldGuestBeFocused(); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_focused_ = focused; 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldGuestBeFocused() != old_guest_focus_state) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateGuestFocusState(); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateVisibility(bool visible) { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (visible_ == visible) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible_ = visible; 1224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (compositing_helper_.get()) 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_helper_->UpdateVisibility(visible); 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetVisibility( 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 1232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible)); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::acceptsInputEvents() { 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::handleInputEvent(const blink::WebInputEvent& event, 1241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCursorInfo& cursor_info) { 12427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (guest_crashed_ || !HasGuestInstanceID()) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (event.type == blink::WebInputEvent::ContextMenu) 12467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 12477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebInputEvent* modified_event = &event; 1249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<blink::WebTouchEvent> touch_event; 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebKit gives BrowserPlugin a list of touches that are down, but the browser 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // process expects a list of all touches. We modify the TouchEnd event here to 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // match these expectations. 1253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (event.type == blink::WebInputEvent::TouchEnd) { 1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebTouchEvent* orig_touch_event = 1255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<const blink::WebTouchEvent*>(&event); 1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) touch_event.reset(new blink::WebTouchEvent()); 1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) memcpy(touch_event.get(), orig_touch_event, sizeof(blink::WebTouchEvent)); 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (touch_event->changedTouchesLength > 0) { 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memcpy(&touch_event->touches[touch_event->touchesLength], 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &touch_event->changedTouches, 1261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) touch_event->changedTouchesLength * sizeof(blink::WebTouchPoint)); 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_event->touchesLength += touch_event->changedTouchesLength; 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) modified_event = touch_event.get(); 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (blink::WebInputEvent::isKeyboardEventType(event.type) && 1268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !edit_commands_.empty()) { 1269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_plugin_manager()->Send( 1270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent( 1271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view_routing_id_, 12722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch guest_instance_id_, 1273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) edit_commands_)); 1274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) edit_commands_.clear(); 1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_, 1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_rect_, 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) modified_event)); 1282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetWebKitCursorInfo(cursor_, &cursor_info); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::handleDragStatusUpdate(blink::WebDragStatus drag_status, 1287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebDragData& drag_data, 1288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask mask, 1289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebPoint& position, 1290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebPoint& screen) { 1291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (guest_crashed_ || !HasGuestInstanceID()) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BrowserPluginHostMsg_DragStatusUpdate( 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 1296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_status, 1298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DropDataBuilder::Build(drag_data), 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask, 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) position)); 1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didReceiveResponse( 1305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response) { 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didReceiveData(const char* data, int data_length) { 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFinishLoading() { 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BrowserPlugin::didFailLoading(const blink::WebURLError& error) { 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BrowserPlugin::didFinishLoadingFrameRequest(const blink::WebURL& url, 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* notify_data) { 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFailLoadingFrameRequest( 1322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url, 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* notify_data, 1324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLError& error) { 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::executeEditCommand(const blink::WebString& name) { 1328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ExecuteEditCommand( 1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view_routing_id_, 1330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) name.utf8())); 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // BrowserPlugin swallows edit commands. 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool BrowserPlugin::executeEditCommand(const blink::WebString& name, 1338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& value) { 1339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) edit_commands_.push_back(EditCommand(name.utf8(), value.utf8())); 1340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // BrowserPlugin swallows edit commands. 1341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 1342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1344d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)bool BrowserPlugin::setComposition( 1345d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const blink::WebString& text, 1346d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const blink::WebVector<blink::WebCompositionUnderline>& underlines, 1347d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) int selectionStart, 1348d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) int selectionEnd) { 1349d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if (!HasGuestInstanceID()) 1350d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) return false; 1351d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) std::vector<blink::WebCompositionUnderline> std_underlines; 1352d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) for (size_t i = 0; i < underlines.size(); ++i) { 1353d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) std_underlines.push_back(underlines[i]); 1354d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) } 1355d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeSetComposition( 1356d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) render_view_routing_id_, 1357d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) guest_instance_id_, 1358d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) text.utf8(), 1359d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) std_underlines, 1360d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) selectionStart, 1361d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) selectionEnd)); 1362d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) // TODO(kochi): This assumes the IPC handling always succeeds. 1363d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) return true; 1364d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)} 1365d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 1366d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)bool BrowserPlugin::confirmComposition( 1367d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const blink::WebString& text, 1368d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) blink::WebWidget::ConfirmCompositionBehavior selectionBehavior) { 1369d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if (!HasGuestInstanceID()) 1370d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) return false; 1371d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) bool keep_selection = (selectionBehavior == blink::WebWidget::KeepSelection); 1372d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ImeConfirmComposition( 1373d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) render_view_routing_id_, 1374d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) guest_instance_id_, 1375d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) text.utf8(), 1376d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) keep_selection)); 1377d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) // TODO(kochi): This assumes the IPC handling always succeeds. 1378d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) return true; 1379d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)} 1380d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 1381d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)void BrowserPlugin::extendSelectionAndDelete(int before, int after) { 1382d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if (!HasGuestInstanceID()) 1383d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) return; 1384d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) browser_plugin_manager()->Send( 1385d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) new BrowserPluginHostMsg_ExtendSelectionAndDelete( 1386d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) render_view_routing_id_, 1387d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) guest_instance_id_, 1388d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) before, 1389d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) after)); 1390d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)} 1391d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLockMouseACK(bool succeeded) { 1393ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch mouse_locked_ = succeeded; 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_LockMouse_ACK( 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_routing_id_, 1396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) succeeded)); 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnMouseLockLost() { 1401ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch mouse_locked_ = false; 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_UnlockMouse_ACK( 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_routing_id_, 1404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_)); 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::HandleMouseLockedInputEvent( 1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseEvent& event) { 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_, 1411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_rect_, 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &event)); 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1418