browser_plugin.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 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"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string_number_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_process_impl.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/v8_value_converter_impl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMCustomEvent.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginParams.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/sad_plugin.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined (OS_WIN)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sys_info.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCanvas;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginContainer;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginParams;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPoint;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRect;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURL;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebVector;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static std::string TerminationStatusToString(base::TerminationStatus status) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case base::TERMINATION_STATUS_NORMAL_TERMINATION:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "normal";
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case base::TERMINATION_STATUS_ABNORMAL_TERMINATION:
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case base::TERMINATION_STATUS_STILL_RUNNING:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "abnormal";
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case base::TERMINATION_STATUS_PROCESS_WAS_KILLED:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "killed";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case base::TERMINATION_STATUS_PROCESS_CRASHED:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "crashed";
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case base::TERMINATION_STATUS_MAX_ENUM:
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED() << "Unknown Termination Status.";
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return "unknown";
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static std::string GetInternalEventName(const char* event_name) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::StringPrintf("-internal-%s", event_name);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static std::string PermissionTypeToString(BrowserPluginPermissionType type) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case BrowserPluginPermissionTypeDownload:
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return browser_plugin::kPermissionTypeDownload;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginPermissionTypeGeolocation:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return browser_plugin::kPermissionTypeGeolocation;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginPermissionTypeMedia:
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return browser_plugin::kPermissionTypeMedia;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginPermissionTypeNewWindow:
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return browser_plugin::kPermissionTypeNewWindow;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginPermissionTypePointerLock:
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return browser_plugin::kPermissionTypePointerLock;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginPermissionTypeUnknown:
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return std::string();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<WebKit::WebPluginContainer*,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 BrowserPlugin*> PluginContainerMap;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<PluginContainerMap> g_plugin_container_map =
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPlugin::BrowserPlugin(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewImpl* render_view,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebKit::WebFrame* frame,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebPluginParams& params)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : instance_id_(browser_plugin::kInstanceIDNone),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_(render_view->AsWeakPtr()),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_routing_id_(render_view->GetRoutingID()),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      container_(NULL),
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      damage_buffer_sequence_id_(0),
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resize_ack_received_(true),
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      last_device_scale_factor_(1.0f),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sad_guest_(NULL),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      guest_crashed_(false),
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      auto_size_ack_pending_(false),
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      guest_process_id_(-1),
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      guest_route_id_(-1),
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      persist_storage_(false),
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      valid_partition_id_(true),
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_window_routing_id_(MSG_ROUTING_NONE),
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_focused_(false),
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visible_(true),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_changed_in_flight_(false),
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      before_first_navigation_(true),
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser_plugin_manager_(render_view->GetBrowserPluginManager()),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_nav_entry_index_(0),
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      nav_entry_count_(0),
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      compositing_enabled_(false),
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPlugin::~BrowserPlugin() {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the BrowserPlugin has never navigated then the browser process and
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BrowserPluginManager don't know about it and so there is nothing to do
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // here.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->RemoveBrowserPlugin(instance_id_);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_PluginDestroyed(render_view_routing_id_,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               instance_id_));
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*static*/
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPlugin* BrowserPlugin::FromContainer(
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebPluginContainer* container) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PluginContainerMap* browser_plugins = g_plugin_container_map.Pointer();
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PluginContainerMap::iterator it = browser_plugins->find(container);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return it == browser_plugins->end() ? NULL : it->second;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool handled = true;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_AddMessageToConsole,
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        OnAddMessageToConsole)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_AdvanceFocus, OnAdvanceFocus)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_Attach_ACK, OnAttachACK)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_BuffersSwapped, OnBuffersSwapped)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_Close, OnClose)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginMsg_CompositorFrameSwapped,
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                OnCompositorFrameSwapped(message))
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestContentWindowReady,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnGuestContentWindowReady)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestGone, OnGuestGone)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestResponsive, OnGuestResponsive)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestUnresponsive, OnGuestUnresponsive)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadAbort, OnLoadAbort)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadCommit, OnLoadCommit)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadRedirect, OnLoadRedirect)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadStart, OnLoadStart)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadStop, OnLoadStop)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_RequestPermission, OnRequestPermission)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetCursor, OnSetCursor)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_ShouldAcceptTouchEvents,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnShouldAcceptTouchEvents)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_UnlockMouse, OnUnlockMouse)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_UpdatedName, OnUpdatedName)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(BrowserPluginMsg_UpdateRect, OnUpdateRect)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC_END_MESSAGE_MAP()
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return handled;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateDOMAttribute(const std::string& attribute_name,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       const std::string& attribute_value) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container())
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebElement element = container()->element();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebString web_attribute_name =
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebString::fromUTF8(attribute_name);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasDOMAttribute(attribute_name) ||
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (std::string(element.getAttribute(web_attribute_name).utf8()) !=
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          attribute_value)) {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element.setAttribute(web_attribute_name,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WebKit::WebString::fromUTF8(attribute_value));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RemoveDOMAttribute(const std::string& attribute_name) {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container())
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container()->element().removeAttribute(
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebString::fromUTF8(attribute_name));
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetDOMAttributeValue(
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& attribute_name) const {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container())
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return std::string();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container()->element().getAttribute(
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebString::fromUTF8(attribute_name)).utf8();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::HasDOMAttribute(const std::string& attribute_name) const {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container())
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container()->element().hasAttribute(
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebString::fromUTF8(attribute_name));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetNameAttribute() const {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetDOMAttributeValue(browser_plugin::kAttributeName);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetSrcAttribute() const {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetDOMAttributeValue(browser_plugin::kAttributeSrc);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::GetAutoSizeAttribute() const {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return HasDOMAttribute(browser_plugin::kAttributeAutoSize);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMaxHeightAttribute() const {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_height;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxHeight),
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    &max_height);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return max_height;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMaxWidthAttribute() const {
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_width;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxWidth),
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    &max_width);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return max_width;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMinHeightAttribute() const {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_height;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinHeight),
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    &min_height);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return min_height;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMinWidthAttribute() const {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_width;
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinWidth),
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    &min_width);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return min_width;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMaxHeight() const {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_height = GetMaxHeightAttribute();
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return max_height ? max_height : height();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMaxWidth() const {
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_width = GetMaxWidthAttribute();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return max_width ? max_width : width();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMinHeight() const {
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_height = GetMinHeightAttribute();
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FrameView.cpp does not allow this value to be <= 0, so when the value is
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // unset (or set to 0), we set it to the container size.
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  min_height = min_height ? min_height : height();
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For autosize, minHeight should not be bigger than maxHeight.
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::min(min_height, GetAdjustedMaxHeight());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMinWidth() const {
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int min_width = GetMinWidthAttribute();
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FrameView.cpp does not allow this value to be <= 0, so when the value is
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // unset (or set to 0), we set it to the container size.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  min_width = min_width ? min_width : width();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For autosize, minWidth should not be bigger than maxWidth.
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::min(min_width, GetAdjustedMaxWidth());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetPartitionAttribute() const {
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetDOMAttributeValue(browser_plugin::kAttributePartition);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseNameAttribute() {
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_SetName(render_view_routing_id_,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       instance_id_,
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GetNameAttribute()));
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ParseSrcAttribute(std::string* error_message) {
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!valid_partition_id_) {
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error_message = browser_plugin::kErrorInvalidPartition;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string src = GetSrcAttribute();
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (src.empty())
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we haven't created the guest yet, do so now. We will navigate it right
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // after creation. If |src| is empty, we can delay the creation until we
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // actually need it.
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest()) {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // On initial navigation, we request an instance ID from the browser
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // process. We essentially ignore all subsequent calls to SetSrcAttribute
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // until we receive an instance ID. |before_first_navigation_|
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // prevents BrowserPlugin from allocating more than one instance ID.
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Upon receiving an instance ID from the browser process, we continue
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the process of navigation by populating the
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // BrowserPluginHostMsg_Attach_Params with the current state of
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // BrowserPlugin and sending a BrowserPluginHostMsg_CreateGuest to the
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // browser process in order to create a new guest.
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (before_first_navigation_) {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser_plugin_manager()->AllocateInstanceID(this);
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      before_first_navigation_ = false;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_NavigateGuest(render_view_routing_id_,
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             instance_id_,
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             src));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseAutoSizeAttribute() {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto_size_ack_pending_ = true;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_view_size_ = plugin_rect_.size();
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateGuestAutoSizeState(GetAutoSizeAttribute());
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PopulateAutoSizeParameters(
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPluginHostMsg_AutoSize_Params* params, bool current_auto_size) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params->enable = current_auto_size;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No need to populate the params if autosize is off.
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_auto_size) {
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params->max_size = gfx::Size(GetAdjustedMaxWidth(), GetAdjustedMaxHeight());
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params->min_size = gfx::Size(GetAdjustedMinWidth(), GetAdjustedMinHeight());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateGuestAutoSizeState(bool current_auto_size) {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we haven't yet heard back from the guest about the last resize request,
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then we don't issue another request until we do in
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BrowserPlugin::UpdateRect.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest() || !resize_ack_received_)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginHostMsg_AutoSize_Params auto_size_params;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_auto_size) {
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDamageBufferWithSizeParams(&auto_size_params, &resize_guest_params);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDamageBufferWithSizeParams(NULL, &resize_guest_params);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resize_ack_received_ = false;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_SetAutoSize(render_view_routing_id_,
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           instance_id_,
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           auto_size_params,
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           resize_guest_params));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::SizeChangedDueToAutoSize(const gfx::Size& old_view_size) {
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_changed_in_flight_ = false;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kOldHeight] =
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(old_view_size.height());
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kOldWidth] =
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(old_view_size.width());
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kNewHeight] =
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(last_view_size_.height());
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kNewWidth] =
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(last_view_size_.width());
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventSizeChanged, &props);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::UsesDamageBuffer(
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const BrowserPluginMsg_UpdateRect_Params& params) {
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return params.damage_buffer_sequence_id != 0 || params.needs_ack;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::UsesPendingDamageBuffer(
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const BrowserPluginMsg_UpdateRect_Params& params) {
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!pending_damage_buffer_)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return damage_buffer_sequence_id_ == params.damage_buffer_sequence_id;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::Attach(int instance_id) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(instance_id != browser_plugin::kInstanceIDNone);
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  before_first_navigation_ = false;
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance_id_ = instance_id;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->AddBrowserPlugin(instance_id, this);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserPluginHostMsg_Attach_Params create_guest_params;
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_guest_params.focused = ShouldGuestBeFocused();
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_guest_params.visible = visible_;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_guest_params.name = GetNameAttribute();
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_guest_params.storage_partition_id = storage_partition_id_;
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_guest_params.persist_storage = persist_storage_;
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  create_guest_params.src = GetSrcAttribute();
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetDamageBufferWithSizeParams(&create_guest_params.auto_size_params,
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                &create_guest_params.resize_guest_params);
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new BrowserPluginHostMsg_Attach(render_view_routing_id_,
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      instance_id_, create_guest_params));
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::DidCommitCompositorFrame() {
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (compositing_helper_)
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    compositing_helper_->DidCommitCompositorFrame();
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnAddMessageToConsole(
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int instance_id, const base::DictionaryValue& message_info) {
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::map<std::string, base::Value*> props;
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Fill in the info provided by the browser.
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (DictionaryValue::Iterator iter(message_info); !iter.IsAtEnd();
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           iter.Advance()) {
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    props[iter.key()] = iter.value().DeepCopy();
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventConsoleMessage, &props);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnAdvanceFocus(int instance_id, bool reverse) {
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(render_view_);
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view_->GetWebView()->advanceFocus(reverse);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnAttachACK(
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int instance_id,
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const BrowserPluginMsg_Attach_ACK_Params& params) {
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Update BrowserPlugin attributes to match the state of the guest.
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!params.name.empty())
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnUpdatedName(instance_id, params.name);
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!params.storage_partition_id.empty()) {
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string partition_name =
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        (params.persist_storage ? browser_plugin::kPersistPrefix : "") +
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            params.storage_partition_id;
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    UpdateDOMAttribute(browser_plugin::kAttributePartition, partition_name);
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnBuffersSwapped(int instance_id,
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Size& size,
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     std::string mailbox_name,
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     int gpu_route_id,
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     int gpu_host_id) {
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(instance_id == instance_id_);
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EnableCompositing(true);
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  compositing_helper_->OnBuffersSwapped(size,
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        mailbox_name,
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        gpu_route_id,
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        gpu_host_id,
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        GetDeviceScaleFactor());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnClose(int instance_id) {
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventClose, NULL);
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnCompositorFrameSwapped(const IPC::Message& message) {
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserPluginMsg_CompositorFrameSwapped::Param param;
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!BrowserPluginMsg_CompositorFrameSwapped::Read(&message, &param))
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  param.b.AssignTo(frame.get());
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnableCompositing(true);
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  compositing_helper_->OnCompositorFrameSwapped(frame.Pass(),
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                param.c /* route_id */,
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                param.d /* host_id */);
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnGuestContentWindowReady(int instance_id,
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              int content_window_routing_id) {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(content_window_routing_id != MSG_ROUTING_NONE);
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_window_routing_id_ = content_window_routing_id;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnGuestGone(int instance_id, int process_id, int status) {
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the BrowserPlugin in a crashed state before firing event listeners so
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that operations on the BrowserPlugin within listeners are aware that
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BrowserPlugin is in a crashed state.
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  guest_crashed_ = true;
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We fire the event listeners before painting the sad graphic to give the
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // developer an opportunity to display an alternative overlay image on crash.
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string termination_status = TerminationStatusToString(
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<base::TerminationStatus>(status));
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kProcessId] = new base::FundamentalValue(process_id);
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kReason] = new base::StringValue(termination_status);
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Event listeners may remove the BrowserPlugin from the document. If that
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // happens, the BrowserPlugin will be scheduled for later deletion (see
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BrowserPlugin::destroy()). That will clear the container_ reference,
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but leave other member variables valid below.
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventExit, &props);
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We won't paint the contents of the current backing store again so we might
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as well toss it out and save memory.
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  backing_store_.reset();
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the BrowserPlugin is scheduled to be deleted, then container_ will be
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NULL so we shouldn't attempt to access it.
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (container_)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container_->invalidate();
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Turn off compositing so we can display the sad graphic.
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EnableCompositing(false);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnGuestResponsive(int instance_id, int process_id) {
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kProcessId] = new base::FundamentalValue(process_id);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventResponsive, &props);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnGuestUnresponsive(int instance_id, int process_id) {
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kProcessId] = new base::FundamentalValue(process_id);
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventUnresponsive, &props);
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLoadAbort(int instance_id,
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const GURL& url,
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                bool is_top_level,
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const std::string& type) {
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kURL] = new base::StringValue(url.spec());
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kIsTopLevel] = new base::FundamentalValue(is_top_level);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kReason] = new base::StringValue(type);
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventLoadAbort, &props);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLoadCommit(
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int instance_id,
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const BrowserPluginMsg_LoadCommit_Params& params) {
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the guest has just committed a new navigation then it is no longer
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // crashed.
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  guest_crashed_ = false;
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params.is_top_level)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateDOMAttribute(browser_plugin::kAttributeSrc, params.url.spec());
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  guest_process_id_ = params.process_id;
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  guest_route_id_ = params.route_id;
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_nav_entry_index_ = params.current_entry_index;
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  nav_entry_count_ = params.entry_count;
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kURL] = new base::StringValue(params.url.spec());
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kIsTopLevel] =
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new base::FundamentalValue(params.is_top_level);
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventLoadCommit, &props);
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLoadRedirect(int instance_id,
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const GURL& old_url,
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const GURL& new_url,
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool is_top_level) {
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kOldURL] = new base::StringValue(old_url.spec());
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kNewURL] = new base::StringValue(new_url.spec());
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kIsTopLevel] = new base::FundamentalValue(is_top_level);
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventLoadRedirect, &props);
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLoadStart(int instance_id,
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const GURL& url,
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                bool is_top_level) {
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kURL] = new base::StringValue(url.spec());
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kIsTopLevel] = new base::FundamentalValue(is_top_level);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventLoadStart, &props);
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLoadStop(int instance_id) {
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(browser_plugin::kEventLoadStop, NULL);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnRequestPermission(
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int instance_id,
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPluginPermissionType permission_type,
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int request_id,
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::DictionaryValue& request_info) {
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The New Window API is very similiar to the permission API in structure,
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but exposes a slightly different interface to the developer and so we put
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it in a separate event.
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* event_name =
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (permission_type == BrowserPluginPermissionTypeNewWindow) ?
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser_plugin::kEventNewWindow :
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              browser_plugin::kEventRequestPermission;
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddPermissionRequestToMap(request_id, permission_type);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::Value*> props;
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kPermission] =
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Value::CreateStringValue(PermissionTypeToString(permission_type));
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  props[browser_plugin::kRequestId] =
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Value::CreateIntegerValue(request_id);
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fill in the info provided by the browser.
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (DictionaryValue::Iterator iter(request_info); !iter.IsAtEnd();
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           iter.Advance()) {
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    props[iter.key()] = iter.value().DeepCopy();
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TriggerEvent(event_name, &props);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnSetCursor(int instance_id, const WebCursor& cursor) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursor_ = cursor;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnShouldAcceptTouchEvents(int instance_id, bool accept) {
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (container()) {
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    container()->requestTouchEventType(accept ?
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WebKit::WebPluginContainer::TouchEventRequestTypeRaw :
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WebKit::WebPluginContainer::TouchEventRequestTypeNone);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnUnlockMouse(int instance_id) {
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_view_->mouse_lock_dispatcher()->UnlockMouse(this);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnUpdatedName(int instance_id, const std::string& name) {
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateDOMAttribute(browser_plugin::kAttributeName, name);
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::AddPermissionRequestToMap(int request_id,
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPluginPermissionType type) {
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!pending_permission_requests_.count(request_id));
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_permission_requests_.insert(std::make_pair(request_id, type));
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnUpdateRect(
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int instance_id,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BrowserPluginMsg_UpdateRect_Params& params) {
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool use_new_damage_buffer = !backing_store_;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginHostMsg_AutoSize_Params auto_size_params;
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params;
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we have a pending damage buffer, and the guest has begun to use the
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // damage buffer then we know the guest will no longer use the current
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // damage buffer. At this point, we drop the current damage buffer, and
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // mark the pending damage buffer as the current damage buffer.
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (UsesPendingDamageBuffer(params)) {
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SwapDamageBuffers();
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    use_new_damage_buffer = true;
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool auto_size = GetAutoSizeAttribute();
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We receive a resize ACK in regular mode, but not in autosize.
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In SW, |resize_ack_received_| is reset in SwapDamageBuffers().
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In HW mode, we need to do it here so we can continue sending
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resize messages when needed.
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params.is_resize_ack ||
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!params.needs_ack && (auto_size || auto_size_ack_pending_)))
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resize_ack_received_ = true;
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto_size_ack_pending_ = false;
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((!auto_size && (width() != params.view_size.width() ||
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      height() != params.view_size.height())) ||
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (auto_size && (!InAutoSizeBounds(params.view_size))) ||
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetDeviceScaleFactor() != params.scale_factor) {
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We are HW accelerated, render widget does not expect an ack,
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // but we still need to update the size.
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!params.needs_ack) {
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateGuestAutoSizeState(auto_size);
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!resize_ack_received_) {
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // The guest has not yet responded to the last resize request, and
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // so we don't want to do anything at this point other than ACK the guest.
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (auto_size)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PopulateAutoSizeParameters(&auto_size_params, auto_size);
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // If we have no pending damage buffer, then the guest has not caught up
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // with the BrowserPlugin container. We now tell the guest about the new
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // container size.
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (auto_size) {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetDamageBufferWithSizeParams(&auto_size_params,
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      &resize_guest_params);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetDamageBufferWithSizeParams(NULL, &resize_guest_params);
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK(
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view_routing_id_,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_id_,
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        auto_size_params,
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        resize_guest_params));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (auto_size && (params.view_size != last_view_size_)) {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (backing_store_)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      backing_store_->Clear(SK_ColorWHITE);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size old_view_size = last_view_size_;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_view_size_ = params.view_size;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Schedule a SizeChanged instead of calling it directly to ensure that
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the backing store has been updated before the developer attempts to
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // resize to avoid flicker. |size_changed_in_flight_| acts as a form of
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // flow control for SizeChanged events. If the guest's view size is changing
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // rapidly before a SizeChanged event fires, then we avoid scheduling
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // another SizeChanged event. SizeChanged reads the new size from
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |last_view_size_| so we can be sure that it always fires an event
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // with the last seen view size.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (container_ && !size_changed_in_flight_) {
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_changed_in_flight_ = true;
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BrowserPlugin::SizeChangedDueToAutoSize,
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     base::Unretained(this),
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     old_view_size));
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No more work to do since the guest is no longer using a damage buffer.
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!UsesDamageBuffer(params))
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we are seeing damage buffers, HW compositing should be turned off.
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EnableCompositing(false);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we are now using a new damage buffer, then that means that the guest
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // has updated its size state in response to a resize request. We change
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the backing store's size to accomodate the new damage buffer size.
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (use_new_damage_buffer) {
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int backing_store_width = auto_size ? GetAdjustedMaxWidth() : width();
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int backing_store_height = auto_size ? GetAdjustedMaxHeight(): height();
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    backing_store_.reset(
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new BrowserPluginBackingStore(
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gfx::Size(backing_store_width, backing_store_height),
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            params.scale_factor));
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the backing store.
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!params.scroll_rect.IsEmpty()) {
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    backing_store_->ScrollBackingStore(params.scroll_delta,
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       params.scroll_rect,
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       params.view_size);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  backing_store_->PaintToBackingStore(params.bitmap_rect,
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      params.copy_rects,
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      current_damage_buffer_->memory());
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalidate the container.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the BrowserPlugin is scheduled to be deleted, then container_ will be
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL so we shouldn't attempt to access it.
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (container_)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    container_->invalidate();
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (auto_size)
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PopulateAutoSizeParameters(&auto_size_params, auto_size);
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK(
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_routing_id_,
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_id_,
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      auto_size_params,
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resize_guest_params));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseSizeContraintsChanged() {
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool auto_size = GetAutoSizeAttribute();
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (auto_size)
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateGuestAutoSizeState(true);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::InAutoSizeBounds(const gfx::Size& size) const {
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return size.width() <= GetAdjustedMaxWidth() &&
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      size.height() <= GetAdjustedMaxHeight();
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NPObject* BrowserPlugin::GetContentWindow() const {
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (content_window_routing_id_ == MSG_ROUTING_NONE)
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderViewImpl* guest_render_view = RenderViewImpl::FromRoutingID(
801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content_window_routing_id_);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!guest_render_view)
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebFrame* guest_frame = guest_render_view->GetWebView()->mainFrame();
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return guest_frame->windowObject();
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::AttachWindowTo(const WebKit::WebNode& node, int window_id) {
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (node.isNull())
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!node.isElementNode())
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebElement shim_element = node.toConst<WebKit::WebElement>();
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The shim containing the BrowserPlugin must be attached to a document.
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (shim_element.document().isNull())
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebNode shadow_root = shim_element.shadowRoot();
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (shadow_root.isNull() || !shadow_root.hasChildNodes())
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebNode plugin_element = shadow_root.firstChild();
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebPluginContainer* plugin_container =
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      plugin_element.pluginContainer();
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!plugin_container)
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPlugin* browser_plugin =
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BrowserPlugin::FromContainer(plugin_container);
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!browser_plugin)
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the BrowserPlugin already has a guest attached to it then we probably
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // shouldn't allow attaching a different guest.
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(fsamuel): We may wish to support reattaching guests in the future:
839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // http://crbug.com/156219.
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (browser_plugin->HasGuest())
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser_plugin->Attach(window_id);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::HasGuest() const {
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return instance_id_ != browser_plugin::kInstanceIDNone;
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::CanGoBack() const {
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return nav_entry_count_ > 1 && current_nav_entry_index_ > 0;
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::CanGoForward() const {
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return current_nav_entry_index_ >= 0 &&
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_nav_entry_index_ < (nav_entry_count_ - 1);
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ParsePartitionAttribute(std::string* error_message) {
861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!before_first_navigation_) {
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error_message = browser_plugin::kErrorAlreadyNavigated;
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string input = GetPartitionAttribute();
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Since the "persist:" prefix is in ASCII, StartsWith will work fine on
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // UTF-8 encoded |partition_id|. If the prefix is a match, we can safely
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // remove the prefix without splicing in the middle of a multi-byte codepoint.
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We can use the rest of the string as UTF-8 encoded one.
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (StartsWithASCII(input, browser_plugin::kPersistPrefix, true)) {
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t index = input.find(":");
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(index != std::string::npos);
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It is safe to do index + 1, since we tested for the full prefix above.
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    input = input.substr(index + 1);
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (input.empty()) {
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      valid_partition_id_ = false;
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *error_message = browser_plugin::kErrorInvalidPartition;
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    persist_storage_ = true;
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    persist_storage_ = false;
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  valid_partition_id_ = true;
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  storage_partition_id_ = input;
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::CanRemovePartitionAttribute(std::string* error_message) {
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (HasGuest())
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *error_message = browser_plugin::kErrorCannotRemovePartition;
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !HasGuest();
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseAttributes() {
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mthiesse): Handle errors here?
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ParsePartitionAttribute(&error);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parse the 'src' attribute last, as it will set the has_navigated_ flag to
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // true, which prevents changing the 'partition' attribute.
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ParseSrcAttribute(&error);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float BrowserPlugin::GetDeviceScaleFactor() const {
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_view_)
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 1.0f;
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return render_view_->GetWebView()->deviceScaleFactor();
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::UpdateDeviceScaleFactor(float device_scale_factor) {
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (last_device_scale_factor_ == device_scale_factor || !resize_ack_received_)
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserPluginHostMsg_ResizeGuest_Params params;
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PopulateResizeGuestParameters(&params, gfx::Size(width(), height()));
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view_routing_id_,
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      instance_id_,
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      params));
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::TriggerEvent(const std::string& event_name,
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 std::map<std::string, base::Value*>* props) {
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container() || !container()->element().document().frame())
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v8::HandleScope handle_scope;
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string json_string;
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (props) {
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::DictionaryValue dict;
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (std::map<std::string, base::Value*>::iterator iter = props->begin(),
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             end = props->end(); iter != end; ++iter) {
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dict.Set(iter->first, iter->second);
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    JSONStringValueSerializer serializer(&json_string);
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!serializer.Serialize(dict))
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebFrame* frame = container()->element().document().frame();
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebDOMEvent dom_event = frame->document().createEvent("CustomEvent");
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebDOMCustomEvent event = dom_event.to<WebKit::WebDOMCustomEvent>();
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The events triggered directly from the plugin <object> are internal events
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // whose implementation details can (and likely will) change over time. The
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // wrapper/shim (e.g. <webview> tag) should receive these events, and expose a
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // more appropriate (and stable) event to the consumers as part of the API.
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event.initCustomEvent(
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebString::fromUTF8(GetInternalEventName(event_name.c_str())),
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false, false,
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebSerializedScriptValue::serialize(
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          v8::String::New(json_string.c_str(), json_string.size())));
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container()->element().dispatchEvent(event);
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnRequestObjectGarbageCollected(int request_id) {
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove from alive objects.
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<int, AliveV8PermissionRequestItem*>::iterator iter =
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      alive_v8_permission_request_objects_.find(request_id);
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (iter != alive_v8_permission_request_objects_.end())
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    alive_v8_permission_request_objects_.erase(iter);
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If a decision has not been made for this request yet, deny it.
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RespondPermissionIfRequestIsPending(request_id, false /*allow*/);
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PersistRequestObject(
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NPVariant* request, const std::string& type, int id) {
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(alive_v8_permission_request_objects_.find(id) ==
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        alive_v8_permission_request_objects_.end());
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (pending_permission_requests_.find(id) ==
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pending_permission_requests_.end()) {
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  v8::Isolate* isolate = v8::Isolate::GetCurrent();
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  v8::Persistent<v8::Value> weak_request(
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      isolate, WebKit::WebBindings::toV8Value(request));
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AliveV8PermissionRequestItem* new_item =
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new std::pair<int, base::WeakPtr<BrowserPlugin> >(
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          id, weak_ptr_factory_.GetWeakPtr());
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::pair<std::map<int, AliveV8PermissionRequestItem*>::iterator, bool>
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result = alive_v8_permission_request_objects_.insert(
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          std::make_pair(id, new_item));
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(result.second);  // Inserted in the map.
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AliveV8PermissionRequestItem* request_item = result.first->second;
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  weak_request.MakeWeak(isolate, request_item, WeakCallbackForPersistObject);
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::WeakCallbackForPersistObject(
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    v8::Isolate* isolate, v8::Persistent<v8::Value> object, void* param) {
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  v8::Persistent<v8::Object> persistent_object =
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      v8::Persistent<v8::Object>::Cast(object);
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AliveV8PermissionRequestItem* item_ptr =
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<AliveV8PermissionRequestItem*>(param);
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int request_id = item_ptr->first;
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtr<BrowserPlugin> plugin = item_ptr->second;
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete item_ptr;
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persistent_object.Dispose(isolate);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  persistent_object.Clear();
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (plugin) {
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Asynchronously remove item from |alive_v8_permission_request_objects_|.
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note that we are using weak pointer for the following PostTask, so we
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // don't need to worry about BrowserPlugin going away.
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FROM_HERE,
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&BrowserPlugin::OnRequestObjectGarbageCollected,
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   plugin,
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   request_id));
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Back() {
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_Go(render_view_routing_id_,
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  instance_id_, -1));
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Forward() {
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_Go(render_view_routing_id_,
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  instance_id_, 1));
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Go(int relative_index) {
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_Go(render_view_routing_id_,
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  instance_id_,
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  relative_index));
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::TerminateGuest() {
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest() || guest_crashed_)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_TerminateGuest(render_view_routing_id_,
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              instance_id_));
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Stop() {
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_Stop(render_view_routing_id_,
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    instance_id_));
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Reload() {
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_Reload(render_view_routing_id_,
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      instance_id_));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateGuestFocusState() {
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool should_be_focused = ShouldGuestBeFocused();
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus(
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_routing_id_,
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_id_,
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      should_be_focused));
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::ShouldGuestBeFocused() const {
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool embedder_focused = false;
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view_)
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    embedder_focused = render_view_->has_focus();
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return plugin_focused_ && embedder_focused;
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKit::WebPluginContainer* BrowserPlugin::container() const {
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return container_;
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RespondPermission(
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPluginPermissionType permission_type, int request_id, bool allow) {
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (permission_type == BrowserPluginPermissionTypePointerLock)
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RespondPermissionPointerLock(allow);
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser_plugin_manager()->Send(
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new BrowserPluginHostMsg_RespondPermission(
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            render_view_->GetRoutingID(), instance_id_, permission_type,
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            request_id, allow));
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RespondPermissionPointerLock(bool allow) {
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (allow)
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_view_->mouse_lock_dispatcher()->LockMouse(this);
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnLockMouseACK(false);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RespondPermissionIfRequestIsPending(
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int request_id, bool allow) {
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PendingPermissionRequests::iterator iter =
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pending_permission_requests_.find(request_id);
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (iter == pending_permission_requests_.end())
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginPermissionType permission_type = iter->second;
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_permission_requests_.erase(iter);
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RespondPermission(permission_type, request_id, allow);
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnEmbedderDecidedPermission(int request_id, bool allow) {
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RespondPermissionIfRequestIsPending(request_id, allow);
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::initialize(WebPluginContainer* container) {
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!container)
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetContentClient()->renderer()->AllowBrowserPlugin(container))
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bindings_.reset(new BrowserPluginBindings(this));
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container_ = container;
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  container_->setWantsWheelEvents(true);
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ParseAttributes();
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  g_plugin_container_map.Get().insert(std::make_pair(container_, this));
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::EnableCompositing(bool enable) {
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (compositing_enabled_ == enable)
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  compositing_enabled_ = enable;
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (enable) {
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No need to keep the backing store and damage buffer around if we're now
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // compositing.
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    backing_store_.reset();
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_damage_buffer_.reset();
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!compositing_helper_) {
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      compositing_helper_ = new BrowserPluginCompositingHelper(
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          container_,
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser_plugin_manager(),
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          instance_id_,
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          render_view_routing_id_);
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We're switching back to the software path. We create a new damage
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // buffer that can accommodate the current size of the container.
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPluginHostMsg_ResizeGuest_Params params;
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PopulateResizeGuestParameters(&params, gfx::Size(width(), height()));
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Request a full repaint from the guest even if its size is not actually
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // changing.
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.repaint = true;
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resize_ack_received_ = false;
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_view_routing_id_,
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        instance_id_,
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params));
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  compositing_helper_->EnableCompositing(enable);
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::destroy() {
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The BrowserPlugin's WebPluginContainer is deleted immediately after this
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call returns, so let's not keep a reference to it around.
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  g_plugin_container_map.Get().erase(container_);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  container_ = NULL;
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (compositing_helper_)
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositing_helper_->OnContainerDestroy();
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Will be a no-op if the mouse is not currently locked.
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_view_)
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_view_->mouse_lock_dispatcher()->OnLockTargetDestroyed(this);
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObject* BrowserPlugin::scriptableObject() {
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!bindings_)
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObject* browser_plugin_np_object(bindings_->np_object());
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The object is expected to be retained before it is returned.
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebBindings::retainObject(browser_plugin_np_object);
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_plugin_np_object;
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::supportsKeyboardFocus() const {
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::canProcessDrag() const {
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::paint(WebCanvas* canvas, const WebRect& rect) {
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (guest_crashed_) {
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!sad_guest_)  // Lazily initialize bitmap.
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sad_guest_ = content::GetContentClient()->renderer()->
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetSadWebViewBitmap();
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // content_shell does not have the sad plugin bitmap, so we'll paint black
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // instead to make it clear that something went wrong.
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sad_guest_) {
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webkit::PaintSadPlugin(canvas, plugin_rect_, *sad_guest_);
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkAutoCanvasRestore auto_restore(canvas, true);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->translate(plugin_rect_.x(), plugin_rect_.y());
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkRect image_data_rect = SkRect::MakeXYWH(
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkIntToScalar(0),
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkIntToScalar(0),
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkIntToScalar(plugin_rect_.width()),
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkIntToScalar(plugin_rect_.height()));
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->clipRect(image_data_rect);
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Paint black or white in case we have nothing in our backing store or we
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to show a gutter.
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkPaint paint;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  paint.setStyle(SkPaint::kFill_Style);
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  paint.setColor(guest_crashed_ ? SK_ColorBLACK : SK_ColorWHITE);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->drawRect(image_data_rect, paint);
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stay a solid color if we have never set a non-empty src, or we don't have a
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // backing store.
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!backing_store_.get() || !HasGuest())
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float inverse_scale_factor =  1.0f / backing_store_->GetScaleFactor();
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->scale(inverse_scale_factor, inverse_scale_factor);
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->drawBitmap(backing_store_->GetBitmap(), 0, 0);
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::InBounds(const gfx::Point& position) const {
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note that even for plugins that are rotated using rotate transformations,
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we use the the |plugin_rect_| provided by updateGeometry, which means we
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will be off if |position| is within the plugin rect but does not fall
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // within the actual plugin boundary. Not supporting such edge case is OK
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // since this function should not be used for making security-sensitive
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // decisions.
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This also does not take overlapping plugins into account.
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = position.x() >= plugin_rect_.x() &&
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      position.x() < plugin_rect_.x() + plugin_rect_.width() &&
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      position.y() >= plugin_rect_.y() &&
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      position.y() < plugin_rect_.y() + plugin_rect_.height();
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Point BrowserPlugin::ToLocalCoordinates(const gfx::Point& point) const {
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (container_)
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return container_->windowToLocalPoint(WebKit::WebPoint(point));
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Point(point.x() - plugin_rect_.x(), point.y() - plugin_rect_.y());
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ShouldForwardToBrowserPlugin(
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const IPC::Message& message) {
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (message.type()) {
1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case BrowserPluginMsg_AddMessageToConsole::ID:
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_AdvanceFocus::ID:
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case BrowserPluginMsg_Attach_ACK::ID:
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_BuffersSwapped::ID:
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case BrowserPluginMsg_Close::ID:
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case BrowserPluginMsg_CompositorFrameSwapped::ID:
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_GuestContentWindowReady::ID:
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_GuestGone::ID:
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_GuestResponsive::ID:
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_GuestUnresponsive::ID:
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_LoadAbort::ID:
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_LoadCommit::ID:
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_LoadRedirect::ID:
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_LoadStart::ID:
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_LoadStop::ID:
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_RequestPermission::ID:
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_SetCursor::ID:
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_ShouldAcceptTouchEvents::ID:
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_UnlockMouse::ID:
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_UpdatedName::ID:
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BrowserPluginMsg_UpdateRect::ID:
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateGeometry(
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebRect& window_rect,
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebRect& clip_rect,
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebVector<WebRect>& cut_outs_rects,
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_visible) {
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int old_width = width();
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int old_height = height();
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_rect_ = window_rect;
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In AutoSize mode, guests don't care when the BrowserPlugin container is
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resized. If |!resize_ack_received_|, then we are still waiting on a
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // previous resize to be ACK'ed and so we don't issue additional resizes
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // until the previous one is ACK'ed.
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mthiesse): Assess the performance of calling GetAutoSizeAttribute() on
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resize.
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest() ||
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !resize_ack_received_ ||
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (old_width == window_rect.width && old_height == window_rect.height) ||
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetAutoSizeAttribute()) {
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserPluginHostMsg_ResizeGuest_Params params;
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PopulateResizeGuestParameters(&params, gfx::Size(width(), height()));
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resize_ack_received_ = false;
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest(
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_routing_id_,
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      instance_id_,
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params));
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::SwapDamageBuffers() {
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_damage_buffer_.reset(pending_damage_buffer_.release());
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resize_ack_received_ = true;
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PopulateResizeGuestParameters(
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserPluginHostMsg_ResizeGuest_Params* params,
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size& view_size) {
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params->view_size = view_size;
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params->scale_factor = GetDeviceScaleFactor();
1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (last_device_scale_factor_ != params->scale_factor){
1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    params->repaint = true;
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    last_device_scale_factor_ = params->scale_factor;
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In HW compositing mode, we do not need a damage buffer.
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (compositing_enabled_)
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t stride = skia::PlatformCanvasStrideForWidth(view_size.width());
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the size of the damage buffer is at least four bytes so that we
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can fit in a magic word to verify that the memory is shared correctly.
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size =
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::max(sizeof(unsigned int),
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               static_cast<size_t>(view_size.height() *
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   stride *
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   GetDeviceScaleFactor() *
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   GetDeviceScaleFactor()));
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->damage_buffer_size = size;
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_damage_buffer_.reset(
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateDamageBuffer(size, &params->damage_buffer_handle));
1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!pending_damage_buffer_)
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params->damage_buffer_sequence_id = ++damage_buffer_sequence_id_;
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::GetDamageBufferWithSizeParams(
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPluginHostMsg_AutoSize_Params* auto_size_params,
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPluginHostMsg_ResizeGuest_Params* resize_guest_params) {
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (auto_size_params)
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PopulateAutoSizeParameters(auto_size_params, GetAutoSizeAttribute());
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size view_size = (auto_size_params && auto_size_params->enable) ?
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      auto_size_params->max_size : gfx::Size(width(), height());
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view_size.IsEmpty())
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resize_ack_received_ = false;
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PopulateResizeGuestParameters(resize_guest_params, view_size);
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_POSIX)
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const size_t size,
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::SharedMemoryHandle* damage_buffer_handle) {
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::SharedMemory> shared_buf(
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          size).release());
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (shared_buf) {
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (shared_buf->Map(size)) {
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Insert the magic word.
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef;
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shared_buf->ShareToProcess(base::GetCurrentProcessHandle(),
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 damage_buffer_handle);
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return shared_buf.release();
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN)
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const size_t size,
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::SharedMemoryHandle* damage_buffer_handle) {
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::SharedMemory> shared_buf(new base::SharedMemory());
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!shared_buf->CreateAndMapAnonymous(size)) {
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Buffer allocation failed";
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert the magic word.
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef;
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (shared_buf->ShareToProcess(base::GetCurrentProcessHandle(),
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 damage_buffer_handle))
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return shared_buf.release();
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateFocus(bool focused) {
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_focused_ == focused)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool old_guest_focus_state = ShouldGuestBeFocused();
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_focused_ = focused;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShouldGuestBeFocused() != old_guest_focus_state)
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateGuestFocusState();
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateVisibility(bool visible) {
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (visible_ == visible)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visible_ = visible;
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasGuest())
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (compositing_helper_)
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositing_helper_->UpdateVisibility(visible);
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetVisibility(
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view_routing_id_,
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_id_,
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visible));
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::acceptsInputEvents() {
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::handleInputEvent(const WebKit::WebInputEvent& event,
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     WebKit::WebCursorInfo& cursor_info) {
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (guest_crashed_ || !HasGuest() ||
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event.type == WebKit::WebInputEvent::ContextMenu)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const WebKit::WebInputEvent* modified_event = &event;
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WebKit::WebTouchEvent> touch_event;
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WebKit gives BrowserPlugin a list of touches that are down, but the browser
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // process expects a list of all touches. We modify the TouchEnd event here to
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // match these expectations.
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.type == WebKit::WebInputEvent::TouchEnd) {
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebTouchEvent* orig_touch_event =
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<const WebKit::WebTouchEvent*>(&event);
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    touch_event.reset(new WebKit::WebTouchEvent());
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    memcpy(touch_event.get(), orig_touch_event, sizeof(WebKit::WebTouchEvent));
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (touch_event->changedTouchesLength > 0) {
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      memcpy(&touch_event->touches[touch_event->touchesLength],
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             &touch_event->changedTouches,
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            touch_event->changedTouchesLength * sizeof(WebKit::WebTouchPoint));
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    touch_event->touchesLength += touch_event->changedTouchesLength;
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    modified_event = touch_event.get();
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_,
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                instance_id_,
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                plugin_rect_,
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                modified_event));
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursor_.GetCursorInfo(&cursor_info);
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::handleDragStatusUpdate(WebKit::WebDragStatus drag_status,
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const WebKit::WebDragData& drag_data,
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           WebKit::WebDragOperationsMask mask,
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const WebKit::WebPoint& position,
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const WebKit::WebPoint& screen) {
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (guest_crashed_ || !HasGuest())
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new BrowserPluginHostMsg_DragStatusUpdate(
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        render_view_routing_id_,
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_id_,
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        drag_status,
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WebDropData(drag_data),
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mask,
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        position));
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didReceiveResponse(
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebURLResponse& response) {
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didReceiveData(const char* data, int data_length) {
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFinishLoading() {
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFailLoading(const WebKit::WebURLError& error) {
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFinishLoadingFrameRequest(const WebKit::WebURL& url,
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 void* notify_data) {
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFailLoadingFrameRequest(
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebURL& url,
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void* notify_data,
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebURLError& error) {
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool BrowserPlugin::executeEditCommand(const WebKit::WebString& name) {
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_ExecuteEditCommand(
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view_routing_id_,
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      instance_id_,
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      name.utf8()));
1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // BrowserPlugin swallows edit commands.
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLockMouseACK(bool succeeded) {
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_LockMouse_ACK(
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_routing_id_,
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      instance_id_,
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      succeeded));
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnMouseLockLost() {
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(new BrowserPluginHostMsg_UnlockMouse_ACK(
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_routing_id_,
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      instance_id_));
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::HandleMouseLockedInputEvent(
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebMouseEvent& event) {
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_plugin_manager()->Send(
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_,
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                instance_id_,
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                plugin_rect_,
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                &event));
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1556