Index: webkit/plugins/ppapi/ppb_url_loader_impl.cc |
diff --git a/webkit/plugins/ppapi/ppb_url_loader_impl.cc b/webkit/plugins/ppapi/ppb_url_loader_impl.cc |
index 62dd4f46cfc8e182f4fde41f42e2486ea0b9461d..67c42e84ed2b35a7e183f0e4745336d963230cbc 100644 |
--- a/webkit/plugins/ppapi/ppb_url_loader_impl.cc |
+++ b/webkit/plugins/ppapi/ppb_url_loader_impl.cc |
@@ -10,6 +10,8 @@ |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/c/ppb_url_loader.h" |
#include "ppapi/c/trusted/ppb_url_loader_trusted.h" |
+#include "ppapi/shared_impl/ppapi_globals.h" |
+#include "ppapi/shared_impl/url_response_info_data.h" |
#include "ppapi/thunk/enter.h" |
#include "ppapi/thunk/ppb_url_request_info_api.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
@@ -30,7 +32,7 @@ |
#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
#include "webkit/plugins/ppapi/resource_helper.h" |
#include "webkit/plugins/ppapi/url_request_info_util.h" |
-#include "webkit/plugins/ppapi/ppb_url_response_info_impl.h" |
+#include "webkit/plugins/ppapi/url_response_info_util.h" |
using appcache::WebApplicationCacheHostImpl; |
using ppapi::Resource; |
@@ -219,9 +221,20 @@ PP_Bool PPB_URLLoader_Impl::GetDownloadProgress( |
} |
PP_Resource PPB_URLLoader_Impl::GetResponseInfo() { |
- if (!response_info_) |
+ ::ppapi::thunk::EnterResourceCreationNoLock enter(pp_instance()); |
+ if (enter.failed() || !response_info_.get()) |
return 0; |
- return response_info_->GetReference(); |
+ |
+ // Since we're the "host" the process-local resource for the file ref is |
+ // the same as the host resource. We pass a ref to the file ref. |
+ if (!response_info_->body_as_file_ref.resource.is_null()) { |
+ ::ppapi::PpapiGlobals::Get()->GetResourceTracker()->AddRefResource( |
+ response_info_->body_as_file_ref.resource.host_resource()); |
+ } |
+ return enter.functions()->CreateURLResponseInfo( |
+ pp_instance(), |
+ *response_info_, |
+ response_info_->body_as_file_ref.resource.host_resource()); |
} |
int32_t PPB_URLLoader_Impl::ReadResponseBody( |
@@ -231,7 +244,8 @@ int32_t PPB_URLLoader_Impl::ReadResponseBody( |
int32_t rv = ValidateCallback(callback); |
if (rv != PP_OK) |
return rv; |
- if (!response_info_ || response_info_->body()) |
+ if (!response_info_.get() || |
+ !response_info_->body_as_file_ref.resource.is_null()) |
return PP_ERROR_FAILED; |
if (bytes_to_read <= 0 || !buffer) |
return PP_ERROR_BADARGUMENT; |
@@ -258,7 +272,8 @@ int32_t PPB_URLLoader_Impl::FinishStreamingToFile( |
int32_t rv = ValidateCallback(callback); |
if (rv != PP_OK) |
return rv; |
- if (!response_info_ || !response_info_->body()) |
+ if (!response_info_.get() || |
+ response_info_->body_as_file_ref.resource.is_null()) |
return PP_ERROR_FAILED; |
// We may have already reached EOF. |
@@ -292,6 +307,21 @@ void PPB_URLLoader_Impl::SetStatusCallback( |
status_callback_ = cb; |
} |
+bool PPB_URLLoader_Impl::GetResponseInfoData( |
+ ::ppapi::URLResponseInfoData* data) { |
+ if (!response_info_.get()) |
+ return false; |
+ |
+ *data = *response_info_; |
+ |
+ // We transfer one plugin reference to the FileRef to the caller. |
+ if (!response_info_->body_as_file_ref.resource.is_null()) { |
+ ::ppapi::PpapiGlobals::Get()->GetResourceTracker()->AddRefResource( |
+ response_info_->body_as_file_ref.resource.host_resource()); |
+ } |
+ return true; |
+} |
+ |
void PPB_URLLoader_Impl::willSendRequest( |
WebURLLoader* loader, |
WebURLRequest& new_request, |
@@ -473,10 +503,13 @@ size_t PPB_URLLoader_Impl::FillUserBuffer() { |
} |
void PPB_URLLoader_Impl::SaveResponse(const WebURLResponse& response) { |
- scoped_refptr<PPB_URLResponseInfo_Impl> response_info( |
- new PPB_URLResponseInfo_Impl(pp_instance())); |
- if (response_info->Initialize(response)) |
- response_info_ = response_info; |
+ // DataFromWebURLResponse returns a file ref with one reference to it, which |
+ // we take over via our ScopedPPResource. |
+ response_info_.reset(new ::ppapi::URLResponseInfoData( |
+ DataFromWebURLResponse(pp_instance(), response))); |
+ response_info_file_ref_ = ::ppapi::ScopedPPResource( |
+ ::ppapi::ScopedPPResource::PassRef(), |
+ response_info_->body_as_file_ref.resource.host_resource()); |
} |
void PPB_URLLoader_Impl::UpdateStatus() { |