<webview>: Context menu API implementation CL.

Very Similar to chrome.contextMenus API, only applies to the <webview> that it is called upon. 

var w = document.querySelector('webview'); 
w.contextMenus.OnClicked.addListener(function() { .. }); 
w.contextMenus.create({id: '1', title: 'one'}); 
w.contextMenus.update({id: '2', title: 'new', onclick: ...}); 
w.contextMenus.remove('1'); 
w.contextMenus.removeAll('1'); 

This CL adds the actual implementation to the previously exposed skeleton API.

Docs/snippets here:
https://docs.google.com/a/chromium.org/document/d/1AoMD6kF8ui1dikzTrwK-weVHegSqQaLV2zx4xJSh_fQ/edit

[email protected]
BUG=140315
Test=Can be tested inside a chrome apps <webview>.
<webview>.contextMenus.create(...) to create custom context menu items.
The API is similar to chrome.contextMenus API. Similarly .update,
.remove, .removeAll is also supported.
Click event handler can be specified as
<webview>.contextMenus.onClick.addListener(...).

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255917 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/context_menu_matcher.cc b/chrome/browser/extensions/context_menu_matcher.cc
index 396352af..0e7adbd 100644
--- a/chrome/browser/extensions/context_menu_matcher.cc
+++ b/chrome/browser/extensions/context_menu_matcher.cc
@@ -28,7 +28,7 @@
 }
 
 void ContextMenuMatcher::AppendExtensionItems(
-    const std::string& extension_id,
+    const MenuItem::ExtensionKey& extension_key,
     const base::string16& selection_text,
     int* index) {
   DCHECK_GE(*index, 0);
@@ -40,8 +40,8 @@
   const Extension* extension = NULL;
   MenuItem::List items;
   bool can_cross_incognito;
-  if (!GetRelevantExtensionTopLevelItems(extension_id, &extension,
-                                         &can_cross_incognito, items))
+  if (!GetRelevantExtensionTopLevelItems(
+          extension_key, &extension, &can_cross_incognito, items))
     return;
 
   if (items.empty())
@@ -86,7 +86,7 @@
       RecursivelyAppendExtensionItems(submenu_items, can_cross_incognito,
                                       selection_text, submenu, index);
     }
-    SetExtensionIcon(extension_id);
+    SetExtensionIcon(extension_key.extension_id);
   }
 }
 
@@ -96,13 +96,13 @@
 }
 
 base::string16 ContextMenuMatcher::GetTopLevelContextMenuTitle(
-    const std::string& extension_id,
+    const MenuItem::ExtensionKey& extension_key,
     const base::string16& selection_text) {
   const Extension* extension = NULL;
   MenuItem::List items;
   bool can_cross_incognito;
-  GetRelevantExtensionTopLevelItems(extension_id, &extension,
-      &can_cross_incognito, items);
+  GetRelevantExtensionTopLevelItems(
+      extension_key, &extension, &can_cross_incognito, items);
 
   base::string16 title;
 
@@ -144,20 +144,20 @@
 }
 
 bool ContextMenuMatcher::GetRelevantExtensionTopLevelItems(
-    const std::string& extension_id,
+    const MenuItem::ExtensionKey& extension_key,
     const Extension** extension,
     bool* can_cross_incognito,
     MenuItem::List& items) {
   ExtensionService* service =
       extensions::ExtensionSystem::Get(profile_)->extension_service();
-  *extension = service->GetExtensionById(extension_id, false);
+  *extension = service->GetExtensionById(extension_key.extension_id, false);
 
   if (!*extension)
     return false;
 
   // Find matching items.
   MenuManager* manager = MenuManager::Get(profile_);
-  const MenuItem::List* all_items = manager->MenuItems(extension_id);
+  const MenuItem::List* all_items = manager->MenuItems(extension_key);
   if (!all_items || all_items->empty())
     return false;