- add sources.
[platform/framework/web/crosswalk.git] / src / content / renderer / browser_plugin / browser_plugin_manager_impl.cc
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.
4
5 #include "content/renderer/browser_plugin/browser_plugin_manager_impl.h"
6
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"
13
14 namespace content {
15
16 BrowserPluginManagerImpl::BrowserPluginManagerImpl(
17     RenderViewImpl* render_view)
18     : BrowserPluginManager(render_view),
19       request_id_counter_(0) {
20 }
21
22 BrowserPluginManagerImpl::~BrowserPluginManagerImpl() {
23 }
24
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);
30 }
31
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));
39 }
40
41 bool BrowserPluginManagerImpl::Send(IPC::Message* msg) {
42   return RenderThread::Get()->Send(msg);
43 }
44
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
50     // parameter.
51     PickleIterator iter(message);
52     bool success = iter.ReadInt(&guest_instance_id);
53     DCHECK(success);
54     BrowserPlugin* plugin = GetBrowserPlugin(guest_instance_id);
55     if (plugin && plugin->OnMessageReceived(message))
56       return true;
57   }
58
59   bool handled = true;
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)
66   IPC_END_MESSAGE_MAP()
67   return handled;
68 }
69
70 void BrowserPluginManagerImpl::DidCommitCompositorFrame() {
71   IDMap<BrowserPlugin>::iterator iter(&instances_);
72   while (!iter.IsAtEnd()) {
73     iter.GetCurrentValue()->DidCommitCompositorFrame();
74     iter.Advance();
75   }
76 }
77
78 void BrowserPluginManagerImpl::OnAllocateInstanceIDACK(
79     const IPC::Message& message,
80     int request_id,
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())
85     return;
86
87   const base::WeakPtr<BrowserPlugin> plugin(it->second);
88   if (!plugin)
89     return;
90   pending_allocate_guest_instance_id_requests_.erase(request_id);
91   plugin->OnInstanceIDAllocated(guest_instance_id);
92 }
93
94 void BrowserPluginManagerImpl::OnPluginAtPositionRequest(
95     const IPC::Message& message,
96     int request_id,
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);
106       break;
107     }
108     it.Advance();
109   }
110
111   Send(new BrowserPluginHostMsg_PluginAtPositionResponse(
112        message.routing_id(), guest_instance_id, request_id, local_position));
113 }
114
115 }  // namespace content