| 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..f4d639f1e68c316aa7e775a947b386303a5a2f8f 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,17 @@ 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_number =
|
| + 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 +328,11 @@ 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 +351,24 @@ ResourceConverterImpl::CreateResourceVarWithBrowserHost(
|
| return result;
|
| }
|
|
|
| +void ResourceConverterImpl::FlushComplete(
|
| + const ppapi::proxy::CompletedBrowserResourceHosts& hosts) {
|
| + if (pending_conversions_.empty() ||
|
| + hosts.sequence_number != pending_conversions_.front().sequence_number) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| + const PendingConversion& conversion = pending_conversions_.front();
|
| + 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
|
|
|