| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/permissions/permission_util.h" |
| |
| #include "build/build_config.h" |
| #include "base/feature_list.h" |
| #include "base/logging.h" |
| #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| #include "chrome/browser/permissions/permission_uma_util.h" |
| #include "chrome/common/chrome_features.h" |
| #include "components/content_settings/core/browser/host_content_settings_map.h" |
| #include "content/public/browser/permission_type.h" |
| |
| using content::PermissionType; |
| |
| // The returned strings must match the RAPPOR metrics in rappor.xml, |
| // and any Field Trial configs for the Permissions kill switch e.g. |
| // Permissions.Action.Geolocation etc.. |
| std::string PermissionUtil::GetPermissionString( |
| ContentSettingsType content_type) { |
| switch (content_type) { |
| case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
| return "Geolocation"; |
| case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
| return "Notifications"; |
| case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
| return "MidiSysEx"; |
| case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: |
| return "PushMessaging"; |
| case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: |
| return "DurableStorage"; |
| case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
| return "ProtectedMediaIdentifier"; |
| case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: |
| return "AudioCapture"; |
| case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: |
| return "VideoCapture"; |
| case CONTENT_SETTINGS_TYPE_MIDI: |
| return "Midi"; |
| case CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC: |
| return "BackgroundSync"; |
| case CONTENT_SETTINGS_TYPE_PLUGINS: |
| return "Flash"; |
| case CONTENT_SETTINGS_TYPE_SENSORS: |
| return "Sensors"; |
| default: |
| break; |
| } |
| NOTREACHED(); |
| return std::string(); |
| } |
| |
| std::string PermissionUtil::ConvertContentSettingsTypeToSafeBrowsingName( |
| ContentSettingsType permission_type) { |
| switch (permission_type) { |
| case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
| return "GEOLOCATION"; |
| case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
| return "NOTIFICATIONS"; |
| case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
| return "MIDI_SYSEX"; |
| case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: |
| return "PUSH_MESSAGING"; |
| case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: |
| return "DURABLE_STORAGE"; |
| case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
| return "PROTECTED_MEDIA_IDENTIFIER"; |
| case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: |
| return "AUDIO_CAPTURE"; |
| case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: |
| return "VIDEO_CAPTURE"; |
| case CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC: |
| return "BACKGROUND_SYNC"; |
| case CONTENT_SETTINGS_TYPE_PLUGINS: |
| return "FLASH"; |
| case CONTENT_SETTINGS_TYPE_SENSORS: |
| return "SENSORS"; |
| default: |
| break; |
| } |
| NOTREACHED(); |
| return std::string(); |
| } |
| |
| PermissionRequestType PermissionUtil::GetRequestType(ContentSettingsType type) { |
| switch (type) { |
| case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
| return PermissionRequestType::PERMISSION_GEOLOCATION; |
| case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
| return PermissionRequestType::PERMISSION_NOTIFICATIONS; |
| case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
| return PermissionRequestType::PERMISSION_MIDI_SYSEX; |
| case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: |
| return PermissionRequestType::PERMISSION_PUSH_MESSAGING; |
| case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
| return PermissionRequestType::PERMISSION_PROTECTED_MEDIA_IDENTIFIER; |
| case CONTENT_SETTINGS_TYPE_PLUGINS: |
| return PermissionRequestType::PERMISSION_FLASH; |
| case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: |
| return PermissionRequestType::PERMISSION_MEDIASTREAM_MIC; |
| case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: |
| return PermissionRequestType::PERMISSION_MEDIASTREAM_CAMERA; |
| default: |
| NOTREACHED(); |
| return PermissionRequestType::UNKNOWN; |
| } |
| } |
| |
| PermissionRequestGestureType PermissionUtil::GetGestureType(bool user_gesture) { |
| return user_gesture ? PermissionRequestGestureType::GESTURE |
| : PermissionRequestGestureType::NO_GESTURE; |
| } |
| |
| bool PermissionUtil::GetPermissionType(ContentSettingsType type, |
| PermissionType* out) { |
| if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION) { |
| *out = PermissionType::GEOLOCATION; |
| } else if (type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { |
| *out = PermissionType::NOTIFICATIONS; |
| } else if (type == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING) { |
| *out = PermissionType::PUSH_MESSAGING; |
| } else if (type == CONTENT_SETTINGS_TYPE_MIDI) { |
| *out = PermissionType::MIDI; |
| } else if (type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) { |
| *out = PermissionType::MIDI_SYSEX; |
| } else if (type == CONTENT_SETTINGS_TYPE_DURABLE_STORAGE) { |
| *out = PermissionType::DURABLE_STORAGE; |
| } else if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) { |
| *out = PermissionType::VIDEO_CAPTURE; |
| } else if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC) { |
| *out = PermissionType::AUDIO_CAPTURE; |
| } else if (type == CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC) { |
| *out = PermissionType::BACKGROUND_SYNC; |
| } else if (type == CONTENT_SETTINGS_TYPE_PLUGINS) { |
| *out = PermissionType::FLASH; |
| #if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
| } else if (type == CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER) { |
| *out = PermissionType::PROTECTED_MEDIA_IDENTIFIER; |
| #endif |
| } else if (type == CONTENT_SETTINGS_TYPE_SENSORS) { |
| *out = PermissionType::SENSORS; |
| } else { |
| return false; |
| } |
| return true; |
| } |
| |
| ContentSettingsType PermissionUtil::GetContentSettingsStorageType( |
| ContentSettingsType type) { |
| if (type == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING) |
| return CONTENT_SETTINGS_TYPE_NOTIFICATIONS; |
| return type; |
| } |
| |
| bool PermissionUtil::IsPermission(ContentSettingsType type) { |
| switch (type) { |
| case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
| case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
| case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: |
| case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
| case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: |
| case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: |
| case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: |
| case CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC: |
| case CONTENT_SETTINGS_TYPE_PLUGINS: |
| #if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
| case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: |
| #endif |
| case CONTENT_SETTINGS_TYPE_SENSORS: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool PermissionUtil::ShouldShowPersistenceToggle(ContentSettingsType type) { |
| return (type == CONTENT_SETTINGS_TYPE_GEOLOCATION || |
| type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC || |
| type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) && |
| base::FeatureList::IsEnabled( |
| features::kDisplayPersistenceToggleInPermissionPrompts); |
| } |
| |
| PermissionUtil::ScopedRevocationReporter::ScopedRevocationReporter( |
| Profile* profile, |
| const GURL& primary_url, |
| const GURL& secondary_url, |
| ContentSettingsType content_type, |
| PermissionSourceUI source_ui) |
| : profile_(profile), |
| primary_url_(primary_url), |
| secondary_url_(secondary_url), |
| content_type_(content_type), |
| source_ui_(source_ui) { |
| if (!primary_url_.is_valid() || |
| (!secondary_url_.is_valid() && !secondary_url_.is_empty())) { |
| is_initially_allowed_ = false; |
| return; |
| } |
| HostContentSettingsMap* settings_map = |
| HostContentSettingsMapFactory::GetForProfile(profile_); |
| ContentSetting initial_content_setting = settings_map->GetContentSetting( |
| primary_url_, secondary_url_, content_type_, std::string()); |
| is_initially_allowed_ = initial_content_setting == CONTENT_SETTING_ALLOW; |
| } |
| |
| PermissionUtil::ScopedRevocationReporter::ScopedRevocationReporter( |
| Profile* profile, |
| const ContentSettingsPattern& primary_pattern, |
| const ContentSettingsPattern& secondary_pattern, |
| ContentSettingsType content_type, |
| PermissionSourceUI source_ui) |
| : ScopedRevocationReporter( |
| profile, |
| GURL(primary_pattern.ToString()), |
| GURL((secondary_pattern == ContentSettingsPattern::Wildcard()) |
| ? primary_pattern.ToString() |
| : secondary_pattern.ToString()), |
| content_type, |
| source_ui) {} |
| |
| PermissionUtil::ScopedRevocationReporter::~ScopedRevocationReporter() { |
| if (!is_initially_allowed_) |
| return; |
| HostContentSettingsMap* settings_map = |
| HostContentSettingsMapFactory::GetForProfile(profile_); |
| ContentSetting final_content_setting = settings_map->GetContentSetting( |
| primary_url_, secondary_url_, content_type_, std::string()); |
| if (final_content_setting != CONTENT_SETTING_ALLOW) { |
| PermissionUmaUtil::PermissionRevoked(content_type_, source_ui_, |
| primary_url_, profile_); |
| } |
| } |