summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy/ppp_instance_proxy.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/proxy/ppp_instance_proxy.cc')
-rw-r--r--ppapi/proxy/ppp_instance_proxy.cc72
1 files changed, 28 insertions, 44 deletions
diff --git a/ppapi/proxy/ppp_instance_proxy.cc b/ppapi/proxy/ppp_instance_proxy.cc
index eb1d4e4..a7a0699 100644
--- a/ppapi/proxy/ppp_instance_proxy.cc
+++ b/ppapi/proxy/ppp_instance_proxy.cc
@@ -13,11 +13,14 @@
#include "ppapi/c/ppp_instance.h"
#include "ppapi/proxy/host_dispatcher.h"
#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_globals.h"
+#include "ppapi/proxy/plugin_proxy_delegate.h"
#include "ppapi/proxy/plugin_resource_tracker.h"
#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/ppb_url_loader_proxy.h"
+#include "ppapi/proxy/url_loader_resource.h"
#include "ppapi/shared_impl/ppapi_globals.h"
#include "ppapi/shared_impl/ppb_view_shared.h"
+#include "ppapi/shared_impl/resource_tracker.h"
#include "ppapi/shared_impl/scoped_pp_resource.h"
#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/ppb_flash_fullscreen_api.h"
@@ -83,36 +86,11 @@ void DidChangeFocus(PP_Instance instance, PP_Bool has_focus) {
instance, has_focus));
}
-PP_Bool HandleDocumentLoad(PP_Instance instance,
- PP_Resource url_loader) {
- PP_Bool result = PP_FALSE;
- HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
-
- // Set up the URLLoader for proxying.
-
- PPB_URLLoader_Proxy* url_loader_proxy = static_cast<PPB_URLLoader_Proxy*>(
- dispatcher->GetInterfaceProxy(API_ID_PPB_URL_LOADER));
- url_loader_proxy->PrepareURLLoaderForSendingToPlugin(url_loader);
-
- // PluginResourceTracker in the plugin process assumes that resources that it
- // tracks have been addrefed on behalf of the plugin at the renderer side. So
- // we explicitly do it for |url_loader| here.
- //
- // Please also see comments in PPP_Instance_Proxy::OnMsgHandleDocumentLoad()
- // about releasing of this extra reference.
- const PPB_Core* core = reinterpret_cast<const PPB_Core*>(
- dispatcher->local_get_interface()(PPB_CORE_INTERFACE));
- if (!core) {
- NOTREACHED();
- return PP_FALSE;
- }
- core->AddRefResource(url_loader);
-
- HostResource serialized_loader;
- serialized_loader.SetHostResource(instance, url_loader);
- dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad(
- API_ID_PPP_INSTANCE, instance, serialized_loader, &result));
- return result;
+PP_Bool HandleDocumentLoad(PP_Instance instance, PP_Resource url_loader) {
+ // This should never get called. Out-of-process document loads are handled
+ // specially.
+ NOTREACHED();
+ return PP_FALSE;
}
static const PPP_Instance_1_1 instance_interface = {
@@ -253,19 +231,25 @@ void PPP_Instance_Proxy::OnPluginMsgDidChangeFocus(PP_Instance instance,
void PPP_Instance_Proxy::OnPluginMsgHandleDocumentLoad(
PP_Instance instance,
- const HostResource& url_loader,
- PP_Bool* result) {
- PP_Resource plugin_loader =
- PPB_URLLoader_Proxy::TrackPluginResource(url_loader);
- *result = combined_interface_->HandleDocumentLoad(instance, plugin_loader);
-
- // This balances the one reference that TrackPluginResource() initialized it
- // with. The plugin will normally take an additional reference which will keep
- // the resource alive in the plugin (and the one reference in the renderer
- // representing all plugin references).
- // Once all references at the plugin side are released, the renderer side will
- // be notified and release the reference added in HandleDocumentLoad() above.
- PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(plugin_loader);
+ int pending_loader_host_id,
+ const URLResponseInfoData& data) {
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
+ if (!dispatcher)
+ return;
+ Connection connection(PluginGlobals::Get()->GetBrowserSender(),
+ dispatcher);
+
+ scoped_refptr<URLLoaderResource> loader_resource(
+ new URLLoaderResource(connection, instance,
+ pending_loader_host_id, data));
+
+ PP_Resource loader_pp_resource = loader_resource->GetReference();
+ if (!combined_interface_->HandleDocumentLoad(instance, loader_pp_resource))
+ loader_resource->Close();
+ // We don't pass a ref into the plugin, if it wants one, it will have taken
+ // an additional one.
+ PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(
+ loader_pp_resource);
}
} // namespace proxy