Chromium Code Reviews| Index: chrome/common/extensions/permissions/chrome_permission_message_provider.cc |
| diff --git a/chrome/common/extensions/permissions/chrome_permission_message_provider.cc b/chrome/common/extensions/permissions/chrome_permission_message_provider.cc |
| index 8605b578ca2425e2b74a1f7c79923232192aa059..a8afd6786d84055064b03824ece90fc91c99e8bb 100644 |
| --- a/chrome/common/extensions/permissions/chrome_permission_message_provider.cc |
| +++ b/chrome/common/extensions/permissions/chrome_permission_message_provider.cc |
| @@ -136,7 +136,8 @@ PermissionMessages ChromePermissionMessageProvider::GetPermissionMessages( |
| PermissionMsgSet host_msgs = |
| GetHostPermissionMessages(permissions, NULL, extension_type); |
| - PermissionMsgSet api_msgs = GetAPIPermissionMessages(permissions, NULL); |
| + PermissionMsgSet api_msgs = |
| + GetAPIPermissionMessages(permissions, NULL, extension_type); |
| PermissionMsgSet manifest_permission_msgs = |
| GetManifestPermissionMessages(permissions, NULL); |
| messages.insert(messages.end(), host_msgs.begin(), host_msgs.end()); |
| @@ -189,105 +190,11 @@ std::vector<base::string16> ChromePermissionMessageProvider::GetWarningMessages( |
| const PermissionSet* permissions, |
| Manifest::Type extension_type) const { |
| std::vector<base::string16> message_strings; |
| - PermissionMessages messages = |
| - GetPermissionMessages(permissions, extension_type); |
| - |
| - // WARNING: When modifying a coalescing rule in this list, be sure to also |
| - // modify the corresponding rule in |
| - // ChromePermissionMessageProvider::GetCoalescedPermissionMessages(). |
| - // TODO(sashab): Deprecate this function, and remove this list. |
| - for (PermissionMessages::const_iterator i = messages.begin(); |
| - i != messages.end(); ++i) { |
| - int id = i->id(); |
| - // Access to users' devices should provide a single warning message |
| - // specifying the transport method used; serial and/or Bluetooth. |
| - if (id == PermissionMessage::kBluetooth || |
| - id == PermissionMessage::kSerial) { |
| - if (ContainsMessages(messages, |
| - PermissionMessage::kBluetooth, |
| - PermissionMessage::kSerial)) { |
| - if (id == PermissionMessage::kBluetooth) { |
| - message_strings.push_back(l10n_util::GetStringUTF16( |
| - IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL)); |
| - } |
| - continue; |
| - } |
| - } |
| - if (id == PermissionMessage::kAccessibilityFeaturesModify || |
| - id == PermissionMessage::kAccessibilityFeaturesRead) { |
| - if (ContainsMessages(messages, |
| - PermissionMessage::kAccessibilityFeaturesModify, |
| - PermissionMessage::kAccessibilityFeaturesRead)) { |
| - if (id == PermissionMessage::kAccessibilityFeaturesModify) { |
| - message_strings.push_back(l10n_util::GetStringUTF16( |
| - IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ_MODIFY)); |
| - } |
| - continue; |
| - } |
| - } |
| - if (id == PermissionMessage::kAudioCapture || |
| - id == PermissionMessage::kVideoCapture) { |
| - if (ContainsMessages(messages, |
| - PermissionMessage::kAudioCapture, |
| - PermissionMessage::kVideoCapture)) { |
| - if (id == PermissionMessage::kAudioCapture) { |
| - message_strings.push_back(l10n_util::GetStringUTF16( |
| - IDS_EXTENSION_PROMPT_WARNING_AUDIO_AND_VIDEO_CAPTURE)); |
| - } |
| - continue; |
| - } |
| - } |
| - if (id == PermissionMessage::kMediaGalleriesAllGalleriesCopyTo || |
| - id == PermissionMessage::kMediaGalleriesAllGalleriesDelete || |
| - id == PermissionMessage::kMediaGalleriesAllGalleriesRead) { |
| - if (ContainsMessages( |
| - messages, |
| - PermissionMessage::kMediaGalleriesAllGalleriesCopyTo, |
| - PermissionMessage::kMediaGalleriesAllGalleriesDelete, |
| - PermissionMessage::kMediaGalleriesAllGalleriesRead)) { |
| - if (id == PermissionMessage::kMediaGalleriesAllGalleriesCopyTo) { |
| - message_strings.push_back(l10n_util::GetStringUTF16( |
| - IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_WRITE_DELETE)); |
| - } |
| - continue; |
| - } |
| - if (ContainsMessages( |
| - messages, |
| - PermissionMessage::kMediaGalleriesAllGalleriesCopyTo, |
| - PermissionMessage::kMediaGalleriesAllGalleriesRead)) { |
| - if (id == PermissionMessage::kMediaGalleriesAllGalleriesCopyTo) { |
| - message_strings.push_back(l10n_util::GetStringUTF16( |
| - IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_WRITE)); |
| - } |
| - continue; |
| - } |
| - if (ContainsMessages( |
| - messages, |
| - PermissionMessage::kMediaGalleriesAllGalleriesDelete, |
| - PermissionMessage::kMediaGalleriesAllGalleriesRead)) { |
| - if (id == PermissionMessage::kMediaGalleriesAllGalleriesDelete) { |
| - message_strings.push_back(l10n_util::GetStringUTF16( |
| - IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_DELETE)); |
| - } |
| - continue; |
| - } |
| - } |
| - if (permissions->HasAPIPermission(APIPermission::kSessions) && |
| - id == PermissionMessage::kTabs) { |
| - message_strings.push_back(l10n_util::GetStringUTF16( |
| - IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS)); |
| - continue; |
| - } |
| - if (permissions->HasAPIPermission(APIPermission::kSessions) && |
| - id == PermissionMessage::kBrowsingHistory) { |
| - message_strings.push_back(l10n_util::GetStringUTF16( |
| - IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS)); |
| - continue; |
| - } |
| - |
| - message_strings.push_back(i->message()); |
| - } |
| - |
| + std::vector<base::string16> message_details_strings; |
| + CoalesceWarningMessages(permissions, |
| + extension_type, |
| + &message_strings, |
| + &message_details_strings); |
| return message_strings; |
| } |
| @@ -296,14 +203,12 @@ ChromePermissionMessageProvider::GetWarningMessagesDetails( |
| const PermissionSet* permissions, |
| Manifest::Type extension_type) const { |
| std::vector<base::string16> message_strings; |
| - PermissionMessages messages = |
| - GetPermissionMessages(permissions, extension_type); |
| - |
| - for (PermissionMessages::const_iterator i = messages.begin(); |
| - i != messages.end(); ++i) |
| - message_strings.push_back(i->details()); |
| - |
| - return message_strings; |
| + std::vector<base::string16> message_details_strings; |
| + CoalesceWarningMessages(permissions, |
|
Marc Treib
2015/03/09 14:08:02
Before, we'd coalesce the warnings, but not their
Yoyo Zhou
2015/03/11 01:33:23
Is there a test for this case?
Marc Treib
2015/03/11 13:08:52
Not yet. I'll pull this part out into a separate C
|
| + extension_type, |
| + &message_strings, |
| + &message_details_strings); |
| + return message_details_strings; |
| } |
| bool ChromePermissionMessageProvider::IsPrivilegeIncrease( |
| @@ -321,7 +226,7 @@ bool ChromePermissionMessageProvider::IsPrivilegeIncrease( |
| if (IsHostPrivilegeIncrease(old_permissions, new_permissions, extension_type)) |
| return true; |
| - if (IsAPIPrivilegeIncrease(old_permissions, new_permissions)) |
| + if (IsAPIPrivilegeIncrease(old_permissions, new_permissions, extension_type)) |
| return true; |
| if (IsManifestPermissionPrivilegeIncrease(old_permissions, new_permissions)) |
| @@ -334,7 +239,7 @@ PermissionIDSet ChromePermissionMessageProvider::GetAllPermissionIDs( |
| const PermissionSet* permissions, |
| Manifest::Type extension_type) const { |
| PermissionIDSet permission_ids; |
| - GetAPIPermissionMessages(permissions, &permission_ids); |
| + GetAPIPermissionMessages(permissions, &permission_ids, extension_type); |
| GetManifestPermissionMessages(permissions, &permission_ids); |
| GetHostPermissionMessages(permissions, &permission_ids, extension_type); |
| return permission_ids; |
| @@ -343,7 +248,8 @@ PermissionIDSet ChromePermissionMessageProvider::GetAllPermissionIDs( |
| std::set<PermissionMessage> |
| ChromePermissionMessageProvider::GetAPIPermissionMessages( |
| const PermissionSet* permissions, |
| - PermissionIDSet* permission_ids) const { |
| + PermissionIDSet* permission_ids, |
| + Manifest::Type extension_type) const { |
| PermissionMsgSet messages; |
| for (APIPermissionSet::const_iterator permission_it = |
| permissions->apis().begin(); |
| @@ -362,7 +268,8 @@ ChromePermissionMessageProvider::GetAPIPermissionMessages( |
| // display only the "<all_urls>" warning message if both permissions |
| // are required. |
| if (permissions->ShouldWarnAllHosts()) { |
| - if (permission_ids != NULL) |
| + // Platform apps don't show hosts warnings. See crbug.com/255229. |
| + if (permission_ids != NULL && extension_type != Manifest::TYPE_PLATFORM_APP) |
|
Marc Treib
2015/03/09 14:08:02
Platform apps never show the "all urls" warning in
|
| permission_ids->insert(APIPermission::kHostsAll); |
| messages.erase( |
| PermissionMessage( |
| @@ -432,16 +339,131 @@ ChromePermissionMessageProvider::GetHostPermissionMessages( |
| return messages; |
| } |
| +void ChromePermissionMessageProvider::CoalesceWarningMessages( |
| + const PermissionSet* permissions, |
| + Manifest::Type extension_type, |
| + std::vector<base::string16>* message_strings, |
| + std::vector<base::string16>* message_details_strings) const { |
| + PermissionMessages messages = |
| + GetPermissionMessages(permissions, extension_type); |
| + |
| + // WARNING: When modifying a coalescing rule in this list, be sure to also |
| + // modify the corresponding rule in |
| + // ChromePermissionMessageProvider::GetCoalescedPermissionMessages(). |
| + // TODO(sashab): Deprecate this function, and remove this list. |
| + for (PermissionMessages::const_iterator i = messages.begin(); |
| + i != messages.end(); ++i) { |
| + int id = i->id(); |
| + // Access to users' devices should provide a single warning message |
| + // specifying the transport method used; serial and/or Bluetooth. |
| + if (id == PermissionMessage::kBluetooth || |
| + id == PermissionMessage::kSerial) { |
| + if (ContainsMessages(messages, |
| + PermissionMessage::kBluetooth, |
| + PermissionMessage::kSerial)) { |
| + if (id == PermissionMessage::kBluetooth) { |
| + message_strings->push_back(l10n_util::GetStringUTF16( |
| + IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL)); |
| + message_details_strings->push_back(base::string16()); |
| + } |
| + continue; |
| + } |
| + } |
| + if (id == PermissionMessage::kAccessibilityFeaturesModify || |
| + id == PermissionMessage::kAccessibilityFeaturesRead) { |
| + if (ContainsMessages(messages, |
| + PermissionMessage::kAccessibilityFeaturesModify, |
| + PermissionMessage::kAccessibilityFeaturesRead)) { |
| + if (id == PermissionMessage::kAccessibilityFeaturesModify) { |
| + message_strings->push_back(l10n_util::GetStringUTF16( |
| + IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ_MODIFY)); |
| + message_details_strings->push_back(base::string16()); |
| + } |
| + continue; |
| + } |
| + } |
| + if (id == PermissionMessage::kAudioCapture || |
| + id == PermissionMessage::kVideoCapture) { |
| + if (ContainsMessages(messages, |
| + PermissionMessage::kAudioCapture, |
| + PermissionMessage::kVideoCapture)) { |
| + if (id == PermissionMessage::kAudioCapture) { |
| + message_strings->push_back(l10n_util::GetStringUTF16( |
| + IDS_EXTENSION_PROMPT_WARNING_AUDIO_AND_VIDEO_CAPTURE)); |
| + message_details_strings->push_back(base::string16()); |
| + } |
| + continue; |
| + } |
| + } |
| + if (id == PermissionMessage::kMediaGalleriesAllGalleriesCopyTo || |
| + id == PermissionMessage::kMediaGalleriesAllGalleriesDelete || |
| + id == PermissionMessage::kMediaGalleriesAllGalleriesRead) { |
| + if (ContainsMessages( |
| + messages, |
| + PermissionMessage::kMediaGalleriesAllGalleriesCopyTo, |
| + PermissionMessage::kMediaGalleriesAllGalleriesDelete, |
| + PermissionMessage::kMediaGalleriesAllGalleriesRead)) { |
| + if (id == PermissionMessage::kMediaGalleriesAllGalleriesCopyTo) { |
| + message_strings->push_back(l10n_util::GetStringUTF16( |
| + IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_WRITE_DELETE)); |
| + message_details_strings->push_back(base::string16()); |
| + } |
| + continue; |
| + } |
| + if (ContainsMessages( |
| + messages, |
| + PermissionMessage::kMediaGalleriesAllGalleriesCopyTo, |
| + PermissionMessage::kMediaGalleriesAllGalleriesRead)) { |
| + if (id == PermissionMessage::kMediaGalleriesAllGalleriesCopyTo) { |
| + message_strings->push_back(l10n_util::GetStringUTF16( |
| + IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_WRITE)); |
| + message_details_strings->push_back(base::string16()); |
| + } |
| + continue; |
| + } |
| + if (ContainsMessages( |
| + messages, |
| + PermissionMessage::kMediaGalleriesAllGalleriesDelete, |
| + PermissionMessage::kMediaGalleriesAllGalleriesRead)) { |
| + if (id == PermissionMessage::kMediaGalleriesAllGalleriesDelete) { |
| + message_strings->push_back(l10n_util::GetStringUTF16( |
| + IDS_EXTENSION_PROMPT_WARNING_MEDIA_GALLERIES_READ_DELETE)); |
| + message_details_strings->push_back(base::string16()); |
| + } |
| + continue; |
| + } |
| + } |
| + if (permissions->HasAPIPermission(APIPermission::kSessions) && |
| + id == PermissionMessage::kTabs) { |
| + message_strings->push_back(l10n_util::GetStringUTF16( |
| + IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS)); |
| + message_details_strings->push_back(base::string16()); |
| + continue; |
| + } |
| + if (permissions->HasAPIPermission(APIPermission::kSessions) && |
| + id == PermissionMessage::kBrowsingHistory) { |
| + message_strings->push_back(l10n_util::GetStringUTF16( |
| + IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS)); |
| + message_details_strings->push_back(base::string16()); |
| + continue; |
| + } |
| + |
| + message_strings->push_back(i->message()); |
| + message_details_strings->push_back(i->details()); |
| + } |
| +} |
| + |
| bool ChromePermissionMessageProvider::IsAPIPrivilegeIncrease( |
| const PermissionSet* old_permissions, |
| - const PermissionSet* new_permissions) const { |
| + const PermissionSet* new_permissions, |
| + Manifest::Type extension_type) const { |
| if (new_permissions == NULL) |
| return false; |
| PermissionMsgSet old_warnings = |
| - GetAPIPermissionMessages(old_permissions, NULL); |
| + GetAPIPermissionMessages(old_permissions, NULL, extension_type); |
| PermissionMsgSet new_warnings = |
| - GetAPIPermissionMessages(new_permissions, NULL); |
| + GetAPIPermissionMessages(new_permissions, NULL, extension_type); |
| PermissionMsgSet delta_warnings = |
| base::STLSetDifference<PermissionMsgSet>(new_warnings, old_warnings); |