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..0aba1423dafe85d89c946a69ce8db0ebd5c6fbb8 100644 |
--- a/content/renderer/pepper/resource_converter.cc |
+++ b/content/renderer/pepper/resource_converter.cc |
@@ -5,6 +5,7 @@ |
#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" |
@@ -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,18 @@ 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(); |
} |
bool ResourceConverterImpl::ToV8Value(const PP_Var& var, |
@@ -332,6 +329,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 +350,24 @@ ResourceConverterImpl::CreateResourceVarWithBrowserHost( |
return result; |
} |
+void ResourceConverterImpl::FlushComplete( |
+ const ppapi::proxy::CompletedBrowserResourceHosts& hosts) { |
+ if (pending_conversions_.empty() || |
+ hosts.sequence_num < pending_conversions_.front().sequence_num) { |
raymes
2014/11/17 02:48:11
should the sequence numbers be equal?
dmichael (off chromium)
2014/11/17 22:26:20
For now :) I improved my check in the latest patch
|
+ NOTREACHED(); |
+ return; |
+ } |
+ const PendingConversion& conversion = pending_conversions_.front(); |
raymes
2014/11/17 02:48:11
Will FlushComplete() always come back in-order?
dmichael (off chromium)
2014/11/17 22:26:20
Yes. The order of async messages is guaranteed. Wh
|
+ if (conversion.browser_vars.size() != hosts.host_ids.size()) { |
+ NOTREACHED(); |
+ pending_conversions_.pop(); |
+ return; |
+ } |
+ for (size_t i = 0; i < conversion.browser_vars.size(); ++i) { |
+ conversion.browser_vars[i]->set_pending_browser_host_id(hosts.host_ids[i]); |
+ } |
+ conversion.callback.Run(true); |
+ pending_conversions_.pop(); |
+} |
+ |
} // namespace content |