OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |