| Index: chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc | 
| diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc | 
| index 95df36ec36109977da507d60dd1d45b79a83302c..c8554c493d623e2a07f7073ad9279b509d170af4 100644 | 
| --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc | 
| +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc | 
| @@ -212,7 +212,9 @@ void AppInfoPermissionsPanel::CreatePermissionsList() { | 
| l10n_util::GetStringUTF16(IDS_APPLICATION_INFO_APP_PERMISSIONS_TITLE)); | 
| AddChildView(permissions_heading); | 
|  | 
| -  if (!HasActivePermissionMessages() && GetRetainedDeviceCount() == 0 && | 
| +  extensions::CoalescedPermissionMessages active_messages = | 
| +      app_->permissions_data()->GetCoalescedPermissionMessages(); | 
| +  if (active_messages.empty() && GetRetainedDeviceCount() == 0 && | 
| GetRetainedFileCount() == 0) { | 
| views::Label* no_permissions_text = | 
| new views::Label(l10n_util::GetStringUTF16( | 
| @@ -227,9 +229,10 @@ void AppInfoPermissionsPanel::CreatePermissionsList() { | 
| BulletedPermissionsList* permissions_list = new BulletedPermissionsList(); | 
|  | 
| // Add regular and host permission messages. | 
| -  for (const auto& message : GetActivePermissionMessages()) { | 
| +  for (const auto& message : active_messages) { | 
| permissions_list->AddPermissionBullets( | 
| -        message.first, message.second, gfx::ELIDE_MIDDLE, base::Closure()); | 
| +        message.message(), message.submessages(), gfx::ELIDE_MIDDLE, | 
| +        base::Closure()); | 
| } | 
|  | 
| // Add USB devices, if the app has any. | 
| @@ -255,32 +258,6 @@ void AppInfoPermissionsPanel::CreatePermissionsList() { | 
| AddChildView(permissions_list); | 
| } | 
|  | 
| -bool AppInfoPermissionsPanel::HasActivePermissionMessages() const { | 
| -  return !GetActivePermissionMessages().empty(); | 
| -} | 
| - | 
| -const std::vector<PermissionStringAndDetailsPair> | 
| -AppInfoPermissionsPanel::GetActivePermissionMessages() const { | 
| -  std::vector<PermissionStringAndDetailsPair> messages_with_details; | 
| -  std::vector<base::string16> permission_messages = | 
| -      app_->permissions_data()->GetPermissionMessageStrings(); | 
| -  std::vector<base::string16> permission_message_details = | 
| -      app_->permissions_data()->GetPermissionMessageDetailsStrings(); | 
| -  DCHECK_EQ(permission_messages.size(), permission_message_details.size()); | 
| - | 
| -  for (size_t i = 0; i < permission_messages.size(); i++) { | 
| -    std::vector<base::string16> details; | 
| -    if (!permission_message_details[i].empty()) { | 
| -      // Make each new line in the details a separate sub-bullet. | 
| -      base::SplitString( | 
| -          permission_message_details[i], base::char16('\n'), &details); | 
| -    } | 
| -    messages_with_details.push_back( | 
| -        PermissionStringAndDetailsPair(permission_messages[i], details)); | 
| -  } | 
| -  return messages_with_details; | 
| -} | 
| - | 
| int AppInfoPermissionsPanel::GetRetainedFileCount() const { | 
| if (app_->permissions_data()->HasAPIPermission( | 
| extensions::APIPermission::kFileSystem)) { | 
|  |