1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/renderer/browser_plugin/browser_plugin_manager_impl.h"
7 #include "content/common/browser_plugin/browser_plugin_constants.h"
8 #include "content/common/browser_plugin/browser_plugin_messages.h"
9 #include "content/renderer/browser_plugin/browser_plugin.h"
10 #include "content/renderer/render_thread_impl.h"
11 #include "ui/gfx/point.h"
12 #include "webkit/common/cursors/webcursor.h"
16 BrowserPluginManagerImpl::BrowserPluginManagerImpl(
17 RenderViewImpl* render_view)
18 : BrowserPluginManager(render_view),
19 request_id_counter_(0) {
22 BrowserPluginManagerImpl::~BrowserPluginManagerImpl() {
25 BrowserPlugin* BrowserPluginManagerImpl::CreateBrowserPlugin(
26 RenderViewImpl* render_view,
27 WebKit::WebFrame* frame,
28 const WebKit::WebPluginParams& params) {
29 return new BrowserPlugin(render_view, frame, params);
32 void BrowserPluginManagerImpl::AllocateInstanceID(
33 const base::WeakPtr<BrowserPlugin>& browser_plugin) {
34 int request_id = ++request_id_counter_;
35 pending_allocate_guest_instance_id_requests_.insert(
36 std::make_pair(request_id, browser_plugin));
37 Send(new BrowserPluginHostMsg_AllocateInstanceID(
38 browser_plugin->render_view_routing_id(), request_id));
41 bool BrowserPluginManagerImpl::Send(IPC::Message* msg) {
42 return RenderThread::Get()->Send(msg);
45 bool BrowserPluginManagerImpl::OnMessageReceived(
46 const IPC::Message& message) {
47 if (BrowserPlugin::ShouldForwardToBrowserPlugin(message)) {
48 int guest_instance_id = browser_plugin::kInstanceIDNone;
49 // All allowed messages must have |guest_instance_id| as their first
51 PickleIterator iter(message);
52 bool success = iter.ReadInt(&guest_instance_id);
54 BrowserPlugin* plugin = GetBrowserPlugin(guest_instance_id);
55 if (plugin && plugin->OnMessageReceived(message))
60 IPC_BEGIN_MESSAGE_MAP(BrowserPluginManagerImpl, message)
61 IPC_MESSAGE_HANDLER(BrowserPluginMsg_AllocateInstanceID_ACK,
62 OnAllocateInstanceIDACK)
63 IPC_MESSAGE_HANDLER(BrowserPluginMsg_PluginAtPositionRequest,
64 OnPluginAtPositionRequest);
65 IPC_MESSAGE_UNHANDLED(handled = false)
70 void BrowserPluginManagerImpl::DidCommitCompositorFrame() {
71 IDMap<BrowserPlugin>::iterator iter(&instances_);
72 while (!iter.IsAtEnd()) {
73 iter.GetCurrentValue()->DidCommitCompositorFrame();
78 void BrowserPluginManagerImpl::OnAllocateInstanceIDACK(
79 const IPC::Message& message,
81 int guest_instance_id) {
82 InstanceIDMap::iterator it =
83 pending_allocate_guest_instance_id_requests_.find(request_id);
84 if (it == pending_allocate_guest_instance_id_requests_.end())
87 const base::WeakPtr<BrowserPlugin> plugin(it->second);
90 pending_allocate_guest_instance_id_requests_.erase(request_id);
91 plugin->OnInstanceIDAllocated(guest_instance_id);
94 void BrowserPluginManagerImpl::OnPluginAtPositionRequest(
95 const IPC::Message& message,
97 const gfx::Point& position) {
98 int guest_instance_id = browser_plugin::kInstanceIDNone;
99 IDMap<BrowserPlugin>::iterator it(&instances_);
100 gfx::Point local_position = position;
101 while (!it.IsAtEnd()) {
102 const BrowserPlugin* plugin = it.GetCurrentValue();
103 if (!plugin->guest_crashed() && plugin->InBounds(position)) {
104 guest_instance_id = plugin->guest_instance_id();
105 local_position = plugin->ToLocalCoordinates(position);
111 Send(new BrowserPluginHostMsg_PluginAtPositionResponse(
112 message.routing_id(), guest_instance_id, request_id, local_position));
115 } // namespace content