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