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/origin_util.h" |
18 #include "chrome/common/pref_names.h" | 19 #include "chrome/common/pref_names.h" |
19 #include "chrome/grit/generated_resources.h" | 20 #include "chrome/grit/generated_resources.h" |
20 #include "components/content_settings/core/browser/host_content_settings_map.h" | 21 #include "components/content_settings/core/browser/host_content_settings_map.h" |
21 #include "components/content_settings/core/common/content_settings.h" | 22 #include "components/content_settings/core/common/content_settings.h" |
22 #include "components/content_settings/core/common/content_settings_pattern.h" | 23 #include "components/content_settings/core/common/content_settings_pattern.h" |
23 #include "components/pref_registry/pref_registry_syncable.h" | 24 #include "components/pref_registry/pref_registry_syncable.h" |
24 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
25 #include "content/public/browser/render_widget_host_view.h" | 26 #include "content/public/browser/render_widget_host_view.h" |
26 #include "content/public/common/media_stream_request.h" | 27 #include "content/public/common/media_stream_request.h" |
27 #include "extensions/common/constants.h" | 28 #include "extensions/common/constants.h" |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 // Do nothing. | 376 // Do nothing. |
376 NOTREACHED(); | 377 NOTREACHED(); |
377 break; | 378 break; |
378 } | 379 } |
379 } // switch | 380 } // switch |
380 | 381 |
381 // TODO(raymes): We currently set the content permission for non-https | 382 // TODO(raymes): We currently set the content permission for non-https |
382 // websites for Pepper requests as well. This is temporary and should be | 383 // websites for Pepper requests as well. This is temporary and should be |
383 // removed. | 384 // removed. |
384 if (update_content_setting) { | 385 if (update_content_setting) { |
385 if ((IsSchemeSecure() && !devices.empty()) || | 386 if ((IsOriginSecure(request_.security_origin) && !devices.empty()) || |
386 request_.request_type == content::MEDIA_OPEN_DEVICE) { | 387 request_.request_type == content::MEDIA_OPEN_DEVICE) { |
387 StorePermission(true); | 388 StorePermission(true); |
388 } | 389 } |
389 } | 390 } |
390 | 391 |
391 if (audio_allowed) { | 392 if (audio_allowed) { |
392 profile_->GetHostContentSettingsMap()->UpdateLastUsageByPattern( | 393 profile_->GetHostContentSettingsMap()->UpdateLastUsageByPattern( |
393 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin), | 394 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin), |
394 ContentSettingsPattern::Wildcard(), | 395 ContentSettingsPattern::Wildcard(), |
395 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); | 396 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 bool MediaStreamDevicesController::HasUserGesture() const { | 465 bool MediaStreamDevicesController::HasUserGesture() const { |
465 return request_.user_gesture; | 466 return request_.user_gesture; |
466 } | 467 } |
467 | 468 |
468 GURL MediaStreamDevicesController::GetRequestingHostname() const { | 469 GURL MediaStreamDevicesController::GetRequestingHostname() const { |
469 return request_.security_origin; | 470 return request_.security_origin; |
470 } | 471 } |
471 | 472 |
472 void MediaStreamDevicesController::PermissionGranted() { | 473 void MediaStreamDevicesController::PermissionGranted() { |
473 GURL origin(GetSecurityOriginSpec()); | 474 GURL origin(GetSecurityOriginSpec()); |
474 if (origin.SchemeIsSecure()) { | 475 if (IsOriginSecure(origin)) { |
475 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", | 476 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", |
476 kAllowHttps, kPermissionActionsMax); | 477 kAllowHttps, kPermissionActionsMax); |
477 } else { | 478 } else { |
478 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", | 479 UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", |
479 kAllowHttp, kPermissionActionsMax); | 480 kAllowHttp, kPermissionActionsMax); |
480 } | 481 } |
481 Accept(true); | 482 Accept(true); |
482 } | 483 } |
483 | 484 |
484 void MediaStreamDevicesController::PermissionDenied() { | 485 void MediaStreamDevicesController::PermissionDenied() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 request_.security_origin, | 531 request_.security_origin, |
531 device_checks[i].policy_name, | 532 device_checks[i].policy_name, |
532 device_checks[i].list_policy_name); | 533 device_checks[i].list_policy_name); |
533 | 534 |
534 if (policy == ALWAYS_DENY) | 535 if (policy == ALWAYS_DENY) |
535 return false; | 536 return false; |
536 | 537 |
537 if (policy == POLICY_NOT_SET) { | 538 if (policy == POLICY_NOT_SET) { |
538 // Only load content settings from secure origins unless it is a | 539 // Only load content settings from secure origins unless it is a |
539 // content::MEDIA_OPEN_DEVICE (Pepper) request. | 540 // content::MEDIA_OPEN_DEVICE (Pepper) request. |
540 if (!IsSchemeSecure() && | 541 if (!IsOriginSecure(request_.security_origin) && |
541 request_.request_type != content::MEDIA_OPEN_DEVICE) { | 542 request_.request_type != content::MEDIA_OPEN_DEVICE) { |
542 return false; | 543 return false; |
543 } | 544 } |
544 if (profile_->GetHostContentSettingsMap()->GetContentSetting( | 545 if (profile_->GetHostContentSettingsMap()->GetContentSetting( |
545 request_.security_origin, | 546 request_.security_origin, |
546 request_.security_origin, | 547 request_.security_origin, |
547 device_checks[i].settings_type, | 548 device_checks[i].settings_type, |
548 content_settings::ResourceIdentifier()) != | 549 content_settings::ResourceIdentifier()) != |
549 CONTENT_SETTING_ALLOW) { | 550 CONTENT_SETTING_ALLOW) { |
550 return false; | 551 return false; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 bool MediaStreamDevicesController::IsDefaultMediaAccessBlocked() const { | 595 bool MediaStreamDevicesController::IsDefaultMediaAccessBlocked() const { |
595 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 596 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
596 return (profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( | 597 return (profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( |
597 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, NULL) | 598 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, NULL) |
598 == CONTENT_SETTING_BLOCK && | 599 == CONTENT_SETTING_BLOCK && |
599 profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( | 600 profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( |
600 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, NULL) | 601 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, NULL) |
601 == CONTENT_SETTING_BLOCK); | 602 == CONTENT_SETTING_BLOCK); |
602 } | 603 } |
603 | 604 |
604 bool MediaStreamDevicesController::IsSchemeSecure() const { | |
605 return request_.security_origin.SchemeIsSecure() || | |
606 request_.security_origin.SchemeIs(extensions::kExtensionScheme); | |
607 } | |
608 | |
609 void MediaStreamDevicesController::StorePermission(bool allowed) const { | 605 void MediaStreamDevicesController::StorePermission(bool allowed) const { |
610 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 606 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
611 ContentSettingsPattern primary_pattern = | 607 ContentSettingsPattern primary_pattern = |
612 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin); | 608 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin); |
613 // Check the pattern is valid or not. When the request is from a file access, | 609 // Check the pattern is valid or not. When the request is from a file access, |
614 // no exception will be made. | 610 // no exception will be made. |
615 if (!primary_pattern.IsValid()) | 611 if (!primary_pattern.IsValid()) |
616 return; | 612 return; |
617 | 613 |
618 ContentSetting content_setting = allowed ? | 614 ContentSetting content_setting = allowed ? |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 } | 679 } |
684 | 680 |
685 bool MediaStreamDevicesController::IsCaptureDeviceRequestAllowed() const { | 681 bool MediaStreamDevicesController::IsCaptureDeviceRequestAllowed() const { |
686 #if defined(OS_ANDROID) | 682 #if defined(OS_ANDROID) |
687 // Don't approve device requests if the tab was hidden. | 683 // Don't approve device requests if the tab was hidden. |
688 // TODO(qinmin): Add a test for this. http://crbug.com/396869. | 684 // TODO(qinmin): Add a test for this. http://crbug.com/396869. |
689 return web_contents_->GetRenderWidgetHostView()->IsShowing(); | 685 return web_contents_->GetRenderWidgetHostView()->IsShowing(); |
690 #endif | 686 #endif |
691 return true; | 687 return true; |
692 } | 688 } |
OLD | NEW |