browser_plugin.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_constants.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/browser_plugin/browser_plugin_messages.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/content_renderer_client.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_bindings.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_compositing_helper.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/browser_plugin/browser_plugin_manager.h" 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" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/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" 36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h" 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/glue/cursor_utils.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/sad_plugin.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined (OS_WIN) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sys_info.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCanvas; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginContainer; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginParams; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPoint; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRect; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURL; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebVector; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static std::string TerminationStatusToString(base::TerminationStatus status) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::TERMINATION_STATUS_NORMAL_TERMINATION: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "normal"; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case base::TERMINATION_STATUS_STILL_RUNNING: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "abnormal"; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "killed"; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::TERMINATION_STATUS_PROCESS_CRASHED: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "crashed"; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case base::TERMINATION_STATUS_MAX_ENUM: 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unknown Termination Status."; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "unknown"; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static std::string GetInternalEventName(const char* event_name) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::StringPrintf("-internal-%s", event_name); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static std::string PermissionTypeToString(BrowserPluginPermissionType type) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case BrowserPluginPermissionTypeDownload: 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return browser_plugin::kPermissionTypeDownload; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginPermissionTypeGeolocation: 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser_plugin::kPermissionTypeGeolocation; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginPermissionTypeMedia: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser_plugin::kPermissionTypeMedia; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginPermissionTypeNewWindow: 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser_plugin::kPermissionTypeNewWindow; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginPermissionTypePointerLock: 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser_plugin::kPermissionTypePointerLock; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginPermissionTypeUnknown: 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<WebKit::WebPluginContainer*, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPlugin*> PluginContainerMap; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<PluginContainerMap> g_plugin_container_map = 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPlugin::BrowserPlugin( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* render_view, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebFrame* frame, 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const WebPluginParams& params, 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int instance_id) 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : guest_instance_id_(browser_plugin::kInstanceIDNone), 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) instance_id_(instance_id), 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_(render_view->AsWeakPtr()), 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_(render_view->GetRoutingID()), 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_(NULL), 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_buffer_sequence_id_(0), 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_ack_received_(true), 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) last_device_scale_factor_(1.0f), 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sad_guest_(NULL), 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guest_crashed_(false), 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_ack_pending_(false), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) persist_storage_(false), 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valid_partition_id_(true), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_window_routing_id_(MSG_ROUTING_NONE), 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_focused_(false), 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible_(true), 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_changed_in_flight_(false), 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) before_first_navigation_(true), 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager_(render_view->GetBrowserPluginManager()), 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_nav_entry_index_(0), 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_entry_count_(0), 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_enabled_(false), 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_(this) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPlugin::~BrowserPlugin() { 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the BrowserPlugin has never navigated then the browser process and 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowserPluginManager don't know about it and so there is nothing to do 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // here. 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_plugin_manager()->RemoveBrowserPlugin(guest_instance_id_); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_PluginDestroyed(render_view_routing_id_, 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_)); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*static*/ 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserPlugin* BrowserPlugin::FromContainer( 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebPluginContainer* container) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginContainerMap* browser_plugins = g_plugin_container_map.Pointer(); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginContainerMap::iterator it = browser_plugins->find(container); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return it == browser_plugins->end() ? NULL : it->second; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool handled = true; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message) 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_AddMessageToConsole, 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnAddMessageToConsole) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_AdvanceFocus, OnAdvanceFocus) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_Attach_ACK, OnAttachACK) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_BuffersSwapped, OnBuffersSwapped) 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_Close, OnClose) 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginMsg_CompositorFrameSwapped, 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnCompositorFrameSwapped(message)) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestContentWindowReady, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnGuestContentWindowReady) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestGone, OnGuestGone) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestResponsive, OnGuestResponsive) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestUnresponsive, OnGuestUnresponsive) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadAbort, OnLoadAbort) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadCommit, OnLoadCommit) 174b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadHandlerCalled, OnLoadHandlerCalled) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadRedirect, OnLoadRedirect) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadStart, OnLoadStart) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadStop, OnLoadStop) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_RequestPermission, OnRequestPermission) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetCursor, OnSetCursor) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_ShouldAcceptTouchEvents, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnShouldAcceptTouchEvents) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_UnlockMouse, OnUnlockMouse) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_UpdatedName, OnUpdatedName) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(BrowserPluginMsg_UpdateRect, OnUpdateRect) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_END_MESSAGE_MAP() 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return handled; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateDOMAttribute(const std::string& attribute_name, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& attribute_value) { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container()) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebElement element = container()->element(); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebString web_attribute_name = 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebString::fromUTF8(attribute_name); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!HasDOMAttribute(attribute_name) || 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (std::string(element.getAttribute(web_attribute_name).utf8()) != 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attribute_value)) { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element.setAttribute(web_attribute_name, 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebString::fromUTF8(attribute_value)); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RemoveDOMAttribute(const std::string& attribute_name) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container()) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container()->element().removeAttribute( 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebString::fromUTF8(attribute_name)); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetDOMAttributeValue( 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& attribute_name) const { 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container()) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container()->element().getAttribute( 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebString::fromUTF8(attribute_name)).utf8(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::HasDOMAttribute(const std::string& attribute_name) const { 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container()) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container()->element().hasAttribute( 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebString::fromUTF8(attribute_name)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetNameAttribute() const { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetDOMAttributeValue(browser_plugin::kAttributeName); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetSrcAttribute() const { 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetDOMAttributeValue(browser_plugin::kAttributeSrc); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::GetAutoSizeAttribute() const { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HasDOMAttribute(browser_plugin::kAttributeAutoSize); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMaxHeightAttribute() const { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_height; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxHeight), 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &max_height); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_height; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMaxWidthAttribute() const { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_width; 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxWidth), 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &max_width); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_width; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMinHeightAttribute() const { 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_height; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinHeight), 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &min_height); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return min_height; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetMinWidthAttribute() const { 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_width; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinWidth), 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &min_width); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return min_width; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMaxHeight() const { 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_height = GetMaxHeightAttribute(); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_height ? max_height : height(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMaxWidth() const { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_width = GetMaxWidthAttribute(); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_width ? max_width : width(); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMinHeight() const { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_height = GetMinHeightAttribute(); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FrameView.cpp does not allow this value to be <= 0, so when the value is 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unset (or set to 0), we set it to the container size. 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_height = min_height ? min_height : height(); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For autosize, minHeight should not be bigger than maxHeight. 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::min(min_height, GetAdjustedMaxHeight()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int BrowserPlugin::GetAdjustedMinWidth() const { 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int min_width = GetMinWidthAttribute(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FrameView.cpp does not allow this value to be <= 0, so when the value is 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unset (or set to 0), we set it to the container size. 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) min_width = min_width ? min_width : width(); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For autosize, minWidth should not be bigger than maxWidth. 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::min(min_width, GetAdjustedMaxWidth()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string BrowserPlugin::GetPartitionAttribute() const { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetDOMAttributeValue(browser_plugin::kAttributePartition); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseNameAttribute() { 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_SetName(render_view_routing_id_, 308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNameAttribute())); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ParseSrcAttribute(std::string* error_message) { 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!valid_partition_id_) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error_message = browser_plugin::kErrorInvalidPartition; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string src = GetSrcAttribute(); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (src.empty()) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we haven't created the guest yet, do so now. We will navigate it right 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // after creation. If |src| is empty, we can delay the creation until we 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // actually need it. 324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On initial navigation, we request an instance ID from the browser 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // process. We essentially ignore all subsequent calls to SetSrcAttribute 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // until we receive an instance ID. |before_first_navigation_| 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // prevents BrowserPlugin from allocating more than one instance ID. 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Upon receiving an instance ID from the browser process, we continue 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the process of navigation by populating the 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // BrowserPluginHostMsg_Attach_Params with the current state of 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowserPlugin and sending a BrowserPluginHostMsg_CreateGuest to the 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // browser process in order to create a new guest. 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (before_first_navigation_) { 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->AllocateInstanceID(this); 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) before_first_navigation_ = false; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_NavigateGuest(render_view_routing_id_, 343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src)); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseAutoSizeAttribute() { 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_ack_pending_ = true; 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_view_size_ = plugin_rect_.size(); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateGuestAutoSizeState(GetAutoSizeAttribute()); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PopulateAutoSizeParameters( 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_AutoSize_Params* params, bool current_auto_size) { 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->enable = current_auto_size; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No need to populate the params if autosize is off. 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_auto_size) { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->max_size = gfx::Size(GetAdjustedMaxWidth(), GetAdjustedMaxHeight()); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->min_size = gfx::Size(GetAdjustedMinWidth(), GetAdjustedMinHeight()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateGuestAutoSizeState(bool current_auto_size) { 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we haven't yet heard back from the guest about the last resize request, 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // then we don't issue another request until we do in 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowserPlugin::UpdateRect. 368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID() || !resize_ack_received_) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_AutoSize_Params auto_size_params; 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params; 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_auto_size) { 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDamageBufferWithSizeParams(&auto_size_params, &resize_guest_params); 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDamageBufferWithSizeParams(NULL, &resize_guest_params); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_ack_received_ = false; 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_SetAutoSize(render_view_routing_id_, 380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_params, 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_guest_params)); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::SizeChangedDueToAutoSize(const gfx::Size& old_view_size) { 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_changed_in_flight_ = false; 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*> props; 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kOldHeight] = 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(old_view_size.height()); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kOldWidth] = 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(old_view_size.width()); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kNewHeight] = 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(last_view_size_.height()); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kNewWidth] = 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(last_view_size_.width()); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(browser_plugin::kEventSizeChanged, &props); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::UsesDamageBuffer( 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserPluginMsg_UpdateRect_Params& params) { 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return params.damage_buffer_sequence_id != 0 || params.needs_ack; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::UsesPendingDamageBuffer( 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserPluginMsg_UpdateRect_Params& params) { 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!pending_damage_buffer_) 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return damage_buffer_sequence_id_ == params.damage_buffer_sequence_id; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::Attach(int guest_instance_id) { 414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(guest_instance_id != browser_plugin::kInstanceIDNone); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) before_first_navigation_ = false; 416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_ = guest_instance_id; 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserPluginHostMsg_Attach_Params create_guest_params; 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) create_guest_params.browser_plugin_instance_id = instance_id_; 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_guest_params.focused = ShouldGuestBeFocused(); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_guest_params.visible = visible_; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_guest_params.name = GetNameAttribute(); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_guest_params.storage_partition_id = storage_partition_id_; 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_guest_params.persist_storage = persist_storage_; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_guest_params.src = GetSrcAttribute(); 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetDamageBufferWithSizeParams(&create_guest_params.auto_size_params, 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &create_guest_params.resize_guest_params); 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new BrowserPluginHostMsg_Attach(render_view_routing_id_, 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, create_guest_params)); 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::DidCommitCompositorFrame() { 436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (compositing_helper_.get()) 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compositing_helper_->DidCommitCompositorFrame(); 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnAddMessageToConsole( 441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int guest_instance_id, const base::DictionaryValue& message_info) { 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::map<std::string, base::Value*> props; 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Fill in the info provided by the browser. 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (DictionaryValue::Iterator iter(message_info); !iter.IsAtEnd(); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter.Advance()) { 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) props[iter.key()] = iter.value().DeepCopy(); 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TriggerEvent(browser_plugin::kEventConsoleMessage, &props); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnAdvanceFocus(int guest_instance_id, bool reverse) { 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(render_view_.get()); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_->GetWebView()->advanceFocus(reverse); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnAttachACK( 457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int guest_instance_id, 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BrowserPluginMsg_Attach_ACK_Params& params) { 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Update BrowserPlugin attributes to match the state of the guest. 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.name.empty()) 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnUpdatedName(guest_instance_id, params.name); 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.storage_partition_id.empty()) { 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string partition_name = 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (params.persist_storage ? browser_plugin::kPersistPrefix : "") + 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.storage_partition_id; 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDOMAttribute(browser_plugin::kAttributePartition, partition_name); 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnBuffersSwapped(int guest_instance_id, 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& size, 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string mailbox_name, 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int gpu_route_id, 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int gpu_host_id) { 475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(guest_instance_id == guest_instance_id_); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnableCompositing(true); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_helper_->OnBuffersSwapped(size, 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mailbox_name, 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_route_id, 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_host_id, 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDeviceScaleFactor()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnClose(int guest_instance_id) { 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TriggerEvent(browser_plugin::kEventClose, NULL); 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::OnCompositorFrameSwapped(const IPC::Message& message) { 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserPluginMsg_CompositorFrameSwapped::Param param; 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!BrowserPluginMsg_CompositorFrameSwapped::Read(&message, ¶m)) 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) param.b.AssignTo(frame.get()); 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnableCompositing(true); 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) param.c /* route_id */, 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) param.d /* host_id */); 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnGuestContentWindowReady(int guest_instance_id, 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int content_window_routing_id) { 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(content_window_routing_id != MSG_ROUTING_NONE); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_window_routing_id_ = content_window_routing_id; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnGuestGone(int guest_instance_id, 509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int process_id, 510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int status) { 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the BrowserPlugin in a crashed state before firing event listeners so 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that operations on the BrowserPlugin within listeners are aware that 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowserPlugin is in a crashed state. 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) guest_crashed_ = true; 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We fire the event listeners before painting the sad graphic to give the 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // developer an opportunity to display an alternative overlay image on crash. 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string termination_status = TerminationStatusToString( 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<base::TerminationStatus>(status)); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*> props; 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kProcessId] = new base::FundamentalValue(process_id); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kReason] = new base::StringValue(termination_status); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Event listeners may remove the BrowserPlugin from the document. If that 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // happens, the BrowserPlugin will be scheduled for later deletion (see 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BrowserPlugin::destroy()). That will clear the container_ reference, 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but leave other member variables valid below. 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(browser_plugin::kEventExit, &props); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We won't paint the contents of the current backing store again so we might 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // as well toss it out and save memory. 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_store_.reset(); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the BrowserPlugin is scheduled to be deleted, then container_ will be 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NULL so we shouldn't attempt to access it. 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (container_) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->invalidate(); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Turn off compositing so we can display the sad graphic. 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnableCompositing(false); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnGuestResponsive(int guest_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::kEventResponsive, &props); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnGuestUnresponsive(int guest_instance_id, int process_id) { 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*> props; 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kProcessId] = new base::FundamentalValue(process_id); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(browser_plugin::kEventUnresponsive, &props); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnLoadAbort(int guest_instance_id, 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_top_level, 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& type) { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*> props; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kURL] = new base::StringValue(url.spec()); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kIsTopLevel] = new base::FundamentalValue(is_top_level); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kReason] = new base::StringValue(type); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(browser_plugin::kEventLoadAbort, &props); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLoadCommit( 565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int guest_instance_id, 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserPluginMsg_LoadCommit_Params& params) { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the guest has just committed a new navigation then it is no longer 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // crashed. 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) guest_crashed_ = false; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.is_top_level) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDOMAttribute(browser_plugin::kAttributeSrc, params.url.spec()); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_nav_entry_index_ = params.current_entry_index; 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nav_entry_count_ = params.entry_count; 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*> props; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kURL] = new base::StringValue(params.url.spec()); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kIsTopLevel] = 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(params.is_top_level); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(browser_plugin::kEventLoadCommit, &props); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnLoadHandlerCalled(int guest_instance_id) { 584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) TriggerEvent(browser_plugin::kEventContentLoad, NULL); 585b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 586b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnLoadRedirect(int guest_instance_id, 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& old_url, 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& new_url, 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_top_level) { 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*> props; 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kOldURL] = new base::StringValue(old_url.spec()); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kNewURL] = new base::StringValue(new_url.spec()); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kIsTopLevel] = new base::FundamentalValue(is_top_level); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(browser_plugin::kEventLoadRedirect, &props); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnLoadStart(int guest_instance_id, 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_top_level) { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*> props; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kURL] = new base::StringValue(url.spec()); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kIsTopLevel] = new base::FundamentalValue(is_top_level); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(browser_plugin::kEventLoadStart, &props); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnLoadStop(int guest_instance_id) { 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(browser_plugin::kEventLoadStop, NULL); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnRequestPermission( 613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int guest_instance_id, 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginPermissionType permission_type, 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int request_id, 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue& request_info) { 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The New Window API is very similiar to the permission API in structure, 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but exposes a slightly different interface to the developer and so we put 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it in a separate event. 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* event_name = 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (permission_type == BrowserPluginPermissionTypeNewWindow) ? 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin::kEventNewWindow : 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin::kEventRequestPermission; 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPermissionRequestToMap(request_id, permission_type); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*> props; 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kPermission] = 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::CreateStringValue(PermissionTypeToString(permission_type)); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[browser_plugin::kRequestId] = 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::CreateIntegerValue(request_id); 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fill in the info provided by the browser. 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DictionaryValue::Iterator iter(request_info); !iter.IsAtEnd(); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter.Advance()) { 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) props[iter.key()] = iter.value().DeepCopy(); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TriggerEvent(event_name, &props); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnSetCursor(int guest_instance_id, 642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const WebCursor& cursor) { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_ = cursor; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnShouldAcceptTouchEvents(int guest_instance_id, 647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool accept) { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (container()) { 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container()->requestTouchEventType(accept ? 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebPluginContainer::TouchEventRequestTypeRaw : 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebPluginContainer::TouchEventRequestTypeNone); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnUnlockMouse(int guest_instance_id) { 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_->mouse_lock_dispatcher()->UnlockMouse(this); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserPlugin::OnUpdatedName(int guest_instance_id, 660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& name) { 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDOMAttribute(browser_plugin::kAttributeName, name); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::AddPermissionRequestToMap(int request_id, 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginPermissionType type) { 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!pending_permission_requests_.count(request_id)); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_permission_requests_.insert(std::make_pair(request_id, type)); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnUpdateRect( 671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int guest_instance_id, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BrowserPluginMsg_UpdateRect_Params& params) { 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_new_damage_buffer = !backing_store_; 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_AutoSize_Params auto_size_params; 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params; 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we have a pending damage buffer, and the guest has begun to use the 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // damage buffer then we know the guest will no longer use the current 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // damage buffer. At this point, we drop the current damage buffer, and 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mark the pending damage buffer as the current damage buffer. 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (UsesPendingDamageBuffer(params)) { 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SwapDamageBuffers(); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_new_damage_buffer = true; 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool auto_size = GetAutoSizeAttribute(); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We receive a resize ACK in regular mode, but not in autosize. 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In SW, |resize_ack_received_| is reset in SwapDamageBuffers(). 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In HW mode, we need to do it here so we can continue sending 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resize messages when needed. 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.is_resize_ack || 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (!params.needs_ack && (auto_size || auto_size_ack_pending_))) 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_ack_received_ = true; 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_ack_pending_ = false; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((!auto_size && (width() != params.view_size.width() || 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) height() != params.view_size.height())) || 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (auto_size && (!InAutoSizeBounds(params.view_size))) || 699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetDeviceScaleFactor() != params.scale_factor) { 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We are HW accelerated, render widget does not expect an ack, 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but we still need to update the size. 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params.needs_ack) { 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateGuestAutoSizeState(auto_size); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!resize_ack_received_) { 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The guest has not yet responded to the last resize request, and 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so we don't want to do anything at this point other than ACK the guest. 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PopulateAutoSizeParameters(&auto_size_params, auto_size); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we have no pending damage buffer, then the guest has not caught up 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with the BrowserPlugin container. We now tell the guest about the new 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // container size. 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size) { 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDamageBufferWithSizeParams(&auto_size_params, 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &resize_guest_params); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDamageBufferWithSizeParams(NULL, &resize_guest_params); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK( 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_params, 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_guest_params)); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size && (params.view_size != last_view_size_)) { 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (backing_store_) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backing_store_->Clear(SK_ColorWHITE); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size old_view_size = last_view_size_; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_view_size_ = params.view_size; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedule a SizeChanged instead of calling it directly to ensure that 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the backing store has been updated before the developer attempts to 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resize to avoid flicker. |size_changed_in_flight_| acts as a form of 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // flow control for SizeChanged events. If the guest's view size is changing 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rapidly before a SizeChanged event fires, then we avoid scheduling 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // another SizeChanged event. SizeChanged reads the new size from 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |last_view_size_| so we can be sure that it always fires an event 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the last seen view size. 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (container_ && !size_changed_in_flight_) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_changed_in_flight_ = true; 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask( 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&BrowserPlugin::SizeChangedDueToAutoSize, 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_view_size)); 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No more work to do since the guest is no longer using a damage buffer. 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!UsesDamageBuffer(params)) 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we are seeing damage buffers, HW compositing should be turned off. 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnableCompositing(false); 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we are now using a new damage buffer, then that means that the guest 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // has updated its size state in response to a resize request. We change 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the backing store's size to accomodate the new damage buffer size. 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_new_damage_buffer) { 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int backing_store_width = auto_size ? GetAdjustedMaxWidth() : width(); 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int backing_store_height = auto_size ? GetAdjustedMaxHeight(): height(); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backing_store_.reset( 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BrowserPluginBackingStore( 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size(backing_store_width, backing_store_height), 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.scale_factor)); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If we just transitioned from the compositing path to the software path 774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // then we might not yet have a damage buffer. 775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (current_damage_buffer_) { 776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Update the backing store. 777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!params.scroll_rect.IsEmpty()) { 778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_->ScrollBackingStore(params.scroll_delta, 779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.scroll_rect, 780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.view_size); 781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) backing_store_->PaintToBackingStore(params.bitmap_rect, 783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.copy_rects, 784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) current_damage_buffer_->memory()); 785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Invalidate the container. 786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the BrowserPlugin is scheduled to be deleted, then container_ will be 787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // NULL so we shouldn't attempt to access it. 788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (container_) 789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) container_->invalidate(); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size) 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PopulateAutoSizeParameters(&auto_size_params, auto_size); 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK( 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 796868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_params, 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_guest_params)); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseSizeContraintsChanged() { 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool auto_size = GetAutoSizeAttribute(); 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size) 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateGuestAutoSizeState(true); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::InAutoSizeBounds(const gfx::Size& size) const { 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return size.width() <= GetAdjustedMaxWidth() && 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size.height() <= GetAdjustedMaxHeight(); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NPObject* BrowserPlugin::GetContentWindow() const { 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (content_window_routing_id_ == MSG_ROUTING_NONE) 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderViewImpl* guest_render_view = RenderViewImpl::FromRoutingID( 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_window_routing_id_); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!guest_render_view) 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebFrame* guest_frame = guest_render_view->GetWebView()->mainFrame(); 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return guest_frame->windowObject(); 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::AttachWindowTo(const WebKit::WebNode& node, int window_id) { 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (node.isNull()) 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!node.isElementNode()) 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebElement shim_element = node.toConst<WebKit::WebElement>(); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The shim containing the BrowserPlugin must be attached to a document. 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shim_element.document().isNull()) 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebNode shadow_root = shim_element.shadowRoot(); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shadow_root.isNull() || !shadow_root.hasChildNodes()) 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebNode plugin_element = shadow_root.firstChild(); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebPluginContainer* plugin_container = 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_element.pluginContainer(); 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!plugin_container) 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPlugin* browser_plugin = 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPlugin::FromContainer(plugin_container); 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser_plugin) 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the BrowserPlugin has already begun to navigate then we shouldn't allow 852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // attaching a different guest. 853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Navigation happens in two stages. 855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 1. BrowserPlugin requests an instance ID from the browser process. 856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 2. The browser process returns an instance ID and BrowserPlugin is 857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // "Attach"ed to that instance ID. 858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the instance ID is new then a new guest will be created. 859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the instance ID corresponds to an unattached guest then BrowserPlugin 860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // is attached to that guest. 861868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 862868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Between step 1, and step 2, BrowserPlugin::AttachWindowTo may be called. 863868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The check below ensures that BrowserPlugin:Attach does not get called with 864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // a different instance ID after step 1 has happened. 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(fsamuel): We may wish to support reattaching guests in the future: 866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://crbug.com/156219. 867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (browser_plugin->HasNavigated()) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin->Attach(window_id); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserPlugin::HasNavigated() const { 875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return !before_first_navigation_; 876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserPlugin::HasGuestInstanceID() const { 879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return guest_instance_id_ != browser_plugin::kInstanceIDNone; 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::CanGoBack() const { 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return nav_entry_count_ > 1 && current_nav_entry_index_ > 0; 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::CanGoForward() const { 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_nav_entry_index_ >= 0 && 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_nav_entry_index_ < (nav_entry_count_ - 1); 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ParsePartitionAttribute(std::string* error_message) { 892868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (HasNavigated()) { 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error_message = browser_plugin::kErrorAlreadyNavigated; 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string input = GetPartitionAttribute(); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since the "persist:" prefix is in ASCII, StartsWith will work fine on 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // UTF-8 encoded |partition_id|. If the prefix is a match, we can safely 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // remove the prefix without splicing in the middle of a multi-byte codepoint. 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We can use the rest of the string as UTF-8 encoded one. 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (StartsWithASCII(input, browser_plugin::kPersistPrefix, true)) { 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t index = input.find(":"); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(index != std::string::npos); 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It is safe to do index + 1, since we tested for the full prefix above. 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input = input.substr(index + 1); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (input.empty()) { 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valid_partition_id_ = false; 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error_message = browser_plugin::kErrorInvalidPartition; 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) persist_storage_ = true; 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) persist_storage_ = false; 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valid_partition_id_ = true; 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) storage_partition_id_ = input; 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::CanRemovePartitionAttribute(std::string* error_message) { 924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (HasGuestInstanceID()) 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error_message = browser_plugin::kErrorCannotRemovePartition; 926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return !HasGuestInstanceID(); 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::ParseAttributes() { 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(mthiesse): Handle errors here? 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error; 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParsePartitionAttribute(&error); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Parse the 'src' attribute last, as it will set the has_navigated_ flag to 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // true, which prevents changing the 'partition' attribute. 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseSrcAttribute(&error); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float BrowserPlugin::GetDeviceScaleFactor() const { 940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!render_view_.get()) 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1.0f; 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_view_->GetWebView()->deviceScaleFactor(); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserPlugin::UpdateDeviceScaleFactor(float device_scale_factor) { 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (last_device_scale_factor_ == device_scale_factor || !resize_ack_received_) 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params params; 95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PopulateResizeGuestParameters(¶ms, plugin_rect()); 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest( 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view_routing_id_, 953868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params)); 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::TriggerEvent(const std::string& event_name, 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, base::Value*>* props) { 959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!container()) 960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebKit::WebFrame* frame = container()->element().document().frame(); 963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!frame) 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v8::HandleScope handle_scope; 967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v8::Local<v8::Context> context = frame->mainWorldScriptContext(); 968868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v8::Context::Scope context_scope(context); 969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string json_string; 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (props) { 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue dict; 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::map<std::string, base::Value*>::iterator iter = props->begin(), 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end = props->end(); iter != end; ++iter) { 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict.Set(iter->first, iter->second); 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JSONStringValueSerializer serializer(&json_string); 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!serializer.Serialize(dict)) 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebDOMEvent dom_event = frame->document().createEvent("CustomEvent"); 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebDOMCustomEvent event = dom_event.to<WebKit::WebDOMCustomEvent>(); 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The events triggered directly from the plugin <object> are internal events 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // whose implementation details can (and likely will) change over time. The 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wrapper/shim (e.g. <webview> tag) should receive these events, and expose a 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // more appropriate (and stable) event to the consumers as part of the API. 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.initCustomEvent( 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebString::fromUTF8(GetInternalEventName(event_name.c_str())), 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, false, 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebSerializedScriptValue::serialize( 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v8::String::New(json_string.c_str(), json_string.size()))); 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container()->element().dispatchEvent(event); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnRequestObjectGarbageCollected(int request_id) { 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove from alive objects. 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<int, AliveV8PermissionRequestItem*>::iterator iter = 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alive_v8_permission_request_objects_.find(request_id); 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter != alive_v8_permission_request_objects_.end()) 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alive_v8_permission_request_objects_.erase(iter); 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If a decision has not been made for this request yet, deny it. 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RespondPermissionIfRequestIsPending(request_id, false /*allow*/); 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PersistRequestObject( 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NPVariant* request, const std::string& type, int id) { 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(alive_v8_permission_request_objects_.find(id) == 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alive_v8_permission_request_objects_.end()); 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_permission_requests_.find(id) == 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_permission_requests_.end()) { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v8::Isolate* isolate = v8::Isolate::GetCurrent(); 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) v8::Persistent<v8::Value> weak_request( 1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) isolate, WebKit::WebBindings::toV8Value(request)); 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AliveV8PermissionRequestItem* new_item = 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new std::pair<int, base::WeakPtr<BrowserPlugin> >( 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id, weak_ptr_factory_.GetWeakPtr()); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::pair<std::map<int, AliveV8PermissionRequestItem*>::iterator, bool> 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = alive_v8_permission_request_objects_.insert( 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::make_pair(id, new_item)); 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(result.second); // Inserted in the map. 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AliveV8PermissionRequestItem* request_item = result.first->second; 1031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) weak_request.MakeWeak( 1032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) isolate, static_cast<void*>(request_item), WeakCallbackForPersistObject); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::WeakCallbackForPersistObject( 1037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v8::Isolate* isolate, v8::Persistent<v8::Value>* object, void* param) { 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AliveV8PermissionRequestItem* item_ptr = 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<AliveV8PermissionRequestItem*>(param); 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int request_id = item_ptr->first; 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<BrowserPlugin> plugin = item_ptr->second; 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete item_ptr; 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object->Dispose(); 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (plugin.get()) { 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Asynchronously remove item from |alive_v8_permission_request_objects_|. 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that we are using weak pointer for the following PostTask, so we 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // don't need to worry about BrowserPlugin going away. 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask( 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&BrowserPlugin::OnRequestObjectGarbageCollected, 1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) plugin, 1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_id)); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Back() { 1060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_Go(render_view_routing_id_, 1064868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, -1)); 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Forward() { 1068868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_Go(render_view_routing_id_, 1072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 1)); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Go(int relative_index) { 1076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_Go(render_view_routing_id_, 1080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) relative_index)); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::TerminateGuest() { 1085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID() || guest_crashed_) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_TerminateGuest(render_view_routing_id_, 1089868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_)); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Stop() { 1093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_Stop(render_view_routing_id_, 1097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_)); 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::Reload() { 1101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_Reload(render_view_routing_id_, 1105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_)); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::UpdateGuestFocusState() { 1109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_be_focused = ShouldGuestBeFocused(); 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus( 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 1114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_be_focused)); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::ShouldGuestBeFocused() const { 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool embedder_focused = false; 1120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (render_view_.get()) 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) embedder_focused = render_view_->has_focus(); 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return plugin_focused_ && embedder_focused; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKit::WebPluginContainer* BrowserPlugin::container() const { 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container_; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RespondPermission( 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginPermissionType permission_type, int request_id, bool allow) { 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (permission_type == BrowserPluginPermissionTypePointerLock) 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RespondPermissionPointerLock(allow); 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_RespondPermission( 1136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view_->GetRoutingID(), guest_instance_id_, permission_type, 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_id, allow)); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RespondPermissionPointerLock(bool allow) { 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (allow) 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_->mouse_lock_dispatcher()->LockMouse(this); 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnLockMouseACK(false); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::RespondPermissionIfRequestIsPending( 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int request_id, bool allow) { 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingPermissionRequests::iterator iter = 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_permission_requests_.find(request_id); 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter == pending_permission_requests_.end()) 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginPermissionType permission_type = iter->second; 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_permission_requests_.erase(iter); 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RespondPermission(permission_type, request_id, allow); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnEmbedderDecidedPermission(int request_id, bool allow) { 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RespondPermissionIfRequestIsPending(request_id, allow); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::initialize(WebPluginContainer* container) { 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container) 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetContentClient()->renderer()->AllowBrowserPlugin(container)) 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 117090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Tell |container| to allow this plugin to use script objects. 117190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) npp_.reset(new NPP_t); 117290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) container->allowScriptObjects(); 117390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bindings_.reset(new BrowserPluginBindings(this)); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_ = container; 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWantsWheelEvents(true); 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ParseAttributes(); 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_plugin_container_map.Get().insert(std::make_pair(container_, this)); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::EnableCompositing(bool enable) { 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (compositing_enabled_ == enable) 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_enabled_ = enable; 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enable) { 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No need to keep the backing store and damage buffer around if we're now 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // compositing. 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backing_store_.reset(); 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_damage_buffer_.reset(); 1192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!compositing_helper_.get()) { 1193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) compositing_helper_ = 1194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new BrowserPluginCompositingHelper(container_, 1195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_plugin_manager(), 1196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 1197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view_routing_id_); 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We're switching back to the software path. We create a new damage 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // buffer that can accommodate the current size of the container. 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params params; 120390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PopulateResizeGuestParameters(¶ms, plugin_rect()); 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Request a full repaint from the guest even if its size is not actually 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changing. 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.repaint = true; 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_ack_received_ = false; 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest( 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_routing_id_, 1210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params)); 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_helper_->EnableCompositing(enable); 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::destroy() { 121790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If the plugin was initialized then it has a valid |npp_| identifier, and 121890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the |container_| must clear references to the plugin's script objects. 121990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!npp_ || container_); 122090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (container_) 122190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) container_->clearScriptObjects(); 122290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The BrowserPlugin's WebPluginContainer is deleted immediately after this 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call returns, so let's not keep a reference to it around. 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_plugin_container_map.Get().erase(container_); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_ = NULL; 1227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (compositing_helper_.get()) 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_helper_->OnContainerDestroy(); 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Will be a no-op if the mouse is not currently locked. 1230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (render_view_.get()) 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_->mouse_lock_dispatcher()->OnLockTargetDestroyed(this); 1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObject* BrowserPlugin::scriptableObject() { 1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!bindings_) 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPObject* browser_plugin_np_object(bindings_->np_object()); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The object is expected to be retained before it is returned. 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebBindings::retainObject(browser_plugin_np_object); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_plugin_np_object; 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NPP BrowserPlugin::pluginNPP() { 124690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return npp_.get(); 124790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 124890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::supportsKeyboardFocus() const { 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserPlugin::supportsEditCommands() const { 1254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 1255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::canProcessDrag() const { 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::paint(WebCanvas* canvas, const WebRect& rect) { 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (guest_crashed_) { 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sad_guest_) // Lazily initialize bitmap. 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sad_guest_ = content::GetContentClient()->renderer()-> 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSadWebViewBitmap(); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content_shell does not have the sad plugin bitmap, so we'll paint black 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instead to make it clear that something went wrong. 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sad_guest_) { 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit::PaintSadPlugin(canvas, plugin_rect_, *sad_guest_); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkAutoCanvasRestore auto_restore(canvas, true); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->translate(plugin_rect_.x(), plugin_rect_.y()); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkRect image_data_rect = SkRect::MakeXYWH( 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(0), 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(0), 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(plugin_rect_.width()), 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(plugin_rect_.height())); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->clipRect(image_data_rect); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Paint black or white in case we have nothing in our backing store or we 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to show a gutter. 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPaint paint; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setStyle(SkPaint::kFill_Style); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setColor(guest_crashed_ ? SK_ColorBLACK : SK_ColorWHITE); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawRect(image_data_rect, paint); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stay a solid color if we have never set a non-empty src, or we don't have a 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // backing store. 1289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!backing_store_.get() || !HasGuestInstanceID()) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float inverse_scale_factor = 1.0f / backing_store_->GetScaleFactor(); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->scale(inverse_scale_factor, inverse_scale_factor); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->drawBitmap(backing_store_->GetBitmap(), 0, 0); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::InBounds(const gfx::Point& position) const { 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that even for plugins that are rotated using rotate transformations, 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we use the the |plugin_rect_| provided by updateGeometry, which means we 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will be off if |position| is within the plugin rect but does not fall 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // within the actual plugin boundary. Not supporting such edge case is OK 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // since this function should not be used for making security-sensitive 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // decisions. 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This also does not take overlapping plugins into account. 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = position.x() >= plugin_rect_.x() && 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.x() < plugin_rect_.x() + plugin_rect_.width() && 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.y() >= plugin_rect_.y() && 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position.y() < plugin_rect_.y() + plugin_rect_.height(); 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Point BrowserPlugin::ToLocalCoordinates(const gfx::Point& point) const { 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (container_) 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return container_->windowToLocalPoint(WebKit::WebPoint(point)); 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Point(point.x() - plugin_rect_.x(), point.y() - plugin_rect_.y()); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::ShouldForwardToBrowserPlugin( 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& message) { 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (message.type()) { 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case BrowserPluginMsg_AddMessageToConsole::ID: 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_AdvanceFocus::ID: 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case BrowserPluginMsg_Attach_ACK::ID: 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_BuffersSwapped::ID: 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case BrowserPluginMsg_Close::ID: 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case BrowserPluginMsg_CompositorFrameSwapped::ID: 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_GuestContentWindowReady::ID: 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_GuestGone::ID: 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_GuestResponsive::ID: 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_GuestUnresponsive::ID: 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_LoadAbort::ID: 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_LoadCommit::ID: 1333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) case BrowserPluginMsg_LoadHandlerCalled::ID: 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_LoadRedirect::ID: 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_LoadStart::ID: 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_LoadStop::ID: 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_RequestPermission::ID: 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_SetCursor::ID: 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_ShouldAcceptTouchEvents::ID: 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_UnlockMouse::ID: 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_UpdatedName::ID: 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case BrowserPluginMsg_UpdateRect::ID: 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateGeometry( 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& window_rect, 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& clip_rect, 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebVector<WebRect>& cut_outs_rects, 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible) { 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_width = width(); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_height = height(); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_rect_ = window_rect; 1358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 135990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In AutoSize mode, guests don't care when the BrowserPlugin container is 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resized. If |!resize_ack_received_|, then we are still waiting on a 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // previous resize to be ACK'ed and so we don't issue additional resizes 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // until the previous one is ACK'ed. 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(mthiesse): Assess the performance of calling GetAutoSizeAttribute() on 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resize. 136790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!resize_ack_received_ || 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (old_width == window_rect.width && old_height == window_rect.height) || 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetAutoSizeAttribute()) { 137090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Let the browser know about the updated view rect. 137190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateGeometry( 1372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view_routing_id_, guest_instance_id_, plugin_rect_)); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params params; 137790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PopulateResizeGuestParameters(¶ms, plugin_rect()); 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_ack_received_ = false; 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ResizeGuest( 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_routing_id_, 1381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params)); 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::SwapDamageBuffers() { 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_damage_buffer_.reset(pending_damage_buffer_.release()); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_ack_received_ = true; 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::PopulateResizeGuestParameters( 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params* params, 139290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Rect& view_rect) { 139390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params->view_rect = view_rect; 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->scale_factor = GetDeviceScaleFactor(); 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (last_device_scale_factor_ != params->scale_factor){ 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params->repaint = true; 1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) last_device_scale_factor_ = params->scale_factor; 1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In HW compositing mode, we do not need a damage buffer. 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (compositing_enabled_) 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 140490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const size_t stride = skia::PlatformCanvasStrideForWidth(view_rect.width()); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the size of the damage buffer is at least four bytes so that we 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can fit in a magic word to verify that the memory is shared correctly. 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size = 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(sizeof(unsigned int), 140990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static_cast<size_t>(view_rect.height() * 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stride * 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDeviceScaleFactor() * 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDeviceScaleFactor())); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params->damage_buffer_size = size; 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_damage_buffer_.reset( 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateDamageBuffer(size, ¶ms->damage_buffer_handle)); 1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!pending_damage_buffer_) 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params->damage_buffer_sequence_id = ++damage_buffer_sequence_id_; 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::GetDamageBufferWithSizeParams( 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_AutoSize_Params* auto_size_params, 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserPluginHostMsg_ResizeGuest_Params* resize_guest_params) { 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (auto_size_params) 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PopulateAutoSizeParameters(auto_size_params, GetAutoSizeAttribute()); 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size view_size = (auto_size_params && auto_size_params->enable) ? 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_size_params->max_size : gfx::Size(width(), height()); 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_size.IsEmpty()) 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resize_ack_received_ = false; 143290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect view_rect = gfx::Rect(plugin_rect_.origin(), view_size); 143390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PopulateResizeGuestParameters(resize_guest_params, view_rect); 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_POSIX) 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::SharedMemory* BrowserPlugin::CreateDamageBuffer( 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t size, 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SharedMemoryHandle* damage_buffer_handle) { 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::SharedMemory> shared_buf( 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderThread::Get()->HostAllocateSharedMemoryBuffer( 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size).release()); 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shared_buf) { 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shared_buf->Map(size)) { 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Insert the magic word. 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef; 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shared_buf->ShareToProcess(base::GetCurrentProcessHandle(), 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_buffer_handle); 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shared_buf.release(); 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN) 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::SharedMemory* BrowserPlugin::CreateDamageBuffer( 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t size, 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SharedMemoryHandle* damage_buffer_handle) { 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::SharedMemory> shared_buf(new base::SharedMemory()); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!shared_buf->CreateAndMapAnonymous(size)) { 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Buffer allocation failed"; 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert the magic word. 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef; 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shared_buf->ShareToProcess(base::GetCurrentProcessHandle(), 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_buffer_handle)) 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shared_buf.release(); 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateFocus(bool focused) { 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_focused_ == focused) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_guest_focus_state = ShouldGuestBeFocused(); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_focused_ = focused; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldGuestBeFocused() != old_guest_focus_state) 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateGuestFocusState(); 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::updateVisibility(bool visible) { 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (visible_ == visible) 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible_ = visible; 1493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!HasGuestInstanceID()) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (compositing_helper_.get()) 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositing_helper_->UpdateVisibility(visible); 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetVisibility( 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 1501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible)); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::acceptsInputEvents() { 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::handleInputEvent(const WebKit::WebInputEvent& event, 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebCursorInfo& cursor_info) { 1511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (guest_crashed_ || !HasGuestInstanceID() || 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.type == WebKit::WebInputEvent::ContextMenu) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebInputEvent* modified_event = &event; 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<WebKit::WebTouchEvent> touch_event; 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebKit gives BrowserPlugin a list of touches that are down, but the browser 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // process expects a list of all touches. We modify the TouchEnd event here to 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // match these expectations. 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event.type == WebKit::WebInputEvent::TouchEnd) { 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebTouchEvent* orig_touch_event = 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<const WebKit::WebTouchEvent*>(&event); 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_event.reset(new WebKit::WebTouchEvent()); 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memcpy(touch_event.get(), orig_touch_event, sizeof(WebKit::WebTouchEvent)); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (touch_event->changedTouchesLength > 0) { 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memcpy(&touch_event->touches[touch_event->touchesLength], 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &touch_event->changedTouches, 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_event->changedTouchesLength * sizeof(WebKit::WebTouchPoint)); 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_event->touchesLength += touch_event->changedTouchesLength; 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) modified_event = touch_event.get(); 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (WebKit::WebInputEvent::isKeyboardEventType(event.type) && 1535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !edit_commands_.empty()) { 1536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) browser_plugin_manager()->Send( 1537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent( 1538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) render_view_routing_id_, 1539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) instance_id_, 1540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) edit_commands_)); 1541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) edit_commands_.clear(); 1542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_, 1546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_rect_, 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) modified_event)); 154990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) webkit_glue::GetWebKitCursorInfo(cursor_, &cursor_info); 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPlugin::handleDragStatusUpdate(WebKit::WebDragStatus drag_status, 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebDragData& drag_data, 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebDragOperationsMask mask, 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebPoint& position, 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebPoint& screen) { 1558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (guest_crashed_ || !HasGuestInstanceID()) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BrowserPluginHostMsg_DragStatusUpdate( 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_routing_id_, 1563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_status, 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDropData(drag_data), 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask, 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) position)); 1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didReceiveResponse( 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebURLResponse& response) { 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didReceiveData(const char* data, int data_length) { 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFinishLoading() { 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFailLoading(const WebKit::WebURLError& error) { 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFinishLoadingFrameRequest(const WebKit::WebURL& url, 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* notify_data) { 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPlugin::didFailLoadingFrameRequest( 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebURL& url, 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* notify_data, 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebURLError& error) { 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool BrowserPlugin::executeEditCommand(const WebKit::WebString& name) { 1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_ExecuteEditCommand( 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_view_routing_id_, 1597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) name.utf8())); 1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // BrowserPlugin swallows edit commands. 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserPlugin::executeEditCommand(const WebKit::WebString& name, 1605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const WebKit::WebString& value) { 1606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) edit_commands_.push_back(EditCommand(name.utf8(), value.utf8())); 1607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // BrowserPlugin swallows edit commands. 1608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 1609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnLockMouseACK(bool succeeded) { 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_LockMouse_ACK( 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_routing_id_, 1614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) succeeded)); 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPlugin::OnMouseLockLost() { 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send(new BrowserPluginHostMsg_UnlockMouse_ACK( 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) render_view_routing_id_, 1621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_)); 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserPlugin::HandleMouseLockedInputEvent( 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebKit::WebMouseEvent& event) { 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_plugin_manager()->Send( 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new BrowserPluginHostMsg_HandleInputEvent(render_view_routing_id_, 1628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) guest_instance_id_, 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_rect_, 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &event)); 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1635