blob: 936e5bdda2e76a87784a9e24fd741247c619e3b5 [file] [log] [blame]
// 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 "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) {
}
WebsiteSettingsUI::ChosenObjectInfo::ChosenObjectInfo(
const WebsiteSettings::ChooserUIInfo& ui_info,
scoped_ptr<base::DictionaryValue> 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));
}