page_info_ui.cc 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992
  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. #include "components/page_info/page_info_ui.h"
  5. #include <utility>
  6. #include "base/command_line.h"
  7. #include "base/containers/span.h"
  8. #include "base/feature_list.h"
  9. #include "base/strings/utf_string_conversions.h"
  10. #include "build/build_config.h"
  11. #include "build/chromeos_buildflags.h"
  12. #include "components/omnibox/common/omnibox_features.h"
  13. #include "components/page_info/core/features.h"
  14. #include "components/page_info/page_info_ui_delegate.h"
  15. #include "components/permissions/features.h"
  16. #include "components/permissions/permission_decision_auto_blocker.h"
  17. #include "components/permissions/permission_manager.h"
  18. #include "components/permissions/permission_result.h"
  19. #include "components/permissions/permission_util.h"
  20. #include "components/prefs/pref_service.h"
  21. #include "components/safe_browsing/buildflags.h"
  22. #include "components/security_interstitials/core/common_string_util.h"
  23. #include "components/strings/grit/components_chromium_strings.h"
  24. #include "components/strings/grit/components_strings.h"
  25. #include "ppapi/buildflags/buildflags.h"
  26. #include "services/device/public/cpp/device_features.h"
  27. #include "ui/base/l10n/l10n_util.h"
  28. #include "url/gurl.h"
  29. #if BUILDFLAG(IS_ANDROID)
  30. #include "components/resources/android/theme_resources.h"
  31. #else
  32. #include "ui/gfx/color_palette.h"
  33. #include "ui/gfx/color_utils.h"
  34. #include "ui/native_theme/native_theme.h" // nogncheck
  35. #endif
  36. #if BUILDFLAG(FULL_SAFE_BROWSING)
  37. #include "components/safe_browsing/content/browser/password_protection/password_protection_service.h"
  38. #endif
  39. namespace {
  40. const int kInvalidResourceID = -1;
  41. // The resource IDs for the strings that are displayed on the permissions
  42. // button if the permission setting is managed by policy.
  43. const int kPermissionButtonTextIDPolicyManaged[] = {
  44. kInvalidResourceID,
  45. IDS_PAGE_INFO_PERMISSION_ALLOWED_BY_POLICY,
  46. IDS_PAGE_INFO_PERMISSION_BLOCKED_BY_POLICY,
  47. IDS_PAGE_INFO_PERMISSION_ASK_BY_POLICY,
  48. kInvalidResourceID,
  49. kInvalidResourceID};
  50. static_assert(std::size(kPermissionButtonTextIDPolicyManaged) ==
  51. CONTENT_SETTING_NUM_SETTINGS,
  52. "kPermissionButtonTextIDPolicyManaged array size is incorrect");
  53. // The resource IDs for the strings that are displayed on the permissions
  54. // button if the permission setting is managed by an extension.
  55. const int kPermissionButtonTextIDExtensionManaged[] = {
  56. kInvalidResourceID,
  57. IDS_PAGE_INFO_PERMISSION_ALLOWED_BY_EXTENSION,
  58. IDS_PAGE_INFO_PERMISSION_BLOCKED_BY_EXTENSION,
  59. IDS_PAGE_INFO_PERMISSION_ASK_BY_EXTENSION,
  60. kInvalidResourceID,
  61. kInvalidResourceID};
  62. static_assert(std::size(kPermissionButtonTextIDExtensionManaged) ==
  63. CONTENT_SETTING_NUM_SETTINGS,
  64. "kPermissionButtonTextIDExtensionManaged array size is "
  65. "incorrect");
  66. // The resource IDs for the strings that are displayed on the permissions
  67. // button if the permission setting is managed by the user.
  68. const int kPermissionButtonTextIDUserManaged[] = {
  69. kInvalidResourceID,
  70. IDS_PAGE_INFO_BUTTON_TEXT_ALLOWED_BY_USER,
  71. IDS_PAGE_INFO_BUTTON_TEXT_BLOCKED_BY_USER,
  72. IDS_PAGE_INFO_BUTTON_TEXT_ASK_BY_USER,
  73. kInvalidResourceID,
  74. IDS_PAGE_INFO_BUTTON_TEXT_DETECT_IMPORTANT_CONTENT_BY_USER};
  75. static_assert(std::size(kPermissionButtonTextIDUserManaged) ==
  76. CONTENT_SETTING_NUM_SETTINGS,
  77. "kPermissionButtonTextIDUserManaged array size is incorrect");
  78. // The resource IDs for the strings that are displayed on the permissions
  79. // button if the permission setting is the global default setting.
  80. const int kPermissionButtonTextIDDefaultSetting[] = {
  81. kInvalidResourceID,
  82. IDS_PAGE_INFO_BUTTON_TEXT_ALLOWED_BY_DEFAULT,
  83. IDS_PAGE_INFO_BUTTON_TEXT_BLOCKED_BY_DEFAULT,
  84. IDS_PAGE_INFO_BUTTON_TEXT_ASK_BY_DEFAULT,
  85. kInvalidResourceID,
  86. IDS_PAGE_INFO_BUTTON_TEXT_DETECT_IMPORTANT_CONTENT_BY_DEFAULT};
  87. static_assert(std::size(kPermissionButtonTextIDDefaultSetting) ==
  88. CONTENT_SETTING_NUM_SETTINGS,
  89. "kPermissionButtonTextIDDefaultSetting array size is incorrect");
  90. #if !BUILDFLAG(IS_ANDROID)
  91. // The resource IDs for the strings that are displayed on the sound permission
  92. // button if the sound permission setting is managed by the user.
  93. const int kSoundPermissionButtonTextIDUserManaged[] = {
  94. kInvalidResourceID,
  95. IDS_PAGE_INFO_BUTTON_TEXT_ALLOWED_BY_USER,
  96. IDS_PAGE_INFO_BUTTON_TEXT_MUTED_BY_USER,
  97. kInvalidResourceID,
  98. kInvalidResourceID,
  99. kInvalidResourceID};
  100. static_assert(
  101. std::size(kSoundPermissionButtonTextIDUserManaged) ==
  102. CONTENT_SETTING_NUM_SETTINGS,
  103. "kSoundPermissionButtonTextIDUserManaged array size is incorrect");
  104. // The resource IDs for the strings that are displayed on the sound permission
  105. // button if the permission setting is the global default setting and the
  106. // block autoplay preference is disabled.
  107. const int kSoundPermissionButtonTextIDDefaultSetting[] = {
  108. kInvalidResourceID,
  109. IDS_PAGE_INFO_BUTTON_TEXT_ALLOWED_BY_DEFAULT,
  110. IDS_PAGE_INFO_BUTTON_TEXT_MUTED_BY_DEFAULT,
  111. kInvalidResourceID,
  112. kInvalidResourceID,
  113. kInvalidResourceID};
  114. static_assert(
  115. std::size(kSoundPermissionButtonTextIDDefaultSetting) ==
  116. CONTENT_SETTING_NUM_SETTINGS,
  117. "kSoundPermissionButtonTextIDDefaultSetting array size is incorrect");
  118. #endif
  119. base::span<const PageInfoUI::PermissionUIInfo> GetContentSettingsUIInfo() {
  120. DCHECK(base::FeatureList::GetInstance() != nullptr);
  121. static const PageInfoUI::PermissionUIInfo kPermissionUIInfo[] = {
  122. {ContentSettingsType::COOKIES, IDS_SITE_SETTINGS_TYPE_COOKIES,
  123. IDS_SITE_SETTINGS_TYPE_COOKIES_MID_SENTENCE},
  124. {ContentSettingsType::JAVASCRIPT, IDS_SITE_SETTINGS_TYPE_JAVASCRIPT,
  125. IDS_SITE_SETTINGS_TYPE_JAVASCRIPT_MID_SENTENCE},
  126. {ContentSettingsType::POPUPS, IDS_SITE_SETTINGS_TYPE_POPUPS_REDIRECTS,
  127. IDS_SITE_SETTINGS_TYPE_POPUPS_REDIRECTS_MID_SENTENCE},
  128. {ContentSettingsType::GEOLOCATION, IDS_SITE_SETTINGS_TYPE_LOCATION,
  129. IDS_SITE_SETTINGS_TYPE_LOCATION_MID_SENTENCE},
  130. {ContentSettingsType::NOTIFICATIONS, IDS_SITE_SETTINGS_TYPE_NOTIFICATIONS,
  131. IDS_SITE_SETTINGS_TYPE_NOTIFICATIONS_MID_SENTENCE},
  132. {ContentSettingsType::MEDIASTREAM_MIC, IDS_SITE_SETTINGS_TYPE_MIC,
  133. IDS_SITE_SETTINGS_TYPE_MIC_MID_SENTENCE},
  134. {ContentSettingsType::MEDIASTREAM_CAMERA, IDS_SITE_SETTINGS_TYPE_CAMERA,
  135. IDS_SITE_SETTINGS_TYPE_CAMERA_MID_SENTENCE},
  136. {ContentSettingsType::AUTOMATIC_DOWNLOADS,
  137. IDS_SITE_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
  138. IDS_SITE_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS_MID_SENTENCE},
  139. {ContentSettingsType::MIDI_SYSEX, IDS_SITE_SETTINGS_TYPE_MIDI_SYSEX,
  140. IDS_SITE_SETTINGS_TYPE_MIDI_SYSEX_MID_SENTENCE},
  141. {ContentSettingsType::BACKGROUND_SYNC,
  142. IDS_SITE_SETTINGS_TYPE_BACKGROUND_SYNC,
  143. IDS_SITE_SETTINGS_TYPE_BACKGROUND_SYNC_MID_SENTENCE},
  144. #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
  145. {ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER,
  146. IDS_SITE_SETTINGS_TYPE_PROTECTED_MEDIA_ID,
  147. IDS_SITE_SETTINGS_TYPE_PROTECTED_MEDIA_ID_MID_SENTENCE},
  148. #endif
  149. {ContentSettingsType::ADS, IDS_SITE_SETTINGS_TYPE_ADS,
  150. IDS_SITE_SETTINGS_TYPE_ADS_MID_SENTENCE},
  151. {ContentSettingsType::SOUND, IDS_SITE_SETTINGS_TYPE_SOUND,
  152. IDS_SITE_SETTINGS_TYPE_SOUND_MID_SENTENCE},
  153. {ContentSettingsType::CLIPBOARD_READ_WRITE,
  154. IDS_SITE_SETTINGS_TYPE_CLIPBOARD,
  155. IDS_SITE_SETTINGS_TYPE_CLIPBOARD_MID_SENTENCE},
  156. {
  157. ContentSettingsType::SENSORS,
  158. base::FeatureList::IsEnabled(features::kGenericSensorExtraClasses)
  159. ? IDS_SITE_SETTINGS_TYPE_SENSORS
  160. : IDS_SITE_SETTINGS_TYPE_MOTION_SENSORS,
  161. base::FeatureList::IsEnabled(features::kGenericSensorExtraClasses)
  162. ? IDS_SITE_SETTINGS_TYPE_SENSORS_MID_SENTENCE
  163. : IDS_SITE_SETTINGS_TYPE_MOTION_SENSORS_MID_SENTENCE,
  164. },
  165. {ContentSettingsType::USB_GUARD, IDS_SITE_SETTINGS_TYPE_USB_DEVICES,
  166. IDS_SITE_SETTINGS_TYPE_USB_DEVICES_MID_SENTENCE},
  167. {ContentSettingsType::BLUETOOTH_GUARD,
  168. IDS_SITE_SETTINGS_TYPE_BLUETOOTH_DEVICES,
  169. IDS_SITE_SETTINGS_TYPE_BLUETOOTH_DEVICES_MID_SENTENCE},
  170. {ContentSettingsType::BLUETOOTH_SCANNING,
  171. IDS_SITE_SETTINGS_TYPE_BLUETOOTH_SCANNING,
  172. IDS_SITE_SETTINGS_TYPE_BLUETOOTH_SCANNING_MID_SENTENCE},
  173. {ContentSettingsType::NFC, IDS_SITE_SETTINGS_TYPE_NFC,
  174. IDS_SITE_SETTINGS_TYPE_NFC_MID_SENTENCE},
  175. {ContentSettingsType::VR, IDS_SITE_SETTINGS_TYPE_VR,
  176. IDS_SITE_SETTINGS_TYPE_VR_MID_SENTENCE},
  177. {ContentSettingsType::AR, IDS_SITE_SETTINGS_TYPE_AR,
  178. IDS_SITE_SETTINGS_TYPE_AR_MID_SENTENCE},
  179. {ContentSettingsType::CAMERA_PAN_TILT_ZOOM,
  180. IDS_SITE_SETTINGS_TYPE_CAMERA_PAN_TILT_ZOOM,
  181. IDS_SITE_SETTINGS_TYPE_CAMERA_PAN_TILT_ZOOM_MID_SENTENCE},
  182. {ContentSettingsType::FEDERATED_IDENTITY_API,
  183. IDS_SITE_SETTINGS_TYPE_FEDERATED_IDENTITY_API,
  184. IDS_SITE_SETTINGS_TYPE_FEDERATED_IDENTITY_API_MID_SENTENCE},
  185. {ContentSettingsType::IDLE_DETECTION, IDS_SITE_SETTINGS_TYPE_IDLE_DETECTION,
  186. IDS_SITE_SETTINGS_TYPE_IDLE_DETECTION_MID_SENTENCE},
  187. #if !BUILDFLAG(IS_ANDROID)
  188. // Page Info Permissions that are not defined in Android.
  189. {ContentSettingsType::FILE_SYSTEM_WRITE_GUARD,
  190. IDS_SITE_SETTINGS_TYPE_FILE_SYSTEM_ACCESS_WRITE,
  191. IDS_SITE_SETTINGS_TYPE_FILE_SYSTEM_ACCESS_WRITE_MID_SENTENCE},
  192. {ContentSettingsType::LOCAL_FONTS, IDS_SITE_SETTINGS_TYPE_FONT_ACCESS,
  193. IDS_SITE_SETTINGS_TYPE_FONT_ACCESS_MID_SENTENCE},
  194. {ContentSettingsType::HID_GUARD, IDS_SITE_SETTINGS_TYPE_HID_DEVICES,
  195. IDS_SITE_SETTINGS_TYPE_HID_DEVICES_MID_SENTENCE},
  196. {ContentSettingsType::IMAGES, IDS_SITE_SETTINGS_TYPE_IMAGES,
  197. IDS_SITE_SETTINGS_TYPE_IMAGES_MID_SENTENCE},
  198. {ContentSettingsType::SERIAL_GUARD, IDS_SITE_SETTINGS_TYPE_SERIAL_PORTS,
  199. IDS_SITE_SETTINGS_TYPE_SERIAL_PORTS_MID_SENTENCE},
  200. {ContentSettingsType::WINDOW_PLACEMENT,
  201. IDS_SITE_SETTINGS_TYPE_WINDOW_MANAGEMENT,
  202. IDS_SITE_SETTINGS_TYPE_WINDOW_MANAGEMENT_MID_SENTENCE},
  203. #endif
  204. };
  205. return kPermissionUIInfo;
  206. }
  207. std::unique_ptr<PageInfoUI::SecurityDescription> CreateSecurityDescription(
  208. PageInfoUI::SecuritySummaryColor style,
  209. int summary_id,
  210. int details_id,
  211. PageInfoUI::SecurityDescriptionType type) {
  212. auto security_description =
  213. std::make_unique<PageInfoUI::SecurityDescription>();
  214. security_description->summary_style = style;
  215. if (summary_id)
  216. security_description->summary = l10n_util::GetStringUTF16(summary_id);
  217. if (details_id)
  218. security_description->details = l10n_util::GetStringUTF16(details_id);
  219. security_description->type = type;
  220. return security_description;
  221. }
  222. std::unique_ptr<PageInfoUI::SecurityDescription>
  223. CreateSecurityDescriptionForSafetyTip(
  224. const security_state::SafetyTipStatus& safety_tip_status,
  225. const GURL& safe_url) {
  226. auto security_description =
  227. std::make_unique<PageInfoUI::SecurityDescription>();
  228. security_description->summary_style = PageInfoUI::SecuritySummaryColor::RED;
  229. if (safety_tip_status == security_state::SafetyTipStatus::kBadReputation ||
  230. safety_tip_status ==
  231. security_state::SafetyTipStatus::kBadReputationIgnored) {
  232. security_description->summary = l10n_util::GetStringUTF16(
  233. IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_TITLE);
  234. } else {
  235. const std::u16string safe_host =
  236. security_interstitials::common_string_util::GetFormattedHostName(
  237. safe_url);
  238. security_description->summary = l10n_util::GetStringFUTF16(
  239. IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_TITLE, safe_host);
  240. }
  241. security_description->details =
  242. l10n_util::GetStringUTF16(IDS_PAGE_INFO_SAFETY_TIP_DESCRIPTION);
  243. security_description->type = PageInfoUI::SecurityDescriptionType::SAFETY_TIP;
  244. return security_description;
  245. }
  246. // Gets the actual setting for a ContentSettingType, taking into account what
  247. // the default setting value is and whether Html5ByDefault is enabled.
  248. ContentSetting GetEffectiveSetting(ContentSettingsType type,
  249. ContentSetting setting,
  250. ContentSetting default_setting) {
  251. ContentSetting effective_setting = setting;
  252. if (effective_setting == CONTENT_SETTING_DEFAULT)
  253. effective_setting = default_setting;
  254. // Display the UI string for ASK instead of DETECT for Flash.
  255. // TODO(tommycli): Just migrate the actual content setting to ASK.
  256. if (effective_setting == CONTENT_SETTING_DETECT_IMPORTANT_CONTENT)
  257. effective_setting = CONTENT_SETTING_ASK;
  258. return effective_setting;
  259. }
  260. void SetTargetContentSetting(PageInfo::PermissionInfo& permission,
  261. ContentSetting target_setting) {
  262. // If content setting's default setting matches target setting, set
  263. // default setting to avoid crearing a site exception.
  264. permission.setting = permission.default_setting == target_setting
  265. ? CONTENT_SETTING_DEFAULT
  266. : target_setting;
  267. }
  268. void CreateOppositeToDefaultSiteException(
  269. PageInfo::PermissionInfo& permission,
  270. ContentSetting opposite_to_block_setting) {
  271. // For guard content settings opposite to block setting is ask, for the
  272. // rest opposite is allow.
  273. permission.setting = permission.default_setting == opposite_to_block_setting
  274. ? CONTENT_SETTING_BLOCK
  275. : opposite_to_block_setting;
  276. }
  277. std::u16string GetPermissionAskStateString(ContentSettingsType type) {
  278. int message_id = kInvalidResourceID;
  279. switch (type) {
  280. case ContentSettingsType::GEOLOCATION:
  281. message_id = IDS_PAGE_INFO_STATE_TEXT_LOCATION_ASK;
  282. break;
  283. case ContentSettingsType::NOTIFICATIONS:
  284. message_id = IDS_PAGE_INFO_STATE_TEXT_NOTIFICATIONS_ASK;
  285. break;
  286. case ContentSettingsType::MIDI_SYSEX:
  287. message_id = IDS_PAGE_INFO_STATE_TEXT_MIDI_ASK;
  288. break;
  289. case ContentSettingsType::MEDIASTREAM_CAMERA:
  290. message_id = IDS_PAGE_INFO_STATE_TEXT_CAMERA_ASK;
  291. break;
  292. case ContentSettingsType::CAMERA_PAN_TILT_ZOOM:
  293. message_id = IDS_PAGE_INFO_STATE_TEXT_CAMERA_PAN_TILT_ZOOM_ASK;
  294. break;
  295. case ContentSettingsType::MEDIASTREAM_MIC:
  296. message_id = IDS_PAGE_INFO_STATE_TEXT_MIC_ASK;
  297. break;
  298. case ContentSettingsType::CLIPBOARD_READ_WRITE:
  299. message_id = IDS_PAGE_INFO_STATE_TEXT_CLIPBOARD_ASK;
  300. break;
  301. case ContentSettingsType::AUTOMATIC_DOWNLOADS:
  302. message_id = IDS_PAGE_INFO_STATE_TEXT_AUTOMATIC_DOWNLOADS_ASK;
  303. break;
  304. case ContentSettingsType::VR:
  305. message_id = IDS_PAGE_INFO_STATE_TEXT_VR_ASK;
  306. break;
  307. case ContentSettingsType::AR:
  308. message_id = IDS_PAGE_INFO_STATE_TEXT_AR_ASK;
  309. break;
  310. case ContentSettingsType::WINDOW_PLACEMENT:
  311. message_id = IDS_PAGE_INFO_STATE_TEXT_WINDOW_MANAGEMENT_ASK;
  312. break;
  313. case ContentSettingsType::LOCAL_FONTS:
  314. message_id = IDS_PAGE_INFO_STATE_TEXT_FONT_ACCESS_ASK;
  315. break;
  316. case ContentSettingsType::IDLE_DETECTION:
  317. message_id = IDS_PAGE_INFO_STATE_TEXT_IDLE_DETECTION_ASK;
  318. break;
  319. // Guard content settings:
  320. case ContentSettingsType::USB_GUARD:
  321. message_id = IDS_PAGE_INFO_STATE_TEXT_USB_ASK;
  322. break;
  323. case ContentSettingsType::HID_GUARD:
  324. message_id = IDS_PAGE_INFO_STATE_TEXT_HID_DEVICES_ASK;
  325. break;
  326. case ContentSettingsType::SERIAL_GUARD:
  327. message_id = IDS_PAGE_INFO_STATE_TEXT_SERIAL_ASK;
  328. break;
  329. case ContentSettingsType::BLUETOOTH_GUARD:
  330. message_id = IDS_PAGE_INFO_STATE_TEXT_BLUETOOTH_DEVICES_ASK;
  331. break;
  332. case ContentSettingsType::BLUETOOTH_SCANNING:
  333. message_id = IDS_PAGE_INFO_STATE_TEXT_BLUETOOTH_SCANNING_ASK;
  334. break;
  335. case ContentSettingsType::FILE_SYSTEM_WRITE_GUARD:
  336. message_id = IDS_PAGE_INFO_STATE_TEXT_FILE_SYSTEM_WRITE_ASK;
  337. break;
  338. default:
  339. NOTREACHED();
  340. }
  341. if (message_id == kInvalidResourceID)
  342. return std::u16string();
  343. return l10n_util::GetStringUTF16(message_id);
  344. }
  345. } // namespace
  346. PageInfoUI::CookieInfo::CookieInfo() : allowed(-1), blocked(-1) {}
  347. PageInfoUI::CookiesNewInfo::CookiesNewInfo() = default;
  348. PageInfoUI::CookiesFPSInfo::CookiesFPSInfo() = default;
  349. PageInfoUI::CookiesFPSInfo::~CookiesFPSInfo() = default;
  350. PageInfoUI::ChosenObjectInfo::ChosenObjectInfo(
  351. const PageInfo::ChooserUIInfo& ui_info,
  352. std::unique_ptr<permissions::ObjectPermissionContextBase::Object>
  353. chooser_object)
  354. : ui_info(ui_info), chooser_object(std::move(chooser_object)) {}
  355. PageInfoUI::ChosenObjectInfo::~ChosenObjectInfo() = default;
  356. PageInfoUI::IdentityInfo::IdentityInfo()
  357. : identity_status(PageInfo::SITE_IDENTITY_STATUS_UNKNOWN),
  358. safe_browsing_status(PageInfo::SAFE_BROWSING_STATUS_NONE),
  359. safety_tip_info({security_state::SafetyTipStatus::kUnknown, GURL()}),
  360. connection_status(PageInfo::SITE_CONNECTION_STATUS_UNKNOWN),
  361. show_ssl_decision_revoke_button(false),
  362. show_change_password_buttons(false) {}
  363. PageInfoUI::IdentityInfo::~IdentityInfo() = default;
  364. PageInfoUI::PageFeatureInfo::PageFeatureInfo()
  365. : is_vr_presentation_in_headset(false) {}
  366. bool PageInfoUI::AdPersonalizationInfo::is_empty() const {
  367. return !has_joined_user_to_interest_group && accessed_topics.empty();
  368. }
  369. PageInfoUI::AdPersonalizationInfo::AdPersonalizationInfo() = default;
  370. PageInfoUI::AdPersonalizationInfo::~AdPersonalizationInfo() = default;
  371. std::unique_ptr<PageInfoUI::SecurityDescription>
  372. PageInfoUI::GetSecurityDescription(const IdentityInfo& identity_info) const {
  373. switch (identity_info.safe_browsing_status) {
  374. case PageInfo::SAFE_BROWSING_STATUS_NONE:
  375. break;
  376. case PageInfo::SAFE_BROWSING_STATUS_MALWARE:
  377. return CreateSecurityDescription(SecuritySummaryColor::RED,
  378. IDS_PAGE_INFO_MALWARE_SUMMARY,
  379. IDS_PAGE_INFO_MALWARE_DETAILS,
  380. SecurityDescriptionType::SAFE_BROWSING);
  381. case PageInfo::SAFE_BROWSING_STATUS_SOCIAL_ENGINEERING:
  382. return CreateSecurityDescription(SecuritySummaryColor::RED,
  383. IDS_PAGE_INFO_SOCIAL_ENGINEERING_SUMMARY,
  384. IDS_PAGE_INFO_SOCIAL_ENGINEERING_DETAILS,
  385. SecurityDescriptionType::SAFE_BROWSING);
  386. case PageInfo::SAFE_BROWSING_STATUS_UNWANTED_SOFTWARE:
  387. return CreateSecurityDescription(SecuritySummaryColor::RED,
  388. IDS_PAGE_INFO_UNWANTED_SOFTWARE_SUMMARY,
  389. IDS_PAGE_INFO_UNWANTED_SOFTWARE_DETAILS,
  390. SecurityDescriptionType::SAFE_BROWSING);
  391. case PageInfo::SAFE_BROWSING_STATUS_SAVED_PASSWORD_REUSE: {
  392. #if BUILDFLAG(FULL_SAFE_BROWSING)
  393. auto security_description = CreateSecurityDescription(
  394. SecuritySummaryColor::RED,
  395. IDS_PAGE_INFO_CHANGE_PASSWORD_SAVED_PASSWORD_SUMMARY, 0,
  396. SecurityDescriptionType::SAFE_BROWSING);
  397. security_description->details = identity_info.safe_browsing_details;
  398. return security_description;
  399. #endif
  400. NOTREACHED();
  401. break;
  402. }
  403. case PageInfo::SAFE_BROWSING_STATUS_SIGNED_IN_SYNC_PASSWORD_REUSE:
  404. case PageInfo::SAFE_BROWSING_STATUS_SIGNED_IN_NON_SYNC_PASSWORD_REUSE:
  405. case PageInfo::SAFE_BROWSING_STATUS_ENTERPRISE_PASSWORD_REUSE: {
  406. #if BUILDFLAG(FULL_SAFE_BROWSING)
  407. auto security_description = CreateSecurityDescription(
  408. SecuritySummaryColor::RED, IDS_PAGE_INFO_CHANGE_PASSWORD_SUMMARY, 0,
  409. SecurityDescriptionType::SAFE_BROWSING);
  410. security_description->details = identity_info.safe_browsing_details;
  411. return security_description;
  412. #endif
  413. NOTREACHED();
  414. break;
  415. }
  416. case PageInfo::SAFE_BROWSING_STATUS_BILLING:
  417. return CreateSecurityDescription(SecuritySummaryColor::RED,
  418. IDS_PAGE_INFO_BILLING_SUMMARY,
  419. IDS_PAGE_INFO_BILLING_DETAILS,
  420. SecurityDescriptionType::SAFE_BROWSING);
  421. }
  422. std::unique_ptr<SecurityDescription> safety_tip_security_desc =
  423. CreateSafetyTipSecurityDescription(identity_info.safety_tip_info);
  424. if (safety_tip_security_desc) {
  425. return safety_tip_security_desc;
  426. }
  427. switch (identity_info.identity_status) {
  428. #if BUILDFLAG(IS_ANDROID)
  429. case PageInfo::SITE_IDENTITY_STATUS_INTERNAL_PAGE:
  430. return CreateSecurityDescription(SecuritySummaryColor::GREEN, 0,
  431. IDS_PAGE_INFO_INTERNAL_PAGE,
  432. SecurityDescriptionType::INTERNAL);
  433. case PageInfo::SITE_IDENTITY_STATUS_EV_CERT:
  434. case PageInfo::SITE_IDENTITY_STATUS_CERT:
  435. case PageInfo::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT:
  436. switch (identity_info.connection_status) {
  437. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_ACTIVE_SUBRESOURCE:
  438. return CreateSecurityDescription(
  439. SecuritySummaryColor::RED, IDS_PAGE_INFO_NOT_SECURE_SUMMARY_SHORT,
  440. IDS_PAGE_INFO_NOT_SECURE_DETAILS,
  441. SecurityDescriptionType::CONNECTION);
  442. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_FORM_ACTION:
  443. return CreateSecurityDescription(
  444. SecuritySummaryColor::RED,
  445. IDS_PAGE_INFO_MIXED_CONTENT_SUMMARY_SHORT,
  446. IDS_PAGE_INFO_NOT_SECURE_DETAILS,
  447. SecurityDescriptionType::CONNECTION);
  448. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_PASSIVE_SUBRESOURCE:
  449. return CreateSecurityDescription(
  450. SecuritySummaryColor::RED,
  451. IDS_PAGE_INFO_MIXED_CONTENT_SUMMARY_SHORT,
  452. IDS_PAGE_INFO_MIXED_CONTENT_DETAILS,
  453. SecurityDescriptionType::CONNECTION);
  454. default:
  455. // Do not show details for secure connections.
  456. return CreateSecurityDescription(SecuritySummaryColor::GREEN,
  457. IDS_PAGE_INFO_SECURE_SUMMARY, 0,
  458. SecurityDescriptionType::CONNECTION);
  459. }
  460. case PageInfo::SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM:
  461. case PageInfo::SITE_IDENTITY_STATUS_UNKNOWN:
  462. case PageInfo::SITE_IDENTITY_STATUS_NO_CERT:
  463. default:
  464. return CreateSecurityDescription(SecuritySummaryColor::RED,
  465. IDS_PAGE_INFO_NOT_SECURE_SUMMARY_SHORT,
  466. IDS_PAGE_INFO_NOT_SECURE_DETAILS,
  467. SecurityDescriptionType::CONNECTION);
  468. #else
  469. case PageInfo::SITE_IDENTITY_STATUS_INTERNAL_PAGE:
  470. // Internal pages on desktop have their own UI implementations which
  471. // should never call this function.
  472. NOTREACHED();
  473. [[fallthrough]];
  474. case PageInfo::SITE_IDENTITY_STATUS_EV_CERT:
  475. case PageInfo::SITE_IDENTITY_STATUS_CERT:
  476. case PageInfo::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT:
  477. switch (identity_info.connection_status) {
  478. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_ACTIVE_SUBRESOURCE:
  479. return CreateSecurityDescription(SecuritySummaryColor::RED,
  480. IDS_PAGE_INFO_NOT_SECURE_SUMMARY,
  481. IDS_PAGE_INFO_NOT_SECURE_DETAILS,
  482. SecurityDescriptionType::CONNECTION);
  483. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_FORM_ACTION:
  484. return CreateSecurityDescription(SecuritySummaryColor::RED,
  485. IDS_PAGE_INFO_MIXED_CONTENT_SUMMARY,
  486. IDS_PAGE_INFO_NOT_SECURE_DETAILS,
  487. SecurityDescriptionType::CONNECTION);
  488. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_PASSIVE_SUBRESOURCE:
  489. return CreateSecurityDescription(SecuritySummaryColor::RED,
  490. IDS_PAGE_INFO_MIXED_CONTENT_SUMMARY,
  491. IDS_PAGE_INFO_MIXED_CONTENT_DETAILS,
  492. SecurityDescriptionType::CONNECTION);
  493. default:
  494. auto description = CreateSecurityDescription(
  495. SecuritySummaryColor::GREEN, IDS_PAGE_INFO_SECURE_SUMMARY,
  496. base::FeatureList::IsEnabled(
  497. omnibox::kUpdatedConnectionSecurityIndicators)
  498. ? IDS_PAGE_INFO_SECURE_DETAILS_V2
  499. : IDS_PAGE_INFO_SECURE_DETAILS,
  500. SecurityDescriptionType::CONNECTION);
  501. if (identity_info.identity_status ==
  502. PageInfo::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT) {
  503. description->details = l10n_util::GetStringFUTF16(
  504. IDS_PAGE_INFO_ADMIN_PROVIDED_CERT_DETAILS,
  505. base::UTF8ToUTF16(identity_info.site_identity));
  506. }
  507. return description;
  508. }
  509. case PageInfo::SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM:
  510. case PageInfo::SITE_IDENTITY_STATUS_UNKNOWN:
  511. case PageInfo::SITE_IDENTITY_STATUS_NO_CERT:
  512. default:
  513. return CreateSecurityDescription(SecuritySummaryColor::RED,
  514. IDS_PAGE_INFO_NOT_SECURE_SUMMARY,
  515. IDS_PAGE_INFO_NOT_SECURE_DETAILS,
  516. SecurityDescriptionType::CONNECTION);
  517. #endif
  518. }
  519. }
  520. PageInfoUI::~PageInfoUI() = default;
  521. // static
  522. std::u16string PageInfoUI::PermissionTypeToUIString(ContentSettingsType type) {
  523. for (const PermissionUIInfo& info : GetContentSettingsUIInfo()) {
  524. if (info.type == type)
  525. return l10n_util::GetStringUTF16(info.string_id);
  526. }
  527. NOTREACHED();
  528. return std::u16string();
  529. }
  530. // static
  531. std::u16string PageInfoUI::PermissionTypeToUIStringMidSentence(
  532. ContentSettingsType type) {
  533. for (const PermissionUIInfo& info : GetContentSettingsUIInfo()) {
  534. if (info.type == type)
  535. return l10n_util::GetStringUTF16(info.string_id_mid_sentence);
  536. }
  537. NOTREACHED();
  538. return std::u16string();
  539. }
  540. // static
  541. base::span<const PageInfoUI::PermissionUIInfo>
  542. PageInfoUI::GetContentSettingsUIInfoForTesting() {
  543. return GetContentSettingsUIInfo();
  544. }
  545. // static
  546. std::u16string PageInfoUI::PermissionActionToUIString(
  547. PageInfoUiDelegate* delegate,
  548. ContentSettingsType type,
  549. ContentSetting setting,
  550. ContentSetting default_setting,
  551. content_settings::SettingSource source,
  552. bool is_one_time) {
  553. ContentSetting effective_setting =
  554. GetEffectiveSetting(type, setting, default_setting);
  555. const int* button_text_ids = nullptr;
  556. switch (source) {
  557. case content_settings::SETTING_SOURCE_USER:
  558. if (setting == CONTENT_SETTING_DEFAULT) {
  559. #if !BUILDFLAG(IS_ANDROID)
  560. if (type == ContentSettingsType::SOUND) {
  561. // If the block autoplay enabled preference is enabled and the
  562. // sound default setting is ALLOW, we will return a custom string
  563. // indicating that Chrome is controlling autoplay and sound
  564. // automatically.
  565. if (delegate->IsBlockAutoPlayEnabled() &&
  566. effective_setting == ContentSetting::CONTENT_SETTING_ALLOW) {
  567. return l10n_util::GetStringUTF16(
  568. IDS_PAGE_INFO_BUTTON_TEXT_AUTOMATIC_BY_DEFAULT);
  569. }
  570. button_text_ids = kSoundPermissionButtonTextIDDefaultSetting;
  571. break;
  572. }
  573. #endif
  574. button_text_ids = kPermissionButtonTextIDDefaultSetting;
  575. break;
  576. }
  577. [[fallthrough]];
  578. case content_settings::SETTING_SOURCE_POLICY:
  579. case content_settings::SETTING_SOURCE_EXTENSION:
  580. #if !BUILDFLAG(IS_ANDROID)
  581. if (type == ContentSettingsType::SOUND) {
  582. button_text_ids = kSoundPermissionButtonTextIDUserManaged;
  583. break;
  584. }
  585. #endif
  586. button_text_ids = kPermissionButtonTextIDUserManaged;
  587. break;
  588. case content_settings::SETTING_SOURCE_ALLOWLIST:
  589. case content_settings::SETTING_SOURCE_NONE:
  590. default:
  591. NOTREACHED();
  592. return std::u16string();
  593. }
  594. int button_text_id = button_text_ids[effective_setting];
  595. if (is_one_time) {
  596. DCHECK_EQ(source, content_settings::SETTING_SOURCE_USER);
  597. DCHECK_EQ(type, ContentSettingsType::GEOLOCATION);
  598. DCHECK_EQ(button_text_id, IDS_PAGE_INFO_BUTTON_TEXT_ALLOWED_BY_USER);
  599. button_text_id = IDS_PAGE_INFO_BUTTON_TEXT_ALLOWED_ONCE_BY_USER;
  600. }
  601. DCHECK_NE(button_text_id, kInvalidResourceID);
  602. return l10n_util::GetStringUTF16(button_text_id);
  603. }
  604. // static
  605. std::u16string PageInfoUI::PermissionStateToUIString(
  606. PageInfoUiDelegate* delegate,
  607. const PageInfo::PermissionInfo& permission) {
  608. int message_id = kInvalidResourceID;
  609. ContentSetting effective_setting = GetEffectiveSetting(
  610. permission.type, permission.setting, permission.default_setting);
  611. switch (effective_setting) {
  612. case CONTENT_SETTING_ALLOW:
  613. #if !BUILDFLAG(IS_ANDROID)
  614. if (permission.type == ContentSettingsType::SOUND &&
  615. delegate->IsBlockAutoPlayEnabled() &&
  616. permission.setting == CONTENT_SETTING_DEFAULT) {
  617. message_id = IDS_PAGE_INFO_BUTTON_TEXT_AUTOMATIC_BY_DEFAULT;
  618. break;
  619. }
  620. #endif
  621. if (permission.setting == CONTENT_SETTING_DEFAULT) {
  622. message_id = IDS_PAGE_INFO_STATE_TEXT_ALLOWED_BY_DEFAULT;
  623. #if !BUILDFLAG(IS_ANDROID)
  624. } else if (permission.is_one_time) {
  625. DCHECK_EQ(permission.source, content_settings::SETTING_SOURCE_USER);
  626. DCHECK(permissions::PermissionUtil::CanPermissionBeAllowedOnce(
  627. permission.type));
  628. message_id = delegate->IsMultipleTabsOpen()
  629. ? IDS_PAGE_INFO_STATE_TEXT_ALLOWED_ONCE_MULTIPLE_TAB
  630. : IDS_PAGE_INFO_STATE_TEXT_ALLOWED_ONCE_ONE_TAB;
  631. #endif
  632. } else {
  633. message_id = IDS_PAGE_INFO_STATE_TEXT_ALLOWED;
  634. }
  635. break;
  636. case CONTENT_SETTING_BLOCK:
  637. if (permission.setting == CONTENT_SETTING_DEFAULT) {
  638. #if !BUILDFLAG(IS_ANDROID)
  639. if (permission.type == ContentSettingsType::SOUND) {
  640. message_id = IDS_PAGE_INFO_BUTTON_TEXT_MUTED_BY_DEFAULT;
  641. break;
  642. }
  643. #endif
  644. message_id = IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED_BY_DEFAULT;
  645. } else {
  646. #if !BUILDFLAG(IS_ANDROID)
  647. if (permission.type == ContentSettingsType::SOUND) {
  648. message_id = IDS_PAGE_INFO_STATE_TEXT_MUTED;
  649. break;
  650. }
  651. #endif
  652. message_id = IDS_PAGE_INFO_STATE_TEXT_NOT_ALLOWED;
  653. }
  654. break;
  655. case CONTENT_SETTING_ASK:
  656. return GetPermissionAskStateString(permission.type);
  657. default:
  658. NOTREACHED();
  659. }
  660. return l10n_util::GetStringUTF16(message_id);
  661. }
  662. // static
  663. std::u16string PageInfoUI::PermissionMainPageStateToUIString(
  664. PageInfoUiDelegate* delegate,
  665. const PageInfo::PermissionInfo& permission) {
  666. std::u16string auto_blocked_text =
  667. PermissionAutoBlockedToUIString(delegate, permission);
  668. if (!auto_blocked_text.empty())
  669. return auto_blocked_text;
  670. if (permission.is_one_time || permission.setting == CONTENT_SETTING_DEFAULT ||
  671. permission.setting == CONTENT_SETTING_ASK) {
  672. return PermissionStateToUIString(delegate, permission);
  673. }
  674. return std::u16string();
  675. }
  676. // static
  677. std::u16string PageInfoUI::PermissionManagedTooltipToUIString(
  678. PageInfoUiDelegate* delegate,
  679. const PageInfo::PermissionInfo& permission) {
  680. int message_id = kInvalidResourceID;
  681. switch (permission.source) {
  682. case content_settings::SettingSource::SETTING_SOURCE_POLICY:
  683. message_id = IDS_PAGE_INFO_PERMISSION_MANAGED_BY_POLICY;
  684. break;
  685. case content_settings::SettingSource::SETTING_SOURCE_EXTENSION:
  686. // TODO(crbug.com/1225563): Consider "enforced" instead of "managed".
  687. message_id = IDS_PAGE_INFO_PERMISSION_MANAGED_BY_EXTENSION;
  688. break;
  689. default:
  690. break;
  691. }
  692. if (message_id == kInvalidResourceID)
  693. return std::u16string();
  694. return l10n_util::GetStringUTF16(message_id);
  695. }
  696. // static
  697. std::u16string PageInfoUI::PermissionAutoBlockedToUIString(
  698. PageInfoUiDelegate* delegate,
  699. const PageInfo::PermissionInfo& permission) {
  700. int message_id = kInvalidResourceID;
  701. // TODO(crbug.com/1063023): PageInfo::PermissionInfo should be modified
  702. // to contain all needed information regarding Automatically Blocked flag.
  703. if (permission.setting == CONTENT_SETTING_BLOCK &&
  704. permissions::PermissionDecisionAutoBlocker::IsEnabledForContentSetting(
  705. permission.type)) {
  706. permissions::PermissionResult permission_result(
  707. CONTENT_SETTING_DEFAULT,
  708. permissions::PermissionStatusSource::UNSPECIFIED);
  709. if (permissions::PermissionUtil::IsPermission(permission.type)) {
  710. blink::PermissionType permission_type =
  711. permissions::PermissionUtil::ContentSettingTypeToPermissionType(
  712. permission.type);
  713. permission_result = delegate->GetPermissionResult(permission_type);
  714. } else if (permission.type == ContentSettingsType::FEDERATED_IDENTITY_API) {
  715. absl::optional<permissions::PermissionResult> embargo_result =
  716. delegate->GetEmbargoResult(permission.type);
  717. if (embargo_result)
  718. permission_result = *embargo_result;
  719. }
  720. switch (permission_result.source) {
  721. case permissions::PermissionStatusSource::MULTIPLE_DISMISSALS:
  722. message_id = IDS_PAGE_INFO_PERMISSION_AUTOMATICALLY_BLOCKED;
  723. break;
  724. case permissions::PermissionStatusSource::MULTIPLE_IGNORES:
  725. message_id = IDS_PAGE_INFO_PERMISSION_AUTOMATICALLY_BLOCKED;
  726. break;
  727. default:
  728. break;
  729. }
  730. }
  731. if (message_id == kInvalidResourceID)
  732. return std::u16string();
  733. return l10n_util::GetStringUTF16(message_id);
  734. }
  735. // static
  736. void PageInfoUI::ToggleBetweenAllowAndBlock(
  737. PageInfo::PermissionInfo& permission) {
  738. auto opposite_to_block_setting =
  739. permissions::PermissionUtil::IsGuardContentSetting(permission.type)
  740. ? CONTENT_SETTING_ASK
  741. : CONTENT_SETTING_ALLOW;
  742. switch (permission.setting) {
  743. case CONTENT_SETTING_ALLOW:
  744. DCHECK_EQ(opposite_to_block_setting, CONTENT_SETTING_ALLOW);
  745. if (permission.is_one_time) {
  746. permission.setting = CONTENT_SETTING_DEFAULT;
  747. } else {
  748. SetTargetContentSetting(permission, CONTENT_SETTING_BLOCK);
  749. }
  750. permission.is_one_time = false;
  751. break;
  752. case CONTENT_SETTING_BLOCK:
  753. SetTargetContentSetting(permission, opposite_to_block_setting);
  754. permission.is_one_time = false;
  755. break;
  756. case CONTENT_SETTING_DEFAULT: {
  757. CreateOppositeToDefaultSiteException(permission,
  758. opposite_to_block_setting);
  759. // If one-time permissions are supported, permission should go from
  760. // default state to allow once state, not directly to allow.
  761. if (permissions::PermissionUtil::CanPermissionBeAllowedOnce(
  762. permission.type)) {
  763. permission.is_one_time = true;
  764. }
  765. break;
  766. }
  767. case CONTENT_SETTING_ASK:
  768. DCHECK_EQ(opposite_to_block_setting, CONTENT_SETTING_ASK);
  769. SetTargetContentSetting(permission, CONTENT_SETTING_BLOCK);
  770. break;
  771. default:
  772. NOTREACHED();
  773. break;
  774. }
  775. }
  776. // static
  777. void PageInfoUI::ToggleBetweenRememberAndForget(
  778. PageInfo::PermissionInfo& permission) {
  779. DCHECK(permissions::PermissionUtil::IsPermission(permission.type));
  780. switch (permission.setting) {
  781. case CONTENT_SETTING_ALLOW: {
  782. // If one-time permissions are supported, toggle is_one_time.
  783. // Otherwise, go directly to default.
  784. if (permissions::PermissionUtil::CanPermissionBeAllowedOnce(
  785. permission.type)) {
  786. permission.is_one_time = !permission.is_one_time;
  787. } else {
  788. permission.setting = CONTENT_SETTING_DEFAULT;
  789. }
  790. break;
  791. }
  792. case CONTENT_SETTING_BLOCK:
  793. // TODO(olesiamarukhno): If content setting is in the blocklist, setting
  794. // it to default, doesn't do anything. Fix this before introducing
  795. // subpages for content settings (not permissions).
  796. permission.setting = CONTENT_SETTING_DEFAULT;
  797. permission.is_one_time = false;
  798. break;
  799. case CONTENT_SETTING_DEFAULT:
  800. // When user checks the checkbox to remember the permission setting,
  801. // it should go to the "allow" state, only if default setting is
  802. // explicitly allow.
  803. if (permission.default_setting == CONTENT_SETTING_ALLOW) {
  804. permission.setting = CONTENT_SETTING_ALLOW;
  805. } else {
  806. permission.setting = CONTENT_SETTING_BLOCK;
  807. }
  808. break;
  809. default:
  810. NOTREACHED();
  811. break;
  812. }
  813. }
  814. // static
  815. bool PageInfoUI::IsToggleOn(const PageInfo::PermissionInfo& permission) {
  816. ContentSetting effective_setting = GetEffectiveSetting(
  817. permission.type, permission.setting, permission.default_setting);
  818. return permissions::PermissionUtil::IsGuardContentSetting(permission.type)
  819. ? effective_setting == CONTENT_SETTING_ASK
  820. : effective_setting == CONTENT_SETTING_ALLOW;
  821. }
  822. // static
  823. SkColor PageInfoUI::GetSecondaryTextColor() {
  824. return SK_ColorGRAY;
  825. }
  826. #if BUILDFLAG(IS_ANDROID)
  827. // static
  828. int PageInfoUI::GetIdentityIconID(PageInfo::SiteIdentityStatus status) {
  829. switch (status) {
  830. case PageInfo::SITE_IDENTITY_STATUS_UNKNOWN:
  831. case PageInfo::SITE_IDENTITY_STATUS_INTERNAL_PAGE:
  832. case PageInfo::SITE_IDENTITY_STATUS_CERT:
  833. case PageInfo::SITE_IDENTITY_STATUS_EV_CERT:
  834. return IDR_PAGEINFO_GOOD;
  835. case PageInfo::SITE_IDENTITY_STATUS_NO_CERT:
  836. case PageInfo::SITE_IDENTITY_STATUS_ERROR:
  837. case PageInfo::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT:
  838. case PageInfo::SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM:
  839. return IDR_PAGEINFO_BAD;
  840. }
  841. return 0;
  842. }
  843. // static
  844. int PageInfoUI::GetConnectionIconID(PageInfo::SiteConnectionStatus status) {
  845. switch (status) {
  846. case PageInfo::SITE_CONNECTION_STATUS_UNKNOWN:
  847. case PageInfo::SITE_CONNECTION_STATUS_INTERNAL_PAGE:
  848. case PageInfo::SITE_CONNECTION_STATUS_ENCRYPTED:
  849. return IDR_PAGEINFO_GOOD;
  850. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_PASSIVE_SUBRESOURCE:
  851. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_FORM_ACTION:
  852. case PageInfo::SITE_CONNECTION_STATUS_UNENCRYPTED:
  853. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_ACTIVE_SUBRESOURCE:
  854. case PageInfo::SITE_CONNECTION_STATUS_ENCRYPTED_ERROR:
  855. return IDR_PAGEINFO_BAD;
  856. }
  857. return 0;
  858. }
  859. int PageInfoUI::GetIdentityIconColorID(PageInfo::SiteIdentityStatus status) {
  860. switch (status) {
  861. case PageInfo::SITE_IDENTITY_STATUS_UNKNOWN:
  862. case PageInfo::SITE_IDENTITY_STATUS_INTERNAL_PAGE:
  863. case PageInfo::SITE_IDENTITY_STATUS_CERT:
  864. case PageInfo::SITE_IDENTITY_STATUS_EV_CERT:
  865. return IDR_PAGEINFO_GOOD_COLOR;
  866. case PageInfo::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT:
  867. case PageInfo::SITE_IDENTITY_STATUS_NO_CERT:
  868. case PageInfo::SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM:
  869. return IDR_PAGEINFO_WARNING_COLOR;
  870. case PageInfo::SITE_IDENTITY_STATUS_ERROR:
  871. return IDR_PAGEINFO_BAD_COLOR;
  872. }
  873. return 0;
  874. }
  875. int PageInfoUI::GetConnectionIconColorID(
  876. PageInfo::SiteConnectionStatus status) {
  877. switch (status) {
  878. case PageInfo::SITE_CONNECTION_STATUS_UNKNOWN:
  879. case PageInfo::SITE_CONNECTION_STATUS_INTERNAL_PAGE:
  880. case PageInfo::SITE_CONNECTION_STATUS_ENCRYPTED:
  881. return IDR_PAGEINFO_GOOD_COLOR;
  882. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_PASSIVE_SUBRESOURCE:
  883. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_FORM_ACTION:
  884. case PageInfo::SITE_CONNECTION_STATUS_UNENCRYPTED:
  885. return IDR_PAGEINFO_WARNING_COLOR;
  886. case PageInfo::SITE_CONNECTION_STATUS_INSECURE_ACTIVE_SUBRESOURCE:
  887. case PageInfo::SITE_CONNECTION_STATUS_ENCRYPTED_ERROR:
  888. return IDR_PAGEINFO_BAD_COLOR;
  889. }
  890. return 0;
  891. }
  892. #endif // BUILDFLAG(IS_ANDROID)
  893. // static
  894. bool PageInfoUI::ContentSettingsTypeInPageInfo(ContentSettingsType type) {
  895. for (const PermissionUIInfo& info : GetContentSettingsUIInfo()) {
  896. if (info.type == type)
  897. return true;
  898. }
  899. return false;
  900. }
  901. // static
  902. std::unique_ptr<PageInfoUI::SecurityDescription>
  903. PageInfoUI::CreateSafetyTipSecurityDescription(
  904. const security_state::SafetyTipInfo& info) {
  905. switch (info.status) {
  906. case security_state::SafetyTipStatus::kBadReputation:
  907. case security_state::SafetyTipStatus::kBadReputationIgnored:
  908. case security_state::SafetyTipStatus::kLookalike:
  909. case security_state::SafetyTipStatus::kLookalikeIgnored:
  910. return CreateSecurityDescriptionForSafetyTip(info.status, info.safe_url);
  911. case security_state::SafetyTipStatus::kBadKeyword:
  912. // Keyword safety tips are only used to collect metrics for now and are
  913. // not visible to the user, so don't affect Page Info.
  914. break;
  915. case security_state::SafetyTipStatus::kDigitalAssetLinkMatch:
  916. case security_state::SafetyTipStatus::kNone:
  917. case security_state::SafetyTipStatus::kUnknown:
  918. break;
  919. }
  920. return nullptr;
  921. }