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

Side by Side Diff: content/renderer/pepper/resource_converter.cc

Issue 730603002: PPAPI: Refactor renderer side of browser host creation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sequence_id->sequence_num 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/pepper/resource_converter.h" 5 #include "content/renderer/pepper/resource_converter.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h"
8 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
9 #include "content/public/renderer/renderer_ppapi_host.h" 10 #include "content/public/renderer/renderer_ppapi_host.h"
10 #include "content/renderer/pepper/pepper_file_system_host.h" 11 #include "content/renderer/pepper/pepper_file_system_host.h"
11 #include "content/renderer/pepper/pepper_media_stream_audio_track_host.h" 12 #include "content/renderer/pepper/pepper_media_stream_audio_track_host.h"
12 #include "content/renderer/pepper/pepper_media_stream_video_track_host.h" 13 #include "content/renderer/pepper/pepper_media_stream_video_track_host.h"
13 #include "ipc/ipc_message.h" 14 #include "ipc/ipc_message.h"
14 #include "ppapi/host/ppapi_host.h" 15 #include "ppapi/host/ppapi_host.h"
15 #include "ppapi/host/resource_host.h" 16 #include "ppapi/host/resource_host.h"
16 #include "ppapi/proxy/ppapi_messages.h" 17 #include "ppapi/proxy/ppapi_messages.h"
17 #include "ppapi/shared_impl/resource_var.h" 18 #include "ppapi/shared_impl/resource_var.h"
18 #include "ppapi/shared_impl/scoped_pp_var.h" 19 #include "ppapi/shared_impl/scoped_pp_var.h"
19 #include "storage/common/fileapi/file_system_util.h" 20 #include "storage/common/fileapi/file_system_util.h"
20 #include "third_party/WebKit/public/platform/WebFileSystem.h" 21 #include "third_party/WebKit/public/platform/WebFileSystem.h"
21 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" 22 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
22 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 23 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
23 #include "third_party/WebKit/public/web/WebDOMFileSystem.h" 24 #include "third_party/WebKit/public/web/WebDOMFileSystem.h"
24 #include "third_party/WebKit/public/web/WebDOMMediaStreamTrack.h" 25 #include "third_party/WebKit/public/web/WebDOMMediaStreamTrack.h"
25 #include "third_party/WebKit/public/web/WebLocalFrame.h" 26 #include "third_party/WebKit/public/web/WebLocalFrame.h"
26 27
27 using ppapi::ResourceVar; 28 using ppapi::ResourceVar;
28 29
29 namespace content { 30 namespace content {
30 namespace { 31 namespace {
31 32
32 void FlushComplete(
33 const base::Callback<void(bool)>& callback,
34 const std::vector<scoped_refptr<content::HostResourceVar> >& browser_vars,
35 const std::vector<int>& pending_host_ids) {
36 CHECK(browser_vars.size() == pending_host_ids.size());
37 for (size_t i = 0; i < browser_vars.size(); ++i) {
38 browser_vars[i]->set_pending_browser_host_id(pending_host_ids[i]);
39 }
40 callback.Run(true);
41 }
42
43 // Converts a blink::WebFileSystem::Type to a PP_FileSystemType. 33 // Converts a blink::WebFileSystem::Type to a PP_FileSystemType.
44 PP_FileSystemType WebFileSystemTypeToPPAPI(blink::WebFileSystem::Type type) { 34 PP_FileSystemType WebFileSystemTypeToPPAPI(blink::WebFileSystem::Type type) {
45 switch (type) { 35 switch (type) {
46 case blink::WebFileSystem::TypeTemporary: 36 case blink::WebFileSystem::TypeTemporary:
47 return PP_FILESYSTEMTYPE_LOCALTEMPORARY; 37 return PP_FILESYSTEMTYPE_LOCALTEMPORARY;
48 case blink::WebFileSystem::TypePersistent: 38 case blink::WebFileSystem::TypePersistent:
49 return PP_FILESYSTEMTYPE_LOCALPERSISTENT; 39 return PP_FILESYSTEMTYPE_LOCALPERSISTENT;
50 case blink::WebFileSystem::TypeIsolated: 40 case blink::WebFileSystem::TypeIsolated:
51 return PP_FILESYSTEMTYPE_ISOLATED; 41 return PP_FILESYSTEMTYPE_ISOLATED;
52 case blink::WebFileSystem::TypeExternal: 42 case blink::WebFileSystem::TypeExternal:
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 } 181 }
192 #endif 182 #endif
193 return false; 183 return false;
194 } 184 }
195 185
196 } // namespace 186 } // namespace
197 187
198 ResourceConverter::~ResourceConverter() {} 188 ResourceConverter::~ResourceConverter() {}
199 189
200 ResourceConverterImpl::ResourceConverterImpl(PP_Instance instance) 190 ResourceConverterImpl::ResourceConverterImpl(PP_Instance instance)
201 : instance_(instance) {} 191 : instance_(instance),
192 weak_ptr_factory_(this) {}
202 193
203 ResourceConverterImpl::~ResourceConverterImpl() { 194 ResourceConverterImpl::~ResourceConverterImpl() {
204 // Verify Flush() was called. 195 // Verify Flush() was called.
205 DCHECK(browser_host_create_messages_.empty()); 196 DCHECK(browser_host_create_messages_.empty());
206 DCHECK(browser_vars_.empty()); 197 DCHECK(browser_vars_.empty());
207 } 198 }
208 199
209 bool ResourceConverterImpl::FromV8Value(v8::Handle<v8::Object> val, 200 bool ResourceConverterImpl::FromV8Value(v8::Handle<v8::Object> val,
210 v8::Handle<v8::Context> context, 201 v8::Handle<v8::Context> context,
211 PP_Var* result, 202 PP_Var* result,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 void ResourceConverterImpl::Reset() { 260 void ResourceConverterImpl::Reset() {
270 browser_host_create_messages_.clear(); 261 browser_host_create_messages_.clear();
271 browser_vars_.clear(); 262 browser_vars_.clear();
272 } 263 }
273 264
274 bool ResourceConverterImpl::NeedsFlush() { 265 bool ResourceConverterImpl::NeedsFlush() {
275 return !browser_host_create_messages_.empty(); 266 return !browser_host_create_messages_.empty();
276 } 267 }
277 268
278 void ResourceConverterImpl::Flush(const base::Callback<void(bool)>& callback) { 269 void ResourceConverterImpl::Flush(const base::Callback<void(bool)>& callback) {
279 RendererPpapiHost::GetForPPInstance(instance_)->CreateBrowserResourceHosts( 270 pending_conversions_.push(PendingConversion());
280 instance_, 271 pending_conversions_.back().callback = callback;
281 browser_host_create_messages_, 272 pending_conversions_.back().browser_vars.swap(browser_vars_);
282 base::Bind(&FlushComplete, callback, browser_vars_)); 273 pending_conversions_.back().sequence_num =
274 RendererPpapiHost::GetForPPInstance(instance_)->
275 CreateBrowserResourceHosts(
276 instance_,
277 browser_host_create_messages_,
278 base::Bind(&ResourceConverterImpl::FlushComplete,
279 weak_ptr_factory_.GetWeakPtr()));
280
283 browser_host_create_messages_.clear(); 281 browser_host_create_messages_.clear();
284 browser_vars_.clear();
285 } 282 }
286 283
287 bool ResourceConverterImpl::ToV8Value(const PP_Var& var, 284 bool ResourceConverterImpl::ToV8Value(const PP_Var& var,
288 v8::Handle<v8::Context> context, 285 v8::Handle<v8::Context> context,
289 v8::Handle<v8::Value>* result) { 286 v8::Handle<v8::Value>* result) {
290 DCHECK(var.type == PP_VARTYPE_RESOURCE); 287 DCHECK(var.type == PP_VARTYPE_RESOURCE);
291 288
292 ResourceVar* resource = ResourceVar::FromPPVar(var); 289 ResourceVar* resource = ResourceVar::FromPPVar(var);
293 if (!resource) { 290 if (!resource) {
294 NOTREACHED(); 291 NOTREACHED();
(...skipping 30 matching lines...) Expand all
325 static_cast<content::PepperMediaStreamVideoTrackHost*>(resource_host), 322 static_cast<content::PepperMediaStreamVideoTrackHost*>(resource_host),
326 context, 323 context,
327 result); 324 result);
328 } else { 325 } else {
329 LOG(ERROR) << "The type of resource #" << resource_id 326 LOG(ERROR) << "The type of resource #" << resource_id
330 << " cannot be converted to a JavaScript object."; 327 << " cannot be converted to a JavaScript object.";
331 return false; 328 return false;
332 } 329 }
333 } 330 }
334 331
332 ResourceConverterImpl::PendingConversion::PendingConversion() {}
333 ResourceConverterImpl::PendingConversion::~PendingConversion() {}
334
335 scoped_refptr<HostResourceVar> ResourceConverterImpl::CreateResourceVar( 335 scoped_refptr<HostResourceVar> ResourceConverterImpl::CreateResourceVar(
336 int pending_renderer_id, 336 int pending_renderer_id,
337 const IPC::Message& create_message) { 337 const IPC::Message& create_message) {
338 return new HostResourceVar(pending_renderer_id, create_message); 338 return new HostResourceVar(pending_renderer_id, create_message);
339 } 339 }
340 340
341 scoped_refptr<HostResourceVar> 341 scoped_refptr<HostResourceVar>
342 ResourceConverterImpl::CreateResourceVarWithBrowserHost( 342 ResourceConverterImpl::CreateResourceVarWithBrowserHost(
343 int pending_renderer_id, 343 int pending_renderer_id,
344 const IPC::Message& create_message, 344 const IPC::Message& create_message,
345 const IPC::Message& browser_host_create_message) { 345 const IPC::Message& browser_host_create_message) {
346 scoped_refptr<HostResourceVar> result = 346 scoped_refptr<HostResourceVar> result =
347 CreateResourceVar(pending_renderer_id, create_message); 347 CreateResourceVar(pending_renderer_id, create_message);
348 browser_host_create_messages_.push_back(browser_host_create_message); 348 browser_host_create_messages_.push_back(browser_host_create_message);
349 browser_vars_.push_back(result); 349 browser_vars_.push_back(result);
350 return result; 350 return result;
351 } 351 }
352 352
353 void ResourceConverterImpl::FlushComplete(
354 const ppapi::proxy::CompletedBrowserResourceHosts& hosts) {
355 if (pending_conversions_.empty() ||
356 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
357 NOTREACHED();
358 return;
359 }
360 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
361 if (conversion.browser_vars.size() != hosts.host_ids.size()) {
362 NOTREACHED();
363 pending_conversions_.pop();
364 return;
365 }
366 for (size_t i = 0; i < conversion.browser_vars.size(); ++i) {
367 conversion.browser_vars[i]->set_pending_browser_host_id(hosts.host_ids[i]);
368 }
369 conversion.callback.Run(true);
370 pending_conversions_.pop();
371 }
372
353 } // namespace content 373 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698