[Extensions] Implement suspicious extensions bubble on mac

Extend the toolbar actions bar bubble framework on mac to
support an item list, and consolidate the logic to generate
the extension list.

This doesn't turn on the bubble, but now it works.

BUG=474091

Review URL: https://codereview.chromium.org/1112213003

Cr-Commit-Position: refs/heads/master@{#327825}
diff --git a/chrome/browser/extensions/extension_message_bubble_controller.cc b/chrome/browser/extensions/extension_message_bubble_controller.cc
index a30b1f07..0d6f642 100644
--- a/chrome/browser/extensions/extension_message_bubble_controller.cc
+++ b/chrome/browser/extensions/extension_message_bubble_controller.cc
@@ -6,6 +6,8 @@
 
 #include "base/bind.h"
 #include "base/metrics/histogram.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/extensions/extension_message_bubble.h"
 #include "chrome/browser/extensions/extension_toolbar_model.h"
@@ -21,6 +23,11 @@
 
 namespace extensions {
 
+namespace {
+// How many extensions to show in the bubble (max).
+const int kMaxExtensionsToShow = 7;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // ExtensionMessageBubbleController::Delegate
 
@@ -117,6 +124,25 @@
   return return_value;
 }
 
+base::string16 ExtensionMessageBubbleController::GetExtensionListForDisplay() {
+  if (!delegate_->ShouldShowExtensionList())
+    return base::string16();
+
+  std::vector<base::string16> extension_list = GetExtensionList();
+  if (extension_list.size() > kMaxExtensionsToShow) {
+    int old_size = extension_list.size();
+    extension_list.erase(extension_list.begin() + kMaxExtensionsToShow,
+                         extension_list.end());
+    extension_list.push_back(delegate_->GetOverflowText(base::IntToString16(
+        old_size - kMaxExtensionsToShow)));
+  }
+  const base::char16 bullet_point = 0x2022;
+  base::string16 prefix = bullet_point + base::ASCIIToUTF16(" ");
+  for (base::string16& str : extension_list)
+    str.insert(0, prefix);
+  return JoinString(extension_list, base::ASCIIToUTF16("\n"));
+}
+
 const ExtensionIdList& ExtensionMessageBubbleController::GetExtensionIdList() {
   return *GetOrCreateExtensionList();
 }