// Copyright (c) 2012 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/ui/website_settings/website_settings_ui.h" #include "base/macros.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/content_settings/core/browser/plugins_field_trial.h" #include "components/strings/grit/components_strings.h" #include "grit/theme_resources.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/image/image.h" namespace { const int kInvalidResourceID = -1; // The resource IDs for the strings that are displayed on the permissions // button if the permission setting is managed by policy. const int kPermissionButtonTextIDPolicyManaged[] = { kInvalidResourceID, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ALLOWED_BY_POLICY, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_BLOCKED_BY_POLICY, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ASK_BY_POLICY, kInvalidResourceID, kInvalidResourceID}; static_assert(arraysize(kPermissionButtonTextIDPolicyManaged) == CONTENT_SETTING_NUM_SETTINGS, "kPermissionButtonTextIDPolicyManaged array size is incorrect"); // The resource IDs for the strings that are displayed on the permissions // button if the permission setting is managed by an extension. const int kPermissionButtonTextIDExtensionManaged[] = { kInvalidResourceID, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ALLOWED_BY_EXTENSION, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_BLOCKED_BY_EXTENSION, kInvalidResourceID, kInvalidResourceID, kInvalidResourceID}; static_assert(arraysize(kPermissionButtonTextIDExtensionManaged) == CONTENT_SETTING_NUM_SETTINGS, "kPermissionButtonTextIDExtensionManaged array size is " "incorrect"); // The resource IDs for the strings that are displayed on the permissions // button if the permission setting is managed by the user. const int kPermissionButtonTextIDUserManaged[] = { kInvalidResourceID, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ALLOWED_BY_USER, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_BLOCKED_BY_USER, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ASK_BY_USER, kInvalidResourceID, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_DETECT_IMPORTANT_CONTENT_BY_USER}; static_assert(arraysize(kPermissionButtonTextIDUserManaged) == CONTENT_SETTING_NUM_SETTINGS, "kPermissionButtonTextIDUserManaged array size is incorrect"); // The resource IDs for the strings that are displayed on the permissions // button if the permission setting is the global default setting. const int kPermissionButtonTextIDDefaultSetting[] = { kInvalidResourceID, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ALLOWED_BY_DEFAULT, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_BLOCKED_BY_DEFAULT, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ASK_BY_DEFAULT, kInvalidResourceID, IDS_WEBSITE_SETTINGS_BUTTON_TEXT_DETECT_IMPORTANT_CONTENT_BY_DEFAULT}; static_assert(arraysize(kPermissionButtonTextIDDefaultSetting) == CONTENT_SETTING_NUM_SETTINGS, "kPermissionButtonTextIDDefaultSetting array size is incorrect"); struct PermissionsUIInfo { ContentSettingsType type; int string_id; int blocked_icon_id; int allowed_icon_id; }; const PermissionsUIInfo kPermissionsUIInfo[] = { {CONTENT_SETTINGS_TYPE_COOKIES, 0, IDR_BLOCKED_COOKIES, IDR_ACCESSED_COOKIES}, {CONTENT_SETTINGS_TYPE_IMAGES, IDS_WEBSITE_SETTINGS_TYPE_IMAGES, IDR_BLOCKED_IMAGES, IDR_ALLOWED_IMAGES}, {CONTENT_SETTINGS_TYPE_JAVASCRIPT, IDS_WEBSITE_SETTINGS_TYPE_JAVASCRIPT, IDR_BLOCKED_JAVASCRIPT, IDR_ALLOWED_JAVASCRIPT}, {CONTENT_SETTINGS_TYPE_POPUPS, IDS_WEBSITE_SETTINGS_TYPE_POPUPS, IDR_BLOCKED_POPUPS, IDR_ALLOWED_POPUPS}, #if defined(ENABLE_PLUGINS) {CONTENT_SETTINGS_TYPE_PLUGINS, IDS_WEBSITE_SETTINGS_TYPE_PLUGINS, IDR_BLOCKED_POPUPS, IDR_ALLOWED_PLUGINS}, #endif {CONTENT_SETTINGS_TYPE_GEOLOCATION, IDS_WEBSITE_SETTINGS_TYPE_LOCATION, IDR_BLOCKED_LOCATION, IDR_ALLOWED_LOCATION}, {CONTENT_SETTINGS_TYPE_NOTIFICATIONS, IDS_WEBSITE_SETTINGS_TYPE_NOTIFICATIONS, IDR_BLOCKED_NOTIFICATION, IDR_ALLOWED_NOTIFICATION}, {CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, IDS_WEBSITE_SETTINGS_TYPE_NOTIFICATIONS, 0, 0}, {CONTENT_SETTINGS_TYPE_FULLSCREEN, IDS_WEBSITE_SETTINGS_TYPE_FULLSCREEN, IDR_ALLOWED_FULLSCREEN, IDR_ALLOWED_FULLSCREEN}, {CONTENT_SETTINGS_TYPE_MOUSELOCK, IDS_WEBSITE_SETTINGS_TYPE_MOUSELOCK, IDR_BLOCKED_MOUSE_CURSOR, IDR_ALLOWED_MOUSE_CURSOR}, {CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, IDS_WEBSITE_SETTINGS_TYPE_MIC, IDR_BLOCKED_MIC, IDR_ALLOWED_MIC}, {CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, IDS_WEBSITE_SETTINGS_TYPE_CAMERA, IDR_BLOCKED_CAMERA, IDR_ALLOWED_CAMERA}, {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_AUTOMATIC_DOWNLOADS_TAB_LABEL, IDR_BLOCKED_DOWNLOADS, IDR_ALLOWED_DOWNLOADS}, {CONTENT_SETTINGS_TYPE_MIDI_SYSEX, IDS_WEBSITE_SETTINGS_TYPE_MIDI_SYSEX, IDR_BLOCKED_MIDI_SYSEX, IDR_ALLOWED_MIDI_SYSEX}, {CONTENT_SETTINGS_TYPE_KEYGEN, IDS_WEBSITE_SETTINGS_TYPE_KEYGEN, IDR_BLOCKED_KEYGEN, IDR_ALLOWED_KEYGEN}, }; } // namespace WebsiteSettingsUI::CookieInfo::CookieInfo() : allowed(-1), blocked(-1) { } WebsiteSettingsUI::PermissionInfo::PermissionInfo() : type(CONTENT_SETTINGS_TYPE_DEFAULT), setting(CONTENT_SETTING_DEFAULT), default_setting(CONTENT_SETTING_DEFAULT), source(content_settings::SETTING_SOURCE_NONE), is_incognito(false) {} WebsiteSettingsUI::ChosenObjectInfo::ChosenObjectInfo( const WebsiteSettings::ChooserUIInfo& ui_info, scoped_ptr object) : ui_info(ui_info), object(std::move(object)) {} WebsiteSettingsUI::ChosenObjectInfo::~ChosenObjectInfo() {} WebsiteSettingsUI::IdentityInfo::IdentityInfo() : identity_status(WebsiteSettings::SITE_IDENTITY_STATUS_UNKNOWN), cert_id(0), connection_status(WebsiteSettings::SITE_CONNECTION_STATUS_UNKNOWN), show_ssl_decision_revoke_button(false) { } WebsiteSettingsUI::IdentityInfo::~IdentityInfo() {} base::string16 WebsiteSettingsUI::IdentityInfo::GetSecuritySummary() const { switch (identity_status) { case WebsiteSettings::SITE_IDENTITY_STATUS_CERT: case WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT: case WebsiteSettings::SITE_IDENTITY_STATUS_CERT_REVOCATION_UNKNOWN: switch (connection_status) { case WebsiteSettings::SITE_CONNECTION_STATUS_MIXED_CONTENT: return l10n_util::GetStringUTF16( IDS_WEBSITE_SETTINGS_MIXED_PASSIVE_CONTENT); case WebsiteSettings::SITE_CONNECTION_STATUS_MIXED_SCRIPT: return l10n_util::GetStringUTF16( IDS_WEBSITE_SETTINGS_MIXED_ACTIVE_CONTENT); default: return l10n_util::GetStringUTF16( IDS_WEBSITE_SETTINGS_SECURE_TRANSPORT); } case WebsiteSettings:: SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM_MINOR: case WebsiteSettings:: SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM_MAJOR: return l10n_util::GetStringUTF16( IDS_WEBSITE_DEPRECATED_SIGNATURE_ALGORITHM); case WebsiteSettings::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT: return l10n_util::GetStringUTF16(IDS_CERT_POLICY_PROVIDED_CERT_HEADER); case WebsiteSettings::SITE_IDENTITY_STATUS_UNKNOWN: return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_UNKNOWN_TRANSPORT); case WebsiteSettings::SITE_IDENTITY_STATUS_CT_ERROR: return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_CT_ERROR); case WebsiteSettings::SITE_IDENTITY_STATUS_INTERNAL_PAGE: return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_INTERNAL_PAGE); case WebsiteSettings::SITE_IDENTITY_STATUS_NO_CERT: default: return l10n_util::GetStringUTF16( IDS_WEBSITE_SETTINGS_NON_SECURE_TRANSPORT); } } WebsiteSettingsUI::~WebsiteSettingsUI() { } // static base::string16 WebsiteSettingsUI::PermissionTypeToUIString( ContentSettingsType type) { for (const PermissionsUIInfo& info : kPermissionsUIInfo) { if (info.type == type) return l10n_util::GetStringUTF16(info.string_id); } NOTREACHED(); return base::string16(); } // static base::string16 WebsiteSettingsUI::PermissionValueToUIString( ContentSetting value) { switch (value) { case CONTENT_SETTING_ALLOW: return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_PERMISSION_ALLOW); case CONTENT_SETTING_BLOCK: return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_PERMISSION_BLOCK); case CONTENT_SETTING_ASK: return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_PERMISSION_ASK); default: NOTREACHED(); return base::string16(); } } // static base::string16 WebsiteSettingsUI::PermissionActionToUIString( ContentSettingsType type, ContentSetting setting, ContentSetting default_setting, content_settings::SettingSource source) { ContentSetting effective_setting = setting; if (effective_setting == CONTENT_SETTING_DEFAULT) effective_setting = default_setting; #if defined(ENABLE_PLUGINS) effective_setting = content_settings::PluginsFieldTrial::EffectiveContentSetting( type, effective_setting); #endif const int* button_text_ids = NULL; switch (source) { case content_settings::SETTING_SOURCE_USER: if (setting == CONTENT_SETTING_DEFAULT) button_text_ids = kPermissionButtonTextIDDefaultSetting; else button_text_ids = kPermissionButtonTextIDUserManaged; break; case content_settings::SETTING_SOURCE_POLICY: button_text_ids = kPermissionButtonTextIDPolicyManaged; break; case content_settings::SETTING_SOURCE_EXTENSION: button_text_ids = kPermissionButtonTextIDExtensionManaged; break; case content_settings::SETTING_SOURCE_WHITELIST: case content_settings::SETTING_SOURCE_NONE: default: NOTREACHED(); return base::string16(); } int button_text_id = button_text_ids[effective_setting]; DCHECK_NE(button_text_id, kInvalidResourceID); return l10n_util::GetStringUTF16(button_text_id); } // static int WebsiteSettingsUI::GetPermissionIconID(ContentSettingsType type, ContentSetting setting) { bool use_blocked = (setting == CONTENT_SETTING_BLOCK); for (const PermissionsUIInfo& info : kPermissionsUIInfo) { if (info.type == type) return use_blocked ? info.blocked_icon_id : info.allowed_icon_id; } NOTREACHED(); return IDR_INFO; } // static const gfx::Image& WebsiteSettingsUI::GetPermissionIcon( const PermissionInfo& info) { ContentSetting setting = info.setting; if (setting == CONTENT_SETTING_DEFAULT) setting = info.default_setting; ResourceBundle& rb = ResourceBundle::GetSharedInstance(); return rb.GetNativeImageNamed(GetPermissionIconID(info.type, setting)); } // static base::string16 WebsiteSettingsUI::ChosenObjectToUIString( const ChosenObjectInfo& object) { base::string16 name; object.object->GetString(object.ui_info.ui_name_key, &name); return name; } // static const gfx::Image& WebsiteSettingsUI::GetChosenObjectIcon( const ChosenObjectInfo& object, bool deleted) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); return rb.GetNativeImageNamed(deleted ? object.ui_info.blocked_icon_id : object.ui_info.allowed_icon_id); } // static int WebsiteSettingsUI::GetIdentityIconID( WebsiteSettings::SiteIdentityStatus status) { int resource_id = IDR_PAGEINFO_INFO; switch (status) { case WebsiteSettings::SITE_IDENTITY_STATUS_UNKNOWN: case WebsiteSettings::SITE_IDENTITY_STATUS_INTERNAL_PAGE: break; case WebsiteSettings::SITE_IDENTITY_STATUS_CERT: case WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT: resource_id = IDR_PAGEINFO_GOOD; break; case WebsiteSettings::SITE_IDENTITY_STATUS_CERT_REVOCATION_UNKNOWN: resource_id = IDR_PAGEINFO_WARNING_MINOR; break; case WebsiteSettings::SITE_IDENTITY_STATUS_NO_CERT: resource_id = IDR_PAGEINFO_WARNING_MAJOR; break; case WebsiteSettings::SITE_IDENTITY_STATUS_ERROR: case WebsiteSettings::SITE_IDENTITY_STATUS_CT_ERROR: resource_id = IDR_PAGEINFO_BAD; break; case WebsiteSettings::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT: resource_id = IDR_PAGEINFO_ENTERPRISE_MANAGED; break; case WebsiteSettings:: SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM_MINOR: resource_id = IDR_PAGEINFO_WARNING_MINOR; break; case WebsiteSettings:: SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM_MAJOR: resource_id = IDR_PAGEINFO_BAD; break; default: NOTREACHED(); break; } return resource_id; } // static const gfx::Image& WebsiteSettingsUI::GetIdentityIcon( WebsiteSettings::SiteIdentityStatus status) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); return rb.GetNativeImageNamed(GetIdentityIconID(status)); } // static int WebsiteSettingsUI::GetConnectionIconID( WebsiteSettings::SiteConnectionStatus status) { int resource_id = IDR_PAGEINFO_INFO; switch (status) { case WebsiteSettings::SITE_CONNECTION_STATUS_UNKNOWN: case WebsiteSettings::SITE_CONNECTION_STATUS_INTERNAL_PAGE: break; case WebsiteSettings::SITE_CONNECTION_STATUS_ENCRYPTED: resource_id = IDR_PAGEINFO_GOOD; break; case WebsiteSettings::SITE_CONNECTION_STATUS_MIXED_CONTENT: resource_id = IDR_PAGEINFO_WARNING_MINOR; break; case WebsiteSettings::SITE_CONNECTION_STATUS_UNENCRYPTED: resource_id = IDR_PAGEINFO_WARNING_MAJOR; break; case WebsiteSettings::SITE_CONNECTION_STATUS_MIXED_SCRIPT: case WebsiteSettings::SITE_CONNECTION_STATUS_ENCRYPTED_ERROR: resource_id = IDR_PAGEINFO_BAD; break; } return resource_id; } // static const gfx::Image& WebsiteSettingsUI::GetConnectionIcon( WebsiteSettings::SiteConnectionStatus status) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); return rb.GetNativeImageNamed(GetConnectionIconID(status)); }