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