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/ppp_instance_proxy.h" | 5 #include "ppapi/proxy/ppp_instance_proxy.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ppapi/c/dev/ppb_fullscreen_dev.h" | 9 #include "ppapi/c/dev/ppb_fullscreen_dev.h" |
10 #include "ppapi/c/pp_var.h" | 10 #include "ppapi/c/pp_var.h" |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 } | 113 } |
114 | 114 |
115 PP_Var GetInstanceObject(PP_Instance instance) { | 115 PP_Var GetInstanceObject(PP_Instance instance) { |
116 Dispatcher* dispatcher = HostDispatcher::GetForInstance(instance); | 116 Dispatcher* dispatcher = HostDispatcher::GetForInstance(instance); |
117 ReceiveSerializedVarReturnValue result; | 117 ReceiveSerializedVarReturnValue result; |
118 dispatcher->Send(new PpapiMsg_PPPInstance_GetInstanceObject( | 118 dispatcher->Send(new PpapiMsg_PPPInstance_GetInstanceObject( |
119 INTERFACE_ID_PPP_INSTANCE, instance, &result)); | 119 INTERFACE_ID_PPP_INSTANCE, instance, &result)); |
120 return result.Return(dispatcher); | 120 return result.Return(dispatcher); |
121 } | 121 } |
122 | 122 |
123 static const PPP_Instance instance_interface = { | 123 static const PPP_Instance_0_4 instance_interface_0_4 = { |
124 &DidCreate, | 124 &DidCreate, |
125 &DidDestroy, | 125 &DidDestroy, |
126 &DidChangeView, | 126 &DidChangeView, |
127 &DidChangeFocus, | 127 &DidChangeFocus, |
128 &HandleInputEvent, | 128 &HandleInputEvent, |
129 &HandleDocumentLoad, | 129 &HandleDocumentLoad, |
130 &GetInstanceObject | 130 &GetInstanceObject |
131 }; | 131 }; |
132 | 132 |
| 133 static const PPP_Instance_0_5 instance_interface_0_5 = { |
| 134 &DidCreate, |
| 135 &DidDestroy, |
| 136 &DidChangeView, |
| 137 &DidChangeFocus, |
| 138 &HandleInputEvent, |
| 139 &HandleDocumentLoad |
| 140 }; |
| 141 |
| 142 template <class PPP_Instance_Type> |
133 InterfaceProxy* CreateInstanceProxy(Dispatcher* dispatcher, | 143 InterfaceProxy* CreateInstanceProxy(Dispatcher* dispatcher, |
134 const void* target_interface) { | 144 const void* target_interface) { |
135 return new PPP_Instance_Proxy(dispatcher, target_interface); | 145 return new PPP_Instance_Proxy( |
| 146 dispatcher, |
| 147 static_cast<const PPP_Instance_Type*>(target_interface)); |
136 } | 148 } |
137 | 149 |
138 } // namespace | 150 } // namespace |
139 | 151 |
140 PPP_Instance_Proxy::PPP_Instance_Proxy(Dispatcher* dispatcher, | |
141 const void* target_interface) | |
142 : InterfaceProxy(dispatcher, target_interface) { | |
143 } | |
144 | |
145 PPP_Instance_Proxy::~PPP_Instance_Proxy() { | 152 PPP_Instance_Proxy::~PPP_Instance_Proxy() { |
146 } | 153 } |
147 | 154 |
148 // static | 155 // static |
149 const InterfaceProxy::Info* PPP_Instance_Proxy::GetInfo() { | 156 const InterfaceProxy::Info* PPP_Instance_Proxy::GetInfo0_4() { |
150 static const Info info = { | 157 static const Info info = { |
151 &instance_interface, | 158 &instance_interface_0_4, |
152 PPP_INSTANCE_INTERFACE, | 159 PPP_INSTANCE_INTERFACE_0_4, |
153 INTERFACE_ID_PPP_INSTANCE, | 160 INTERFACE_ID_PPP_INSTANCE, |
154 false, | 161 false, |
155 &CreateInstanceProxy, | 162 &CreateInstanceProxy<PPP_Instance_0_4> |
156 }; | 163 }; |
157 return &info; | 164 return &info; |
158 } | 165 } |
| 166 |
| 167 // static |
| 168 const InterfaceProxy::Info* PPP_Instance_Proxy::GetInfo0_5() { |
| 169 static const Info info = { |
| 170 &instance_interface_0_5, |
| 171 PPP_INSTANCE_INTERFACE_0_5, |
| 172 INTERFACE_ID_PPP_INSTANCE, |
| 173 false, |
| 174 &CreateInstanceProxy<PPP_Instance_0_5>, |
| 175 }; |
| 176 return &info; |
| 177 } |
159 | 178 |
160 bool PPP_Instance_Proxy::OnMessageReceived(const IPC::Message& msg) { | 179 bool PPP_Instance_Proxy::OnMessageReceived(const IPC::Message& msg) { |
161 bool handled = true; | 180 bool handled = true; |
162 IPC_BEGIN_MESSAGE_MAP(PPP_Instance_Proxy, msg) | 181 IPC_BEGIN_MESSAGE_MAP(PPP_Instance_Proxy, msg) |
163 IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidCreate, | 182 IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidCreate, |
164 OnMsgDidCreate) | 183 OnMsgDidCreate) |
165 IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidDestroy, | 184 IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidDestroy, |
166 OnMsgDidDestroy) | 185 OnMsgDidDestroy) |
167 IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidChangeView, | 186 IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstance_DidChangeView, |
168 OnMsgDidChangeView) | 187 OnMsgDidChangeView) |
(...skipping 30 matching lines...) Expand all Loading... |
199 // address below. | 218 // address below. |
200 std::vector<const char*> argn_array( | 219 std::vector<const char*> argn_array( |
201 std::max(static_cast<size_t>(1), argn.size())); | 220 std::max(static_cast<size_t>(1), argn.size())); |
202 std::vector<const char*> argv_array( | 221 std::vector<const char*> argv_array( |
203 std::max(static_cast<size_t>(1), argn.size())); | 222 std::max(static_cast<size_t>(1), argn.size())); |
204 for (size_t i = 0; i < argn.size(); i++) { | 223 for (size_t i = 0; i < argn.size(); i++) { |
205 argn_array[i] = argn[i].c_str(); | 224 argn_array[i] = argn[i].c_str(); |
206 argv_array[i] = argv[i].c_str(); | 225 argv_array[i] = argv[i].c_str(); |
207 } | 226 } |
208 | 227 |
209 DCHECK(ppp_instance_target()); | 228 DCHECK(combined_interface_.get()); |
210 *result = ppp_instance_target()->DidCreate(instance, | 229 *result = combined_interface_->DidCreate(instance, |
211 static_cast<uint32_t>(argn.size()), | 230 static_cast<uint32_t>(argn.size()), |
212 &argn_array[0], &argv_array[0]); | 231 &argn_array[0], &argv_array[0]); |
213 } | 232 } |
214 | 233 |
215 void PPP_Instance_Proxy::OnMsgDidDestroy(PP_Instance instance) { | 234 void PPP_Instance_Proxy::OnMsgDidDestroy(PP_Instance instance) { |
216 ppp_instance_target()->DidDestroy(instance); | 235 combined_interface_->DidDestroy(instance); |
217 static_cast<PluginDispatcher*>(dispatcher())->DidDestroyInstance(instance); | 236 static_cast<PluginDispatcher*>(dispatcher())->DidDestroyInstance(instance); |
218 } | 237 } |
219 | 238 |
220 void PPP_Instance_Proxy::OnMsgDidChangeView(PP_Instance instance, | 239 void PPP_Instance_Proxy::OnMsgDidChangeView(PP_Instance instance, |
221 const PP_Rect& position, | 240 const PP_Rect& position, |
222 const PP_Rect& clip, | 241 const PP_Rect& clip, |
223 PP_Bool fullscreen) { | 242 PP_Bool fullscreen) { |
224 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); | 243 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
225 if (!dispatcher) | 244 if (!dispatcher) |
226 return; | 245 return; |
227 InstanceData* data = dispatcher->GetInstanceData(instance); | 246 InstanceData* data = dispatcher->GetInstanceData(instance); |
228 if (!data) | 247 if (!data) |
229 return; | 248 return; |
230 data->position = position; | 249 data->position = position; |
231 data->fullscreen = fullscreen; | 250 data->fullscreen = fullscreen; |
232 ppp_instance_target()->DidChangeView(instance, &position, &clip); | 251 combined_interface_->DidChangeView(instance, &position, &clip); |
233 } | 252 } |
234 | 253 |
235 void PPP_Instance_Proxy::OnMsgDidChangeFocus(PP_Instance instance, | 254 void PPP_Instance_Proxy::OnMsgDidChangeFocus(PP_Instance instance, |
236 PP_Bool has_focus) { | 255 PP_Bool has_focus) { |
237 ppp_instance_target()->DidChangeFocus(instance, has_focus); | 256 combined_interface_->DidChangeFocus(instance, has_focus); |
238 } | 257 } |
239 | 258 |
240 void PPP_Instance_Proxy::OnMsgHandleInputEvent(PP_Instance instance, | 259 void PPP_Instance_Proxy::OnMsgHandleInputEvent(PP_Instance instance, |
241 const PP_InputEvent& event, | 260 const PP_InputEvent& event, |
242 PP_Bool* result) { | 261 PP_Bool* result) { |
243 *result = ppp_instance_target()->HandleInputEvent(instance, &event); | 262 *result = combined_interface_->HandleInputEvent(instance, &event); |
244 } | 263 } |
245 | 264 |
246 void PPP_Instance_Proxy::OnMsgHandleDocumentLoad(PP_Instance instance, | 265 void PPP_Instance_Proxy::OnMsgHandleDocumentLoad(PP_Instance instance, |
247 const HostResource& url_loader, | 266 const HostResource& url_loader, |
248 PP_Bool* result) { | 267 PP_Bool* result) { |
249 PP_Resource plugin_loader = | 268 PP_Resource plugin_loader = |
250 PPB_URLLoader_Proxy::TrackPluginResource(url_loader); | 269 PPB_URLLoader_Proxy::TrackPluginResource(url_loader); |
251 *result = ppp_instance_target()->HandleDocumentLoad( | 270 *result = combined_interface_->HandleDocumentLoad(instance, plugin_loader); |
252 instance, plugin_loader); | |
253 | 271 |
254 // This balances the one reference that TrackPluginResource() initialized it | 272 // This balances the one reference that TrackPluginResource() initialized it |
255 // with. The plugin will normally take an additional reference which will keep | 273 // with. The plugin will normally take an additional reference which will keep |
256 // the resource alive in the plugin (and the one reference in the renderer | 274 // the resource alive in the plugin (and the one reference in the renderer |
257 // representing all plugin references). | 275 // representing all plugin references). |
258 // Once all references at the plugin side are released, the renderer side will | 276 // Once all references at the plugin side are released, the renderer side will |
259 // be notified and release the reference added in HandleDocumentLoad() above. | 277 // be notified and release the reference added in HandleDocumentLoad() above. |
260 PluginResourceTracker::GetInstance()->ReleaseResource(plugin_loader); | 278 PluginResourceTracker::GetInstance()->ReleaseResource(plugin_loader); |
261 } | 279 } |
262 | 280 |
263 void PPP_Instance_Proxy::OnMsgGetInstanceObject( | 281 void PPP_Instance_Proxy::OnMsgGetInstanceObject( |
264 PP_Instance instance, | 282 PP_Instance instance, |
265 SerializedVarReturnValue result) { | 283 SerializedVarReturnValue result) { |
| 284 // GetInstanceObject_0_4 can be null if we're talking to version 0.5 or later, |
| 285 // however the host side of the proxy should never call this function on an |
| 286 // 0.5 or later version. |
| 287 DCHECK(combined_interface_->GetInstanceObject_0_4); |
266 result.Return(dispatcher(), | 288 result.Return(dispatcher(), |
267 ppp_instance_target()->GetInstanceObject(instance)); | 289 combined_interface_->GetInstanceObject_0_4(instance)); |
268 } | 290 } |
269 | 291 |
270 } // namespace proxy | 292 } // namespace proxy |
271 } // namespace pp | 293 } // namespace pp |
OLD | NEW |