blob: 6ddbd7ea801868233125c8fa4c8b301931bea14a [file] [log] [blame]
[email protected]00d320a2012-02-14 00:27:041// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]1054c072010-11-05 22:52:482// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/proxy/ppb_testing_proxy.h"
6
avie029c4132015-12-23 06:45:227#include <stddef.h>
8
[email protected]a76295972013-07-18 00:42:329#include "base/message_loop/message_loop.h"
[email protected]7310b162013-11-25 22:39:1510#include "ppapi/c/private/ppb_testing_private.h"
[email protected]ed33e2e2011-11-20 21:18:0711#include "ppapi/proxy/enter_proxy.h"
[email protected]1054c072010-11-05 22:52:4812#include "ppapi/proxy/plugin_dispatcher.h"
13#include "ppapi/proxy/ppapi_messages.h"
[email protected]794d83cd2011-10-20 19:09:2014#include "ppapi/shared_impl/ppapi_globals.h"
[email protected]4c41d3f2012-02-15 01:44:4715#include "ppapi/shared_impl/proxy_lock.h"
[email protected]7f8b26b2011-08-18 15:41:0116#include "ppapi/shared_impl/resource.h"
[email protected]794d83cd2011-10-20 19:09:2017#include "ppapi/shared_impl/resource_tracker.h"
[email protected]ed33e2e2011-11-20 21:18:0718#include "ppapi/thunk/enter.h"
[email protected]08e65c12012-11-29 18:53:2919#include "ppapi/thunk/ppb_graphics_2d_api.h"
[email protected]ed33e2e2011-11-20 21:18:0720#include "ppapi/thunk/ppb_input_event_api.h"
21
[email protected]961e8972011-12-15 15:29:1922using ppapi::thunk::EnterInstance;
[email protected]08e65c12012-11-29 18:53:2923using ppapi::thunk::EnterResource;
[email protected]4c41d3f2012-02-15 01:44:4724using ppapi::thunk::EnterResourceNoLock;
[email protected]08e65c12012-11-29 18:53:2925using ppapi::thunk::PPB_Graphics2D_API;
[email protected]ed33e2e2011-11-20 21:18:0726using ppapi::thunk::PPB_InputEvent_API;
[email protected]1054c072010-11-05 22:52:4827
[email protected]4d2efd22011-08-18 21:58:0228namespace ppapi {
[email protected]1054c072010-11-05 22:52:4829namespace proxy {
30
31namespace {
32
[email protected]f24448db2011-01-27 20:40:3933PP_Bool ReadImageData(PP_Resource graphics_2d,
[email protected]19d2b012010-11-08 16:32:1834 PP_Resource image,
35 const PP_Point* top_left) {
[email protected]4c41d3f2012-02-15 01:44:4736 ProxyAutoLock lock;
[email protected]794d83cd2011-10-20 19:09:2037 Resource* image_object =
38 PpapiGlobals::Get()->GetResourceTracker()->GetResource(image);
[email protected]4614f192011-01-21 00:26:4339 if (!image_object)
40 return PP_FALSE;
[email protected]7f8b26b2011-08-18 15:41:0141 Resource* graphics_2d_object =
[email protected]794d83cd2011-10-20 19:09:2042 PpapiGlobals::Get()->GetResourceTracker()->GetResource(graphics_2d);
[email protected]f24448db2011-01-27 20:40:3943 if (!graphics_2d_object ||
[email protected]7f8b26b2011-08-18 15:41:0144 image_object->pp_instance() != graphics_2d_object->pp_instance())
[email protected]f24448db2011-01-27 20:40:3945 return PP_FALSE;
46
[email protected]08e65c12012-11-29 18:53:2947 EnterResourceNoLock<PPB_Graphics2D_API> enter(graphics_2d, true);
48 if (enter.failed())
[email protected]4614f192011-01-21 00:26:4349 return PP_FALSE;
[email protected]08e65c12012-11-29 18:53:2950 const HostResource& host_image = image_object->host_resource();
51 return enter.object()->ReadImageData(host_image.host_resource(), top_left) ?
52 PP_TRUE : PP_FALSE;
[email protected]1054c072010-11-05 22:52:4853}
54
[email protected]7358d572011-02-15 18:44:4055void RunMessageLoop(PP_Instance instance) {
[email protected]d2881d82013-05-06 19:23:0856 base::MessageLoop::ScopedNestableTaskAllower allow(
57 base::MessageLoop::current());
[email protected]77c34172012-11-08 18:55:1658 CHECK(PpapiGlobals::Get()->GetMainThreadMessageLoop()->
[email protected]d2881d82013-05-06 19:23:0859 BelongsToCurrentThread());
60 base::MessageLoop::current()->Run();
[email protected]1054c072010-11-05 22:52:4861}
62
[email protected]7358d572011-02-15 18:44:4063void QuitMessageLoop(PP_Instance instance) {
[email protected]77c34172012-11-08 18:55:1664 CHECK(PpapiGlobals::Get()->GetMainThreadMessageLoop()->
65 BelongsToCurrentThread());
[email protected]d2881d82013-05-06 19:23:0866 base::MessageLoop::current()->QuitNow();
[email protected]1054c072010-11-05 22:52:4867}
68
[email protected]4614f192011-01-21 00:26:4369uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) {
[email protected]4c41d3f2012-02-15 01:44:4770 ProxyAutoLock lock;
[email protected]4614f192011-01-21 00:26:4371 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
72 if (!dispatcher)
73 return static_cast<uint32_t>(-1);
74
[email protected]1054c072010-11-05 22:52:4875 uint32_t result = 0;
[email protected]4614f192011-01-21 00:26:4376 dispatcher->Send(new PpapiHostMsg_PPBTesting_GetLiveObjectsForInstance(
[email protected]ac4b54d2011-10-20 23:09:2877 API_ID_PPB_TESTING, instance_id, &result));
[email protected]1054c072010-11-05 22:52:4878 return result;
79}
80
[email protected]5d904b9e2011-08-30 19:38:3181PP_Bool IsOutOfProcess() {
82 return PP_TRUE;
83}
84
tommycliee0a49b2015-05-05 19:40:4985void PostPowerSaverStatus(PP_Instance instance_id) {
tommycli0dd13012015-04-24 20:27:2286 ProxyAutoLock lock;
87 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
88 if (!dispatcher)
tommycliee0a49b2015-05-05 19:40:4989 return;
tommycli0dd13012015-04-24 20:27:2290
tommycliee0a49b2015-05-05 19:40:4991 dispatcher->Send(new PpapiHostMsg_PPBTesting_PostPowerSaverStatus(
92 API_ID_PPB_TESTING, instance_id));
93}
94
95void SubscribeToPowerSaverNotifications(PP_Instance instance_id) {
96 ProxyAutoLock lock;
97 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
98 if (!dispatcher)
99 return;
100
101 dispatcher->Send(
102 new PpapiHostMsg_PPBTesting_SubscribeToPowerSaverNotifications(
103 API_ID_PPB_TESTING, instance_id));
tommycli0dd13012015-04-24 20:27:22104}
105
[email protected]ed33e2e2011-11-20 21:18:07106void SimulateInputEvent(PP_Instance instance_id, PP_Resource input_event) {
[email protected]4c41d3f2012-02-15 01:44:47107 ProxyAutoLock lock;
[email protected]ed33e2e2011-11-20 21:18:07108 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
109 if (!dispatcher)
110 return;
[email protected]4c41d3f2012-02-15 01:44:47111 EnterResourceNoLock<PPB_InputEvent_API> enter(input_event, false);
[email protected]ed33e2e2011-11-20 21:18:07112 if (enter.failed())
113 return;
114
115 const InputEventData& input_event_data = enter.object()->GetInputEventData();
116 dispatcher->Send(new PpapiHostMsg_PPBTesting_SimulateInputEvent(
117 API_ID_PPB_TESTING, instance_id, input_event_data));
118}
119
[email protected]961e8972011-12-15 15:29:19120PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) {
121 EnterInstance enter(instance);
122 if (enter.failed())
123 return PP_MakeUndefined();
124 return enter.functions()->GetDocumentURL(instance, components);
125}
126
[email protected]a732cec2011-12-22 08:35:52127// TODO(dmichael): Ideally we could get a way to check the number of vars in the
128// host-side tracker when running out-of-process, to make sure the proxy does
129// not leak host-side vars.
130uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) {
[email protected]4c41d3f2012-02-15 01:44:47131 ProxyAutoLock lock;
[email protected]a732cec2011-12-22 08:35:52132 std::vector<PP_Var> vars =
133 PpapiGlobals::Get()->GetVarTracker()->GetLiveVars();
134 for (size_t i = 0u;
135 i < std::min(static_cast<size_t>(array_size), vars.size());
136 ++i)
137 live_vars[i] = vars[i];
brettw669d47b12015-02-13 21:17:38138 return static_cast<uint32_t>(vars.size());
[email protected]a732cec2011-12-22 08:35:52139}
140
[email protected]38f428f12013-04-19 14:46:05141void SetMinimumArrayBufferSizeForShmem(PP_Instance instance,
142 uint32_t threshold) {
143 ProxyAutoLock lock;
144 RawVarDataGraph::SetMinimumArrayBufferSizeForShmemForTest(threshold);
145 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
146 if (!dispatcher)
147 return;
148 dispatcher->Send(
149 new PpapiHostMsg_PPBTesting_SetMinimumArrayBufferSizeForShmem(
150 API_ID_PPB_TESTING, threshold));
151}
152
[email protected]45c897d2014-08-11 04:12:46153void RunV8GC(PP_Instance instance) {
154 // TODO(raymes): Implement this if we need it.
155 NOTIMPLEMENTED();
156}
157
[email protected]7310b162013-11-25 22:39:15158const PPB_Testing_Private testing_interface = {
tommycli0dd13012015-04-24 20:27:22159 &ReadImageData,
160 &RunMessageLoop,
161 &QuitMessageLoop,
162 &GetLiveObjectsForInstance,
163 &IsOutOfProcess,
tommycliee0a49b2015-05-05 19:40:49164 &PostPowerSaverStatus,
165 &SubscribeToPowerSaverNotifications,
tommycli0dd13012015-04-24 20:27:22166 &SimulateInputEvent,
167 &GetDocumentURL,
168 &GetLiveVars,
169 &SetMinimumArrayBufferSizeForShmem,
170 &RunV8GC};
[email protected]1054c072010-11-05 22:52:48171
172} // namespace
173
[email protected]5c966022011-09-13 18:09:37174PPB_Testing_Proxy::PPB_Testing_Proxy(Dispatcher* dispatcher)
175 : InterfaceProxy(dispatcher),
176 ppb_testing_impl_(NULL) {
177 if (!dispatcher->IsPlugin()) {
[email protected]7310b162013-11-25 22:39:15178 ppb_testing_impl_ = static_cast<const PPB_Testing_Private*>(
179 dispatcher->local_get_interface()(PPB_TESTING_PRIVATE_INTERFACE));
[email protected]5c966022011-09-13 18:09:37180 }
[email protected]1054c072010-11-05 22:52:48181}
182
183PPB_Testing_Proxy::~PPB_Testing_Proxy() {
184}
185
[email protected]465faa22011-02-08 16:31:46186// static
[email protected]637fc4cd2013-12-06 22:08:15187const PPB_Testing_Private* PPB_Testing_Proxy::GetProxyInterface() {
188 return &testing_interface;
[email protected]1054c072010-11-05 22:52:48189}
190
[email protected]a95986a82010-12-24 06:19:28191bool PPB_Testing_Proxy::OnMessageReceived(const IPC::Message& msg) {
[email protected]27b04df2012-12-10 23:43:10192 if (!dispatcher()->permissions().HasPermission(PERMISSION_TESTING))
193 return false;
194
[email protected]a95986a82010-12-24 06:19:28195 bool handled = true;
[email protected]1054c072010-11-05 22:52:48196 IPC_BEGIN_MESSAGE_MAP(PPB_Testing_Proxy, msg)
197 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTesting_ReadImageData,
198 OnMsgReadImageData)
[email protected]4614f192011-01-21 00:26:43199 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTesting_GetLiveObjectsForInstance,
200 OnMsgGetLiveObjectsForInstance)
tommycliee0a49b2015-05-05 19:40:49201 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTesting_PostPowerSaverStatus,
202 OnMsgPostPowerSaverStatus)
203 IPC_MESSAGE_HANDLER(
204 PpapiHostMsg_PPBTesting_SubscribeToPowerSaverNotifications,
205 OnMsgSubscribeToPowerSaverNotifications)
[email protected]ed33e2e2011-11-20 21:18:07206 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBTesting_SimulateInputEvent,
207 OnMsgSimulateInputEvent)
[email protected]38f428f12013-04-19 14:46:05208 IPC_MESSAGE_HANDLER(
209 PpapiHostMsg_PPBTesting_SetMinimumArrayBufferSizeForShmem,
210 OnMsgSetMinimumArrayBufferSizeForShmem)
[email protected]a95986a82010-12-24 06:19:28211 IPC_MESSAGE_UNHANDLED(handled = false)
[email protected]1054c072010-11-05 22:52:48212 IPC_END_MESSAGE_MAP()
[email protected]a95986a82010-12-24 06:19:28213 return handled;
[email protected]1054c072010-11-05 22:52:48214}
215
[email protected]f24448db2011-01-27 20:40:39216void PPB_Testing_Proxy::OnMsgReadImageData(
217 const HostResource& device_context_2d,
218 const HostResource& image,
219 const PP_Point& top_left,
220 PP_Bool* result) {
[email protected]5c966022011-09-13 18:09:37221 *result = ppb_testing_impl_->ReadImageData(
[email protected]f24448db2011-01-27 20:40:39222 device_context_2d.host_resource(), image.host_resource(), &top_left);
[email protected]1054c072010-11-05 22:52:48223}
224
[email protected]7358d572011-02-15 18:44:40225void PPB_Testing_Proxy::OnMsgRunMessageLoop(PP_Instance instance) {
[email protected]5c966022011-09-13 18:09:37226 ppb_testing_impl_->RunMessageLoop(instance);
[email protected]1054c072010-11-05 22:52:48227}
228
[email protected]7358d572011-02-15 18:44:40229void PPB_Testing_Proxy::OnMsgQuitMessageLoop(PP_Instance instance) {
[email protected]5c966022011-09-13 18:09:37230 ppb_testing_impl_->QuitMessageLoop(instance);
[email protected]1054c072010-11-05 22:52:48231}
232
[email protected]4614f192011-01-21 00:26:43233void PPB_Testing_Proxy::OnMsgGetLiveObjectsForInstance(PP_Instance instance,
[email protected]f24448db2011-01-27 20:40:39234 uint32_t* result) {
[email protected]5c966022011-09-13 18:09:37235 *result = ppb_testing_impl_->GetLiveObjectsForInstance(instance);
[email protected]1054c072010-11-05 22:52:48236}
237
tommycliee0a49b2015-05-05 19:40:49238void PPB_Testing_Proxy::OnMsgPostPowerSaverStatus(PP_Instance instance) {
239 ppb_testing_impl_->PostPowerSaverStatus(instance);
240}
241
242void PPB_Testing_Proxy::OnMsgSubscribeToPowerSaverNotifications(
243 PP_Instance instance) {
244 ppb_testing_impl_->SubscribeToPowerSaverNotifications(instance);
tommycli0dd13012015-04-24 20:27:22245}
246
[email protected]ed33e2e2011-11-20 21:18:07247void PPB_Testing_Proxy::OnMsgSimulateInputEvent(
248 PP_Instance instance,
249 const InputEventData& input_event) {
[email protected]9a578392011-12-07 18:59:27250 scoped_refptr<PPB_InputEvent_Shared> input_event_impl(
[email protected]00d320a2012-02-14 00:27:04251 new PPB_InputEvent_Shared(OBJECT_IS_PROXY, instance, input_event));
[email protected]ed33e2e2011-11-20 21:18:07252 ppb_testing_impl_->SimulateInputEvent(instance,
253 input_event_impl->pp_resource());
254}
255
[email protected]38f428f12013-04-19 14:46:05256void PPB_Testing_Proxy::OnMsgSetMinimumArrayBufferSizeForShmem(
257 uint32_t threshold) {
258 RawVarDataGraph::SetMinimumArrayBufferSizeForShmemForTest(threshold);
259}
260
[email protected]1054c072010-11-05 22:52:48261} // namespace proxy
[email protected]4d2efd22011-08-18 21:58:02262} // namespace ppapi