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
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/website_settings/website_settings_ui.h"
6
7#include "chrome/grit/generated_resources.h"
8#include "grit/theme_resources.h"
9#include "ui/base/l10n/l10n_util.h"
10#include "ui/base/resource/resource_bundle.h"
11#include "ui/gfx/image/image.h"
12
13namespace {
14
15const int kInvalidResourceID = -1;
16
17// The resource id's for the strings that are displayed on the permissions
18// button if the permission setting is managed by policy.
19const int kPermissionButtonTextIDPolicyManaged[] = {
20  kInvalidResourceID,
21  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ALLOWED_BY_POLICY,
22  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_BLOCKED_BY_POLICY,
23  kInvalidResourceID,
24  kInvalidResourceID
25};
26COMPILE_ASSERT(arraysize(kPermissionButtonTextIDPolicyManaged) ==
27               CONTENT_SETTING_NUM_SETTINGS,
28               button_text_id_array_size_incorrect);
29
30// The resource id's for the strings that are displayed on the permissions
31// button if the permission setting is managed by an extension.
32const int kPermissionButtonTextIDExtensionManaged[] = {
33  kInvalidResourceID,
34  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ALLOWED_BY_EXTENSION,
35  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_BLOCKED_BY_EXTENSION,
36  kInvalidResourceID,
37  kInvalidResourceID
38};
39COMPILE_ASSERT(arraysize(kPermissionButtonTextIDExtensionManaged) ==
40               CONTENT_SETTING_NUM_SETTINGS,
41               button_text_id_array_size_incorrect);
42
43// The resource id's for the strings that are displayed on the permissions
44// button if the permission setting is managed by the user.
45const int kPermissionButtonTextIDUserManaged[] = {
46  kInvalidResourceID,
47  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ALLOWED_BY_USER,
48  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_BLOCKED_BY_USER,
49  kInvalidResourceID,
50  kInvalidResourceID
51};
52COMPILE_ASSERT(arraysize(kPermissionButtonTextIDUserManaged) ==
53               CONTENT_SETTING_NUM_SETTINGS,
54               button_text_id_array_size_incorrect);
55
56// The resource id's for the strings that are displayed on the permissions
57// button if the permission setting is the global default setting.
58const int kPermissionButtonTextIDDefaultSetting[] = {
59  kInvalidResourceID,
60  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ALLOWED_BY_DEFAULT,
61  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_BLOCKED_BY_DEFAULT,
62  IDS_WEBSITE_SETTINGS_BUTTON_TEXT_ASK_BY_DEFAULT,
63  kInvalidResourceID
64};
65COMPILE_ASSERT(arraysize(kPermissionButtonTextIDDefaultSetting) ==
66               CONTENT_SETTING_NUM_SETTINGS,
67               button_text_id_array_size_incorrect);
68
69}  // namespace
70
71WebsiteSettingsUI::CookieInfo::CookieInfo()
72    : allowed(-1), blocked(-1) {
73}
74
75WebsiteSettingsUI::PermissionInfo::PermissionInfo()
76    : type(CONTENT_SETTINGS_TYPE_DEFAULT),
77      setting(CONTENT_SETTING_DEFAULT),
78      default_setting(CONTENT_SETTING_DEFAULT),
79      source(content_settings::SETTING_SOURCE_NONE) {
80}
81
82WebsiteSettingsUI::IdentityInfo::IdentityInfo()
83    : identity_status(WebsiteSettings::SITE_IDENTITY_STATUS_UNKNOWN),
84      cert_id(0),
85      connection_status(WebsiteSettings::SITE_CONNECTION_STATUS_UNKNOWN),
86      show_ssl_decision_revoke_button(false) {
87}
88
89WebsiteSettingsUI::IdentityInfo::~IdentityInfo() {}
90
91base::string16 WebsiteSettingsUI::IdentityInfo::GetIdentityStatusText() const {
92  if (identity_status == WebsiteSettings::SITE_IDENTITY_STATUS_CERT ||
93      identity_status ==  WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT) {
94    return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_IDENTITY_VERIFIED);
95  }
96  if (identity_status ==
97          WebsiteSettings::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT) {
98    return l10n_util::GetStringUTF16(IDS_CERT_POLICY_PROVIDED_CERT_HEADER);
99  }
100  return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_IDENTITY_NOT_VERIFIED);
101}
102
103WebsiteSettingsUI::~WebsiteSettingsUI() {
104}
105
106// static
107base::string16 WebsiteSettingsUI::PermissionTypeToUIString(
108      ContentSettingsType type) {
109  switch (type) {
110    case CONTENT_SETTINGS_TYPE_IMAGES:
111     return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_IMAGES);
112    case CONTENT_SETTINGS_TYPE_JAVASCRIPT:
113     return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_JAVASCRIPT);
114    case CONTENT_SETTINGS_TYPE_POPUPS:
115      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_POPUPS);
116    case CONTENT_SETTINGS_TYPE_PLUGINS:
117      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_PLUGINS);
118    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
119      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_LOCATION);
120    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
121      return l10n_util::GetStringUTF16(
122          IDS_WEBSITE_SETTINGS_TYPE_NOTIFICATIONS);
123    case CONTENT_SETTINGS_TYPE_FULLSCREEN:
124      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_FULLSCREEN);
125    case CONTENT_SETTINGS_TYPE_MOUSELOCK:
126      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_MOUSELOCK);
127    case CONTENT_SETTINGS_TYPE_MEDIASTREAM:
128      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_MEDIASTREAM);
129    case CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS:
130      return l10n_util::GetStringUTF16(IDS_AUTOMATIC_DOWNLOADS_TAB_LABEL);
131    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
132      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TYPE_MIDI_SYSEX);
133    default:
134      NOTREACHED();
135      return base::string16();
136  }
137}
138
139// static
140base::string16 WebsiteSettingsUI::PermissionValueToUIString(
141    ContentSetting value) {
142  switch (value) {
143    case CONTENT_SETTING_ALLOW:
144      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_PERMISSION_ALLOW);
145    case CONTENT_SETTING_BLOCK:
146      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_PERMISSION_BLOCK);
147    case CONTENT_SETTING_ASK:
148      return l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_PERMISSION_ASK);
149    default:
150      NOTREACHED();
151      return base::string16();
152  }
153}
154
155// static
156base::string16 WebsiteSettingsUI::PermissionActionToUIString(
157      ContentSetting setting,
158      ContentSetting default_setting,
159      content_settings::SettingSource source) {
160  ContentSetting effective_setting = setting;
161  if (effective_setting == CONTENT_SETTING_DEFAULT)
162    effective_setting = default_setting;
163
164  const int* button_text_ids = NULL;
165  switch (source) {
166    case content_settings::SETTING_SOURCE_USER:
167      if (setting == CONTENT_SETTING_DEFAULT)
168        button_text_ids = kPermissionButtonTextIDDefaultSetting;
169      else
170        button_text_ids = kPermissionButtonTextIDUserManaged;
171      break;
172    case content_settings::SETTING_SOURCE_POLICY:
173      button_text_ids = kPermissionButtonTextIDPolicyManaged;
174      break;
175    case content_settings::SETTING_SOURCE_EXTENSION:
176      button_text_ids = kPermissionButtonTextIDExtensionManaged;
177      break;
178    case content_settings::SETTING_SOURCE_WHITELIST:
179    case content_settings::SETTING_SOURCE_NONE:
180    default:
181      NOTREACHED();
182      return base::string16();
183  }
184  int button_text_id = button_text_ids[effective_setting];
185  DCHECK_NE(button_text_id, kInvalidResourceID);
186  return l10n_util::GetStringUTF16(button_text_id);
187}
188
189// static
190int WebsiteSettingsUI::GetPermissionIconID(ContentSettingsType type,
191                                           ContentSetting setting) {
192  bool use_blocked = (setting == CONTENT_SETTING_BLOCK);
193  int resource_id = IDR_INFO;
194  switch (type) {
195    case CONTENT_SETTINGS_TYPE_IMAGES:
196      resource_id = use_blocked ? IDR_BLOCKED_IMAGES : IDR_ALLOWED_IMAGES;
197      break;
198    case CONTENT_SETTINGS_TYPE_JAVASCRIPT:
199      resource_id =
200          use_blocked ? IDR_BLOCKED_JAVASCRIPT : IDR_ALLOWED_JAVASCRIPT;
201      break;
202    case CONTENT_SETTINGS_TYPE_COOKIES:
203      resource_id = use_blocked ? IDR_BLOCKED_COOKIES : IDR_ACCESSED_COOKIES;
204      break;
205    case CONTENT_SETTINGS_TYPE_POPUPS:
206      resource_id = use_blocked ? IDR_BLOCKED_POPUPS : IDR_ALLOWED_POPUPS;
207      break;
208    case CONTENT_SETTINGS_TYPE_PLUGINS:
209      resource_id = use_blocked ? IDR_BLOCKED_PLUGINS : IDR_ALLOWED_PLUGINS;
210      break;
211    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
212      resource_id = use_blocked ? IDR_BLOCKED_LOCATION : IDR_ALLOWED_LOCATION;
213      break;
214    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
215      resource_id =
216          use_blocked ? IDR_BLOCKED_NOTIFICATION : IDR_ALLOWED_NOTIFICATION;
217      break;
218    case CONTENT_SETTINGS_TYPE_FULLSCREEN:
219      resource_id = IDR_ALLOWED_FULLSCREEN;
220      break;
221    case CONTENT_SETTINGS_TYPE_MOUSELOCK:
222      resource_id =
223          use_blocked ? IDR_BLOCKED_MOUSE_CURSOR : IDR_ALLOWED_MOUSE_CURSOR;
224      break;
225    case CONTENT_SETTINGS_TYPE_MEDIASTREAM:
226      resource_id = use_blocked ? IDR_BLOCKED_MEDIA : IDR_ASK_MEDIA;
227      break;
228    case CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS:
229      resource_id = use_blocked ? IDR_BLOCKED_DOWNLOADS
230                                : IDR_ALLOWED_DOWNLOADS;
231      break;
232    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
233      resource_id = use_blocked ? IDR_BLOCKED_MIDI_SYSEX
234                                : IDR_ALLOWED_MIDI_SYSEX;
235      break;
236    default:
237      NOTREACHED();
238      break;
239  }
240  return resource_id;
241}
242
243// static
244const gfx::Image& WebsiteSettingsUI::GetPermissionIcon(
245    const PermissionInfo& info) {
246  ContentSetting setting = info.setting;
247  if (setting == CONTENT_SETTING_DEFAULT)
248    setting = info.default_setting;
249  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
250  return rb.GetNativeImageNamed(GetPermissionIconID(info.type, setting));
251}
252
253// static
254int WebsiteSettingsUI::GetIdentityIconID(
255    WebsiteSettings::SiteIdentityStatus status) {
256  int resource_id = IDR_PAGEINFO_INFO;
257  switch (status) {
258    case WebsiteSettings::SITE_IDENTITY_STATUS_UNKNOWN:
259      break;
260    case WebsiteSettings::SITE_IDENTITY_STATUS_CERT:
261    case WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT:
262      resource_id = IDR_PAGEINFO_GOOD;
263      break;
264    case WebsiteSettings::SITE_IDENTITY_STATUS_CERT_REVOCATION_UNKNOWN:
265      resource_id = IDR_PAGEINFO_WARNING_MINOR;
266      break;
267    case WebsiteSettings::SITE_IDENTITY_STATUS_NO_CERT:
268      resource_id = IDR_PAGEINFO_WARNING_MAJOR;
269      break;
270    case WebsiteSettings::SITE_IDENTITY_STATUS_ERROR:
271      resource_id = IDR_PAGEINFO_BAD;
272      break;
273    case WebsiteSettings::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT:
274      resource_id = IDR_PAGEINFO_ENTERPRISE_MANAGED;
275      break;
276    case WebsiteSettings::SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM:
277      resource_id = IDR_PAGEINFO_WARNING_MINOR;
278      break;
279    default:
280      NOTREACHED();
281      break;
282  }
283  return resource_id;
284}
285
286// static
287const gfx::Image& WebsiteSettingsUI::GetIdentityIcon(
288    WebsiteSettings::SiteIdentityStatus status) {
289  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
290  return rb.GetNativeImageNamed(GetIdentityIconID(status));
291}
292
293// static
294int WebsiteSettingsUI::GetConnectionIconID(
295    WebsiteSettings::SiteConnectionStatus status) {
296  int resource_id = IDR_PAGEINFO_INFO;
297  switch (status) {
298    case WebsiteSettings::SITE_CONNECTION_STATUS_UNKNOWN:
299      break;
300    case WebsiteSettings::SITE_CONNECTION_STATUS_ENCRYPTED:
301      resource_id = IDR_PAGEINFO_GOOD;
302      break;
303    case WebsiteSettings::SITE_CONNECTION_STATUS_MIXED_CONTENT:
304      resource_id = IDR_PAGEINFO_WARNING_MINOR;
305      break;
306    case WebsiteSettings::SITE_CONNECTION_STATUS_UNENCRYPTED:
307      resource_id = IDR_PAGEINFO_WARNING_MAJOR;
308      break;
309    case WebsiteSettings::SITE_CONNECTION_STATUS_ENCRYPTED_ERROR:
310      resource_id = IDR_PAGEINFO_BAD;
311      break;
312    default:
313      NOTREACHED();
314      break;
315  }
316  return resource_id;
317}
318
319// static
320const gfx::Image& WebsiteSettingsUI::GetConnectionIcon(
321    WebsiteSettings::SiteConnectionStatus status) {
322  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
323  return rb.GetNativeImageNamed(GetConnectionIconID(status));
324}
325
326// static
327int WebsiteSettingsUI::GetFirstVisitIconID(const base::string16& first_visit) {
328  // FIXME(markusheintz): Display a minor warning icon if the page is visited
329  // the first time.
330  return IDR_PAGEINFO_INFO;
331}
332
333// static
334const gfx::Image& WebsiteSettingsUI::GetFirstVisitIcon(
335    const base::string16& first_visit) {
336  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
337  return rb.GetNativeImageNamed(GetFirstVisitIconID(first_visit));
338}
339