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

Side by Side Diff: content/browser/renderer_host/media/media_stream_manager.cc

Issue 54863002: Implement a salt for MediaSource IDs that can be cleared by a user. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed more comments. Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/browser/renderer_host/media/media_stream_manager.h" 5 #include "content/browser/renderer_host/media/media_stream_manager.h"
6 6
7 #include <list> 7 #include <list>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 return label; 57 return label;
58 } 58 }
59 59
60 // Helper to verify if a media stream type is part of options or not. 60 // Helper to verify if a media stream type is part of options or not.
61 static bool Requested(const MediaStreamRequest& request, 61 static bool Requested(const MediaStreamRequest& request,
62 MediaStreamType stream_type) { 62 MediaStreamType stream_type) {
63 return (request.audio_type == stream_type || 63 return (request.audio_type == stream_type ||
64 request.video_type == stream_type); 64 request.video_type == stream_type);
65 } 65 }
66 66
67 // TODO(xians): Merge DeviceRequest with MediaStreamRequest.
68 class MediaStreamManager::DeviceRequest { 67 class MediaStreamManager::DeviceRequest {
69 public: 68 public:
70 DeviceRequest(MediaStreamRequester* requester, 69 DeviceRequest(MediaStreamRequester* requester,
71 const MediaStreamRequest& request, 70 const MediaStreamRequest& request,
72 int requesting_process_id, 71 int requesting_process_id,
73 int requesting_view_id) 72 int requesting_view_id,
73 ResourceContext* resource_context)
74 : requester(requester), 74 : requester(requester),
75 request(request), 75 request(request),
76 requesting_process_id(requesting_process_id), 76 requesting_process_id(requesting_process_id),
77 requesting_view_id(requesting_view_id), 77 requesting_view_id(requesting_view_id),
78 resource_context(resource_context),
78 state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED) { 79 state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED) {
79 } 80 }
80 81
81 ~DeviceRequest() {} 82 ~DeviceRequest() {}
82 83
83 // Update the request state and notify observers. 84 // Update the request state and notify observers.
84 void SetState(MediaStreamType stream_type, MediaRequestState new_state) { 85 void SetState(MediaStreamType stream_type, MediaRequestState new_state) {
85 if (stream_type == NUM_MEDIA_TYPES) { 86 if (stream_type == NUM_MEDIA_TYPES) {
86 for (int i = MEDIA_NO_SERVICE + 1; i < NUM_MEDIA_TYPES; ++i) { 87 for (int i = MEDIA_NO_SERVICE + 1; i < NUM_MEDIA_TYPES; ++i) {
87 const MediaStreamType stream_type = static_cast<MediaStreamType>(i); 88 const MediaStreamType stream_type = static_cast<MediaStreamType>(i);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 // MediaStreamRequest::render_process_id which in the tab capture case 128 // MediaStreamRequest::render_process_id which in the tab capture case
128 // specifies the target renderer from which audio and video is captured. 129 // specifies the target renderer from which audio and video is captured.
129 const int requesting_process_id; 130 const int requesting_process_id;
130 131
131 // The render view id that requested this stream to be generated and that 132 // The render view id that requested this stream to be generated and that
132 // will receive a handle to the MediaStream. This may be different from 133 // will receive a handle to the MediaStream. This may be different from
133 // MediaStreamRequest::render_view_id which in the tab capture case 134 // MediaStreamRequest::render_view_id which in the tab capture case
134 // specifies the target renderer from which audio and video is captured. 135 // specifies the target renderer from which audio and video is captured.
135 const int requesting_view_id; 136 const int requesting_view_id;
136 137
138 ResourceContext* resource_context;
139
137 StreamDeviceInfoArray devices; 140 StreamDeviceInfoArray devices;
138 141
139 // Callback to the requester which audio/video devices have been selected. 142 // Callback to the requester which audio/video devices have been selected.
140 // It can be null if the requester has no interest to know the result. 143 // It can be null if the requester has no interest to know the result.
141 // Currently it is only used by |DEVICE_ACCESS| type. 144 // Currently it is only used by |DEVICE_ACCESS| type.
142 MediaStreamManager::MediaRequestResponseCallback callback; 145 MediaStreamManager::MediaRequestResponseCallback callback;
143 146
144 scoped_ptr<MediaStreamUIProxy> ui_proxy; 147 scoped_ptr<MediaStreamUIProxy> ui_proxy;
145 148
146 private: 149 private:
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 int page_request_id, 208 int page_request_id,
206 const StreamOptions& options, 209 const StreamOptions& options,
207 const GURL& security_origin, 210 const GURL& security_origin,
208 const MediaRequestResponseCallback& callback) { 211 const MediaRequestResponseCallback& callback) {
209 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 212 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
210 // Create a new request based on options. 213 // Create a new request based on options.
211 MediaStreamRequest stream_request( 214 MediaStreamRequest stream_request(
212 render_process_id, render_view_id, page_request_id, 215 render_process_id, render_view_id, page_request_id,
213 security_origin, MEDIA_DEVICE_ACCESS, std::string(), std::string(), 216 security_origin, MEDIA_DEVICE_ACCESS, std::string(), std::string(),
214 options.audio_type, options.video_type); 217 options.audio_type, options.video_type);
218 // TODO(perkj): The argument list with NULL parameters to DeviceRequest
219 // suggests that this is the wrong design. Can this be refactored?
215 DeviceRequest* request = new DeviceRequest(NULL, stream_request, 220 DeviceRequest* request = new DeviceRequest(NULL, stream_request,
216 render_process_id, render_view_id); 221 render_process_id, render_view_id,
222 NULL);
217 const std::string& label = AddRequest(request); 223 const std::string& label = AddRequest(request);
218 224
219 request->callback = callback; 225 request->callback = callback;
220 BrowserThread::PostTask( 226 BrowserThread::PostTask(
221 BrowserThread::IO, FROM_HERE, 227 BrowserThread::IO, FROM_HERE,
222 base::Bind(&MediaStreamManager::HandleRequest, 228 base::Bind(&MediaStreamManager::HandleRequest,
223 base::Unretained(this), label)); 229 base::Unretained(this), label));
224 return label; 230 return label;
225 } 231 }
226 232
227 std::string MediaStreamManager::GenerateStream( 233 std::string MediaStreamManager::GenerateStream(
228 MediaStreamRequester* requester, 234 MediaStreamRequester* requester,
229 int render_process_id, 235 int render_process_id,
230 int render_view_id, 236 int render_view_id,
237 ResourceContext* rc,
231 int page_request_id, 238 int page_request_id,
232 const StreamOptions& options, 239 const StreamOptions& options,
233 const GURL& security_origin) { 240 const GURL& security_origin) {
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 241 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
235 if (CommandLine::ForCurrentProcess()->HasSwitch( 242 if (CommandLine::ForCurrentProcess()->HasSwitch(
236 switches::kUseFakeDeviceForMediaStream)) { 243 switches::kUseFakeDeviceForMediaStream)) {
237 UseFakeDevice(); 244 UseFakeDevice();
238 } 245 }
239 if (CommandLine::ForCurrentProcess()->HasSwitch( 246 if (CommandLine::ForCurrentProcess()->HasSwitch(
240 switches::kUseFakeUIForMediaStream)) { 247 switches::kUseFakeUIForMediaStream)) {
241 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>()); 248 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>());
242 } 249 }
243 250
244 // Create a new request based on options. 251 // Create a new request based on options.
245 MediaStreamRequest stream_request( 252 MediaStreamRequest stream_request(
246 render_process_id, render_view_id, page_request_id, 253 render_process_id, render_view_id, page_request_id,
247 security_origin, MEDIA_GENERATE_STREAM, 254 security_origin, MEDIA_GENERATE_STREAM,
248 options.audio_device_id, options.video_device_id, 255 options.audio_device_id, options.video_device_id,
249 options.audio_type, options.video_type); 256 options.audio_type, options.video_type);
250 DeviceRequest* request = new DeviceRequest(requester, stream_request, 257 DeviceRequest* request = new DeviceRequest(requester, stream_request,
251 render_process_id, 258 render_process_id,
252 render_view_id); 259 render_view_id,
260 rc);
253 const std::string& label = AddRequest(request); 261 const std::string& label = AddRequest(request);
254 262
255 // Need to post a task since the requester won't have label till 263 // Need to post a task since the requester won't have label till
256 // this function returns. 264 // this function returns.
257 BrowserThread::PostTask( 265 BrowserThread::PostTask(
258 BrowserThread::IO, FROM_HERE, 266 BrowserThread::IO, FROM_HERE,
259 base::Bind(&MediaStreamManager::HandleRequest, 267 base::Bind(&MediaStreamManager::HandleRequest,
260 base::Unretained(this), label)); 268 base::Unretained(this), label));
261 return label; 269 return label;
262 } 270 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 MEDIA_REQUEST_STATE_CLOSING); 400 MEDIA_REQUEST_STATE_CLOSING);
393 } 401 }
394 } 402 }
395 } 403 }
396 } 404 }
397 405
398 std::string MediaStreamManager::EnumerateDevices( 406 std::string MediaStreamManager::EnumerateDevices(
399 MediaStreamRequester* requester, 407 MediaStreamRequester* requester,
400 int render_process_id, 408 int render_process_id,
401 int render_view_id, 409 int render_view_id,
410 ResourceContext* rc,
402 int page_request_id, 411 int page_request_id,
403 MediaStreamType type, 412 MediaStreamType type,
404 const GURL& security_origin) { 413 const GURL& security_origin) {
405 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 414 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
406 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 415 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
407 type == MEDIA_DEVICE_VIDEO_CAPTURE); 416 type == MEDIA_DEVICE_VIDEO_CAPTURE);
408 417
409 // When the requester is NULL, the request is made by the UI to ensure MSM 418 // When the requester is NULL, the request is made by the UI to ensure MSM
410 // starts monitoring devices. 419 // starts monitoring devices.
411 if (!requester) { 420 if (!requester) {
(...skipping 12 matching lines...) Expand all
424 } else { 433 } else {
425 NOTREACHED(); 434 NOTREACHED();
426 return std::string(); 435 return std::string();
427 } 436 }
428 437
429 MediaStreamRequest stream_request( 438 MediaStreamRequest stream_request(
430 render_process_id, render_view_id, page_request_id, 439 render_process_id, render_view_id, page_request_id,
431 security_origin, MEDIA_ENUMERATE_DEVICES, std::string(), std::string(), 440 security_origin, MEDIA_ENUMERATE_DEVICES, std::string(), std::string(),
432 options.audio_type, options.video_type); 441 options.audio_type, options.video_type);
433 DeviceRequest* request = new DeviceRequest(requester, stream_request, 442 DeviceRequest* request = new DeviceRequest(requester, stream_request,
434 render_process_id, 443 render_process_id, render_view_id,
435 render_view_id); 444 rc);
436 const std::string& label = AddRequest(request); 445 const std::string& label = AddRequest(request);
437 BrowserThread::PostTask( 446 BrowserThread::PostTask(
438 BrowserThread::IO, FROM_HERE, 447 BrowserThread::IO, FROM_HERE,
439 base::Bind(&MediaStreamManager::DoEnumerateDevices, 448 base::Bind(&MediaStreamManager::DoEnumerateDevices,
440 base::Unretained(this), label)); 449 base::Unretained(this), label));
441 450
442 return label; 451 return label;
443 } 452 }
444 453
445 void MediaStreamManager::DoEnumerateDevices(const std::string& label) { 454 void MediaStreamManager::DoEnumerateDevices(const std::string& label) {
(...skipping 19 matching lines...) Expand all
465 FinalizeEnumerateDevices(label, request); 474 FinalizeEnumerateDevices(label, request);
466 } else { 475 } else {
467 StartEnumeration(request); 476 StartEnumeration(request);
468 } 477 }
469 } 478 }
470 479
471 std::string MediaStreamManager::OpenDevice( 480 std::string MediaStreamManager::OpenDevice(
472 MediaStreamRequester* requester, 481 MediaStreamRequester* requester,
473 int render_process_id, 482 int render_process_id,
474 int render_view_id, 483 int render_view_id,
484 ResourceContext* rc,
475 int page_request_id, 485 int page_request_id,
476 const std::string& device_id, 486 const std::string& device_id,
477 MediaStreamType type, 487 MediaStreamType type,
478 const GURL& security_origin) { 488 const GURL& security_origin) {
479 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 489 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
480 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 490 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
481 type == MEDIA_DEVICE_VIDEO_CAPTURE); 491 type == MEDIA_DEVICE_VIDEO_CAPTURE);
482 492
483 // Create a new request. 493 // Create a new request.
484 StreamOptions options; 494 StreamOptions options;
485 if (IsAudioMediaType(type)) { 495 if (IsAudioMediaType(type)) {
486 options.audio_type = type; 496 options.audio_type = type;
487 options.audio_device_id = device_id; 497 options.audio_device_id = device_id;
488 } else if (IsVideoMediaType(type)) { 498 } else if (IsVideoMediaType(type)) {
489 options.video_type = type; 499 options.video_type = type;
490 options.video_device_id = device_id; 500 options.video_device_id = device_id;
491 } else { 501 } else {
492 NOTREACHED(); 502 NOTREACHED();
493 return std::string(); 503 return std::string();
494 } 504 }
495 505
496 MediaStreamRequest stream_request( 506 MediaStreamRequest stream_request(
497 render_process_id, render_view_id, page_request_id, 507 render_process_id, render_view_id, page_request_id,
498 security_origin, MEDIA_OPEN_DEVICE, options.audio_device_id, 508 security_origin, MEDIA_OPEN_DEVICE, options.audio_device_id,
499 options.video_device_id, options.audio_type, options.video_type); 509 options.video_device_id, options.audio_type, options.video_type);
500 DeviceRequest* request = new DeviceRequest(requester, stream_request, 510 DeviceRequest* request = new DeviceRequest(requester, stream_request,
501 render_process_id, 511 render_process_id, render_view_id,
502 render_view_id); 512 rc);
503 const std::string& label = AddRequest(request); 513 const std::string& label = AddRequest(request);
504 BrowserThread::PostTask( 514 BrowserThread::PostTask(
505 BrowserThread::IO, FROM_HERE, 515 BrowserThread::IO, FROM_HERE,
506 base::Bind(&MediaStreamManager::HandleRequest, 516 base::Bind(&MediaStreamManager::HandleRequest,
507 base::Unretained(this), label)); 517 base::Unretained(this), label));
508 518
509 return label; 519 return label;
510 } 520 }
511 521
512 void MediaStreamManager::StartMonitoring() { 522 void MediaStreamManager::StartMonitoring() {
(...skipping 18 matching lines...) Expand all
531 DCHECK_EQ(base::MessageLoop::current(), io_loop_); 541 DCHECK_EQ(base::MessageLoop::current(), io_loop_);
532 if (monitoring_started_) { 542 if (monitoring_started_) {
533 base::SystemMonitor::Get()->RemoveDevicesChangedObserver(this); 543 base::SystemMonitor::Get()->RemoveDevicesChangedObserver(this);
534 monitoring_started_ = false; 544 monitoring_started_ = false;
535 ClearEnumerationCache(&audio_enumeration_cache_); 545 ClearEnumerationCache(&audio_enumeration_cache_);
536 ClearEnumerationCache(&video_enumeration_cache_); 546 ClearEnumerationCache(&video_enumeration_cache_);
537 } 547 }
538 } 548 }
539 549
540 bool MediaStreamManager::TranslateRequestedSourceIdToDeviceId( 550 bool MediaStreamManager::TranslateRequestedSourceIdToDeviceId(
541 MediaStreamRequest* request) { 551 DeviceRequest* request) {
552 MediaStreamRequest* ms_request = &request->request;
542 // If a specific device has been requested we need to find the real device id. 553 // If a specific device has been requested we need to find the real device id.
543 if (request->audio_type == MEDIA_DEVICE_AUDIO_CAPTURE && 554 if (ms_request->audio_type == MEDIA_DEVICE_AUDIO_CAPTURE &&
544 !request->requested_audio_device_id.empty()) { 555 !ms_request->requested_audio_device_id.empty()) {
545 if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_AUDIO_CAPTURE, 556 if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_AUDIO_CAPTURE,
546 request->security_origin, 557 request->resource_context,
547 request->requested_audio_device_id, 558 ms_request->security_origin,
548 &request->requested_audio_device_id)) { 559 ms_request->requested_audio_device_id,
560 &ms_request->requested_audio_device_id)) {
549 // TODO(perkj): gUM should support mandatory and optional constraints. 561 // TODO(perkj): gUM should support mandatory and optional constraints.
550 // Ie - if the sourceId is optional but it does not match - gUM should 562 // Ie - if the sourceId is optional but it does not match - gUM should
551 // not fail. For now we treat sourceId as a mandatory constraint. 563 // not fail. For now we treat sourceId as a mandatory constraint.
552 LOG(ERROR) << "Requested device does not exist."; 564 LOG(ERROR) << "Requested device does not exist.";
553 return false; 565 return false;
554 } 566 }
555 } 567 }
556 568
557 if (request->video_type == MEDIA_DEVICE_VIDEO_CAPTURE && 569 if (ms_request->video_type == MEDIA_DEVICE_VIDEO_CAPTURE &&
558 !request->requested_video_device_id.empty()) { 570 !ms_request->requested_video_device_id.empty()) {
559 if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_VIDEO_CAPTURE, 571 if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_VIDEO_CAPTURE,
560 request->security_origin, 572 request->resource_context,
561 request->requested_video_device_id, 573 ms_request->security_origin,
562 &request->requested_video_device_id)) { 574 ms_request->requested_video_device_id,
575 &ms_request->requested_video_device_id)) {
563 // TODO(perkj): guM should support mandatory and optional constraints. 576 // TODO(perkj): guM should support mandatory and optional constraints.
564 // Ie - if the sourceId is optional but it does not match - guM should 577 // Ie - if the sourceId is optional but it does not match - guM should
565 // not fail. For now we treat sourceId as a mandatory constraint. 578 // not fail. For now we treat sourceId as a mandatory constraint.
566 return false; 579 return false;
567 } 580 }
568 } 581 }
569 DVLOG(3) << "Requested audio device " << request->requested_audio_device_id 582 DVLOG(3) << "Requested audio device "
570 << "Requested video device " << request->requested_video_device_id; 583 << ms_request->requested_audio_device_id
584 << "Requested video device "
585 << ms_request->requested_video_device_id;
571 return true; 586 return true;
572 } 587 }
573 588
574 void MediaStreamManager::TranslateDeviceIdToSourceId( 589 void MediaStreamManager::TranslateDeviceIdToSourceId(
575 const MediaStreamRequest& request, 590 DeviceRequest* request,
576 MediaStreamDevice* device) { 591 MediaStreamDevice* device) {
577 if (request.audio_type == MEDIA_DEVICE_AUDIO_CAPTURE || 592 if (request->request.audio_type == MEDIA_DEVICE_AUDIO_CAPTURE ||
578 request.video_type == MEDIA_DEVICE_VIDEO_CAPTURE) { 593 request->request.video_type == MEDIA_DEVICE_VIDEO_CAPTURE) {
579 device->id = content::GetHMACForMediaDeviceID( 594 device->id = content::GetHMACForMediaDeviceID(
580 request.security_origin, 595 request->resource_context,
596 request->request.security_origin,
581 device->id); 597 device->id);
582 return; 598 return;
583 } 599 }
584 return; 600 return;
585 } 601 }
586 602
587 bool MediaStreamManager::TranslateSourceIdToDeviceId( 603 bool MediaStreamManager::TranslateSourceIdToDeviceId(
588 MediaStreamType stream_type, 604 MediaStreamType stream_type,
605 ResourceContext* rc,
589 const GURL& security_origin, 606 const GURL& security_origin,
590 const std::string& source_id, 607 const std::string& source_id,
591 std::string* device_id) { 608 std::string* device_id) {
592 DCHECK(stream_type == MEDIA_DEVICE_AUDIO_CAPTURE || 609 DCHECK(stream_type == MEDIA_DEVICE_AUDIO_CAPTURE ||
593 stream_type == MEDIA_DEVICE_VIDEO_CAPTURE); 610 stream_type == MEDIA_DEVICE_VIDEO_CAPTURE);
594 DCHECK(!source_id.empty()); 611 DCHECK(!source_id.empty());
595 612
596 EnumerationCache* cache = 613 EnumerationCache* cache =
597 stream_type == MEDIA_DEVICE_AUDIO_CAPTURE ? 614 stream_type == MEDIA_DEVICE_AUDIO_CAPTURE ?
598 &audio_enumeration_cache_ : &video_enumeration_cache_; 615 &audio_enumeration_cache_ : &video_enumeration_cache_;
599 616
600 // If device monitoring hasn't started, the |device_guid| is not valid. 617 // If device monitoring hasn't started, the |device_guid| is not valid.
601 if (!cache->valid) 618 if (!cache->valid)
602 return false; 619 return false;
603 620
604 for (StreamDeviceInfoArray::const_iterator it = cache->devices.begin(); 621 for (StreamDeviceInfoArray::const_iterator it = cache->devices.begin();
605 it != cache->devices.end(); 622 it != cache->devices.end();
606 ++it) { 623 ++it) {
607 if (content::DoesMediaDeviceIDMatchHMAC(security_origin, source_id, 624 if (content::DoesMediaDeviceIDMatchHMAC(rc, security_origin, source_id,
608 it->device.id)) { 625 it->device.id)) {
609 *device_id = it->device.id; 626 *device_id = it->device.id;
610 return true; 627 return true;
611 } 628 }
612 } 629 }
613 return false; 630 return false;
614 } 631 }
615 632
616 void MediaStreamManager::ClearEnumerationCache(EnumerationCache* cache) { 633 void MediaStreamManager::ClearEnumerationCache(EnumerationCache* cache) {
617 DCHECK_EQ(base::MessageLoop::current(), io_loop_); 634 DCHECK_EQ(base::MessageLoop::current(), io_loop_);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 if (!is_web_contents_capture && 745 if (!is_web_contents_capture &&
729 !is_screen_capture && 746 !is_screen_capture &&
730 ((IsAudioMediaType(audio_type) && !audio_enumeration_cache_.valid) || 747 ((IsAudioMediaType(audio_type) && !audio_enumeration_cache_.valid) ||
731 (IsVideoMediaType(video_type) && !video_enumeration_cache_.valid))) { 748 (IsVideoMediaType(video_type) && !video_enumeration_cache_.valid))) {
732 // Enumerate the devices if there is no valid device lists to be used. 749 // Enumerate the devices if there is no valid device lists to be used.
733 StartEnumeration(request); 750 StartEnumeration(request);
734 return; 751 return;
735 } 752 }
736 753
737 // If a specific device has been requested we need to find the real device id. 754 // If a specific device has been requested we need to find the real device id.
738 if (!TranslateRequestedSourceIdToDeviceId(&request->request)) { 755 if (!TranslateRequestedSourceIdToDeviceId(request)) {
739 FinalizeRequestFailed(label, request); 756 FinalizeRequestFailed(label, request);
740 return; 757 return;
741 } 758 }
742 759
743 // No need to do new device enumerations, post the request to UI 760 // No need to do new device enumerations, post the request to UI
744 // immediately. 761 // immediately.
745 if (IsAudioMediaType(audio_type)) 762 if (IsAudioMediaType(audio_type))
746 request->SetState(audio_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL); 763 request->SetState(audio_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL);
747 if (IsVideoMediaType(video_type)) 764 if (IsVideoMediaType(video_type))
748 request->SetState(video_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL); 765 request->SetState(video_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 if (source_id == device_it->device.id) { 842 if (source_id == device_it->device.id) {
826 return &*device_it; 843 return &*device_it;
827 } 844 }
828 } 845 }
829 } 846 }
830 } 847 }
831 return NULL; 848 return NULL;
832 } 849 }
833 850
834 bool MediaStreamManager::FindExistingRequestedDeviceInfo( 851 bool MediaStreamManager::FindExistingRequestedDeviceInfo(
835 int render_process_id, 852 const DeviceRequest* new_request,
836 int render_view_id, 853 const MediaStreamDevice& new_device_info,
837 const GURL& security_origin, 854 StreamDeviceInfo* existing_device_info,
838 MediaStreamRequestType type, 855 MediaRequestState* existing_request_state) const {
839 const std::string& device_id, 856 DCHECK(existing_device_info);
840 MediaStreamType device_type, 857 DCHECK(existing_request_state);
841 StreamDeviceInfo* device_info, 858
842 MediaRequestState* request_state) const { 859 const MediaStreamRequest& new_ms_request = new_request->request;
843 DCHECK(device_info);
844 DCHECK(request_state);
845 860
846 std::string source_id = content::GetHMACForMediaDeviceID( 861 std::string source_id = content::GetHMACForMediaDeviceID(
847 security_origin, 862 new_request->resource_context,
848 device_id); 863 new_ms_request.security_origin,
864 new_device_info.id);
849 865
850 for (DeviceRequests::const_iterator it = requests_.begin(); 866 for (DeviceRequests::const_iterator it = requests_.begin();
851 it != requests_.end() ; ++it) { 867 it != requests_.end() ; ++it) {
852 const DeviceRequest* request = it->second; 868 const DeviceRequest* request = it->second;
853 if (request->requesting_process_id == render_process_id && 869 if (request->requesting_process_id == new_request->requesting_process_id &&
854 request->requesting_view_id == render_view_id && 870 request->requesting_view_id == new_request->requesting_view_id &&
855 request->request.request_type == type) { 871 request->request.request_type == new_ms_request.request_type) {
856 for (StreamDeviceInfoArray::const_iterator device_it = 872 for (StreamDeviceInfoArray::const_iterator device_it =
857 request->devices.begin(); 873 request->devices.begin();
858 device_it != request->devices.end(); ++device_it) { 874 device_it != request->devices.end(); ++device_it) {
859 if (device_it->device.id == source_id && 875 if (device_it->device.id == source_id &&
860 device_it->device.type == device_type) { 876 device_it->device.type == new_device_info.type) {
861 *device_info = *device_it; 877 *existing_device_info = *device_it;
862 *request_state = request->state(device_it->device.type); 878 *existing_request_state = request->state(device_it->device.type);
863 return true; 879 return true;
864 } 880 }
865 } 881 }
866 } 882 }
867 } 883 }
868 return false; 884 return false;
869 } 885 }
870 886
871 void MediaStreamManager::FinalizeGenerateStream(const std::string& label, 887 void MediaStreamManager::FinalizeGenerateStream(const std::string& label,
872 DeviceRequest* request) { 888 DeviceRequest* request) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 void MediaStreamManager::FinalizeOpenDevice(const std::string& label, 922 void MediaStreamManager::FinalizeOpenDevice(const std::string& label,
907 DeviceRequest* request) { 923 DeviceRequest* request) {
908 const StreamDeviceInfoArray& requested_devices = request->devices; 924 const StreamDeviceInfoArray& requested_devices = request->devices;
909 request->requester->DeviceOpened(label, requested_devices.front()); 925 request->requester->DeviceOpened(label, requested_devices.front());
910 } 926 }
911 927
912 void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label, 928 void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label,
913 DeviceRequest* request) { 929 DeviceRequest* request) {
914 for (StreamDeviceInfoArray::iterator it = request->devices.begin(); 930 for (StreamDeviceInfoArray::iterator it = request->devices.begin();
915 it != request->devices.end(); ++it) { 931 it != request->devices.end(); ++it) {
916 TranslateDeviceIdToSourceId(request->request, &it->device); 932 TranslateDeviceIdToSourceId(request, &it->device);
917 } 933 }
918 request->requester->DevicesEnumerated(label, request->devices); 934 request->requester->DevicesEnumerated(label, request->devices);
919 } 935 }
920 936
921 void MediaStreamManager::FinalizeMediaAccessRequest( 937 void MediaStreamManager::FinalizeMediaAccessRequest(
922 const std::string& label, 938 const std::string& label,
923 DeviceRequest* request, 939 DeviceRequest* request,
924 const MediaStreamDevices& devices) { 940 const MediaStreamDevices& devices) {
925 if (!request->callback.is_null()) 941 if (!request->callback.is_null())
926 request->callback.Run(devices, request->ui_proxy.Pass()); 942 request->callback.Run(devices, request->ui_proxy.Pass());
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 } else if (device_info.device.type == request->request.video_type) { 1169 } else if (device_info.device.type == request->request.video_type) {
1154 found_video = true; 1170 found_video = true;
1155 } 1171 }
1156 1172
1157 // If this is request for a new MediaStream, a device is only opened once 1173 // If this is request for a new MediaStream, a device is only opened once
1158 // per render view. This is so that the permission to use a device can be 1174 // per render view. This is so that the permission to use a device can be
1159 // revoked by a single call to StopStreamDevice regardless of how many 1175 // revoked by a single call to StopStreamDevice regardless of how many
1160 // MediaStreams it is being used in. 1176 // MediaStreams it is being used in.
1161 if (request->request.request_type == MEDIA_GENERATE_STREAM) { 1177 if (request->request.request_type == MEDIA_GENERATE_STREAM) {
1162 MediaRequestState state; 1178 MediaRequestState state;
1163 if (FindExistingRequestedDeviceInfo(request->requesting_process_id, 1179 if (FindExistingRequestedDeviceInfo(request,
1164 request->requesting_view_id, 1180 device_info.device,
1165 request->request.security_origin,
1166 request->request.request_type,
1167 device_info.device.id,
1168 device_info.device.type,
1169 &device_info, 1181 &device_info,
1170 &state)) { 1182 &state)) {
1171 request->devices.push_back(device_info); 1183 request->devices.push_back(device_info);
1172 request->SetState(device_info.device.type, state); 1184 request->SetState(device_info.device.type, state);
1173 DVLOG(1) << "HandleAccessRequestResponse - device already opened " 1185 DVLOG(1) << "HandleAccessRequestResponse - device already opened "
1174 << ", {label = " << label << "}" 1186 << ", {label = " << label << "}"
1175 << ", device_id = " << device_it->id << "}"; 1187 << ", device_id = " << device_it->id << "}";
1176 continue; 1188 continue;
1177 } 1189 }
1178 } 1190 }
1179 device_info.session_id = 1191 device_info.session_id =
1180 GetDeviceManager(device_info.device.type)->Open(device_info); 1192 GetDeviceManager(device_info.device.type)->Open(device_info);
1181 TranslateDeviceIdToSourceId(request->request, &device_info.device); 1193 TranslateDeviceIdToSourceId(request, &device_info.device);
1182 request->devices.push_back(device_info); 1194 request->devices.push_back(device_info);
1183 1195
1184 request->SetState(device_info.device.type, MEDIA_REQUEST_STATE_OPENING); 1196 request->SetState(device_info.device.type, MEDIA_REQUEST_STATE_OPENING);
1185 DVLOG(1) << "HandleAccessRequestResponse - opening device " 1197 DVLOG(1) << "HandleAccessRequestResponse - opening device "
1186 << ", {label = " << label << "}" 1198 << ", {label = " << label << "}"
1187 << ", {device_id = " << device_info.device.id << "}" 1199 << ", {device_id = " << device_info.device.id << "}"
1188 << ", {session_id = " << device_info.session_id << "}"; 1200 << ", {session_id = " << device_info.session_id << "}";
1189 } 1201 }
1190 1202
1191 // Check whether we've received all stream types requested. 1203 // Check whether we've received all stream types requested.
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1325 } 1337 }
1326 1338
1327 // Always do enumeration even though some enumeration is in progress, 1339 // Always do enumeration even though some enumeration is in progress,
1328 // because those enumeration commands could be sent before these devices 1340 // because those enumeration commands could be sent before these devices
1329 // change. 1341 // change.
1330 ++active_enumeration_ref_count_[stream_type]; 1342 ++active_enumeration_ref_count_[stream_type];
1331 GetDeviceManager(stream_type)->EnumerateDevices(stream_type); 1343 GetDeviceManager(stream_type)->EnumerateDevices(stream_type);
1332 } 1344 }
1333 1345
1334 } // namespace content 1346 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698