| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/media/desktop_capture_access_handler.h" | 5 #include "chrome/browser/media/desktop_capture_access_handler.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 8 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 11 #include "build/build_config.h" | 13 #include "build/build_config.h" |
| 12 #include "chrome/browser/media/desktop_streams_registry.h" | 14 #include "chrome/browser/media/desktop_streams_registry.h" |
| 13 #include "chrome/browser/media/media_capture_devices_dispatcher.h" | 15 #include "chrome/browser/media/media_capture_devices_dispatcher.h" |
| 14 #include "chrome/browser/ui/browser.h" | 16 #include "chrome/browser/ui/browser.h" |
| 15 #include "chrome/browser/ui/browser_finder.h" | 17 #include "chrome/browser/ui/browser_finder.h" |
| 16 #include "chrome/browser/ui/browser_window.h" | 18 #include "chrome/browser/ui/browser_window.h" |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 if (application_title == registered_extension_name) { | 115 if (application_title == registered_extension_name) { |
| 114 ui = ScreenCaptureNotificationUI::Create(l10n_util::GetStringFUTF16( | 116 ui = ScreenCaptureNotificationUI::Create(l10n_util::GetStringFUTF16( |
| 115 IDS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_TEXT, application_title)); | 117 IDS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_TEXT, application_title)); |
| 116 } else { | 118 } else { |
| 117 ui = ScreenCaptureNotificationUI::Create(l10n_util::GetStringFUTF16( | 119 ui = ScreenCaptureNotificationUI::Create(l10n_util::GetStringFUTF16( |
| 118 IDS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_TEXT_DELEGATED, | 120 IDS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_TEXT_DELEGATED, |
| 119 registered_extension_name, application_title)); | 121 registered_extension_name, application_title)); |
| 120 } | 122 } |
| 121 } | 123 } |
| 122 | 124 |
| 123 return ui.Pass(); | 125 return ui; |
| 124 } | 126 } |
| 125 | 127 |
| 126 #if !defined(OS_ANDROID) | 128 #if !defined(OS_ANDROID) |
| 127 // Find browser or app window from a given |web_contents|. | 129 // Find browser or app window from a given |web_contents|. |
| 128 gfx::NativeWindow FindParentWindowForWebContents( | 130 gfx::NativeWindow FindParentWindowForWebContents( |
| 129 content::WebContents* web_contents) { | 131 content::WebContents* web_contents) { |
| 130 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); | 132 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); |
| 131 if (browser && browser->window()) | 133 if (browser && browser->window()) |
| 132 return browser->window()->GetNativeWindow(); | 134 return browser->window()->GetNativeWindow(); |
| 133 | 135 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 application_title); | 262 application_title); |
| 261 DCHECK(!devices.empty()); | 263 DCHECK(!devices.empty()); |
| 262 } | 264 } |
| 263 | 265 |
| 264 // The only case when devices can be empty is if the user has denied | 266 // The only case when devices can be empty is if the user has denied |
| 265 // permission. | 267 // permission. |
| 266 result = devices.empty() ? content::MEDIA_DEVICE_PERMISSION_DENIED | 268 result = devices.empty() ? content::MEDIA_DEVICE_PERMISSION_DENIED |
| 267 : content::MEDIA_DEVICE_OK; | 269 : content::MEDIA_DEVICE_OK; |
| 268 } | 270 } |
| 269 | 271 |
| 270 callback.Run(devices, result, ui.Pass()); | 272 callback.Run(devices, result, std::move(ui)); |
| 271 } | 273 } |
| 272 | 274 |
| 273 bool DesktopCaptureAccessHandler::SupportsStreamType( | 275 bool DesktopCaptureAccessHandler::SupportsStreamType( |
| 274 const content::MediaStreamType type, | 276 const content::MediaStreamType type, |
| 275 const extensions::Extension* extension) { | 277 const extensions::Extension* extension) { |
| 276 return type == content::MEDIA_DESKTOP_VIDEO_CAPTURE || | 278 return type == content::MEDIA_DESKTOP_VIDEO_CAPTURE || |
| 277 type == content::MEDIA_DESKTOP_AUDIO_CAPTURE; | 279 type == content::MEDIA_DESKTOP_AUDIO_CAPTURE; |
| 278 } | 280 } |
| 279 | 281 |
| 280 bool DesktopCaptureAccessHandler::CheckMediaAccessPermission( | 282 bool DesktopCaptureAccessHandler::CheckMediaAccessPermission( |
| 281 content::WebContents* web_contents, | 283 content::WebContents* web_contents, |
| 282 const GURL& security_origin, | 284 const GURL& security_origin, |
| 283 content::MediaStreamType type, | 285 content::MediaStreamType type, |
| 284 const extensions::Extension* extension) { | 286 const extensions::Extension* extension) { |
| 285 return false; | 287 return false; |
| 286 } | 288 } |
| 287 | 289 |
| 288 void DesktopCaptureAccessHandler::HandleRequest( | 290 void DesktopCaptureAccessHandler::HandleRequest( |
| 289 content::WebContents* web_contents, | 291 content::WebContents* web_contents, |
| 290 const content::MediaStreamRequest& request, | 292 const content::MediaStreamRequest& request, |
| 291 const content::MediaResponseCallback& callback, | 293 const content::MediaResponseCallback& callback, |
| 292 const extensions::Extension* extension) { | 294 const extensions::Extension* extension) { |
| 293 content::MediaStreamDevices devices; | 295 content::MediaStreamDevices devices; |
| 294 scoped_ptr<content::MediaStreamUI> ui; | 296 scoped_ptr<content::MediaStreamUI> ui; |
| 295 | 297 |
| 296 if (request.video_type != content::MEDIA_DESKTOP_VIDEO_CAPTURE) { | 298 if (request.video_type != content::MEDIA_DESKTOP_VIDEO_CAPTURE) { |
| 297 callback.Run(devices, content::MEDIA_DEVICE_INVALID_STATE, ui.Pass()); | 299 callback.Run(devices, content::MEDIA_DEVICE_INVALID_STATE, std::move(ui)); |
| 298 return; | 300 return; |
| 299 } | 301 } |
| 300 | 302 |
| 301 // If the device id wasn't specified then this is a screen capture request | 303 // If the device id wasn't specified then this is a screen capture request |
| 302 // (i.e. chooseDesktopMedia() API wasn't used to generate device id). | 304 // (i.e. chooseDesktopMedia() API wasn't used to generate device id). |
| 303 if (request.requested_video_device_id.empty()) { | 305 if (request.requested_video_device_id.empty()) { |
| 304 ProcessScreenCaptureAccessRequest(web_contents, request, callback, | 306 ProcessScreenCaptureAccessRequest(web_contents, request, callback, |
| 305 extension); | 307 extension); |
| 306 return; | 308 return; |
| 307 } | 309 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 324 ->GetDesktopStreamsRegistry() | 326 ->GetDesktopStreamsRegistry() |
| 325 ->RequestMediaForStreamId(request.requested_video_device_id, | 327 ->RequestMediaForStreamId(request.requested_video_device_id, |
| 326 main_frame->GetProcess()->GetID(), | 328 main_frame->GetProcess()->GetID(), |
| 327 main_frame->GetRoutingID(), | 329 main_frame->GetRoutingID(), |
| 328 request.security_origin, | 330 request.security_origin, |
| 329 &original_extension_name); | 331 &original_extension_name); |
| 330 } | 332 } |
| 331 | 333 |
| 332 // Received invalid device id. | 334 // Received invalid device id. |
| 333 if (media_id.type == content::DesktopMediaID::TYPE_NONE) { | 335 if (media_id.type == content::DesktopMediaID::TYPE_NONE) { |
| 334 callback.Run(devices, content::MEDIA_DEVICE_INVALID_STATE, ui.Pass()); | 336 callback.Run(devices, content::MEDIA_DEVICE_INVALID_STATE, std::move(ui)); |
| 335 return; | 337 return; |
| 336 } | 338 } |
| 337 | 339 |
| 338 bool loopback_audio_supported = false; | 340 bool loopback_audio_supported = false; |
| 339 #if defined(USE_CRAS) || defined(OS_WIN) | 341 #if defined(USE_CRAS) || defined(OS_WIN) |
| 340 // Currently loopback audio capture is supported only on Windows and ChromeOS. | 342 // Currently loopback audio capture is supported only on Windows and ChromeOS. |
| 341 loopback_audio_supported = true; | 343 loopback_audio_supported = true; |
| 342 #endif | 344 #endif |
| 343 | 345 |
| 344 // Audio is only supported for screen capture streams. | 346 // Audio is only supported for screen capture streams. |
| 345 bool capture_audio = | 347 bool capture_audio = |
| 346 (media_id.type == content::DesktopMediaID::TYPE_SCREEN && | 348 (media_id.type == content::DesktopMediaID::TYPE_SCREEN && |
| 347 request.audio_type == content::MEDIA_DESKTOP_AUDIO_CAPTURE && | 349 request.audio_type == content::MEDIA_DESKTOP_AUDIO_CAPTURE && |
| 348 loopback_audio_supported); | 350 loopback_audio_supported); |
| 349 | 351 |
| 350 ui = GetDevicesForDesktopCapture(&devices, media_id, capture_audio, true, | 352 ui = GetDevicesForDesktopCapture(&devices, media_id, capture_audio, true, |
| 351 GetApplicationTitle(web_contents, extension), | 353 GetApplicationTitle(web_contents, extension), |
| 352 base::UTF8ToUTF16(original_extension_name)); | 354 base::UTF8ToUTF16(original_extension_name)); |
| 353 | 355 |
| 354 callback.Run(devices, content::MEDIA_DEVICE_OK, ui.Pass()); | 356 callback.Run(devices, content::MEDIA_DEVICE_OK, std::move(ui)); |
| 355 } | 357 } |
| 356 | 358 |
| 357 void DesktopCaptureAccessHandler::UpdateMediaRequestState( | 359 void DesktopCaptureAccessHandler::UpdateMediaRequestState( |
| 358 int render_process_id, | 360 int render_process_id, |
| 359 int render_frame_id, | 361 int render_frame_id, |
| 360 int page_request_id, | 362 int page_request_id, |
| 361 content::MediaStreamType stream_type, | 363 content::MediaStreamType stream_type, |
| 362 content::MediaRequestState state) { | 364 content::MediaRequestState state) { |
| 363 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 365 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 364 // Track desktop capture sessions. Tracking is necessary to avoid unbalanced | 366 // Track desktop capture sessions. Tracking is necessary to avoid unbalanced |
| (...skipping 16 matching lines...) Expand all Loading... |
| 381 desktop_capture_sessions_.erase(it); | 383 desktop_capture_sessions_.erase(it); |
| 382 break; | 384 break; |
| 383 } | 385 } |
| 384 } | 386 } |
| 385 } | 387 } |
| 386 } | 388 } |
| 387 | 389 |
| 388 bool DesktopCaptureAccessHandler::IsCaptureInProgress() { | 390 bool DesktopCaptureAccessHandler::IsCaptureInProgress() { |
| 389 return desktop_capture_sessions_.size() > 0; | 391 return desktop_capture_sessions_.size() > 0; |
| 390 } | 392 } |
| OLD | NEW |