OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/proxy/ppb_testing_proxy.h" | 5 #include "ppapi/proxy/ppb_testing_proxy.h" |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "ppapi/c/dev/ppb_testing_dev.h" | 8 #include "ppapi/c/dev/ppb_testing_dev.h" |
9 #include "ppapi/proxy/enter_proxy.h" | 9 #include "ppapi/proxy/enter_proxy.h" |
10 #include "ppapi/proxy/plugin_dispatcher.h" | 10 #include "ppapi/proxy/plugin_dispatcher.h" |
11 #include "ppapi/proxy/ppapi_messages.h" | 11 #include "ppapi/proxy/ppapi_messages.h" |
12 #include "ppapi/shared_impl/ppapi_globals.h" | 12 #include "ppapi/shared_impl/ppapi_globals.h" |
| 13 #include "ppapi/shared_impl/proxy_lock.h" |
13 #include "ppapi/shared_impl/resource.h" | 14 #include "ppapi/shared_impl/resource.h" |
14 #include "ppapi/shared_impl/resource_tracker.h" | 15 #include "ppapi/shared_impl/resource_tracker.h" |
15 #include "ppapi/thunk/enter.h" | 16 #include "ppapi/thunk/enter.h" |
16 #include "ppapi/thunk/ppb_input_event_api.h" | 17 #include "ppapi/thunk/ppb_input_event_api.h" |
17 | 18 |
18 using ppapi::thunk::EnterInstance; | 19 using ppapi::thunk::EnterInstance; |
19 using ppapi::thunk::EnterResource; | 20 using ppapi::thunk::EnterResourceNoLock; |
20 using ppapi::thunk::PPB_InputEvent_API; | 21 using ppapi::thunk::PPB_InputEvent_API; |
21 | 22 |
22 namespace ppapi { | 23 namespace ppapi { |
23 namespace proxy { | 24 namespace proxy { |
24 | 25 |
25 namespace { | 26 namespace { |
26 | 27 |
27 PP_Bool ReadImageData(PP_Resource graphics_2d, | 28 PP_Bool ReadImageData(PP_Resource graphics_2d, |
28 PP_Resource image, | 29 PP_Resource image, |
29 const PP_Point* top_left) { | 30 const PP_Point* top_left) { |
| 31 ProxyAutoLock lock; |
30 Resource* image_object = | 32 Resource* image_object = |
31 PpapiGlobals::Get()->GetResourceTracker()->GetResource(image); | 33 PpapiGlobals::Get()->GetResourceTracker()->GetResource(image); |
32 if (!image_object) | 34 if (!image_object) |
33 return PP_FALSE; | 35 return PP_FALSE; |
34 Resource* graphics_2d_object = | 36 Resource* graphics_2d_object = |
35 PpapiGlobals::Get()->GetResourceTracker()->GetResource(graphics_2d); | 37 PpapiGlobals::Get()->GetResourceTracker()->GetResource(graphics_2d); |
36 if (!graphics_2d_object || | 38 if (!graphics_2d_object || |
37 image_object->pp_instance() != graphics_2d_object->pp_instance()) | 39 image_object->pp_instance() != graphics_2d_object->pp_instance()) |
38 return PP_FALSE; | 40 return PP_FALSE; |
39 | 41 |
40 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance( | 42 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance( |
41 image_object->pp_instance()); | 43 image_object->pp_instance()); |
42 if (!dispatcher) | 44 if (!dispatcher) |
43 return PP_FALSE; | 45 return PP_FALSE; |
44 | 46 |
45 PP_Bool result = PP_FALSE; | 47 PP_Bool result = PP_FALSE; |
46 dispatcher->Send(new PpapiHostMsg_PPBTesting_ReadImageData( | 48 dispatcher->Send(new PpapiHostMsg_PPBTesting_ReadImageData( |
47 API_ID_PPB_TESTING, graphics_2d_object->host_resource(), | 49 API_ID_PPB_TESTING, graphics_2d_object->host_resource(), |
48 image_object->host_resource(), *top_left, &result)); | 50 image_object->host_resource(), *top_left, &result)); |
49 return result; | 51 return result; |
50 } | 52 } |
51 | 53 |
52 void RunMessageLoop(PP_Instance instance) { | 54 void RunMessageLoop(PP_Instance instance) { |
| 55 // TODO(dmichael): We should probably assert that this is the main thread. |
53 bool old_state = MessageLoop::current()->NestableTasksAllowed(); | 56 bool old_state = MessageLoop::current()->NestableTasksAllowed(); |
54 MessageLoop::current()->SetNestableTasksAllowed(true); | 57 MessageLoop::current()->SetNestableTasksAllowed(true); |
55 MessageLoop::current()->Run(); | 58 MessageLoop::current()->Run(); |
56 MessageLoop::current()->SetNestableTasksAllowed(old_state); | 59 MessageLoop::current()->SetNestableTasksAllowed(old_state); |
57 } | 60 } |
58 | 61 |
59 void QuitMessageLoop(PP_Instance instance) { | 62 void QuitMessageLoop(PP_Instance instance) { |
| 63 // TODO(dmichael): We should probably assert that this is the main thread. |
60 MessageLoop::current()->QuitNow(); | 64 MessageLoop::current()->QuitNow(); |
61 } | 65 } |
62 | 66 |
63 uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) { | 67 uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) { |
| 68 ProxyAutoLock lock; |
64 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id); | 69 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id); |
65 if (!dispatcher) | 70 if (!dispatcher) |
66 return static_cast<uint32_t>(-1); | 71 return static_cast<uint32_t>(-1); |
67 | 72 |
68 uint32_t result = 0; | 73 uint32_t result = 0; |
69 dispatcher->Send(new PpapiHostMsg_PPBTesting_GetLiveObjectsForInstance( | 74 dispatcher->Send(new PpapiHostMsg_PPBTesting_GetLiveObjectsForInstance( |
70 API_ID_PPB_TESTING, instance_id, &result)); | 75 API_ID_PPB_TESTING, instance_id, &result)); |
71 return result; | 76 return result; |
72 } | 77 } |
73 | 78 |
74 PP_Bool IsOutOfProcess() { | 79 PP_Bool IsOutOfProcess() { |
75 return PP_TRUE; | 80 return PP_TRUE; |
76 } | 81 } |
77 | 82 |
78 void SimulateInputEvent(PP_Instance instance_id, PP_Resource input_event) { | 83 void SimulateInputEvent(PP_Instance instance_id, PP_Resource input_event) { |
| 84 ProxyAutoLock lock; |
79 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id); | 85 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id); |
80 if (!dispatcher) | 86 if (!dispatcher) |
81 return; | 87 return; |
82 EnterResource<PPB_InputEvent_API> enter(input_event, false); | 88 EnterResourceNoLock<PPB_InputEvent_API> enter(input_event, false); |
83 if (enter.failed()) | 89 if (enter.failed()) |
84 return; | 90 return; |
85 | 91 |
86 const InputEventData& input_event_data = enter.object()->GetInputEventData(); | 92 const InputEventData& input_event_data = enter.object()->GetInputEventData(); |
87 dispatcher->Send(new PpapiHostMsg_PPBTesting_SimulateInputEvent( | 93 dispatcher->Send(new PpapiHostMsg_PPBTesting_SimulateInputEvent( |
88 API_ID_PPB_TESTING, instance_id, input_event_data)); | 94 API_ID_PPB_TESTING, instance_id, input_event_data)); |
89 } | 95 } |
90 | 96 |
91 PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) { | 97 PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) { |
92 EnterInstance enter(instance); | 98 EnterInstance enter(instance); |
93 if (enter.failed()) | 99 if (enter.failed()) |
94 return PP_MakeUndefined(); | 100 return PP_MakeUndefined(); |
95 return enter.functions()->GetDocumentURL(instance, components); | 101 return enter.functions()->GetDocumentURL(instance, components); |
96 } | 102 } |
97 | 103 |
98 // TODO(dmichael): Ideally we could get a way to check the number of vars in the | 104 // TODO(dmichael): Ideally we could get a way to check the number of vars in the |
99 // host-side tracker when running out-of-process, to make sure the proxy does | 105 // host-side tracker when running out-of-process, to make sure the proxy does |
100 // not leak host-side vars. | 106 // not leak host-side vars. |
101 uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) { | 107 uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) { |
| 108 ProxyAutoLock lock; |
102 std::vector<PP_Var> vars = | 109 std::vector<PP_Var> vars = |
103 PpapiGlobals::Get()->GetVarTracker()->GetLiveVars(); | 110 PpapiGlobals::Get()->GetVarTracker()->GetLiveVars(); |
104 for (size_t i = 0u; | 111 for (size_t i = 0u; |
105 i < std::min(static_cast<size_t>(array_size), vars.size()); | 112 i < std::min(static_cast<size_t>(array_size), vars.size()); |
106 ++i) | 113 ++i) |
107 live_vars[i] = vars[i]; | 114 live_vars[i] = vars[i]; |
108 return vars.size(); | 115 return vars.size(); |
109 } | 116 } |
110 | 117 |
111 const PPB_Testing_Dev testing_interface = { | 118 const PPB_Testing_Dev testing_interface = { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 scoped_refptr<PPB_InputEvent_Shared> input_event_impl( | 198 scoped_refptr<PPB_InputEvent_Shared> input_event_impl( |
192 new PPB_InputEvent_Shared(PPB_InputEvent_Shared::InitAsProxy(), | 199 new PPB_InputEvent_Shared(PPB_InputEvent_Shared::InitAsProxy(), |
193 instance, | 200 instance, |
194 input_event)); | 201 input_event)); |
195 ppb_testing_impl_->SimulateInputEvent(instance, | 202 ppb_testing_impl_->SimulateInputEvent(instance, |
196 input_event_impl->pp_resource()); | 203 input_event_impl->pp_resource()); |
197 } | 204 } |
198 | 205 |
199 } // namespace proxy | 206 } // namespace proxy |
200 } // namespace ppapi | 207 } // namespace ppapi |
OLD | NEW |