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

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

Issue 180633008: Add different error codes for getUserMedia. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed comments Created 6 years, 9 months 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 &mandatory)) { 81 &mandatory)) {
82 DCHECK(mandatory); 82 DCHECK(mandatory);
83 // This is tab or screen capture. 83 // This is tab or screen capture.
84 if (audio_stream_source == kMediaStreamSourceTab) { 84 if (audio_stream_source == kMediaStreamSourceTab) {
85 *audio_type = content::MEDIA_TAB_AUDIO_CAPTURE; 85 *audio_type = content::MEDIA_TAB_AUDIO_CAPTURE;
86 } else if (audio_stream_source == kMediaStreamSourceSystem) { 86 } else if (audio_stream_source == kMediaStreamSourceSystem) {
87 *audio_type = content::MEDIA_LOOPBACK_AUDIO_CAPTURE; 87 *audio_type = content::MEDIA_LOOPBACK_AUDIO_CAPTURE;
88 } 88 }
89 } else { 89 } else {
90 // This is normal audio device capture. 90 // This is normal audio device capture.
91 *audio_type = content::MEDIA_DEVICE_AUDIO_CAPTURE; 91 *audio_type = MEDIA_DEVICE_AUDIO_CAPTURE;
92 } 92 }
93 } 93 }
94 if (options.video_requested) { 94 if (options.video_requested) {
95 std::string video_stream_source; 95 std::string video_stream_source;
96 bool mandatory = false; 96 bool mandatory = false;
97 if (options.GetFirstVideoConstraintByName(kMediaStreamSource, 97 if (options.GetFirstVideoConstraintByName(kMediaStreamSource,
98 &video_stream_source, 98 &video_stream_source,
99 &mandatory)) { 99 &mandatory)) {
100 DCHECK(mandatory); 100 DCHECK(mandatory);
101 // This is tab or screen capture. 101 // This is tab or screen capture.
102 if (video_stream_source == kMediaStreamSourceTab) { 102 if (video_stream_source == kMediaStreamSourceTab) {
103 *video_type = content::MEDIA_TAB_VIDEO_CAPTURE; 103 *video_type = content::MEDIA_TAB_VIDEO_CAPTURE;
104 } else if (video_stream_source == kMediaStreamSourceScreen) { 104 } else if (video_stream_source == kMediaStreamSourceScreen) {
105 *video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE; 105 *video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE;
106 } else if (video_stream_source == kMediaStreamSourceDesktop) { 106 } else if (video_stream_source == kMediaStreamSourceDesktop) {
107 *video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE; 107 *video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE;
108 } 108 }
109 } else { 109 } else {
110 // This is normal video device capture. 110 // This is normal video device capture.
111 *video_type = content::MEDIA_DEVICE_VIDEO_CAPTURE; 111 *video_type = MEDIA_DEVICE_VIDEO_CAPTURE;
112 } 112 }
113 } 113 }
114 } 114 }
115 115
116 // Private helper method for SendMessageToNativeLog() that obtains the global 116 // Private helper method for SendMessageToNativeLog() that obtains the global
117 // MediaStreamManager instance on the UI thread before sending |message| to the 117 // MediaStreamManager instance on the UI thread before sending |message| to the
118 // webrtcLoggingPrivate API. 118 // webrtcLoggingPrivate API.
119 void DoAddLogMessage(const std::string& message) { 119 void DoAddLogMessage(const std::string& message) {
120 // Must be on the UI thread to access BrowserMainLoop. 120 // Must be on the UI thread to access BrowserMainLoop.
121 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 121 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
(...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1045 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1046 DeviceRequest* request = FindRequest(label); 1046 DeviceRequest* request = FindRequest(label);
1047 if (!request) { 1047 if (!request) {
1048 DVLOG(1) << "SetupRequest label " << label << " doesn't exist!!"; 1048 DVLOG(1) << "SetupRequest label " << label << " doesn't exist!!";
1049 return; // This can happen if the request has been canceled. 1049 return; // This can happen if the request has been canceled.
1050 } 1050 }
1051 1051
1052 if (!request->security_origin.is_valid()) { 1052 if (!request->security_origin.is_valid()) {
1053 LOG(ERROR) << "Invalid security origin. " 1053 LOG(ERROR) << "Invalid security origin. "
1054 << request->security_origin; 1054 << request->security_origin;
1055 FinalizeRequestFailed(label, request); 1055 FinalizeRequestFailed(label,
1056 request,
1057 MEDIA_DEVICE_INVALID_SECURITY_ORIGIN);
1056 return; 1058 return;
1057 } 1059 }
1058 1060
1059 MediaStreamType audio_type = MEDIA_NO_SERVICE; 1061 MediaStreamType audio_type = MEDIA_NO_SERVICE;
1060 MediaStreamType video_type = MEDIA_NO_SERVICE; 1062 MediaStreamType video_type = MEDIA_NO_SERVICE;
1061 ParseStreamType(request->options, &audio_type, &video_type); 1063 ParseStreamType(request->options, &audio_type, &video_type);
1062 request->SetAudioType(audio_type); 1064 request->SetAudioType(audio_type);
1063 request->SetVideoType(video_type); 1065 request->SetVideoType(video_type);
1064 1066
1065 bool is_web_contents_capture = 1067 bool is_web_contents_capture =
1066 audio_type == MEDIA_TAB_AUDIO_CAPTURE || 1068 audio_type == MEDIA_TAB_AUDIO_CAPTURE ||
1067 video_type == MEDIA_TAB_VIDEO_CAPTURE; 1069 video_type == MEDIA_TAB_VIDEO_CAPTURE;
1068 if (is_web_contents_capture && !SetupTabCaptureRequest(request)) { 1070 if (is_web_contents_capture && !SetupTabCaptureRequest(request)) {
1069 FinalizeRequestFailed(label, request); 1071 FinalizeRequestFailed(label,
1072 request,
1073 MEDIA_DEVICE_TAB_CAPTURE_FAILURE);
1070 return; 1074 return;
1071 } 1075 }
1072 1076
1073 bool is_screen_capture = 1077 bool is_screen_capture =
1074 video_type == MEDIA_DESKTOP_VIDEO_CAPTURE; 1078 video_type == MEDIA_DESKTOP_VIDEO_CAPTURE;
1075 if (is_screen_capture && !SetupScreenCaptureRequest(request)) { 1079 if (is_screen_capture && !SetupScreenCaptureRequest(request)) {
1076 FinalizeRequestFailed(label, request); 1080 FinalizeRequestFailed(label,
1081 request,
1082 MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE);
1077 return; 1083 return;
1078 } 1084 }
1079 1085
1080 if (!is_web_contents_capture && !is_screen_capture) { 1086 if (!is_web_contents_capture && !is_screen_capture) {
1081 if (EnumerationRequired(&audio_enumeration_cache_, audio_type) || 1087 if (EnumerationRequired(&audio_enumeration_cache_, audio_type) ||
1082 EnumerationRequired(&video_enumeration_cache_, video_type)) { 1088 EnumerationRequired(&video_enumeration_cache_, video_type)) {
1083 // Enumerate the devices if there is no valid device lists to be used. 1089 // Enumerate the devices if there is no valid device lists to be used.
1084 StartEnumeration(request); 1090 StartEnumeration(request);
1085 return; 1091 return;
1086 } else { 1092 } else {
1087 // Cache is valid, so log the cached devices for MediaStream requests. 1093 // Cache is valid, so log the cached devices for MediaStream requests.
1088 if (request->request_type == MEDIA_GENERATE_STREAM) { 1094 if (request->request_type == MEDIA_GENERATE_STREAM) {
1089 std::string log_message("Using cached devices for request.\n"); 1095 std::string log_message("Using cached devices for request.\n");
1090 if (audio_type != MEDIA_NO_SERVICE) { 1096 if (audio_type != MEDIA_NO_SERVICE) {
1091 log_message += 1097 log_message +=
1092 GetLogMessageString(audio_type, audio_enumeration_cache_.devices); 1098 GetLogMessageString(audio_type, audio_enumeration_cache_.devices);
1093 } 1099 }
1094 if (video_type != MEDIA_NO_SERVICE) { 1100 if (video_type != MEDIA_NO_SERVICE) {
1095 log_message += 1101 log_message +=
1096 GetLogMessageString(video_type, video_enumeration_cache_.devices); 1102 GetLogMessageString(video_type, video_enumeration_cache_.devices);
1097 } 1103 }
1098 SendMessageToNativeLog(log_message); 1104 SendMessageToNativeLog(log_message);
1099 } 1105 }
1100 } 1106 }
1101 1107
1102 if (!SetupDeviceCaptureRequest(request)) { 1108 if (!SetupDeviceCaptureRequest(request)) {
1103 FinalizeRequestFailed(label, request); 1109 FinalizeRequestFailed(label, request, MEDIA_DEVICE_CAPTURE_FAILURE);
1104 return; 1110 return;
1105 } 1111 }
1106 } 1112 }
1107 PostRequestToUI(label, request); 1113 PostRequestToUI(label, request);
1108 } 1114 }
1109 1115
1110 bool MediaStreamManager::SetupDeviceCaptureRequest(DeviceRequest* request) { 1116 bool MediaStreamManager::SetupDeviceCaptureRequest(DeviceRequest* request) {
1111 DCHECK((request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE || 1117 DCHECK((request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE ||
1112 request->audio_type() == MEDIA_NO_SERVICE) && 1118 request->audio_type() == MEDIA_NO_SERVICE) &&
1113 (request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE || 1119 (request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE ||
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 } 1294 }
1289 1295
1290 request->requester->StreamGenerated( 1296 request->requester->StreamGenerated(
1291 request->requesting_view_id, 1297 request->requesting_view_id,
1292 request->page_request_id, 1298 request->page_request_id,
1293 label, audio_devices, video_devices); 1299 label, audio_devices, video_devices);
1294 } 1300 }
1295 1301
1296 void MediaStreamManager::FinalizeRequestFailed( 1302 void MediaStreamManager::FinalizeRequestFailed(
1297 const std::string& label, 1303 const std::string& label,
1298 DeviceRequest* request) { 1304 DeviceRequest* request,
1305 content::MediaStreamRequestResult result) {
1299 if (request->requester) 1306 if (request->requester)
1300 request->requester->StreamGenerationFailed( 1307 request->requester->StreamGenerationFailed(
1301 request->requesting_view_id, 1308 request->requesting_view_id,
1302 request->page_request_id); 1309 request->page_request_id,
1310 result);
1303 1311
1304 if (request->request_type == MEDIA_DEVICE_ACCESS && 1312 if (request->request_type == MEDIA_DEVICE_ACCESS &&
1305 !request->callback.is_null()) { 1313 !request->callback.is_null()) {
1306 request->callback.Run(MediaStreamDevices(), request->ui_proxy.Pass()); 1314 request->callback.Run(MediaStreamDevices(), request->ui_proxy.Pass());
1307 } 1315 }
1308 1316
1309 DeleteRequest(label); 1317 DeleteRequest(label);
1310 } 1318 }
1311 1319
1312 void MediaStreamManager::FinalizeOpenDevice(const std::string& label, 1320 void MediaStreamManager::FinalizeOpenDevice(const std::string& label,
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1538 default: 1546 default:
1539 if (request->state(request->audio_type()) == 1547 if (request->state(request->audio_type()) ==
1540 MEDIA_REQUEST_STATE_REQUESTED || 1548 MEDIA_REQUEST_STATE_REQUESTED ||
1541 request->state(request->video_type()) == 1549 request->state(request->video_type()) ==
1542 MEDIA_REQUEST_STATE_REQUESTED) { 1550 MEDIA_REQUEST_STATE_REQUESTED) {
1543 // We are doing enumeration for other type of media, wait until it is 1551 // We are doing enumeration for other type of media, wait until it is
1544 // all done before posting the request to UI because UI needs 1552 // all done before posting the request to UI because UI needs
1545 // the device lists to handle the request. 1553 // the device lists to handle the request.
1546 break; 1554 break;
1547 } 1555 }
1548 if (!SetupDeviceCaptureRequest(request)) 1556 if (!SetupDeviceCaptureRequest(request)) {
1549 FinalizeRequestFailed(*it, request); 1557 FinalizeRequestFailed(*it,
1550 else 1558 request,
1559 MEDIA_DEVICE_CAPTURE_FAILURE);
1560 } else {
1551 PostRequestToUI(*it, request); 1561 PostRequestToUI(*it, request);
1562 }
1552 break; 1563 break;
1553 } 1564 }
1554 } 1565 }
1555 label_list.clear(); 1566 label_list.clear();
1556 --active_enumeration_ref_count_[stream_type]; 1567 --active_enumeration_ref_count_[stream_type];
1557 DCHECK_GE(active_enumeration_ref_count_[stream_type], 0); 1568 DCHECK_GE(active_enumeration_ref_count_[stream_type], 0);
1558 } 1569 }
1559 1570
1560 // static 1571 // static
1561 void MediaStreamManager::SendMessageToNativeLog(const std::string& message) { 1572 void MediaStreamManager::SendMessageToNativeLog(const std::string& message) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1605 static_cast<content::RenderProcessHostImpl*>( 1616 static_cast<content::RenderProcessHostImpl*>(
1606 content::RenderProcessHost::FromID(*it)); 1617 content::RenderProcessHost::FromID(*it));
1607 if (render_process_host_impl) 1618 if (render_process_host_impl)
1608 render_process_host_impl->WebRtcLogMessage(message); 1619 render_process_host_impl->WebRtcLogMessage(message);
1609 } 1620 }
1610 #endif 1621 #endif
1611 } 1622 }
1612 1623
1613 void MediaStreamManager::HandleAccessRequestResponse( 1624 void MediaStreamManager::HandleAccessRequestResponse(
1614 const std::string& label, 1625 const std::string& label,
1615 const MediaStreamDevices& devices) { 1626 const MediaStreamDevices& devices,
1627 content::MediaStreamRequestResult result) {
1616 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1628 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1617 DVLOG(1) << "HandleAccessRequestResponse(" 1629 DVLOG(1) << "HandleAccessRequestResponse("
1618 << ", {label = " << label << "})"; 1630 << ", {label = " << label << "})";
1619 1631
1620 DeviceRequest* request = FindRequest(label); 1632 DeviceRequest* request = FindRequest(label);
1621 if (!request) { 1633 if (!request) {
1622 // The request has been canceled before the UI returned. 1634 // The request has been canceled before the UI returned.
1623 return; 1635 return;
1624 } 1636 }
1625 1637
1626 if (request->request_type == MEDIA_DEVICE_ACCESS) { 1638 if (request->request_type == MEDIA_DEVICE_ACCESS) {
1627 FinalizeMediaAccessRequest(label, request, devices); 1639 FinalizeMediaAccessRequest(label, request, devices);
1628 return; 1640 return;
1629 } 1641 }
1630 1642
1631 // Handle the case when the request was denied. 1643 // Handle the case when the request was denied.
1632 if (devices.empty()) { 1644 if (result != MEDIA_DEVICE_OK) {
1633 FinalizeRequestFailed(label, request); 1645 FinalizeRequestFailed(label, request, result);
1634 return; 1646 return;
1635 } 1647 }
1636 1648
1637 // Process all newly-accepted devices for this request. 1649 // Process all newly-accepted devices for this request.
1638 bool found_audio = false; 1650 bool found_audio = false;
1639 bool found_video = false; 1651 bool found_video = false;
1640 for (MediaStreamDevices::const_iterator device_it = devices.begin(); 1652 for (MediaStreamDevices::const_iterator device_it = devices.begin();
1641 device_it != devices.end(); ++device_it) { 1653 device_it != devices.end(); ++device_it) {
1642 StreamDeviceInfo device_info; 1654 StreamDeviceInfo device_info;
1643 device_info.device = *device_it; 1655 device_info.device = *device_it;
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
1838 } 1850 }
1839 1851
1840 // Always do enumeration even though some enumeration is in progress, 1852 // Always do enumeration even though some enumeration is in progress,
1841 // because those enumeration commands could be sent before these devices 1853 // because those enumeration commands could be sent before these devices
1842 // change. 1854 // change.
1843 ++active_enumeration_ref_count_[stream_type]; 1855 ++active_enumeration_ref_count_[stream_type];
1844 GetDeviceManager(stream_type)->EnumerateDevices(stream_type); 1856 GetDeviceManager(stream_type)->EnumerateDevices(stream_type);
1845 } 1857 }
1846 1858
1847 } // namespace content 1859 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698