| 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
|
|
|