| OLD | NEW |
| 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 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 } | 154 } |
| 155 } | 155 } |
| 156 return output_string; | 156 return output_string; |
| 157 } | 157 } |
| 158 | 158 |
| 159 // Needed for MediaStreamManager::GenerateStream below. | 159 // Needed for MediaStreamManager::GenerateStream below. |
| 160 std::string ReturnEmptySalt() { | 160 std::string ReturnEmptySalt() { |
| 161 return std::string(); | 161 return std::string(); |
| 162 } | 162 } |
| 163 | 163 |
| 164 // Clears the MediaStreamDevice.name from all devices in |devices|. | |
| 165 static void ClearDeviceLabels(content::StreamDeviceInfoArray* devices) { | |
| 166 for (content::StreamDeviceInfoArray::iterator device_itr = devices->begin(); | |
| 167 device_itr != devices->end(); | |
| 168 ++device_itr) { | |
| 169 device_itr->device.name.clear(); | |
| 170 } | |
| 171 } | |
| 172 | |
| 173 } // namespace | 164 } // namespace |
| 174 | 165 |
| 175 | 166 |
| 176 // MediaStreamManager::DeviceRequest represents a request to either enumerate | 167 // MediaStreamManager::DeviceRequest represents a request to either enumerate |
| 177 // available devices or open one or more devices. | 168 // available devices or open one or more devices. |
| 178 // TODO(perkj): MediaStreamManager still needs refactoring. I propose we create | 169 // TODO(perkj): MediaStreamManager still needs refactoring. I propose we create |
| 179 // several subclasses of DeviceRequest and move some of the responsibility of | 170 // several subclasses of DeviceRequest and move some of the responsibility of |
| 180 // the MediaStreamManager to the subclasses to get rid of the way too many if | 171 // the MediaStreamManager to the subclasses to get rid of the way too many if |
| 181 // statements in MediaStreamManager. | 172 // statements in MediaStreamManager. |
| 182 class MediaStreamManager::DeviceRequest { | 173 class MediaStreamManager::DeviceRequest { |
| 183 public: | 174 public: |
| 184 DeviceRequest(MediaStreamRequester* requester, | 175 DeviceRequest(MediaStreamRequester* requester, |
| 185 int requesting_process_id, | 176 int requesting_process_id, |
| 186 int requesting_view_id, | 177 int requesting_view_id, |
| 187 int page_request_id, | 178 int page_request_id, |
| 188 const GURL& security_origin, | 179 const GURL& security_origin, |
| 189 bool have_permission, | |
| 190 bool user_gesture, | 180 bool user_gesture, |
| 191 MediaStreamRequestType request_type, | 181 MediaStreamRequestType request_type, |
| 192 const StreamOptions& options, | 182 const StreamOptions& options, |
| 193 const ResourceContext::SaltCallback& salt_callback) | 183 const ResourceContext::SaltCallback& salt_callback) |
| 194 : requester(requester), | 184 : requester(requester), |
| 195 requesting_process_id(requesting_process_id), | 185 requesting_process_id(requesting_process_id), |
| 196 requesting_view_id(requesting_view_id), | 186 requesting_view_id(requesting_view_id), |
| 197 page_request_id(page_request_id), | 187 page_request_id(page_request_id), |
| 198 security_origin(security_origin), | 188 security_origin(security_origin), |
| 199 have_permission(have_permission), | |
| 200 user_gesture(user_gesture), | 189 user_gesture(user_gesture), |
| 201 request_type(request_type), | 190 request_type(request_type), |
| 202 options(options), | 191 options(options), |
| 203 salt_callback(salt_callback), | 192 salt_callback(salt_callback), |
| 204 state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED), | 193 state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED), |
| 205 audio_type_(MEDIA_NO_SERVICE), | 194 audio_type_(MEDIA_NO_SERVICE), |
| 206 video_type_(MEDIA_NO_SERVICE) { | 195 video_type_(MEDIA_NO_SERVICE) { |
| 207 } | 196 } |
| 208 | 197 |
| 209 ~DeviceRequest() {} | 198 ~DeviceRequest() {} |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 // will receive a handle to the MediaStream. This may be different from | 300 // will receive a handle to the MediaStream. This may be different from |
| 312 // MediaStreamRequest::render_view_id which in the tab capture case | 301 // MediaStreamRequest::render_view_id which in the tab capture case |
| 313 // specifies the target renderer from which audio and video is captured. | 302 // specifies the target renderer from which audio and video is captured. |
| 314 const int requesting_view_id; | 303 const int requesting_view_id; |
| 315 | 304 |
| 316 // An ID the render view provided to identify this request. | 305 // An ID the render view provided to identify this request. |
| 317 const int page_request_id; | 306 const int page_request_id; |
| 318 | 307 |
| 319 const GURL security_origin; | 308 const GURL security_origin; |
| 320 | 309 |
| 321 // This is used when enumerating devices; if we don't have device access | |
| 322 // permission, we remove the device label. | |
| 323 bool have_permission; | |
| 324 | |
| 325 const bool user_gesture; | 310 const bool user_gesture; |
| 326 | 311 |
| 327 const MediaStreamRequestType request_type; | 312 const MediaStreamRequestType request_type; |
| 328 | 313 |
| 329 const StreamOptions options; | 314 const StreamOptions options; |
| 330 | 315 |
| 331 ResourceContext::SaltCallback salt_callback; | 316 ResourceContext::SaltCallback salt_callback; |
| 332 | 317 |
| 333 StreamDeviceInfoArray devices; | 318 StreamDeviceInfoArray devices; |
| 334 | 319 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 const MediaRequestResponseCallback& callback) { | 404 const MediaRequestResponseCallback& callback) { |
| 420 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 405 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 421 | 406 |
| 422 // TODO(perkj): The argument list with NULL parameters to DeviceRequest | 407 // TODO(perkj): The argument list with NULL parameters to DeviceRequest |
| 423 // suggests that this is the wrong design. Can this be refactored? | 408 // suggests that this is the wrong design. Can this be refactored? |
| 424 DeviceRequest* request = new DeviceRequest(NULL, | 409 DeviceRequest* request = new DeviceRequest(NULL, |
| 425 render_process_id, | 410 render_process_id, |
| 426 render_view_id, | 411 render_view_id, |
| 427 page_request_id, | 412 page_request_id, |
| 428 security_origin, | 413 security_origin, |
| 429 true, | |
| 430 false, // user gesture | 414 false, // user gesture |
| 431 MEDIA_DEVICE_ACCESS, | 415 MEDIA_DEVICE_ACCESS, |
| 432 options, | 416 options, |
| 433 base::Bind(&ReturnEmptySalt)); | 417 base::Bind(&ReturnEmptySalt)); |
| 434 | 418 |
| 435 const std::string& label = AddRequest(request); | 419 const std::string& label = AddRequest(request); |
| 436 | 420 |
| 437 request->callback = callback; | 421 request->callback = callback; |
| 438 // Post a task and handle the request asynchronously. The reason is that the | 422 // Post a task and handle the request asynchronously. The reason is that the |
| 439 // requester won't have a label for the request until this function returns | 423 // requester won't have a label for the request until this function returns |
| (...skipping 20 matching lines...) Expand all Loading... |
| 460 if (CommandLine::ForCurrentProcess()->HasSwitch( | 444 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 461 switches::kUseFakeUIForMediaStream)) { | 445 switches::kUseFakeUIForMediaStream)) { |
| 462 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>()); | 446 UseFakeUI(scoped_ptr<FakeMediaStreamUIProxy>()); |
| 463 } | 447 } |
| 464 | 448 |
| 465 DeviceRequest* request = new DeviceRequest(requester, | 449 DeviceRequest* request = new DeviceRequest(requester, |
| 466 render_process_id, | 450 render_process_id, |
| 467 render_view_id, | 451 render_view_id, |
| 468 page_request_id, | 452 page_request_id, |
| 469 security_origin, | 453 security_origin, |
| 470 true, | |
| 471 user_gesture, | 454 user_gesture, |
| 472 MEDIA_GENERATE_STREAM, | 455 MEDIA_GENERATE_STREAM, |
| 473 options, | 456 options, |
| 474 sc); | 457 sc); |
| 475 | 458 |
| 476 const std::string& label = AddRequest(request); | 459 const std::string& label = AddRequest(request); |
| 477 | 460 |
| 478 // Post a task and handle the request asynchronously. The reason is that the | 461 // Post a task and handle the request asynchronously. The reason is that the |
| 479 // requester won't have a label for the request until this function returns | 462 // requester won't have a label for the request until this function returns |
| 480 // and thus can not handle a response. Using base::Unretained is safe since | 463 // and thus can not handle a response. Using base::Unretained is safe since |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 } | 626 } |
| 644 } | 627 } |
| 645 | 628 |
| 646 std::string MediaStreamManager::EnumerateDevices( | 629 std::string MediaStreamManager::EnumerateDevices( |
| 647 MediaStreamRequester* requester, | 630 MediaStreamRequester* requester, |
| 648 int render_process_id, | 631 int render_process_id, |
| 649 int render_view_id, | 632 int render_view_id, |
| 650 const ResourceContext::SaltCallback& sc, | 633 const ResourceContext::SaltCallback& sc, |
| 651 int page_request_id, | 634 int page_request_id, |
| 652 MediaStreamType type, | 635 MediaStreamType type, |
| 653 const GURL& security_origin, | 636 const GURL& security_origin) { |
| 654 bool have_permission) { | |
| 655 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 637 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 656 DCHECK(requester); | 638 DCHECK(requester); |
| 657 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || | 639 DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || |
| 658 type == MEDIA_DEVICE_VIDEO_CAPTURE); | 640 type == MEDIA_DEVICE_VIDEO_CAPTURE); |
| 659 | 641 |
| 660 DeviceRequest* request = new DeviceRequest(requester, | 642 DeviceRequest* request = new DeviceRequest(requester, |
| 661 render_process_id, | 643 render_process_id, |
| 662 render_view_id, | 644 render_view_id, |
| 663 page_request_id, | 645 page_request_id, |
| 664 security_origin, | 646 security_origin, |
| 665 have_permission, | |
| 666 false, // user gesture | 647 false, // user gesture |
| 667 MEDIA_ENUMERATE_DEVICES, | 648 MEDIA_ENUMERATE_DEVICES, |
| 668 StreamOptions(), | 649 StreamOptions(), |
| 669 sc); | 650 sc); |
| 670 if (IsAudioMediaType(type)) | 651 if (IsAudioMediaType(type)) |
| 671 request->SetAudioType(type); | 652 request->SetAudioType(type); |
| 672 else if (IsVideoMediaType(type)) | 653 else if (IsVideoMediaType(type)) |
| 673 request->SetVideoType(type); | 654 request->SetVideoType(type); |
| 674 | 655 |
| 675 const std::string& label = AddRequest(request); | 656 const std::string& label = AddRequest(request); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 692 return; // This can happen if the request has been canceled. | 673 return; // This can happen if the request has been canceled. |
| 693 | 674 |
| 694 MediaStreamType type; | 675 MediaStreamType type; |
| 695 EnumerationCache* cache; | 676 EnumerationCache* cache; |
| 696 if (request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE) { | 677 if (request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE) { |
| 697 DCHECK_EQ(MEDIA_NO_SERVICE, request->video_type()); | 678 DCHECK_EQ(MEDIA_NO_SERVICE, request->video_type()); |
| 698 type = MEDIA_DEVICE_AUDIO_CAPTURE; | 679 type = MEDIA_DEVICE_AUDIO_CAPTURE; |
| 699 cache = &audio_enumeration_cache_; | 680 cache = &audio_enumeration_cache_; |
| 700 } else { | 681 } else { |
| 701 DCHECK_EQ(MEDIA_DEVICE_VIDEO_CAPTURE, request->video_type()); | 682 DCHECK_EQ(MEDIA_DEVICE_VIDEO_CAPTURE, request->video_type()); |
| 702 DCHECK_EQ(MEDIA_NO_SERVICE, request->audio_type()); | |
| 703 type = MEDIA_DEVICE_VIDEO_CAPTURE; | 683 type = MEDIA_DEVICE_VIDEO_CAPTURE; |
| 704 cache = &video_enumeration_cache_; | 684 cache = &video_enumeration_cache_; |
| 705 } | 685 } |
| 706 | 686 |
| 707 if (!EnumerationRequired(cache, type)) { | 687 if (!EnumerationRequired(cache, type)) { |
| 708 // Cached device list of this type exists. Just send it out. | 688 // Cached device list of this type exists. Just send it out. |
| 709 request->SetState(type, MEDIA_REQUEST_STATE_REQUESTED); | 689 request->SetState(type, MEDIA_REQUEST_STATE_REQUESTED); |
| 710 request->devices = cache->devices; | 690 request->devices = cache->devices; |
| 711 FinalizeEnumerateDevices(label, request); | 691 FinalizeEnumerateDevices(label, request); |
| 712 } else { | 692 } else { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 737 options.mandatory_video.push_back( | 717 options.mandatory_video.push_back( |
| 738 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); | 718 StreamOptions::Constraint(kMediaStreamSourceInfoId, device_id)); |
| 739 } else { | 719 } else { |
| 740 NOTREACHED(); | 720 NOTREACHED(); |
| 741 } | 721 } |
| 742 DeviceRequest* request = new DeviceRequest(requester, | 722 DeviceRequest* request = new DeviceRequest(requester, |
| 743 render_process_id, | 723 render_process_id, |
| 744 render_view_id, | 724 render_view_id, |
| 745 page_request_id, | 725 page_request_id, |
| 746 security_origin, | 726 security_origin, |
| 747 true, | |
| 748 false, // user gesture | 727 false, // user gesture |
| 749 MEDIA_OPEN_DEVICE, | 728 MEDIA_OPEN_DEVICE, |
| 750 options, | 729 options, |
| 751 sc); | 730 sc); |
| 752 | 731 |
| 753 const std::string& label = AddRequest(request); | 732 const std::string& label = AddRequest(request); |
| 754 // Post a task and handle the request asynchronously. The reason is that the | 733 // Post a task and handle the request asynchronously. The reason is that the |
| 755 // requester won't have a label for the request until this function returns | 734 // requester won't have a label for the request until this function returns |
| 756 // and thus can not handle a response. Using base::Unretained is safe since | 735 // and thus can not handle a response. Using base::Unretained is safe since |
| 757 // MediaStreamManager is deleted on the UI thread, after the IO thread has | 736 // MediaStreamManager is deleted on the UI thread, after the IO thread has |
| (...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1389 | 1368 |
| 1390 if (request->security_origin.is_valid()) { | 1369 if (request->security_origin.is_valid()) { |
| 1391 for (StreamDeviceInfoArray::iterator it = request->devices.begin(); | 1370 for (StreamDeviceInfoArray::iterator it = request->devices.begin(); |
| 1392 it != request->devices.end(); ++it) { | 1371 it != request->devices.end(); ++it) { |
| 1393 TranslateDeviceIdToSourceId(request, &it->device); | 1372 TranslateDeviceIdToSourceId(request, &it->device); |
| 1394 } | 1373 } |
| 1395 } else { | 1374 } else { |
| 1396 request->devices.clear(); | 1375 request->devices.clear(); |
| 1397 } | 1376 } |
| 1398 | 1377 |
| 1399 if (!request->have_permission) | |
| 1400 ClearDeviceLabels(&request->devices); | |
| 1401 | |
| 1402 request->requester->DevicesEnumerated( | 1378 request->requester->DevicesEnumerated( |
| 1403 request->requesting_view_id, | 1379 request->requesting_view_id, |
| 1404 request->page_request_id, | 1380 request->page_request_id, |
| 1405 label, | 1381 label, |
| 1406 request->devices); | 1382 request->devices); |
| 1407 | 1383 |
| 1408 // TODO(tommi): | 1384 // TODO(tommi): |
| 1409 // Ideally enumeration requests should be deleted once they have been served | 1385 // Ideally enumeration requests should be deleted once they have been served |
| 1410 // (as any request). However, this implementation mixes requests and | 1386 // (as any request). However, this implementation mixes requests and |
| 1411 // notifications together so enumeration requests are kept open by some | 1387 // notifications together so enumeration requests are kept open by some |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1952 if (it->device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) { | 1928 if (it->device.type == MEDIA_DESKTOP_VIDEO_CAPTURE) { |
| 1953 video_capture_manager_->SetDesktopCaptureWindowId(it->session_id, | 1929 video_capture_manager_->SetDesktopCaptureWindowId(it->session_id, |
| 1954 window_id); | 1930 window_id); |
| 1955 break; | 1931 break; |
| 1956 } | 1932 } |
| 1957 } | 1933 } |
| 1958 } | 1934 } |
| 1959 } | 1935 } |
| 1960 | 1936 |
| 1961 } // namespace content | 1937 } // namespace content |
| OLD | NEW |