15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/search_engine_manager_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search_engines/keyword_editor_controller.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search_engines/template_url_table_model.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/omnibox/omnibox_handler.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/icons_handler.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum EngineInfoIndexes {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ENGINE_NAME,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ENGINE_KEYWORD,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ENGINE_URL,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};  // namespace
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace options {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchEngineManagerHandler::SearchEngineManagerHandler() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SearchEngineManagerHandler::~SearchEngineManagerHandler() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (list_controller_.get() && list_controller_->table_model())
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list_controller_->table_model()->SetObserver(NULL);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::InitializeHandler() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list_controller_.reset(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new KeywordEditorController(Profile::FromWebUI(web_ui())));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(list_controller_.get());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list_controller_->table_model()->SetObserver(this);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::InitializePage() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnModelChanged();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::GetLocalizedValues(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* localized_strings) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(localized_strings);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "searchEngineManagerPage",
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_SEARCH_ENGINES_EDITOR_WINDOW_TITLE);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("defaultSearchEngineListTitle",
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINES_EDITOR_MAIN_SEPARATOR));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("otherSearchEngineListTitle",
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINES_EDITOR_OTHER_SEPARATOR));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("extensionKeywordsListTitle",
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_SEARCH_ENGINES_EDITOR_EXTENSIONS_SEPARATOR));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("makeDefaultSearchEngineButton",
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINES_EDITOR_MAKE_DEFAULT_BUTTON));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("searchEngineTableNamePlaceholder",
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINE_ADD_NEW_NAME_PLACEHOLDER));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("searchEngineTableKeywordPlaceholder",
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINE_ADD_NEW_KEYWORD_PLACEHOLDER));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("searchEngineTableURLPlaceholder",
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINE_ADD_NEW_URL_PLACEHOLDER));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("editSearchEngineInvalidTitleToolTip",
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINES_INVALID_TITLE_TT));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("editSearchEngineInvalidKeywordToolTip",
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINES_INVALID_KEYWORD_TT));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("editSearchEngineInvalidURLToolTip",
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SEARCH_ENGINES_INVALID_URL_TT));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::RegisterMessages() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "managerSetDefaultSearchEngine",
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SearchEngineManagerHandler::SetDefaultSearchEngine,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "removeSearchEngine",
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SearchEngineManagerHandler::RemoveSearchEngine,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "editSearchEngine",
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SearchEngineManagerHandler::EditSearchEngine,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "checkSearchEngineInfoValidity",
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SearchEngineManagerHandler::CheckSearchEngineInfoValidity,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "searchEngineEditCancelled",
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SearchEngineManagerHandler::EditCancelled,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "searchEngineEditCompleted",
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SearchEngineManagerHandler::EditCompleted,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::OnModelChanged() {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(list_controller_.get());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!list_controller_->loaded())
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the default engine.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TemplateURL* default_engine =
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list_controller_->url_model()->GetDefaultSearchProvider();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int default_index = list_controller_->table_model()->IndexOfTemplateURL(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_engine);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Build the first list (default search engine options).
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue defaults_list;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int last_default_engine_index =
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list_controller_->table_model()->last_search_engine_index();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < last_default_engine_index; ++i) {
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Third argument is false, as the engine is not from an extension.
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    defaults_list.Append(CreateDictionaryForEngine(
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        i, i == default_index, false));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Build the second list (other search templates).
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue others_list;
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int last_other_engine_index =
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      list_controller_->table_model()->last_other_engine_index();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_default_engine_index < 0)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_default_engine_index = 0;
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (int i = last_default_engine_index; i < last_other_engine_index; ++i) {
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    others_list.Append(CreateDictionaryForEngine(i, i == default_index, false));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Build the extension keywords list.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue keyword_list;
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (last_other_engine_index < 0)
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    last_other_engine_index = 0;
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int engine_count = list_controller_->table_model()->RowCount();
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (int i = last_other_engine_index; i < engine_count; ++i) {
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    keyword_list.Append(CreateDictionaryForEngine(i, i == default_index, true));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("SearchEngineManager.updateSearchEngineList",
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   defaults_list, others_list, keyword_list);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::OnItemsChanged(int start, int length) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnModelChanged();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::OnItemsAdded(int start, int length) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnModelChanged();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::OnItemsRemoved(int start, int length) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnModelChanged();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::DictionaryValue* SearchEngineManagerHandler::CreateDictionaryForEngine(
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int index, bool is_default, bool is_extension) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLTableModel* table_model = list_controller_->table_model();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TemplateURL* template_url = list_controller_->GetTemplateURL(index);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("name",  template_url->short_name());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("displayName", table_model->GetText(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index, IDS_SEARCH_ENGINES_EDITOR_DESCRIPTION_COLUMN));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("keyword", table_model->GetText(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index, IDS_SEARCH_ENGINES_EDITOR_KEYWORD_COLUMN));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("url", template_url->url_ref().DisplayURL());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBoolean("urlLocked", template_url->prepopulate_id() > 0);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL icon_url = template_url->favicon_url();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_url.is_valid())
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("iconURL", icon_url.spec());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("modelIndex", base::IntToString(index));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dict->SetBoolean("canBeRemoved",
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      list_controller_->CanRemove(template_url) && !is_extension);
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dict->SetBoolean("canBeDefault",
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      list_controller_->CanMakeDefault(template_url) && !is_extension);
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dict->SetBoolean("default", is_default);
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dict->SetBoolean("canBeEdited", list_controller_->CanEdit(template_url));
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dict->SetBoolean("isExtension", is_extension);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::SetDefaultSearchEngine(const ListValue* args) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ExtractIntegerValue(args, &index)) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index < 0 || index >= list_controller_->table_model()->RowCount())
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list_controller_->MakeDefaultTemplateURL(index);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::RemoveSearchEngine(const ListValue* args) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ExtractIntegerValue(args, &index)) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index < 0 || index >= list_controller_->table_model()->RowCount())
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (list_controller_->CanRemove(list_controller_->GetTemplateURL(index)))
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list_controller_->RemoveTemplateURL(index);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::EditSearchEngine(const ListValue* args) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ExtractIntegerValue(args, &index)) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow -1, which means we are adding a new engine.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index < -1 || index >= list_controller_->table_model()->RowCount())
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  edit_controller_.reset(new EditSearchEngineController(
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (index == -1) ? NULL : list_controller_->GetTemplateURL(index), this,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::FromWebUI(web_ui())));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::OnEditedKeyword(
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TemplateURL* template_url,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& title,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& keyword,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& url) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!url.empty());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (template_url)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list_controller_->ModifyTemplateURL(template_url, title, keyword, url);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list_controller_->AddTemplateURL(title, keyword, url);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  edit_controller_.reset();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::CheckSearchEngineInfoValidity(
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* args)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!edit_controller_.get())
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 name;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 keyword;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string modelIndex;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(ENGINE_NAME, &name) ||
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(ENGINE_KEYWORD, &keyword) ||
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(ENGINE_URL, &url) ||
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(3, &modelIndex)) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue validity;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  validity.SetBoolean("name", edit_controller_->IsTitleValid(name));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  validity.SetBoolean("keyword", edit_controller_->IsKeywordValid(keyword));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  validity.SetBoolean("url", edit_controller_->IsURLValid(url));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue indexValue(modelIndex);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("SearchEngineManager.validityCheckCallback",
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   validity, indexValue);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::EditCancelled(const ListValue* args) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!edit_controller_.get())
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  edit_controller_->CleanUpCancelledAdd();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  edit_controller_.reset();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchEngineManagerHandler::EditCompleted(const ListValue* args) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!edit_controller_.get())
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 name;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 keyword;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(ENGINE_NAME, &name) ||
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(ENGINE_KEYWORD, &keyword) ||
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(ENGINE_URL, &url)) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recheck validity.  It's possible to get here with invalid input if e.g. the
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user calls the right JS functions directly from the web inspector.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (edit_controller_->IsTitleValid(name) &&
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      edit_controller_->IsKeywordValid(keyword) &&
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      edit_controller_->IsURLValid(url))
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    edit_controller_->AcceptAddOrEdit(name, keyword, url);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace options
307