Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(505)

Unified Diff: content/browser/browser_plugin/browser_plugin_host_helper.cc

Issue 10560022: Browser Plugin: New Implementation (Browser Side) (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Address some of creis@'s comments. Handing off to Istiaque as I head for vacation. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/browser_plugin/browser_plugin_host_helper.cc
diff --git a/content/browser/browser_plugin/browser_plugin_host_helper.cc b/content/browser/browser_plugin/browser_plugin_host_helper.cc
new file mode 100644
index 0000000000000000000000000000000000000000..551bfcb8b0af6295f85cb4c0b18abe846033c262
--- /dev/null
+++ b/content/browser/browser_plugin/browser_plugin_host_helper.cc
@@ -0,0 +1,205 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/browser_plugin/browser_plugin_host_helper.h"
+
+#include "base/time.h"
+#include "content/browser/browser_plugin/browser_plugin_host.h"
+#include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/common/browser_plugin_messages.h"
+#include "content/common/view_messages.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/render_widget_host_view.h"
+#include "ui/gfx/size.h"
+
+namespace content {
+
+BrowserPluginHostHelper::BrowserPluginHostHelper(
+ BrowserPluginHost* browser_plugin_host,
+ RenderViewHost* render_view_host)
+ : RenderViewHostObserver(render_view_host),
+ browser_plugin_host_(browser_plugin_host) {
+}
+
+BrowserPluginHostHelper::~BrowserPluginHostHelper() {
+}
+
+bool BrowserPluginHostHelper::Send(IPC::Message* message) {
+ return RenderViewHostObserver::Send(message);
+}
+
+bool BrowserPluginHostHelper::OnMessageReceived(const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(BrowserPluginHostHelper, message)
+ IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_NavigateGuest,
+ OnNavigateGuest)
+ IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ResizeGuest, OnResizeGuest)
+ IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_UpdateRect_ACK, OnUpdateRectACK)
+ IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetFocus, OnSetFocus)
+ IPC_MESSAGE_HANDLER_GENERIC(BrowserPluginHostMsg_HandleInputEvent,
+ OnHandleInputEvent(*static_cast<const IPC::SyncMessage*>(&message),
+ &handled))
+ IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_PluginDestroyed, OnPluginDestroyed)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+
+ // We want to intercept certain messages if they are guests.
+ if (!browser_plugin_host_->embedder_render_process_host())
+ return handled;
+
+ handled = true;
+ IPC_BEGIN_MESSAGE_MAP(BrowserPluginHostHelper, message)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnUpdateRect)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_HandleInputEvent_ACK,
+ OnHandleInputEventAck)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_ShowWidget, OnShowWidget)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnSetCursor)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+
+ return handled;
+}
+
+void BrowserPluginHostHelper::OnNavigateGuest(
+ int instance_id,
+ long long frame_id,
+ const std::string& src,
+ const gfx::Size& size) {
+ browser_plugin_host_->NavigateGuest(
+ render_view_host(),
+ instance_id,
+ frame_id,
+ src,
+ size);
+}
+
+void BrowserPluginHostHelper::OnResizeGuest(
+ int instance_id,
+ const BrowserPluginHostMsg_ResizeGuest_Params& params) {
+ TransportDIB* damage_buffer = NULL;
+#if defined(OS_WIN)
+ // On Windows we need to duplicate the handle from the remote process
+ HANDLE section;
+ DuplicateHandle(GetHandle(),
+ params.damage_buffer_id.handle,
+ GetCurrentProcess(),
+ &section,
+ STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE,
+ FALSE, 0);
+ damage_buffer = TransportDIB::Map(section);
+#elif defined(OS_MACOSX)
+ // On OSX, the browser allocates all DIBs and keeps a file descriptor around
+ // for each.
+ damage_buffer = widget_helper_->MapTransportDIB(params.damage_buffer_id);
+#elif defined(OS_ANDROID)
+ damage_buffer = TransportDIB::Map(params.damage_buffer_id);
+#elif defined(OS_POSIX)
+ damage_buffer = TransportDIB::Map(params.damage_buffer_id.shmkey);
+#endif // defined(OS_POSIX)
+ DCHECK(damage_buffer);
+ // TODO(fsamuel): Schedule this later so that we don't stall the embedder for
+ // too long.
+ browser_plugin_host_->ResizeGuest(instance_id,
+ damage_buffer,
+ params.width,
+ params.height,
+ params.resize_pending,
+ params.scale_factor);
+}
+
+void BrowserPluginHostHelper::OnUpdateRect(
+ const ViewHostMsg_UpdateRect_Params& params) {
+ RenderWidgetHostImpl* render_widget_host =
+ RenderWidgetHostImpl::From(render_view_host());
+ render_widget_host->ResetFlags();
+ browser_plugin_host_->UpdateRect(render_view_host(), params);
+}
+
+void BrowserPluginHostHelper::OnHandleInputEventAck(
+ WebKit::WebInputEvent::Type event_type,
+ bool processed) {
+ browser_plugin_host_->HandleInputEventAck(render_view_host(), processed);
+}
+
+void BrowserPluginHostHelper::OnTakeFocus(bool reverse) {
+ browser_plugin_host_->TakeFocus(reverse);
+}
+
+void BrowserPluginHostHelper::OnShowWidget(
+ int route_id,
+ const gfx::Rect& initial_pos) {
+ browser_plugin_host_->ShowWidget(render_view_host(), route_id, initial_pos);
+}
+
+void BrowserPluginHostHelper::OnSetCursor(const WebCursor& cursor) {
+ browser_plugin_host_->SetCursor(cursor);
+}
+
+void BrowserPluginHostHelper::OnUpdateRectACK(int instance_id,
+ int message_id,
+ const gfx::Size& size) {
+
+ BrowserPluginHost* guest = browser_plugin_host_->
+ GetGuestByInstanceID(instance_id);
+ guest->UpdateRectACK(message_id, size);
+}
+
+void BrowserPluginHostHelper::OnHandleInputEvent(
+ const IPC::SyncMessage& message,
+ bool* handled) {
+ *handled = true;
+ PickleIterator iter(message);
+
+ // TODO(fsamuel): This appears to be a monotonically increasing value.
+ int instance_id = -1;
+ const char* guest_rect_data = NULL;
+ int guest_rect_data_length = -1;
+ const char* input_event_data = NULL;
+ int input_event_data_length = -1;
+ if (!iter.SkipBytes(4) ||
+ !message.ReadInt(&iter, &instance_id) ||
+ !message.ReadData(&iter, &guest_rect_data, &guest_rect_data_length) ||
+ !message.ReadData(&iter, &input_event_data, &input_event_data_length)) {
+ *handled = false;
+ return;
+ }
+ const gfx::Rect* guest_rect =
+ reinterpret_cast<const gfx::Rect*>(guest_rect_data);
+ const WebKit::WebInputEvent* input_event =
+ reinterpret_cast<const WebKit::WebInputEvent*>(input_event_data);
+ RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
+ render_view_host());
+
+ // Convert the window coordinates into screen coordinates.
+ gfx::Rect guest_screen_rect(*guest_rect);
+ if (rvh->GetView())
+ guest_screen_rect.Offset(
+ rvh->GetView()->GetViewBounds().origin());
+
+ IPC::Message* reply_message =
+ IPC::SyncMessage::GenerateReply(&message);
+ BrowserPluginHost* guest = browser_plugin_host_->
+ GetGuestByInstanceID(instance_id);
+ guest->HandleInputEvent(rvh,
+ guest_screen_rect,
+ *input_event,
+ reply_message);
+}
+
+void BrowserPluginHostHelper::OnSetFocus(int instance_id,
+ bool focused) {
+ BrowserPluginHost* guest = browser_plugin_host_->
+ GetGuestByInstanceID(instance_id);
+ if (guest)
+ guest->SetFocus(focused);
+}
+
+void BrowserPluginHostHelper::OnPluginDestroyed(int instance_id) {
+ browser_plugin_host_->DestroyGuestByInstanceID(instance_id);
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698