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

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: 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
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);
215 DeviceRequest* request = new DeviceRequest(NULL, stream_request, 218 DeviceRequest* request = new DeviceRequest(NULL, stream_request,
216 render_process_id, render_view_id); 219 render_process_id, render_view_id,
220 NULL);
217 const std::string& label = AddRequest(request); 221 const std::string& label = AddRequest(request);
218 222
219 request->callback = callback; 223 request->callback = callback;
220 BrowserThread::PostTask( 224 BrowserThread::PostTask(
221 BrowserThread::IO, FROM_HERE, 225 BrowserThread::IO, FROM_HERE,
222 base::Bind(&MediaStreamManager::HandleRequest, 226 base::Bind(&MediaStreamManager::HandleRequest,
223 base::Unretained(this), label)); 227 base::Unretained(this), label));
224 return label; 228 return label;
225 } 229 }
226 230
227 std::string MediaStreamManager::GenerateStream( 231 std::string MediaStreamManager::GenerateStream(
228 MediaStreamRequester* requester, 232 MediaStreamRequester* requester,
229 int render_process_id, 233 int render_process_id,
230 int render_view_id, 234 int render_view_id,
235 ResourceContext* rc,
231 int page_request_id, 236 int page_request_id,
232 const StreamOptions& options, 237 const StreamOptions& options,
233 const GURL& security_origin) { 238 const GURL& security_origin) {
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 239 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
235 if (CommandLine::ForCurrentProcess()->HasSwitch( 240 if (CommandLine::ForCurrentProcess()->HasSwitch(
236 switches::kUseFakeDeviceForMediaStream)) { 241 switches::kUseFakeDeviceForMediaStream)) {
237 UseFakeDevice(); 242 UseFakeDevice();
238 } 243 }
239 if (CommandLine::ForCurrentProcess()->HasSwitch( 244 if (CommandLine::ForCurrentProcess()->HasSwitch(
240 switches::kUseFakeUIForMediaStream)) { 245 switches::kUseFakeUIForMediaStream)) {
241 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>()); 246 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>());
242 } 247 }
243 248
244 // Create a new request based on options. 249 // Create a new request based on options.
245 MediaStreamRequest stream_request( 250 MediaStreamRequest stream_request(
246 render_process_id, render_view_id, page_request_id, 251 render_process_id, render_view_id, page_request_id,
247 security_origin, MEDIA_GENERATE_STREAM, 252 security_origin, MEDIA_GENERATE_STREAM,
248 options.audio_device_id, options.video_device_id, 253 options.audio_device_id, options.video_device_id,
249 options.audio_type, options.video_type); 254 options.audio_type, options.video_type);
250 DeviceRequest* request = new DeviceRequest(requester, stream_request, 255 DeviceRequest* request = new DeviceRequest(requester, stream_request,
251 render_process_id, 256 render_process_id,
252 render_view_id); 257 render_view_id,
258 rc);
253 const std::string& label = AddRequest(request); 259 const std::string& label = AddRequest(request);
254 260
255 // Need to post a task since the requester won't have label till 261 // Need to post a task since the requester won't have label till
256 // this function returns. 262 // this function returns.
257 BrowserThread::PostTask( 263 BrowserThread::PostTask(
258 BrowserThread::IO, FROM_HERE, 264 BrowserThread::IO, FROM_HERE,
259 base::Bind(&MediaStreamManager::HandleRequest, 265 base::Bind(&MediaStreamManager::HandleRequest,
260 base::Unretained(this), label)); 266 base::Unretained(this), label));
261 return label; 267 return label;
262 } 268 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 MEDIA_REQUEST_STATE_CLOSING); 398 MEDIA_REQUEST_STATE_CLOSING);
393 } 399 }
394 } 400 }
395 } 401 }
396 } 402 }
397 403
398 std::string MediaStreamManager::EnumerateDevices( 404 std::string MediaStreamManager::EnumerateDevices(
399 MediaStreamRequester* requester, 405 MediaStreamRequester* requester,
400 int render_process_id, 406 int render_process_id,
401 int render_view_id, 407 int render_view_id,
408 ResourceContext* rc,
402 int page_request_id, 409 int page_request_id,
403 MediaStreamType type, 410 MediaStreamType type,
404 const GURL& security_origin) { 411 const GURL& security_origin) {
405 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 412 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
406 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 413 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
407 type == MEDIA_DEVICE_VIDEO_CAPTURE); 414 type == MEDIA_DEVICE_VIDEO_CAPTURE);
408 415
409 // When the requester is NULL, the request is made by the UI to ensure MSM 416 // When the requester is NULL, the request is made by the UI to ensure MSM
410 // starts monitoring devices. 417 // starts monitoring devices.
411 if (!requester) { 418 if (!requester) {
(...skipping 12 matching lines...) Expand all
424 } else { 431 } else {
425 NOTREACHED(); 432 NOTREACHED();
426 return std::string(); 433 return std::string();
427 } 434 }
428 435
429 MediaStreamRequest stream_request( 436 MediaStreamRequest stream_request(
430 render_process_id, render_view_id, page_request_id, 437 render_process_id, render_view_id, page_request_id,
431 security_origin, MEDIA_ENUMERATE_DEVICES, std::string(), std::string(), 438 security_origin, MEDIA_ENUMERATE_DEVICES, std::string(), std::string(),
432 options.audio_type, options.video_type); 439 options.audio_type, options.video_type);
433 DeviceRequest* request = new DeviceRequest(requester, stream_request, 440 DeviceRequest* request = new DeviceRequest(requester, stream_request,
434 render_process_id, 441 render_process_id, render_view_id,
435 render_view_id); 442 rc);
436 const std::string& label = AddRequest(request); 443 const std::string& label = AddRequest(request);
437 BrowserThread::PostTask( 444 BrowserThread::PostTask(
438 BrowserThread::IO, FROM_HERE, 445 BrowserThread::IO, FROM_HERE,
439 base::Bind(&MediaStreamManager::DoEnumerateDevices, 446 base::Bind(&MediaStreamManager::DoEnumerateDevices,
440 base::Unretained(this), label)); 447 base::Unretained(this), label));
441 448
442 return label; 449 return label;
443 } 450 }
444 451
445 void MediaStreamManager::DoEnumerateDevices(const std::string& label) { 452 void MediaStreamManager::DoEnumerateDevices(const std::string& label) {
(...skipping 19 matching lines...) Expand all
465 FinalizeEnumerateDevices(label, request); 472 FinalizeEnumerateDevices(label, request);
466 } else { 473 } else {
467 StartEnumeration(request); 474 StartEnumeration(request);
468 } 475 }
469 } 476 }
470 477
471 std::string MediaStreamManager::OpenDevice( 478 std::string MediaStreamManager::OpenDevice(
472 MediaStreamRequester* requester, 479 MediaStreamRequester* requester,
473 int render_process_id, 480 int render_process_id,
474 int render_view_id, 481 int render_view_id,
482 ResourceContext* rc,
475 int page_request_id, 483 int page_request_id,
476 const std::string& device_id, 484 const std::string& device_id,
477 MediaStreamType type, 485 MediaStreamType type,
478 const GURL& security_origin) { 486 const GURL& security_origin) {
479 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 487 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
480 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || 488 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE ||
481 type == MEDIA_DEVICE_VIDEO_CAPTURE); 489 type == MEDIA_DEVICE_VIDEO_CAPTURE);
482 490
483 // Create a new request. 491 // Create a new request.
484 StreamOptions options; 492 StreamOptions options;
485 if (IsAudioMediaType(type)) { 493 if (IsAudioMediaType(type)) {
486 options.audio_type = type; 494 options.audio_type = type;
487 options.audio_device_id = device_id; 495 options.audio_device_id = device_id;
488 } else if (IsVideoMediaType(type)) { 496 } else if (IsVideoMediaType(type)) {
489 options.video_type = type; 497 options.video_type = type;
490 options.video_device_id = device_id; 498 options.video_device_id = device_id;
491 } else { 499 } else {
492 NOTREACHED(); 500 NOTREACHED();
493 return std::string(); 501 return std::string();
494 } 502 }
495 503
496 MediaStreamRequest stream_request( 504 MediaStreamRequest stream_request(
497 render_process_id, render_view_id, page_request_id, 505 render_process_id, render_view_id, page_request_id,
498 security_origin, MEDIA_OPEN_DEVICE, options.audio_device_id, 506 security_origin, MEDIA_OPEN_DEVICE, options.audio_device_id,
499 options.video_device_id, options.audio_type, options.video_type); 507 options.video_device_id, options.audio_type, options.video_type);
500 DeviceRequest* request = new DeviceRequest(requester, stream_request, 508 DeviceRequest* request = new DeviceRequest(requester, stream_request,
501 render_process_id, 509 render_process_id, render_view_id,
502 render_view_id); 510 rc);
503 const std::string& label = AddRequest(request); 511 const std::string& label = AddRequest(request);
504 BrowserThread::PostTask( 512 BrowserThread::PostTask(
505 BrowserThread::IO, FROM_HERE, 513 BrowserThread::IO, FROM_HERE,
506 base::Bind(&MediaStreamManager::HandleRequest, 514 base::Bind(&MediaStreamManager::HandleRequest,
507 base::Unretained(this), label)); 515 base::Unretained(this), label));
508 516
509 return label; 517 return label;
510 } 518 }
511 519
512 void MediaStreamManager::StartMonitoring() { 520 void MediaStreamManager::StartMonitoring() {
(...skipping 18 matching lines...) Expand all
531 DCHECK_EQ(base::MessageLoop::current(), io_loop_); 539 DCHECK_EQ(base::MessageLoop::current(), io_loop_);
532 if (monitoring_started_) { 540 if (monitoring_started_) {
533 base::SystemMonitor::Get()->RemoveDevicesChangedObserver(this); 541 base::SystemMonitor::Get()->RemoveDevicesChangedObserver(this);
534 monitoring_started_ = false; 542 monitoring_started_ = false;
535 ClearEnumerationCache(&audio_enumeration_cache_); 543 ClearEnumerationCache(&audio_enumeration_cache_);
536 ClearEnumerationCache(&video_enumeration_cache_); 544 ClearEnumerationCache(&video_enumeration_cache_);
537 } 545 }
538 } 546 }
539 547
540 bool MediaStreamManager::TranslateRequestedSourceIdToDeviceId( 548 bool MediaStreamManager::TranslateRequestedSourceIdToDeviceId(
541 MediaStreamRequest* request) { 549 DeviceRequest* request) {
550 MediaStreamRequest* ms_request = &request->request;
542 // If a specific device has been requested we need to find the real device id. 551 // If a specific device has been requested we need to find the real device id.
543 if (request->audio_type == MEDIA_DEVICE_AUDIO_CAPTURE && 552 if (ms_request->audio_type == MEDIA_DEVICE_AUDIO_CAPTURE &&
544 !request->requested_audio_device_id.empty()) { 553 !ms_request->requested_audio_device_id.empty()) {
545 if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_AUDIO_CAPTURE, 554 if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_AUDIO_CAPTURE,
546 request->security_origin, 555 request->resource_context,
547 request->requested_audio_device_id, 556 ms_request->security_origin,
548 &request->requested_audio_device_id)) { 557 ms_request->requested_audio_device_id,
558 &ms_request->requested_audio_device_id)) {
549 // TODO(perkj): gUM should support mandatory and optional constraints. 559 // TODO(perkj): gUM should support mandatory and optional constraints.
550 // Ie - if the sourceId is optional but it does not match - gUM should 560 // 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. 561 // not fail. For now we treat sourceId as a mandatory constraint.
552 LOG(ERROR) << "Requested device does not exist."; 562 LOG(ERROR) << "Requested device does not exist.";
553 return false; 563 return false;
554 } 564 }
555 } 565 }
556 566
557 if (request->video_type == MEDIA_DEVICE_VIDEO_CAPTURE && 567 if (ms_request->video_type == MEDIA_DEVICE_VIDEO_CAPTURE &&
558 !request->requested_video_device_id.empty()) { 568 !ms_request->requested_video_device_id.empty()) {
559 if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_VIDEO_CAPTURE, 569 if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_VIDEO_CAPTURE,
560 request->security_origin, 570 request->resource_context,
561 request->requested_video_device_id, 571 ms_request->security_origin,
562 &request->requested_video_device_id)) { 572 ms_request->requested_video_device_id,
573 &ms_request->requested_video_device_id)) {
563 // TODO(perkj): guM should support mandatory and optional constraints. 574 // TODO(perkj): guM should support mandatory and optional constraints.
564 // Ie - if the sourceId is optional but it does not match - guM should 575 // 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. 576 // not fail. For now we treat sourceId as a mandatory constraint.
566 return false; 577 return false;
567 } 578 }
568 } 579 }
569 DVLOG(3) << "Requested audio device " << request->requested_audio_device_id 580 DVLOG(3) << "Requested audio device "
570 << "Requested video device " << request->requested_video_device_id; 581 << ms_request->requested_audio_device_id
582 << "Requested video device "
583 << ms_request->requested_video_device_id;
571 return true; 584 return true;
572 } 585 }
573 586
574 void MediaStreamManager::TranslateDeviceIdToSourceId( 587 void MediaStreamManager::TranslateDeviceIdToSourceId(
575 const MediaStreamRequest& request, 588 DeviceRequest* request,
576 MediaStreamDevice* device) { 589 MediaStreamDevice* device) {
577 if (request.audio_type == MEDIA_DEVICE_AUDIO_CAPTURE || 590 if (request->request.audio_type == MEDIA_DEVICE_AUDIO_CAPTURE ||
578 request.video_type == MEDIA_DEVICE_VIDEO_CAPTURE) { 591 request->request.video_type == MEDIA_DEVICE_VIDEO_CAPTURE) {
579 device->id = content::GetHMACForMediaDeviceID( 592 device->id = content::GetHMACForMediaDeviceID(
580 request.security_origin, 593 request->resource_context,
594 request->request.security_origin,
581 device->id); 595 device->id);
582 return; 596 return;
583 } 597 }
584 return; 598 return;
585 } 599 }
586 600
587 bool MediaStreamManager::TranslateSourceIdToDeviceId( 601 bool MediaStreamManager::TranslateSourceIdToDeviceId(
588 MediaStreamType stream_type, 602 MediaStreamType stream_type,
603 ResourceContext* rc,
589 const GURL& security_origin, 604 const GURL& security_origin,
590 const std::string& source_id, 605 const std::string& source_id,
591 std::string* device_id) { 606 std::string* device_id) {
592 DCHECK(stream_type == MEDIA_DEVICE_AUDIO_CAPTURE || 607 DCHECK(stream_type == MEDIA_DEVICE_AUDIO_CAPTURE ||
593 stream_type == MEDIA_DEVICE_VIDEO_CAPTURE); 608 stream_type == MEDIA_DEVICE_VIDEO_CAPTURE);
594 DCHECK(!source_id.empty()); 609 DCHECK(!source_id.empty());
595 610
596 EnumerationCache* cache = 611 EnumerationCache* cache =
597 stream_type == MEDIA_DEVICE_AUDIO_CAPTURE ? 612 stream_type == MEDIA_DEVICE_AUDIO_CAPTURE ?
598 &audio_enumeration_cache_ : &video_enumeration_cache_; 613 &audio_enumeration_cache_ : &video_enumeration_cache_;
599 614
600 // If device monitoring hasn't started, the |device_guid| is not valid. 615 // If device monitoring hasn't started, the |device_guid| is not valid.
601 if (!cache->valid) 616 if (!cache->valid)
602 return false; 617 return false;
603 618
604 for (StreamDeviceInfoArray::const_iterator it = cache->devices.begin(); 619 for (StreamDeviceInfoArray::const_iterator it = cache->devices.begin();
605 it != cache->devices.end(); 620 it != cache->devices.end();
606 ++it) { 621 ++it) {
607 if (content::DoesMediaDeviceIDMatchHMAC(security_origin, source_id, 622 if (content::DoesMediaDeviceIDMatchHMAC(rc, security_origin, source_id,
608 it->device.id)) { 623 it->device.id)) {
609 *device_id = it->device.id; 624 *device_id = it->device.id;
610 return true; 625 return true;
611 } 626 }
612 } 627 }
613 return false; 628 return false;
614 } 629 }
615 630
616 void MediaStreamManager::ClearEnumerationCache(EnumerationCache* cache) { 631 void MediaStreamManager::ClearEnumerationCache(EnumerationCache* cache) {
617 DCHECK_EQ(base::MessageLoop::current(), io_loop_); 632 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 && 743 if (!is_web_contents_capture &&
729 !is_screen_capture && 744 !is_screen_capture &&
730 ((IsAudioMediaType(audio_type) && !audio_enumeration_cache_.valid) || 745 ((IsAudioMediaType(audio_type) && !audio_enumeration_cache_.valid) ||
731 (IsVideoMediaType(video_type) && !video_enumeration_cache_.valid))) { 746 (IsVideoMediaType(video_type) && !video_enumeration_cache_.valid))) {
732 // Enumerate the devices if there is no valid device lists to be used. 747 // Enumerate the devices if there is no valid device lists to be used.
733 StartEnumeration(request); 748 StartEnumeration(request);
734 return; 749 return;
735 } 750 }
736 751
737 // If a specific device has been requested we need to find the real device id. 752 // If a specific device has been requested we need to find the real device id.
738 if (!TranslateRequestedSourceIdToDeviceId(&request->request)) { 753 if (!TranslateRequestedSourceIdToDeviceId(request)) {
739 FinalizeRequestFailed(label, request); 754 FinalizeRequestFailed(label, request);
740 return; 755 return;
741 } 756 }
742 757
743 // No need to do new device enumerations, post the request to UI 758 // No need to do new device enumerations, post the request to UI
744 // immediately. 759 // immediately.
745 if (IsAudioMediaType(audio_type)) 760 if (IsAudioMediaType(audio_type))
746 request->SetState(audio_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL); 761 request->SetState(audio_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL);
747 if (IsVideoMediaType(video_type)) 762 if (IsVideoMediaType(video_type))
748 request->SetState(video_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL); 763 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) { 840 if (source_id == device_it->device.id) {
826 return &*device_it; 841 return &*device_it;
827 } 842 }
828 } 843 }
829 } 844 }
830 } 845 }
831 return NULL; 846 return NULL;
832 } 847 }
833 848
834 bool MediaStreamManager::FindExistingRequestedDeviceInfo( 849 bool MediaStreamManager::FindExistingRequestedDeviceInfo(
850 const DeviceRequest* new_request,
851 const MediaStreamDevice& new_device_info,
852 StreamDeviceInfo* existing_device_info,
853 MediaRequestState* existing_request_state) const {
854 /*bool MediaStreamManager::FindExistingRequestedDeviceInfo(
Jói 2013/10/31 16:14:47 Did you mean to leave this commented-out block of
perkj_chrome 2013/10/31 17:05:44 eh- nope- sorry.
835 int render_process_id, 855 int render_process_id,
836 int render_view_id, 856 int render_view_id,
837 const GURL& security_origin, 857 const GURL& security_origin,
838 MediaStreamRequestType type, 858 MediaStreamRequestType type,
839 const std::string& device_id, 859 const std::string& device_id,
840 MediaStreamType device_type, 860 MediaStreamType device_type,
841 StreamDeviceInfo* device_info, 861 StreamDeviceInfo* device_info,
842 MediaRequestState* request_state) const { 862 MediaRequestState* request_state) const {*/
843 DCHECK(device_info); 863 DCHECK(existing_device_info);
844 DCHECK(request_state); 864 DCHECK(existing_request_state);
865
866 const MediaStreamRequest& new_ms_request = new_request->request;
845 867
846 std::string source_id = content::GetHMACForMediaDeviceID( 868 std::string source_id = content::GetHMACForMediaDeviceID(
847 security_origin, 869 new_request->resource_context,
848 device_id); 870 new_ms_request.security_origin,
871 new_device_info.id);
849 872
850 for (DeviceRequests::const_iterator it = requests_.begin(); 873 for (DeviceRequests::const_iterator it = requests_.begin();
851 it != requests_.end() ; ++it) { 874 it != requests_.end() ; ++it) {
852 const DeviceRequest* request = it->second; 875 const DeviceRequest* request = it->second;
853 if (request->requesting_process_id == render_process_id && 876 if (request->requesting_process_id == new_request->requesting_process_id &&
854 request->requesting_view_id == render_view_id && 877 request->requesting_view_id == new_request->requesting_view_id &&
855 request->request.request_type == type) { 878 request->request.request_type == new_ms_request.request_type) {
856 for (StreamDeviceInfoArray::const_iterator device_it = 879 for (StreamDeviceInfoArray::const_iterator device_it =
857 request->devices.begin(); 880 request->devices.begin();
858 device_it != request->devices.end(); ++device_it) { 881 device_it != request->devices.end(); ++device_it) {
859 if (device_it->device.id == source_id && 882 if (device_it->device.id == source_id &&
860 device_it->device.type == device_type) { 883 device_it->device.type == new_device_info.type) {
861 *device_info = *device_it; 884 *existing_device_info = *device_it;
862 *request_state = request->state(device_it->device.type); 885 *existing_request_state = request->state(device_it->device.type);
863 return true; 886 return true;
864 } 887 }
865 } 888 }
866 } 889 }
867 } 890 }
868 return false; 891 return false;
869 } 892 }
870 893
871 void MediaStreamManager::FinalizeGenerateStream(const std::string& label, 894 void MediaStreamManager::FinalizeGenerateStream(const std::string& label,
872 DeviceRequest* request) { 895 DeviceRequest* request) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 void MediaStreamManager::FinalizeOpenDevice(const std::string& label, 929 void MediaStreamManager::FinalizeOpenDevice(const std::string& label,
907 DeviceRequest* request) { 930 DeviceRequest* request) {
908 const StreamDeviceInfoArray& requested_devices = request->devices; 931 const StreamDeviceInfoArray& requested_devices = request->devices;
909 request->requester->DeviceOpened(label, requested_devices.front()); 932 request->requester->DeviceOpened(label, requested_devices.front());
910 } 933 }
911 934
912 void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label, 935 void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label,
913 DeviceRequest* request) { 936 DeviceRequest* request) {
914 for (StreamDeviceInfoArray::iterator it = request->devices.begin(); 937 for (StreamDeviceInfoArray::iterator it = request->devices.begin();
915 it != request->devices.end(); ++it) { 938 it != request->devices.end(); ++it) {
916 TranslateDeviceIdToSourceId(request->request, &it->device); 939 TranslateDeviceIdToSourceId(request, &it->device);
917 } 940 }
918 request->requester->DevicesEnumerated(label, request->devices); 941 request->requester->DevicesEnumerated(label, request->devices);
919 } 942 }
920 943
921 void MediaStreamManager::FinalizeMediaAccessRequest( 944 void MediaStreamManager::FinalizeMediaAccessRequest(
922 const std::string& label, 945 const std::string& label,
923 DeviceRequest* request, 946 DeviceRequest* request,
924 const MediaStreamDevices& devices) { 947 const MediaStreamDevices& devices) {
925 if (!request->callback.is_null()) 948 if (!request->callback.is_null())
926 request->callback.Run(devices, request->ui_proxy.Pass()); 949 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) { 1176 } else if (device_info.device.type == request->request.video_type) {
1154 found_video = true; 1177 found_video = true;
1155 } 1178 }
1156 1179
1157 // If this is request for a new MediaStream, a device is only opened once 1180 // 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 1181 // 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 1182 // revoked by a single call to StopStreamDevice regardless of how many
1160 // MediaStreams it is being used in. 1183 // MediaStreams it is being used in.
1161 if (request->request.request_type == MEDIA_GENERATE_STREAM) { 1184 if (request->request.request_type == MEDIA_GENERATE_STREAM) {
1162 MediaRequestState state; 1185 MediaRequestState state;
1163 if (FindExistingRequestedDeviceInfo(request->requesting_process_id, 1186 if (FindExistingRequestedDeviceInfo(request,
1164 request->requesting_view_id, 1187 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, 1188 &device_info,
1170 &state)) { 1189 &state)) {
1171 request->devices.push_back(device_info); 1190 request->devices.push_back(device_info);
1172 request->SetState(device_info.device.type, state); 1191 request->SetState(device_info.device.type, state);
1173 DVLOG(1) << "HandleAccessRequestResponse - device already opened " 1192 DVLOG(1) << "HandleAccessRequestResponse - device already opened "
1174 << ", {label = " << label << "}" 1193 << ", {label = " << label << "}"
1175 << ", device_id = " << device_it->id << "}"; 1194 << ", device_id = " << device_it->id << "}";
1176 continue; 1195 continue;
1177 } 1196 }
1178 } 1197 }
1179 device_info.session_id = 1198 device_info.session_id =
1180 GetDeviceManager(device_info.device.type)->Open(device_info); 1199 GetDeviceManager(device_info.device.type)->Open(device_info);
1181 TranslateDeviceIdToSourceId(request->request, &device_info.device); 1200 TranslateDeviceIdToSourceId(request, &device_info.device);
1182 request->devices.push_back(device_info); 1201 request->devices.push_back(device_info);
1183 1202
1184 request->SetState(device_info.device.type, MEDIA_REQUEST_STATE_OPENING); 1203 request->SetState(device_info.device.type, MEDIA_REQUEST_STATE_OPENING);
1185 DVLOG(1) << "HandleAccessRequestResponse - opening device " 1204 DVLOG(1) << "HandleAccessRequestResponse - opening device "
1186 << ", {label = " << label << "}" 1205 << ", {label = " << label << "}"
1187 << ", {device_id = " << device_info.device.id << "}" 1206 << ", {device_id = " << device_info.device.id << "}"
1188 << ", {session_id = " << device_info.session_id << "}"; 1207 << ", {session_id = " << device_info.session_id << "}";
1189 } 1208 }
1190 1209
1191 // Check whether we've received all stream types requested. 1210 // Check whether we've received all stream types requested.
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1325 } 1344 }
1326 1345
1327 // Always do enumeration even though some enumeration is in progress, 1346 // Always do enumeration even though some enumeration is in progress,
1328 // because those enumeration commands could be sent before these devices 1347 // because those enumeration commands could be sent before these devices
1329 // change. 1348 // change.
1330 ++active_enumeration_ref_count_[stream_type]; 1349 ++active_enumeration_ref_count_[stream_type];
1331 GetDeviceManager(stream_type)->EnumerateDevices(stream_type); 1350 GetDeviceManager(stream_type)->EnumerateDevices(stream_type);
1332 } 1351 }
1333 1352
1334 } // namespace content 1353 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698