| Index: content/browser/guest_render_view_host_observer.cc
|
| diff --git a/content/browser/guest_render_view_host_observer.cc b/content/browser/guest_render_view_host_observer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..057e46d49c995e7f29ff580b7d595e0391ca9f85
|
| --- /dev/null
|
| +++ b/content/browser/guest_render_view_host_observer.cc
|
| @@ -0,0 +1,97 @@
|
| +// 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/guest_render_view_host_observer.h"
|
| +
|
| +#include "content/browser/renderer_host/browser_plugin_message_filter.h"
|
| +#include "content/common/view_messages.h"
|
| +#include "content/public/browser/render_process_host.h"
|
| +#include "content/public/browser/render_view_host_observer.h"
|
| +#include "content/public/browser/render_widget_host_view.h"
|
| +#include "ppapi/proxy/ppapi_messages.h"
|
| +
|
| +GuestRenderViewHostObserver::~GuestRenderViewHostObserver() {
|
| +}
|
| +
|
| +GuestRenderViewHostObserver* GuestRenderViewHostObserver::Create(
|
| + BrowserPluginMessageFilter* filter,
|
| + content::RenderViewHost* render_view_host,
|
| + int host_routing_id,
|
| + int instance_id) {
|
| + return new GuestRenderViewHostObserver(filter,
|
| + render_view_host,
|
| + host_routing_id,
|
| + instance_id);
|
| +}
|
| +
|
| +GuestRenderViewHostObserver::GuestRenderViewHostObserver(
|
| + BrowserPluginMessageFilter* filter,
|
| + content::RenderViewHost* render_view_host,
|
| + int host_routing_id,
|
| + int instance_id)
|
| + : RenderViewHostObserver(render_view_host),
|
| + filter_(filter),
|
| + host_routing_id_(host_routing_id),
|
| + instance_id_(instance_id) {
|
| +}
|
| +
|
| +bool GuestRenderViewHostObserver::OnMessageReceived(const IPC::Message& msg) {
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP(GuestRenderViewHostObserver, msg)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated,
|
| + OnRendererPluginChannelCreated)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_ResizeGuest, OnMsgResizeGuest)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_RenderViewReady, OnMsgRenderViewReady)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| +
|
| + return handled;
|
| +}
|
| +
|
| +// Called when a new plugin <--> renderer channel has been created.
|
| +void GuestRenderViewHostObserver::OnRendererPluginChannelCreated(
|
| + const IPC::ChannelHandle& channel_handle) {
|
| + // Prepare the handle to send to the renderer.
|
| + base::ProcessHandle plugin_process =
|
| + render_view_host()->GetProcess()->GetHandle();
|
| +#if defined(OS_WIN)
|
| + base::ProcessHandle renderer_process = filter_->peer_handle();
|
| + int renderer_id = filter_->render_process_id();
|
| +
|
| + base::ProcessHandle renderers_plugin_handle = NULL;
|
| + ::DuplicateHandle(::GetCurrentProcess(), plugin_process,
|
| + renderer_process, &renderers_plugin_handle,
|
| + 0, FALSE, DUPLICATE_SAME_ACCESS);
|
| +#elif defined(OS_POSIX)
|
| + // Don't need to duplicate anything on POSIX since it's just a PID.
|
| + base::ProcessHandle renderers_plugin_handle = plugin_process;
|
| +#endif
|
| + // Tell the browser loading placeholder that we're done.
|
| + // and that it can begin using the guest renderer.
|
| + filter_->Send(
|
| + new ViewMsg_GuestReady(host_routing_id_,
|
| + instance_id_,
|
| + renderers_plugin_handle,
|
| + channel_handle));
|
| +}
|
| +
|
| +void GuestRenderViewHostObserver::OnMsgRenderViewReady() {
|
| + // The renderer is now ready to receive ppapi messages.
|
| + // Let's tell it create a channel with the embedder/host.
|
| + PpapiMsg_CreateChannel* msg =
|
| + new PpapiMsg_CreateChannel(filter_->peer_handle(),
|
| + filter_->render_process_id());
|
| + msg->set_routing_id(render_view_host()->GetRoutingID());
|
| + msg->set_unblock(true);
|
| + // TODO(fsamuel): If we aren't able to successfully send this message
|
| + // to the guest then that probably means it crashed. Is there anything
|
| + // we can do that's cleaner than failing a check?
|
| + CHECK(Send(msg));
|
| +}
|
| +
|
| +void GuestRenderViewHostObserver::OnMsgResizeGuest(int width, int height) {
|
| + // Tell the RenderWidgetHostView to adjust its size.
|
| + render_view_host()->GetView()->SetSize(gfx::Size(width, height));
|
| +}
|
| +
|
|
|