| Index: chrome/browser/tab_contents/render_view_context_menu.cc | 
| =================================================================== | 
| --- chrome/browser/tab_contents/render_view_context_menu.cc	(revision 90541) | 
| +++ chrome/browser/tab_contents/render_view_context_menu.cc	(working copy) | 
| @@ -42,7 +42,9 @@ | 
| #include "chrome/browser/translate/translate_manager.h" | 
| #include "chrome/browser/translate/translate_prefs.h" | 
| #include "chrome/browser/translate/translate_tab_helper.h" | 
| +#include "chrome/browser/ui/browser.h" | 
| #include "chrome/browser/ui/download/download_tab_helper.h" | 
| +#include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" | 
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 
| #include "chrome/common/chrome_constants.h" | 
| #include "chrome/common/chrome_switches.h" | 
| @@ -785,6 +787,12 @@ | 
| IDS_CONTENT_CONTEXT_DELETE); | 
| menu_model_.AddSeparator(); | 
|  | 
| +  if (!params_.keyword_url.is_empty()) { | 
| +    menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ADDSEARCHENGINE, | 
| +                                    IDS_CONTENT_CONTEXT_ADDSEARCHENGINE); | 
| +    menu_model_.AddSeparator(); | 
| +  } | 
| + | 
| AppendSpellcheckOptionsSubMenu(); | 
|  | 
| #if defined(OS_MACOSX) | 
| @@ -1177,6 +1185,9 @@ | 
| return true; | 
| #endif | 
|  | 
| +    case IDC_CONTENT_CONTEXT_ADDSEARCHENGINE: | 
| +      return !params_.keyword_url.is_empty(); | 
| + | 
| case IDC_SPELLCHECK_MENU: | 
| return true; | 
|  | 
| @@ -1622,6 +1633,36 @@ | 
| break; | 
| } | 
|  | 
| +    case IDC_CONTENT_CONTEXT_ADDSEARCHENGINE: { | 
| +      // Make sure the model is loaded. | 
| +      TemplateURLService* model = | 
| +          TemplateURLServiceFactory::GetForProfile(profile_); | 
| +      if (!model) | 
| +        return; | 
| +      model->Load(); | 
| + | 
| +      scoped_ptr<TemplateURL> template_url(new TemplateURL); | 
| +      string16 keyword = | 
| +          net::StripWWW(UTF8ToUTF16((params_.page_url.host()))); | 
| +      template_url->set_short_name(keyword); | 
| +      template_url->set_keyword(keyword); | 
| +      template_url->SetURL(params_.keyword_url.spec(), 0, 0); | 
| +      template_url->SetFaviconURL(TemplateURL::GenerateFaviconURL( | 
| +          params_.page_url.GetOrigin())); | 
| + | 
| +      TabContentsWrapper* tab_contents_wrapper = | 
| +          TabContentsWrapper::GetCurrentWrapperForContents( | 
| +              source_tab_contents_); | 
| +      if (tab_contents_wrapper && | 
| +          tab_contents_wrapper->search_engine_tab_helper() && | 
| +          tab_contents_wrapper->search_engine_tab_helper()->delegate()) { | 
| +        // Takes ownership of |template_url|. | 
| +        tab_contents_wrapper->search_engine_tab_helper()->delegate()-> | 
| +            ConfirmAddSearchProvider(template_url.release(), profile_); | 
| +      } | 
| +      break; | 
| +    } | 
| + | 
| default: | 
| NOTREACHED(); | 
| break; | 
|  |