| 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_flash_proxy.h" | 5 #include "ppapi/proxy/ppb_flash_proxy.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "base/time.h" | 9 #include "base/time.h" |
| 10 #include "ppapi/c/dev/ppb_font_dev.h" | 10 #include "ppapi/c/dev/ppb_font_dev.h" |
| 11 #include "ppapi/c/dev/ppb_var_deprecated.h" | 11 #include "ppapi/c/dev/ppb_var_deprecated.h" |
| 12 #include "ppapi/c/pp_errors.h" | 12 #include "ppapi/c/pp_errors.h" |
| 13 #include "ppapi/c/pp_resource.h" | 13 #include "ppapi/c/pp_resource.h" |
| 14 #include "ppapi/c/private/ppb_flash.h" | 14 #include "ppapi/c/private/ppb_flash.h" |
| 15 #include "ppapi/proxy/host_dispatcher.h" | 15 #include "ppapi/proxy/host_dispatcher.h" |
| 16 #include "ppapi/proxy/plugin_dispatcher.h" | 16 #include "ppapi/proxy/plugin_dispatcher.h" |
| 17 #include "ppapi/proxy/plugin_resource_tracker.h" | 17 #include "ppapi/proxy/plugin_resource_tracker.h" |
| 18 #include "ppapi/proxy/ppapi_messages.h" | 18 #include "ppapi/proxy/ppapi_messages.h" |
| 19 #include "ppapi/proxy/proxy_module.h" | 19 #include "ppapi/proxy/proxy_module.h" |
| 20 #include "ppapi/proxy/serialized_var.h" | 20 #include "ppapi/proxy/serialized_var.h" |
| 21 #include "ppapi/shared_impl/resource.h" | 21 #include "ppapi/shared_impl/resource.h" |
| 22 #include "ppapi/shared_impl/scoped_pp_resource.h" |
| 23 #include "ppapi/thunk/enter.h" |
| 24 #include "ppapi/thunk/ppb_url_request_info_api.h" |
| 25 #include "ppapi/thunk/resource_creation_api.h" |
| 22 | 26 |
| 23 namespace ppapi { | 27 namespace ppapi { |
| 24 namespace proxy { | 28 namespace proxy { |
| 25 | 29 |
| 26 namespace { | 30 namespace { |
| 27 | 31 |
| 28 void SetInstanceAlwaysOnTop(PP_Instance pp_instance, PP_Bool on_top) { | 32 void SetInstanceAlwaysOnTop(PP_Instance pp_instance, PP_Bool on_top) { |
| 29 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(pp_instance); | 33 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(pp_instance); |
| 30 if (dispatcher) { | 34 if (dispatcher) { |
| 31 dispatcher->Send(new PpapiHostMsg_PPBFlash_SetInstanceAlwaysOnTop( | 35 dispatcher->Send(new PpapiHostMsg_PPBFlash_SetInstanceAlwaysOnTop( |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 | 92 |
| 89 ReceiveSerializedVarReturnValue result; | 93 ReceiveSerializedVarReturnValue result; |
| 90 dispatcher->Send(new PpapiHostMsg_PPBFlash_GetProxyForURL( | 94 dispatcher->Send(new PpapiHostMsg_PPBFlash_GetProxyForURL( |
| 91 INTERFACE_ID_PPB_FLASH, instance, url, &result)); | 95 INTERFACE_ID_PPB_FLASH, instance, url, &result)); |
| 92 return result.Return(dispatcher); | 96 return result.Return(dispatcher); |
| 93 } | 97 } |
| 94 | 98 |
| 95 int32_t Navigate(PP_Resource request_id, | 99 int32_t Navigate(PP_Resource request_id, |
| 96 const char* target, | 100 const char* target, |
| 97 bool from_user_action) { | 101 bool from_user_action) { |
| 98 Resource* request_object = | 102 thunk::EnterResource<thunk::PPB_URLRequestInfo_API> enter(request_id, true); |
| 99 PluginResourceTracker::GetInstance()->GetResource(request_id); | 103 if (enter.failed()) |
| 100 if (!request_object) | |
| 101 return PP_ERROR_BADRESOURCE; | 104 return PP_ERROR_BADRESOURCE; |
| 105 PP_Instance instance = enter.resource()->pp_instance(); |
| 102 | 106 |
| 103 PluginDispatcher* dispatcher = | 107 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| 104 PluginDispatcher::GetForInstance(request_object->pp_instance()); | |
| 105 if (!dispatcher) | 108 if (!dispatcher) |
| 106 return PP_ERROR_FAILED; | 109 return PP_ERROR_FAILED; |
| 107 | 110 |
| 108 int32_t result = PP_ERROR_FAILED; | 111 int32_t result = PP_ERROR_FAILED; |
| 109 dispatcher->Send(new PpapiHostMsg_PPBFlash_Navigate( | 112 dispatcher->Send(new PpapiHostMsg_PPBFlash_Navigate( |
| 110 INTERFACE_ID_PPB_FLASH, | 113 INTERFACE_ID_PPB_FLASH, |
| 111 request_object->host_resource(), target, from_user_action, | 114 instance, enter.object()->GetData(), target, from_user_action, |
| 112 &result)); | 115 &result)); |
| 113 return result; | 116 return result; |
| 114 } | 117 } |
| 115 | 118 |
| 116 void RunMessageLoop(PP_Instance instance) { | 119 void RunMessageLoop(PP_Instance instance) { |
| 117 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); | 120 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| 118 if (!dispatcher) | 121 if (!dispatcher) |
| 119 return; | 122 return; |
| 120 IPC::SyncMessage* msg = new PpapiHostMsg_PPBFlash_RunMessageLoop( | 123 IPC::SyncMessage* msg = new PpapiHostMsg_PPBFlash_RunMessageLoop( |
| 121 INTERFACE_ID_PPB_FLASH, instance); | 124 INTERFACE_ID_PPB_FLASH, instance); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 const_cast<PP_Point*>(¶ms.glyph_advances[0])); | 252 const_cast<PP_Point*>(¶ms.glyph_advances[0])); |
| 250 } | 253 } |
| 251 | 254 |
| 252 void PPB_Flash_Proxy::OnMsgGetProxyForURL(PP_Instance instance, | 255 void PPB_Flash_Proxy::OnMsgGetProxyForURL(PP_Instance instance, |
| 253 const std::string& url, | 256 const std::string& url, |
| 254 SerializedVarReturnValue result) { | 257 SerializedVarReturnValue result) { |
| 255 result.Return(dispatcher(), ppb_flash_target()->GetProxyForURL( | 258 result.Return(dispatcher(), ppb_flash_target()->GetProxyForURL( |
| 256 instance, url.c_str())); | 259 instance, url.c_str())); |
| 257 } | 260 } |
| 258 | 261 |
| 259 void PPB_Flash_Proxy::OnMsgNavigate(const HostResource& request_info, | 262 void PPB_Flash_Proxy::OnMsgNavigate(PP_Instance instance, |
| 263 const PPB_URLRequestInfo_Data& data, |
| 260 const std::string& target, | 264 const std::string& target, |
| 261 bool from_user_action, | 265 bool from_user_action, |
| 262 int32_t* result) { | 266 int32_t* result) { |
| 263 DCHECK(!dispatcher()->IsPlugin()); | 267 DCHECK(!dispatcher()->IsPlugin()); |
| 268 |
| 269 // Validate the PP_Instance since we'll be constructing resources on its |
| 270 // behalf. |
| 271 HostDispatcher* host_dispatcher = static_cast<HostDispatcher*>(dispatcher()); |
| 272 if (HostDispatcher::GetForInstance(instance) != host_dispatcher) { |
| 273 NOTREACHED(); |
| 274 *result = PP_ERROR_BADARGUMENT; |
| 275 return; |
| 276 } |
| 277 |
| 264 // We need to allow re-entrancy here, because this may call into Javascript | 278 // We need to allow re-entrancy here, because this may call into Javascript |
| 265 // (e.g. with a "javascript:" URL), or do things like navigate away from the | 279 // (e.g. with a "javascript:" URL), or do things like navigate away from the |
| 266 // page, either one of which will need to re-enter into the plugin. | 280 // page, either one of which will need to re-enter into the plugin. |
| 267 // It is safe, because it is essentially equivalent to NPN_GetURL, where Flash | 281 // It is safe, because it is essentially equivalent to NPN_GetURL, where Flash |
| 268 // would expect re-entrancy. When running in-process, it does re-enter here. | 282 // would expect re-entrancy. When running in-process, it does re-enter here. |
| 269 static_cast<HostDispatcher*>(dispatcher())->set_allow_plugin_reentrancy(); | 283 host_dispatcher->set_allow_plugin_reentrancy(); |
| 270 *result = ppb_flash_target()->Navigate(request_info.host_resource(), | 284 |
| 285 // Make a temporary request resource. |
| 286 thunk::EnterFunctionNoLock<thunk::ResourceCreationAPI> enter(instance, true); |
| 287 if (enter.failed()) { |
| 288 *result = PP_ERROR_FAILED; |
| 289 return; |
| 290 } |
| 291 ScopedPPResource request_resource( |
| 292 ScopedPPResource::PassRef(), |
| 293 enter.functions()->CreateURLRequestInfo(instance, data)); |
| 294 |
| 295 *result = ppb_flash_target()->Navigate(request_resource, |
| 271 target.c_str(), | 296 target.c_str(), |
| 272 from_user_action); | 297 from_user_action); |
| 273 } | 298 } |
| 274 | 299 |
| 275 void PPB_Flash_Proxy::OnMsgRunMessageLoop(PP_Instance instance) { | 300 void PPB_Flash_Proxy::OnMsgRunMessageLoop(PP_Instance instance) { |
| 276 ppb_flash_target()->RunMessageLoop(instance); | 301 ppb_flash_target()->RunMessageLoop(instance); |
| 277 } | 302 } |
| 278 | 303 |
| 279 void PPB_Flash_Proxy::OnMsgQuitMessageLoop(PP_Instance instance) { | 304 void PPB_Flash_Proxy::OnMsgQuitMessageLoop(PP_Instance instance) { |
| 280 ppb_flash_target()->QuitMessageLoop(instance); | 305 ppb_flash_target()->QuitMessageLoop(instance); |
| 281 } | 306 } |
| 282 | 307 |
| 283 void PPB_Flash_Proxy::OnMsgGetLocalTimeZoneOffset(PP_Instance instance, | 308 void PPB_Flash_Proxy::OnMsgGetLocalTimeZoneOffset(PP_Instance instance, |
| 284 PP_Time t, | 309 PP_Time t, |
| 285 double* result) { | 310 double* result) { |
| 286 *result = ppb_flash_target()->GetLocalTimeZoneOffset(instance, t); | 311 *result = ppb_flash_target()->GetLocalTimeZoneOffset(instance, t); |
| 287 } | 312 } |
| 288 | 313 |
| 289 } // namespace proxy | 314 } // namespace proxy |
| 290 } // namespace ppapi | 315 } // namespace ppapi |
| OLD | NEW |