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), weak_ptr_factory_(this) { |
| 192 } |
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_number = |
| 274 RendererPpapiHost::GetForPPInstance(instance_) |
| 275 ->CreateBrowserResourceHosts( |
| 276 instance_, browser_host_create_messages_, |
| 277 base::Bind(&ResourceConverterImpl::FlushComplete, |
| 278 weak_ptr_factory_.GetWeakPtr())); |
| 279 |
283 browser_host_create_messages_.clear(); | 280 browser_host_create_messages_.clear(); |
284 browser_vars_.clear(); | |
285 } | 281 } |
286 | 282 |
287 bool ResourceConverterImpl::ToV8Value(const PP_Var& var, | 283 bool ResourceConverterImpl::ToV8Value(const PP_Var& var, |
288 v8::Handle<v8::Context> context, | 284 v8::Handle<v8::Context> context, |
289 v8::Handle<v8::Value>* result) { | 285 v8::Handle<v8::Value>* result) { |
290 DCHECK(var.type == PP_VARTYPE_RESOURCE); | 286 DCHECK(var.type == PP_VARTYPE_RESOURCE); |
291 | 287 |
292 ResourceVar* resource = ResourceVar::FromPPVar(var); | 288 ResourceVar* resource = ResourceVar::FromPPVar(var); |
293 if (!resource) { | 289 if (!resource) { |
294 NOTREACHED(); | 290 NOTREACHED(); |
(...skipping 30 matching lines...) Expand all Loading... |
325 static_cast<content::PepperMediaStreamVideoTrackHost*>(resource_host), | 321 static_cast<content::PepperMediaStreamVideoTrackHost*>(resource_host), |
326 context, | 322 context, |
327 result); | 323 result); |
328 } else { | 324 } else { |
329 LOG(ERROR) << "The type of resource #" << resource_id | 325 LOG(ERROR) << "The type of resource #" << resource_id |
330 << " cannot be converted to a JavaScript object."; | 326 << " cannot be converted to a JavaScript object."; |
331 return false; | 327 return false; |
332 } | 328 } |
333 } | 329 } |
334 | 330 |
| 331 ResourceConverterImpl::PendingConversion::PendingConversion() { |
| 332 } |
| 333 ResourceConverterImpl::PendingConversion::~PendingConversion() { |
| 334 } |
| 335 |
335 scoped_refptr<HostResourceVar> ResourceConverterImpl::CreateResourceVar( | 336 scoped_refptr<HostResourceVar> ResourceConverterImpl::CreateResourceVar( |
336 int pending_renderer_id, | 337 int pending_renderer_id, |
337 const IPC::Message& create_message) { | 338 const IPC::Message& create_message) { |
338 return new HostResourceVar(pending_renderer_id, create_message); | 339 return new HostResourceVar(pending_renderer_id, create_message); |
339 } | 340 } |
340 | 341 |
341 scoped_refptr<HostResourceVar> | 342 scoped_refptr<HostResourceVar> |
342 ResourceConverterImpl::CreateResourceVarWithBrowserHost( | 343 ResourceConverterImpl::CreateResourceVarWithBrowserHost( |
343 int pending_renderer_id, | 344 int pending_renderer_id, |
344 const IPC::Message& create_message, | 345 const IPC::Message& create_message, |
345 const IPC::Message& browser_host_create_message) { | 346 const IPC::Message& browser_host_create_message) { |
346 scoped_refptr<HostResourceVar> result = | 347 scoped_refptr<HostResourceVar> result = |
347 CreateResourceVar(pending_renderer_id, create_message); | 348 CreateResourceVar(pending_renderer_id, create_message); |
348 browser_host_create_messages_.push_back(browser_host_create_message); | 349 browser_host_create_messages_.push_back(browser_host_create_message); |
349 browser_vars_.push_back(result); | 350 browser_vars_.push_back(result); |
350 return result; | 351 return result; |
351 } | 352 } |
352 | 353 |
| 354 void ResourceConverterImpl::FlushComplete( |
| 355 const ppapi::proxy::CompletedBrowserResourceHosts& hosts) { |
| 356 if (pending_conversions_.empty() || |
| 357 hosts.sequence_number != pending_conversions_.front().sequence_number) { |
| 358 NOTREACHED(); |
| 359 return; |
| 360 } |
| 361 const PendingConversion& conversion = pending_conversions_.front(); |
| 362 if (conversion.browser_vars.size() != hosts.host_ids.size()) { |
| 363 NOTREACHED(); |
| 364 pending_conversions_.pop(); |
| 365 return; |
| 366 } |
| 367 for (size_t i = 0; i < conversion.browser_vars.size(); ++i) { |
| 368 conversion.browser_vars[i]->set_pending_browser_host_id(hosts.host_ids[i]); |
| 369 } |
| 370 conversion.callback.Run(true); |
| 371 pending_conversions_.pop(); |
| 372 } |
| 373 |
353 } // namespace content | 374 } // namespace content |
OLD | NEW |