Index: content/renderer/pepper/resource_converter.cc |
diff --git a/content/renderer/pepper/resource_converter.cc b/content/renderer/pepper/resource_converter.cc |
index 2af3bba3e7799d5864281bc05397c88e052477e3..6094e8a04073d2bcceb2c4a3c1a212d299cb8ae6 100644 |
--- a/content/renderer/pepper/resource_converter.cc |
+++ b/content/renderer/pepper/resource_converter.cc |
@@ -5,11 +5,12 @@ |
#include "content/renderer/pepper/resource_converter.h" |
#include "base/bind.h" |
+#include "base/callback.h" |
#include "base/message_loop/message_loop.h" |
-#include "content/public/renderer/renderer_ppapi_host.h" |
#include "content/renderer/pepper/pepper_file_system_host.h" |
#include "content/renderer/pepper/pepper_media_stream_audio_track_host.h" |
#include "content/renderer/pepper/pepper_media_stream_video_track_host.h" |
+#include "content/renderer/pepper/renderer_ppapi_host_impl.h" |
#include "ipc/ipc_message.h" |
#include "ppapi/host/ppapi_host.h" |
#include "ppapi/host/resource_host.h" |
@@ -29,17 +30,6 @@ using ppapi::ResourceVar; |
namespace content { |
namespace { |
-void FlushComplete( |
- const base::Callback<void(bool)>& callback, |
- const std::vector<scoped_refptr<content::HostResourceVar> >& browser_vars, |
- const std::vector<int>& pending_host_ids) { |
- CHECK(browser_vars.size() == pending_host_ids.size()); |
- for (size_t i = 0; i < browser_vars.size(); ++i) { |
- browser_vars[i]->set_pending_browser_host_id(pending_host_ids[i]); |
- } |
- callback.Run(true); |
-} |
- |
// Converts a blink::WebFileSystem::Type to a PP_FileSystemType. |
PP_FileSystemType WebFileSystemTypeToPPAPI(blink::WebFileSystem::Type type) { |
switch (type) { |
@@ -198,7 +188,8 @@ bool DOMMediaStreamTrackToResource( |
ResourceConverter::~ResourceConverter() {} |
ResourceConverterImpl::ResourceConverterImpl(PP_Instance instance) |
- : instance_(instance) {} |
+ : instance_(instance), |
+ weak_ptr_factory_(this) {} |
ResourceConverterImpl::~ResourceConverterImpl() { |
// Verify Flush() was called. |
@@ -276,12 +267,36 @@ bool ResourceConverterImpl::NeedsFlush() { |
} |
void ResourceConverterImpl::Flush(const base::Callback<void(bool)>& callback) { |
- RendererPpapiHost::GetForPPInstance(instance_)->CreateBrowserResourceHosts( |
- instance_, |
- browser_host_create_messages_, |
- base::Bind(&FlushComplete, callback, browser_vars_)); |
+ pending_conversions_.push(PendingConversion()); |
+ pending_conversions_.back().callback = callback; |
+ pending_conversions_.back().browser_vars.swap(browser_vars_); |
+ pending_conversions_.back().sequence_num = |
+ RendererPpapiHost::GetForPPInstance(instance_)-> |
+ CreateBrowserResourceHosts( |
+ instance_, |
+ browser_host_create_messages_, |
+ base::Bind(&ResourceConverterImpl::FlushComplete, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ |
browser_host_create_messages_.clear(); |
- browser_vars_.clear(); |
+} |
+ |
+void ResourceConverterImpl::FlushSync() { |
+ // Send a request to the browser. We depend here on the fact that the async |
+ // message generated by Flush will arrive before our synchronous request for |
+ // all pending hosts. |
+ // |
+ // We don't need a response for this, since we'll get the result back in the |
+ // response to calling GetAllPendingBrowserHosts, so use a null callback. |
+ base::Callback<void(bool)> null_callback; |
+ Flush(null_callback); |
+ |
+ std::vector<ppapi::proxy::CompletedBrowserResourceHosts> completed_hosts; |
+ RendererPpapiHostImpl* host_impl = static_cast<RendererPpapiHostImpl*>( |
+ RendererPpapiHost::GetForPPInstance(instance_)); |
+ host_impl->GetAllPendingBrowserHosts(instance_, &completed_hosts); |
+ for (const auto& completed_host_set : completed_hosts) |
+ FlushComplete(completed_host_set); |
} |
bool ResourceConverterImpl::ToV8Value(const PP_Var& var, |
@@ -332,6 +347,9 @@ bool ResourceConverterImpl::ToV8Value(const PP_Var& var, |
} |
} |
+ResourceConverterImpl::PendingConversion::PendingConversion() {} |
+ResourceConverterImpl::PendingConversion::~PendingConversion() {} |
+ |
scoped_refptr<HostResourceVar> ResourceConverterImpl::CreateResourceVar( |
int pending_renderer_id, |
const IPC::Message& create_message) { |
@@ -350,4 +368,22 @@ ResourceConverterImpl::CreateResourceVarWithBrowserHost( |
return result; |
} |
+void ResourceConverterImpl::FlushComplete( |
+ const ppapi::proxy::CompletedBrowserResourceHosts& hosts) { |
+ if (pending_conversions_.empty() || |
+ hosts.sequence_id < pending_conversions_.front().sequence_num) { |
+ // We must have already processed this result, so we can ignore it. |
+ return; |
+ } |
+ const PendingConversion& conversion = pending_conversions_.front(); |
+ CHECK(conversion.browser_vars.size() == hosts.host_ids.size()); |
+ for (size_t i = 0; i < conversion.browser_vars.size(); ++i) { |
+ conversion.browser_vars[i]->set_pending_browser_host_id( |
+ hosts.host_ids[i]); |
+ } |
+ if (!conversion.callback.is_null()) |
+ conversion.callback.Run(true); |
+ pending_conversions_.pop(); |
+} |
+ |
} // namespace content |