Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(868)

Unified Diff: content/renderer/pepper/resource_converter.cc

Issue 605593002: PPAPI: Support sending browser-hosted resources synchronously Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix content_browsertests Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/pepper/resource_converter.h ('k') | content/renderer/pepper/url_response_info_util.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « content/renderer/pepper/resource_converter.h ('k') | content/renderer/pepper/url_response_info_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698