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