Index: ppapi/proxy/ppb_flash_proxy.cc |
diff --git a/ppapi/proxy/ppb_flash_proxy.cc b/ppapi/proxy/ppb_flash_proxy.cc |
index 725af5f14d08cc0244d57e4b1f55c1a13593d5fe..c551ace8b125fd7a4983f1c97c7a95c9ab4c2fcf 100644 |
--- a/ppapi/proxy/ppb_flash_proxy.cc |
+++ b/ppapi/proxy/ppb_flash_proxy.cc |
@@ -19,6 +19,10 @@ |
#include "ppapi/proxy/proxy_module.h" |
#include "ppapi/proxy/serialized_var.h" |
#include "ppapi/shared_impl/resource.h" |
+#include "ppapi/shared_impl/scoped_pp_resource.h" |
+#include "ppapi/thunk/enter.h" |
+#include "ppapi/thunk/ppb_url_request_info_api.h" |
+#include "ppapi/thunk/resource_creation_api.h" |
namespace ppapi { |
namespace proxy { |
@@ -95,20 +99,19 @@ PP_Var GetProxyForURL(PP_Instance instance, const char* url) { |
int32_t Navigate(PP_Resource request_id, |
const char* target, |
bool from_user_action) { |
- Resource* request_object = |
- PluginResourceTracker::GetInstance()->GetResource(request_id); |
- if (!request_object) |
+ thunk::EnterResource<thunk::PPB_URLRequestInfo_API> enter(request_id, true); |
+ if (enter.failed()) |
return PP_ERROR_BADRESOURCE; |
+ PP_Instance instance = enter.resource()->pp_instance(); |
- PluginDispatcher* dispatcher = |
- PluginDispatcher::GetForInstance(request_object->pp_instance()); |
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
if (!dispatcher) |
return PP_ERROR_FAILED; |
int32_t result = PP_ERROR_FAILED; |
dispatcher->Send(new PpapiHostMsg_PPBFlash_Navigate( |
INTERFACE_ID_PPB_FLASH, |
- request_object->host_resource(), target, from_user_action, |
+ instance, enter.object()->GetData(), target, from_user_action, |
&result)); |
return result; |
} |
@@ -256,18 +259,40 @@ void PPB_Flash_Proxy::OnMsgGetProxyForURL(PP_Instance instance, |
instance, url.c_str())); |
} |
-void PPB_Flash_Proxy::OnMsgNavigate(const HostResource& request_info, |
+void PPB_Flash_Proxy::OnMsgNavigate(PP_Instance instance, |
+ const PPB_URLRequestInfo_Data& data, |
const std::string& target, |
bool from_user_action, |
int32_t* result) { |
DCHECK(!dispatcher()->IsPlugin()); |
+ |
+ // Validate the PP_Instance since we'll be constructing resources on its |
+ // behalf. |
+ HostDispatcher* host_dispatcher = static_cast<HostDispatcher*>(dispatcher()); |
+ if (HostDispatcher::GetForInstance(instance) != host_dispatcher) { |
+ NOTREACHED(); |
+ *result = PP_ERROR_BADARGUMENT; |
+ return; |
+ } |
+ |
// We need to allow re-entrancy here, because this may call into Javascript |
// (e.g. with a "javascript:" URL), or do things like navigate away from the |
// page, either one of which will need to re-enter into the plugin. |
// It is safe, because it is essentially equivalent to NPN_GetURL, where Flash |
// would expect re-entrancy. When running in-process, it does re-enter here. |
- static_cast<HostDispatcher*>(dispatcher())->set_allow_plugin_reentrancy(); |
- *result = ppb_flash_target()->Navigate(request_info.host_resource(), |
+ host_dispatcher->set_allow_plugin_reentrancy(); |
+ |
+ // Make a temporary request resource. |
+ thunk::EnterFunctionNoLock<thunk::ResourceCreationAPI> enter(instance, true); |
+ if (enter.failed()) { |
+ *result = PP_ERROR_FAILED; |
+ return; |
+ } |
+ ScopedPPResource request_resource( |
+ ScopedPPResource::PassRef(), |
+ enter.functions()->CreateURLRequestInfo(instance, data)); |
+ |
+ *result = ppb_flash_target()->Navigate(request_resource, |
target.c_str(), |
from_user_action); |
} |