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, &param))
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(&params, 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(&params,
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(&params, 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, &params->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