Context menus for text selections in editable boxes and links should include the Search menu item.  Original patch by Brian Duff (see http://codereview.chromium.org/16510 ), r=me.

BUG=1925

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8815 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/webkit/glue/context_menu_client_impl.cc b/webkit/glue/context_menu_client_impl.cc
index e2fbfcf1..30f5e1a3 100644
--- a/webkit/glue/context_menu_client_impl.cc
+++ b/webkit/glue/context_menu_client_impl.cc
@@ -108,23 +108,23 @@
 // Figure out the URL of a page or subframe. Returns |page_type| as the type,
 // which indicates page or subframe, or ContextNode::NONE if the URL could not
 // be determined for some reason.
-static ContextNode::Type GetTypeAndURLFromFrame(WebCore::Frame* frame,
-                                                GURL* url,
-                                                ContextNode::Type page_type) {
-  ContextNode::Type type = ContextNode::NONE;
+static ContextNode GetTypeAndURLFromFrame(WebCore::Frame* frame,
+                                          GURL* url,
+                                          ContextNode page_node) {
+  ContextNode node;
   if (frame) {
     WebCore::DocumentLoader* dl = frame->loader()->documentLoader();
     if (dl) {
       WebDataSource* ds = static_cast<WebDocumentLoaderImpl*>(dl)->
           GetDataSource();
       if (ds) {
-        type = page_type;
+        node = page_node;
         *url = ds->HasUnreachableURL() ? ds->GetUnreachableURL()
                                        : ds->GetRequest().GetURL();
       }
     }
   }
-  return type;
+  return node;
 }
 
 WebCore::PlatformMenuDescription
@@ -144,19 +144,17 @@
   WebCore::IntPoint menu_point =
       selected_frame->view()->contentsToWindow(r.point());
 
-  ContextNode::Type type = ContextNode::NONE;
+  ContextNode node;
 
   // Links, Images and Image-Links take preference over all else.
   WebCore::KURL link_url = r.absoluteLinkURL();
   if (!link_url.isEmpty()) {
-    type = ContextNode::LINK;
+    node.type |= ContextNode::LINK;
   }
   WebCore::KURL image_url = r.absoluteImageURL();
   if (!image_url.isEmpty()) {
-    type = ContextNode::IMAGE;
+    node.type |= ContextNode::IMAGE;
   }
-  if (!image_url.isEmpty() && !link_url.isEmpty())
-    type = ContextNode::IMAGE_LINK;
 
   // If it's not a link, an image or an image link, show a selection menu or a
   // more generic page menu.
@@ -168,37 +166,40 @@
   
   std::wstring frame_encoding;
   // Send the frame and page URLs in any case.
-  ContextNode::Type frame_type = ContextNode::NONE;
-  ContextNode::Type page_type = 
+  ContextNode frame_node = ContextNode(ContextNode::NONE);
+  ContextNode page_node =
       GetTypeAndURLFromFrame(webview_->main_frame()->frame(),
                              &page_url,
-                             ContextNode::PAGE);
+                             ContextNode(ContextNode::PAGE));
   if (selected_frame != webview_->main_frame()->frame()) {
-    frame_type = GetTypeAndURLFromFrame(selected_frame,
+    frame_node = GetTypeAndURLFromFrame(selected_frame,
                                         &frame_url,
-                                        ContextNode::FRAME);
+                                        ContextNode(ContextNode::FRAME));
     frame_encoding = webkit_glue::StringToStdWString(
         selected_frame->loader()->encoding());
   }
+
+  if (r.isSelected()) {
+    node.type |= ContextNode::SELECTION;
+    selection_text_string = CollapseWhitespace(
+      webkit_glue::StringToStdWString(selected_frame->selectedText()),
+      false);
+  }
+
+  if (r.isContentEditable()) {
+    node.type |= ContextNode::EDITABLE;
+    if (webview_->GetFocusedWebCoreFrame()->editor()->
+        isContinuousSpellCheckingEnabled()) {
+      misspelled_word_string = GetMisspelledWord(default_menu,
+                                                 selected_frame);
+    }
+  }
   
-  if (type == ContextNode::NONE) {
-    if (r.isContentEditable()) {
-      type = ContextNode::EDITABLE;
-      if (webview_->GetFocusedWebCoreFrame()->editor()->
-          isContinuousSpellCheckingEnabled()) {
-        misspelled_word_string = GetMisspelledWord(default_menu,
-                                                   selected_frame);
-      }
-    } else if (r.isSelected()) {
-      type = ContextNode::SELECTION;
-      selection_text_string =
-          CollapseWhitespace(
-              webkit_glue::StringToStdWString(selected_frame->selectedText()),
-              false);
-    } else if (selected_frame != webview_->main_frame()->frame()) {
-      type = frame_type;
+  if (node.type == ContextNode::NONE) {
+    if (selected_frame != webview_->main_frame()->frame()) {
+      node = frame_node;
     } else {
-      type = page_type;
+      node = page_node;
     }
   }
 
@@ -232,7 +233,7 @@
   WebViewDelegate* d = webview_->delegate();
   if (d) {
     d->ShowContextMenu(webview_,
-                       type,
+                       node,
                        menu_point.x(),
                        menu_point.y(),
                        webkit_glue::KURLToGURL(link_url),