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 "chrome/browser/media/media_stream_devices_controller.h" | 5 #include "chrome/browser/media/media_stream_devices_controller.h" |
6 | 6 |
7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
8 #include "base/prefs/scoped_user_pref_update.h" | 8 #include "base/prefs/scoped_user_pref_update.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
11 #include "chrome/browser/content_settings/tab_specific_content_settings.h" | 11 #include "chrome/browser/content_settings/tab_specific_content_settings.h" |
12 #include "chrome/browser/media/media_capture_devices_dispatcher.h" | 12 #include "chrome/browser/media/media_capture_devices_dispatcher.h" |
13 #include "chrome/browser/media/media_stream_capture_indicator.h" | 13 #include "chrome/browser/media/media_stream_capture_indicator.h" |
14 #include "chrome/browser/media/media_stream_device_permissions.h" | 14 #include "chrome/browser/media/media_stream_device_permissions.h" |
15 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
16 #include "chrome/browser/ui/browser.h" | 16 #include "chrome/browser/ui/browser.h" |
17 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
18 #include "chrome/common/pref_names.h" | 18 #include "chrome/common/pref_names.h" |
19 #include "chrome/grit/generated_resources.h" | 19 #include "chrome/grit/generated_resources.h" |
20 #include "components/content_settings/core/browser/host_content_settings_map.h" | 20 #include "components/content_settings/core/browser/host_content_settings_map.h" |
21 #include "components/content_settings/core/common/content_settings.h" | 21 #include "components/content_settings/core/common/content_settings.h" |
22 #include "components/content_settings/core/common/content_settings_pattern.h" | 22 #include "components/content_settings/core/common/content_settings_pattern.h" |
23 #include "components/pref_registry/pref_registry_syncable.h" | 23 #include "components/pref_registry/pref_registry_syncable.h" |
24 #include "content/public/browser/browser_thread.h" | 24 #include "content/public/browser/browser_thread.h" |
25 #include "content/public/browser/render_widget_host_view.h" | 25 #include "content/public/browser/render_widget_host_view.h" |
26 #include "content/public/common/media_stream_request.h" | 26 #include "content/public/common/media_stream_request.h" |
| 27 #include "content/public/common/origin_util.h" |
27 #include "extensions/common/constants.h" | 28 #include "extensions/common/constants.h" |
28 #include "grit/theme_resources.h" | 29 #include "grit/theme_resources.h" |
29 #include "ui/base/l10n/l10n_util.h" | 30 #include "ui/base/l10n/l10n_util.h" |
30 | 31 |
31 using content::BrowserThread; | 32 using content::BrowserThread; |
32 | 33 |
33 namespace { | 34 namespace { |
34 | 35 |
35 bool HasAvailableDevicesForRequest(const content::MediaStreamRequest& request) { | 36 bool HasAvailableDevicesForRequest(const content::MediaStreamRequest& request) { |
36 const content::MediaStreamDevices* audio_devices = | 37 const content::MediaStreamDevices* audio_devices = |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 // Do nothing. | 370 // Do nothing. |
370 NOTREACHED(); | 371 NOTREACHED(); |
371 break; | 372 break; |
372 } | 373 } |
373 } // switch | 374 } // switch |
374 | 375 |
375 // TODO(raymes): We currently set the content permission for non-https | 376 // TODO(raymes): We currently set the content permission for non-https |
376 // websites for Pepper requests as well. This is temporary and should be | 377 // websites for Pepper requests as well. This is temporary and should be |
377 // removed. | 378 // removed. |
378 if (update_content_setting) { | 379 if (update_content_setting) { |
379 if ((IsSchemeSecure() && !devices.empty()) || | 380 if ((IsOriginSecure(request_.security_origin) && !devices.empty()) || |
380 request_.request_type == content::MEDIA_OPEN_DEVICE) { | 381 request_.request_type == content::MEDIA_OPEN_DEVICE) { |
381 StorePermission(true); | 382 StorePermission(true); |
382 } | 383 } |
383 } | 384 } |
384 | 385 |
385 if (audio_allowed) { | 386 if (audio_allowed) { |
386 profile_->GetHostContentSettingsMap()->UpdateLastUsageByPattern( | 387 profile_->GetHostContentSettingsMap()->UpdateLastUsageByPattern( |
387 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin), | 388 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin), |
388 ContentSettingsPattern::Wildcard(), | 389 ContentSettingsPattern::Wildcard(), |
389 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); | 390 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 bool MediaStreamDevicesController::HasUserGesture() const { | 459 bool MediaStreamDevicesController::HasUserGesture() const { |
459 return request_.user_gesture; | 460 return request_.user_gesture; |
460 } | 461 } |
461 | 462 |
462 GURL MediaStreamDevicesController::GetRequestingHostname() const { | 463 GURL MediaStreamDevicesController::GetRequestingHostname() const { |
463 return request_.security_origin; | 464 return request_.security_origin; |
464 } | 465 } |
465 | 466 |
466 void MediaStreamDevicesController::PermissionGranted() { | 467 void MediaStreamDevicesController::PermissionGranted() { |
467 GURL origin(GetSecurityOriginSpec()); | 468 GURL origin(GetSecurityOriginSpec()); |
468 if (origin.SchemeIsSecure()) { | 469 if (IsOriginSecure(origin)) { |
469 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", | 470 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", |
470 kAllowHttps, kPermissionActionsMax); | 471 kAllowHttps, kPermissionActionsMax); |
471 } else { | 472 } else { |
472 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", | 473 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", |
473 kAllowHttp, kPermissionActionsMax); | 474 kAllowHttp, kPermissionActionsMax); |
474 } | 475 } |
475 Accept(true); | 476 Accept(true); |
476 } | 477 } |
477 | 478 |
478 void MediaStreamDevicesController::PermissionDenied() { | 479 void MediaStreamDevicesController::PermissionDenied() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 request_.security_origin, | 525 request_.security_origin, |
525 device_checks[i].policy_name, | 526 device_checks[i].policy_name, |
526 device_checks[i].list_policy_name); | 527 device_checks[i].list_policy_name); |
527 | 528 |
528 if (policy == ALWAYS_DENY) | 529 if (policy == ALWAYS_DENY) |
529 return false; | 530 return false; |
530 | 531 |
531 if (policy == POLICY_NOT_SET) { | 532 if (policy == POLICY_NOT_SET) { |
532 // Only load content settings from secure origins unless it is a | 533 // Only load content settings from secure origins unless it is a |
533 // content::MEDIA_OPEN_DEVICE (Pepper) request. | 534 // content::MEDIA_OPEN_DEVICE (Pepper) request. |
534 if (!IsSchemeSecure() && | 535 if (!IsOriginSecure(request_.security_origin) && |
535 request_.request_type != content::MEDIA_OPEN_DEVICE) { | 536 request_.request_type != content::MEDIA_OPEN_DEVICE) { |
536 return false; | 537 return false; |
537 } | 538 } |
538 if (profile_->GetHostContentSettingsMap()->GetContentSetting( | 539 if (profile_->GetHostContentSettingsMap()->GetContentSetting( |
539 request_.security_origin, | 540 request_.security_origin, |
540 request_.security_origin, | 541 request_.security_origin, |
541 device_checks[i].settings_type, | 542 device_checks[i].settings_type, |
542 content_settings::ResourceIdentifier()) != | 543 content_settings::ResourceIdentifier()) != |
543 CONTENT_SETTING_ALLOW) { | 544 CONTENT_SETTING_ALLOW) { |
544 return false; | 545 return false; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 bool MediaStreamDevicesController::IsDefaultMediaAccessBlocked() const { | 589 bool MediaStreamDevicesController::IsDefaultMediaAccessBlocked() const { |
589 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 590 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
590 return (profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( | 591 return (profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( |
591 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, NULL) | 592 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, NULL) |
592 == CONTENT_SETTING_BLOCK && | 593 == CONTENT_SETTING_BLOCK && |
593 profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( | 594 profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( |
594 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, NULL) | 595 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, NULL) |
595 == CONTENT_SETTING_BLOCK); | 596 == CONTENT_SETTING_BLOCK); |
596 } | 597 } |
597 | 598 |
598 bool MediaStreamDevicesController::IsSchemeSecure() const { | |
599 return request_.security_origin.SchemeIsSecure() || | |
600 request_.security_origin.SchemeIs(extensions::kExtensionScheme); | |
601 } | |
602 | |
603 void MediaStreamDevicesController::StorePermission(bool allowed) const { | 599 void MediaStreamDevicesController::StorePermission(bool allowed) const { |
604 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 600 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
605 ContentSettingsPattern primary_pattern = | 601 ContentSettingsPattern primary_pattern = |
606 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin); | 602 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin); |
607 // Check the pattern is valid or not. When the request is from a file access, | 603 // Check the pattern is valid or not. When the request is from a file access, |
608 // no exception will be made. | 604 // no exception will be made. |
609 if (!primary_pattern.IsValid()) | 605 if (!primary_pattern.IsValid()) |
610 return; | 606 return; |
611 | 607 |
612 ContentSetting content_setting = allowed ? | 608 ContentSetting content_setting = allowed ? |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 } | 673 } |
678 | 674 |
679 bool MediaStreamDevicesController::IsCaptureDeviceRequestAllowed() const { | 675 bool MediaStreamDevicesController::IsCaptureDeviceRequestAllowed() const { |
680 #if defined(OS_ANDROID) | 676 #if defined(OS_ANDROID) |
681 // Don't approve device requests if the tab was hidden. | 677 // Don't approve device requests if the tab was hidden. |
682 // TODO(qinmin): Add a test for this. http://crbug.com/396869. | 678 // TODO(qinmin): Add a test for this. http://crbug.com/396869. |
683 return web_contents_->GetRenderWidgetHostView()->IsShowing(); | 679 return web_contents_->GetRenderWidgetHostView()->IsShowing(); |
684 #endif | 680 #endif |
685 return true; | 681 return true; |
686 } | 682 } |
OLD | NEW |