Fix top-level context menus sorting by name

BUG=174878
TEST=

Review URL: https://chromiumcodereview.appspot.com/12299013

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@205793 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/context_menu_matcher.cc b/chrome/browser/extensions/context_menu_matcher.cc
index e69e38c..950461d 100644
--- a/chrome/browser/extensions/context_menu_matcher.cc
+++ b/chrome/browser/extensions/context_menu_matcher.cc
@@ -30,23 +30,18 @@
                                               const string16& selection_text,
                                               int* index)
 {
-  ExtensionService* service =
-      extensions::ExtensionSystem::Get(profile_)->extension_service();
-  MenuManager* manager = service->menu_manager();
-  const Extension* extension = service->GetExtensionById(extension_id, false);
   DCHECK_GE(*index, 0);
   int max_index =
       IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST - IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST;
-  if (!extension || *index >= max_index)
+  if (*index >= max_index)
     return;
 
-  // Find matching items.
-  const MenuItem::List* all_items = manager->MenuItems(extension_id);
-  if (!all_items || all_items->empty())
+  const Extension* extension = NULL;
+  MenuItem::List items;
+  bool can_cross_incognito;
+  if (!GetRelevantExtensionTopLevelItems(extension_id, &extension,
+                                         &can_cross_incognito, items))
     return;
-  bool can_cross_incognito = service->CanCrossIncognito(extension);
-  MenuItem::List items = GetRelevantExtensionItems(*all_items,
-                                                   can_cross_incognito);
 
   if (items.empty())
     return;
@@ -99,6 +94,29 @@
   extension_menu_models_.clear();
 }
 
+base::string16 ContextMenuMatcher::GetTopLevelContextMenuTitle(
+    const std::string& extension_id,
+    const string16& selection_text) {
+  const Extension* extension = NULL;
+  MenuItem::List items;
+  bool can_cross_incognito;
+  GetRelevantExtensionTopLevelItems(extension_id, &extension,
+      &can_cross_incognito, items);
+
+  base::string16 title;
+
+  if (items.empty() ||
+      items.size() > 1 ||
+      items[0]->type() != MenuItem::NORMAL) {
+    title = UTF8ToUTF16(extension->name());
+  } else {
+    MenuItem* item = items[0];
+    title = item->TitleWithReplacement(
+        selection_text, kMaxExtensionItemTitleLength);
+  }
+  return title;
+}
+
 bool ContextMenuMatcher::IsCommandIdChecked(int command_id) const {
   MenuItem* item = GetExtensionMenuItem(command_id);
   if (!item)
@@ -125,6 +143,31 @@
   manager->ExecuteCommand(profile_, web_contents, params, item->id());
 }
 
+bool ContextMenuMatcher::GetRelevantExtensionTopLevelItems(
+    const std::string& extension_id,
+    const Extension** extension,
+    bool* can_cross_incognito,
+    MenuItem::List& items) {
+  ExtensionService* service =
+      extensions::ExtensionSystem::Get(profile_)->extension_service();
+  MenuManager* manager = service->menu_manager();
+  *extension = service->GetExtensionById(extension_id, false);
+
+  if (!*extension)
+    return false;
+
+  // Find matching items.
+  const MenuItem::List* all_items = manager->MenuItems(extension_id);
+  if (!all_items || all_items->empty())
+    return false;
+
+  *can_cross_incognito = service->CanCrossIncognito(*extension);
+  items = GetRelevantExtensionItems(*all_items,
+                                    *can_cross_incognito);
+
+  return true;
+}
+
 MenuItem::List ContextMenuMatcher::GetRelevantExtensionItems(
     const MenuItem::List& items,
     bool can_cross_incognito) {