Index: webkit/plugins/ppapi/ppb_url_loader_impl.cc |
=================================================================== |
--- webkit/plugins/ppapi/ppb_url_loader_impl.cc (revision 82761) |
+++ webkit/plugins/ppapi/ppb_url_loader_impl.cc (working copy) |
@@ -7,6 +7,7 @@ |
#include "base/logging.h" |
#include "ppapi/c/pp_completion_callback.h" |
#include "ppapi/c/pp_errors.h" |
+#include "ppapi/c/ppb_core.h" |
#include "ppapi/c/ppb_url_loader.h" |
#include "ppapi/c/trusted/ppb_url_loader_trusted.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
@@ -47,6 +48,15 @@ |
namespace { |
+int32_t CompletionResult(PP_CompletionCallback callback, int32_t result) { |
+ if (callback.func == NULL || |
+ (callback.flags & PP_COMPLETIONCALLBACK_FLAG_NOFORCEASYNC) != 0) |
+ return result; |
+ |
+ PluginModule::GetCore()->CallOnMainThread(0, callback, result); |
+ return PP_OK_COMPLETIONPENDING; |
+} |
+ |
PP_Resource Create(PP_Instance instance_id) { |
PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
if (!instance) |
@@ -66,12 +76,12 @@ |
scoped_refptr<PPB_URLLoader_Impl> loader( |
Resource::GetAs<PPB_URLLoader_Impl>(loader_id)); |
if (!loader) |
- return PP_ERROR_BADRESOURCE; |
+ return CompletionResult(callback, PP_ERROR_BADRESOURCE); |
scoped_refptr<PPB_URLRequestInfo_Impl> request( |
Resource::GetAs<PPB_URLRequestInfo_Impl>(request_id)); |
if (!request) |
- return PP_ERROR_BADRESOURCE; |
+ return CompletionResult(callback, PP_ERROR_BADRESOURCE); |
return loader->Open(request, callback); |
} |
@@ -242,18 +252,18 @@ |
PP_CompletionCallback callback) { |
int32_t rv = ValidateCallback(callback); |
if (rv != PP_OK) |
- return rv; |
+ return CompletionResult(callback, rv); |
darin (slow to review)
2011/04/25 18:31:06
I think it would be better to put the callback fix
polina
2011/04/25 19:44:44
Do you mean put this in outer Open where it has:
|
if (request->RequiresUniversalAccess() && !has_universal_access_) |
- return PP_ERROR_BADARGUMENT; |
+ // Why is this not PP_ERROR_NOACCESS? |
+ return CompletionResult(callback, PP_ERROR_BADARGUMENT); |
if (loader_.get()) |
- return PP_ERROR_INPROGRESS; |
+ return CompletionResult(callback, PP_ERROR_INPROGRESS); |
WebFrame* frame = GetFrame(instance()); |
if (!frame) |
- return PP_ERROR_FAILED; |
- WebURLRequest web_request(request->ToWebURLRequest(frame)); |
+ return CompletionResult(callback, PP_ERROR_FAILED); |
WebURLLoaderOptions options; |
if (has_universal_access_) { |
@@ -270,8 +280,9 @@ |
loader_.reset(frame->createAssociatedURLLoader(options)); |
if (!loader_.get()) |
- return PP_ERROR_FAILED; |
+ return CompletionResult(callback, PP_ERROR_FAILED); |
+ WebURLRequest web_request(request->ToWebURLRequest(frame)); |
loader_->loadAsynchronously(web_request, this); |
// Check for immediate failure; The AssociatedURLLoader will call our |
// didFail method synchronously for certain kinds of access violations |
@@ -279,7 +290,7 @@ |
// TODO(bbudge) Modify the underlying AssociatedURLLoader to only call |
// back asynchronously. |
if (done_status_ == PP_ERROR_FAILED) |
- return PP_ERROR_NOACCESS; |
+ return CompletionResult(callback, PP_ERROR_NOACCESS); |
request_info_ = scoped_refptr<PPB_URLRequestInfo_Impl>(request); |
@@ -291,7 +302,7 @@ |
int32_t PPB_URLLoader_Impl::FollowRedirect(PP_CompletionCallback callback) { |
int32_t rv = ValidateCallback(callback); |
if (rv != PP_OK) |
- return rv; |
+ return CompletionResult(callback, rv); |
WebURL redirect_url = GURL(response_info_->redirect_url()); |
@@ -330,23 +341,23 @@ |
PP_CompletionCallback callback) { |
int32_t rv = ValidateCallback(callback); |
if (rv != PP_OK) |
- return rv; |
+ return CompletionResult(callback, rv); |
if (!response_info_ || response_info_->body()) |
- return PP_ERROR_FAILED; |
+ return CompletionResult(callback, PP_ERROR_FAILED); |
if (bytes_to_read <= 0 || !buffer) |
- return PP_ERROR_BADARGUMENT; |
+ return CompletionResult(callback, PP_ERROR_BADARGUMENT); |
user_buffer_ = static_cast<char*>(buffer); |
user_buffer_size_ = bytes_to_read; |
if (!buffer_.empty()) |
- return FillUserBuffer(); |
+ return CompletionResult(callback, FillUserBuffer()); |
// We may have already reached EOF. |
if (done_status_ != PP_OK_COMPLETIONPENDING) { |
user_buffer_ = NULL; |
user_buffer_size_ = 0; |
- return done_status_; |
+ return CompletionResult(callback, done_status_); |
} |
RegisterCallback(callback); |
@@ -357,13 +368,13 @@ |
PP_CompletionCallback callback) { |
int32_t rv = ValidateCallback(callback); |
if (rv != PP_OK) |
- return rv; |
+ return CompletionResult(callback, rv); |
if (!response_info_ || !response_info_->body()) |
- return PP_ERROR_FAILED; |
+ return CompletionResult(callback, PP_ERROR_FAILED); |
// We may have already reached EOF. |
if (done_status_ != PP_OK_COMPLETIONPENDING) |
- return done_status_; |
+ return CompletionResult(callback, done_status_); |
// Wait for didFinishLoading / didFail. |
RegisterCallback(callback); |