Index: chrome/browser/ui/webui/options2/browser_options_handler.cc |
diff --git a/chrome/browser/ui/webui/options2/browser_options_handler.cc b/chrome/browser/ui/webui/options2/browser_options_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..205512c035f6bbe78f5e8ed5f61d130628355c7a |
--- /dev/null |
+++ b/chrome/browser/ui/webui/options2/browser_options_handler.cc |
@@ -0,0 +1,496 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/webui/options2/browser_options_handler.h" |
+ |
+#include "base/basictypes.h" |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/memory/singleton.h" |
+#include "base/string_number_conversions.h" |
+#include "base/utf_string_conversions.h" |
+#include "base/values.h" |
+#include "chrome/browser/autocomplete/autocomplete.h" |
+#include "chrome/browser/autocomplete/autocomplete_match.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/custom_home_pages_table_model.h" |
+#include "chrome/browser/instant/instant_confirm_dialog.h" |
+#include "chrome/browser/instant/instant_controller.h" |
+#include "chrome/browser/instant/instant_field_trial.h" |
+#include "chrome/browser/net/url_fixer_upper.h" |
+#include "chrome/browser/prefs/pref_service.h" |
+#include "chrome/browser/prefs/session_startup_pref.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/search_engines/template_url.h" |
+#include "chrome/browser/search_engines/template_url_service.h" |
+#include "chrome/browser/search_engines/template_url_service_factory.h" |
+#include "chrome/browser/ui/webui/favicon_source.h" |
+#include "chrome/common/chrome_notification_types.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/notification_details.h" |
+#include "content/public/browser/notification_source.h" |
+#include "content/public/browser/user_metrics.h" |
+#include "grit/chromium_strings.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+using content::UserMetricsAction; |
+ |
+BrowserOptionsHandler::BrowserOptionsHandler() |
+ : template_url_service_(NULL), startup_custom_pages_table_model_(NULL) { |
+#if !defined(OS_MACOSX) |
+ default_browser_worker_ = new ShellIntegration::DefaultBrowserWorker(this); |
+#endif |
+} |
+ |
+BrowserOptionsHandler::~BrowserOptionsHandler() { |
+ if (default_browser_worker_.get()) |
+ default_browser_worker_->ObserverDestroyed(); |
+ if (template_url_service_) |
+ template_url_service_->RemoveObserver(this); |
+} |
+ |
+void BrowserOptionsHandler::GetLocalizedValues( |
+ DictionaryValue* localized_strings) { |
+ DCHECK(localized_strings); |
+ |
+ static OptionsStringResource resources[] = { |
+ { "startupGroupName", IDS_OPTIONS_STARTUP_GROUP_NAME }, |
+ { "startupShowDefaultAndNewTab", |
+ IDS_OPTIONS_STARTUP_SHOW_DEFAULT_AND_NEWTAB}, |
+ { "startupShowLastSession", IDS_OPTIONS_STARTUP_SHOW_LAST_SESSION }, |
+ { "startupShowPages", IDS_OPTIONS_STARTUP_SHOW_PAGES }, |
+ { "startupAddLabel", IDS_OPTIONS_STARTUP_ADD_LABEL }, |
+ { "startupUseCurrent", IDS_OPTIONS_STARTUP_USE_CURRENT }, |
+ { "homepageGroupName", IDS_OPTIONS_HOMEPAGE_GROUP_NAME }, |
+ { "homepageUseNewTab", IDS_OPTIONS_HOMEPAGE_USE_NEWTAB }, |
+ { "homepageUseURL", IDS_OPTIONS_HOMEPAGE_USE_URL }, |
+ { "toolbarGroupName", IDS_OPTIONS_TOOLBAR_GROUP_NAME }, |
+ { "toolbarShowHomeButton", IDS_OPTIONS_TOOLBAR_SHOW_HOME_BUTTON }, |
+ { "toolbarShowBookmarksBar", IDS_OPTIONS_TOOLBAR_SHOW_BOOKMARKS_BAR }, |
+ { "defaultSearchGroupName", IDS_OPTIONS_DEFAULTSEARCH_GROUP_NAME }, |
+ { "defaultSearchManageEngines", IDS_OPTIONS_DEFAULTSEARCH_MANAGE_ENGINES }, |
+ { "instantName", IDS_INSTANT_PREF }, |
+ { "instantWarningText", IDS_INSTANT_PREF_WARNING }, |
+ { "instantConfirmTitle", IDS_INSTANT_OPT_IN_TITLE }, |
+ { "instantConfirmMessage", IDS_INSTANT_OPT_IN_MESSAGE }, |
+ { "defaultBrowserGroupName", IDS_OPTIONS_DEFAULTBROWSER_GROUP_NAME }, |
+ }; |
+ |
+ RegisterStrings(localized_strings, resources, arraysize(resources)); |
+ RegisterTitle(localized_strings, "browserPage", |
+ IDS_OPTIONS_GENERAL_TAB_LABEL); |
+ |
+ localized_strings->SetString("instantLearnMoreLink", |
+ ASCIIToUTF16(browser::InstantLearnMoreURL().spec())); |
+ localized_strings->SetString("defaultBrowserUnknown", |
+ l10n_util::GetStringFUTF16(IDS_OPTIONS_DEFAULTBROWSER_UNKNOWN, |
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); |
+ localized_strings->SetString("defaultBrowserUseAsDefault", |
+ l10n_util::GetStringFUTF16(IDS_OPTIONS_DEFAULTBROWSER_USEASDEFAULT, |
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); |
+} |
+ |
+void BrowserOptionsHandler::RegisterMessages() { |
+ web_ui_->RegisterMessageCallback("becomeDefaultBrowser", |
+ base::Bind(&BrowserOptionsHandler::BecomeDefaultBrowser, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("setDefaultSearchEngine", |
+ base::Bind(&BrowserOptionsHandler::SetDefaultSearchEngine, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("removeStartupPages", |
+ base::Bind(&BrowserOptionsHandler::RemoveStartupPages, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("addStartupPage", |
+ base::Bind(&BrowserOptionsHandler::AddStartupPage, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("editStartupPage", |
+ base::Bind(&BrowserOptionsHandler::EditStartupPage, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("setStartupPagesToCurrentPages", |
+ base::Bind(&BrowserOptionsHandler::SetStartupPagesToCurrentPages, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("dragDropStartupPage", |
+ base::Bind(&BrowserOptionsHandler::DragDropStartupPage, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("requestAutocompleteSuggestions", |
+ base::Bind(&BrowserOptionsHandler::RequestAutocompleteSuggestions, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("enableInstant", |
+ base::Bind(&BrowserOptionsHandler::EnableInstant, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("disableInstant", |
+ base::Bind(&BrowserOptionsHandler::DisableInstant, |
+ base::Unretained(this))); |
+ web_ui_->RegisterMessageCallback("getInstantFieldTrialStatus", |
+ base::Bind(&BrowserOptionsHandler::GetInstantFieldTrialStatus, |
+ base::Unretained(this))); |
+} |
+ |
+void BrowserOptionsHandler::Initialize() { |
+ Profile* profile = Profile::FromWebUI(web_ui_); |
+ |
+ // Create our favicon data source. |
+ profile->GetChromeURLDataManager()->AddDataSource( |
+ new FaviconSource(profile, FaviconSource::FAVICON)); |
+ |
+ homepage_.Init(prefs::kHomePage, profile->GetPrefs(), NULL); |
+ default_browser_policy_.Init(prefs::kDefaultBrowserSettingEnabled, |
+ g_browser_process->local_state(), |
+ this); |
+ UpdateDefaultBrowserState(); |
+ |
+ startup_custom_pages_table_model_.reset( |
+ new CustomHomePagesTableModel(profile)); |
+ startup_custom_pages_table_model_->SetObserver(this); |
+ UpdateStartupPages(); |
+ |
+ pref_change_registrar_.Init(profile->GetPrefs()); |
+ pref_change_registrar_.Add(prefs::kURLsToRestoreOnStartup, this); |
+ |
+ UpdateSearchEngines(); |
+ |
+ autocomplete_controller_.reset(new AutocompleteController(profile, this)); |
+} |
+ |
+void BrowserOptionsHandler::UpdateDefaultBrowserState() { |
+ // Check for side-by-side first. |
+ if (!ShellIntegration::CanSetAsDefaultBrowser()) { |
+ SetDefaultBrowserUIString(IDS_OPTIONS_DEFAULTBROWSER_SXS); |
+ return; |
+ } |
+ |
+#if defined(OS_MACOSX) |
+ ShellIntegration::DefaultWebClientState state = |
+ ShellIntegration::IsDefaultBrowser(); |
+ int status_string_id; |
+ if (state == ShellIntegration::IS_DEFAULT_WEB_CLIENT) |
+ status_string_id = IDS_OPTIONS_DEFAULTBROWSER_DEFAULT; |
+ else if (state == ShellIntegration::NOT_DEFAULT_WEB_CLIENT) |
+ status_string_id = IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT; |
+ else |
+ status_string_id = IDS_OPTIONS_DEFAULTBROWSER_UNKNOWN; |
+ |
+ SetDefaultBrowserUIString(status_string_id); |
+#else |
+ default_browser_worker_->StartCheckIsDefault(); |
+#endif |
+} |
+ |
+void BrowserOptionsHandler::BecomeDefaultBrowser(const ListValue* args) { |
+ // If the default browser setting is managed then we should not be able to |
+ // call this function. |
+ if (default_browser_policy_.IsManaged()) |
+ return; |
+ |
+ content::RecordAction(UserMetricsAction("Options_SetAsDefaultBrowser")); |
+#if defined(OS_MACOSX) |
+ if (ShellIntegration::SetAsDefaultBrowser()) |
+ UpdateDefaultBrowserState(); |
+#else |
+ default_browser_worker_->StartSetAsDefault(); |
+ // Callback takes care of updating UI. |
+#endif |
+ |
+ // If the user attempted to make Chrome the default browser, then he/she |
+ // arguably wants to be notified when that changes. |
+ PrefService* prefs = Profile::FromWebUI(web_ui_)->GetPrefs(); |
+ prefs->SetBoolean(prefs::kCheckDefaultBrowser, true); |
+} |
+ |
+int BrowserOptionsHandler::StatusStringIdForState( |
+ ShellIntegration::DefaultWebClientState state) { |
+ if (state == ShellIntegration::IS_DEFAULT_WEB_CLIENT) |
+ return IDS_OPTIONS_DEFAULTBROWSER_DEFAULT; |
+ if (state == ShellIntegration::NOT_DEFAULT_WEB_CLIENT) |
+ return IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT; |
+ return IDS_OPTIONS_DEFAULTBROWSER_UNKNOWN; |
+} |
+ |
+void BrowserOptionsHandler::SetDefaultWebClientUIState( |
+ ShellIntegration::DefaultWebClientUIState state) { |
+ int status_string_id; |
+ if (state == ShellIntegration::STATE_IS_DEFAULT) |
+ status_string_id = IDS_OPTIONS_DEFAULTBROWSER_DEFAULT; |
+ else if (state == ShellIntegration::STATE_NOT_DEFAULT) |
+ status_string_id = IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT; |
+ else if (state == ShellIntegration::STATE_UNKNOWN) |
+ status_string_id = IDS_OPTIONS_DEFAULTBROWSER_UNKNOWN; |
+ else |
+ return; // Still processing. |
+ |
+ SetDefaultBrowserUIString(status_string_id); |
+} |
+ |
+void BrowserOptionsHandler::SetDefaultBrowserUIString(int status_string_id) { |
+ scoped_ptr<Value> status_string(Value::CreateStringValue( |
+ l10n_util::GetStringFUTF16(status_string_id, |
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)))); |
+ |
+ scoped_ptr<Value> is_default(Value::CreateBooleanValue( |
+ status_string_id == IDS_OPTIONS_DEFAULTBROWSER_DEFAULT)); |
+ |
+ scoped_ptr<Value> can_be_default(Value::CreateBooleanValue( |
+ !default_browser_policy_.IsManaged() && |
+ (status_string_id == IDS_OPTIONS_DEFAULTBROWSER_DEFAULT || |
+ status_string_id == IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT))); |
+ |
+ web_ui_->CallJavascriptFunction("BrowserOptions.updateDefaultBrowserState", |
+ *status_string, *is_default, *can_be_default); |
+} |
+ |
+void BrowserOptionsHandler::OnTemplateURLServiceChanged() { |
+ if (!template_url_service_ || !template_url_service_->loaded()) |
+ return; |
+ |
+ const TemplateURL* default_url = |
+ template_url_service_->GetDefaultSearchProvider(); |
+ |
+ int default_index = 0; |
+ ListValue search_engines; |
+ std::vector<const TemplateURL*> model_urls = |
+ template_url_service_->GetTemplateURLs(); |
+ for (size_t i = 0; i < model_urls.size(); ++i) { |
+ if (!model_urls[i]->ShowInDefaultList()) |
+ continue; |
+ |
+ DictionaryValue* entry = new DictionaryValue(); |
+ entry->SetString("name", model_urls[i]->short_name()); |
+ entry->SetInteger("index", i); |
+ search_engines.Append(entry); |
+ if (model_urls[i] == default_url) |
+ default_index = i; |
+ } |
+ |
+ scoped_ptr<Value> default_value(Value::CreateIntegerValue(default_index)); |
+ scoped_ptr<Value> default_managed(Value::CreateBooleanValue( |
+ template_url_service_->is_default_search_managed())); |
+ |
+ web_ui_->CallJavascriptFunction("BrowserOptions.updateSearchEngines", |
+ search_engines, *default_value, |
+ *default_managed); |
+} |
+ |
+void BrowserOptionsHandler::SetDefaultSearchEngine(const ListValue* args) { |
+ int selected_index = -1; |
+ if (!ExtractIntegerValue(args, &selected_index)) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ std::vector<const TemplateURL*> model_urls = |
+ template_url_service_->GetTemplateURLs(); |
+ if (selected_index >= 0 && |
+ selected_index < static_cast<int>(model_urls.size())) |
+ template_url_service_->SetDefaultSearchProvider(model_urls[selected_index]); |
+ |
+ content::RecordAction(UserMetricsAction("Options_SearchEngineChanged")); |
+} |
+ |
+void BrowserOptionsHandler::UpdateSearchEngines() { |
+ template_url_service_ = |
+ TemplateURLServiceFactory::GetForProfile(Profile::FromWebUI(web_ui_)); |
+ if (template_url_service_) { |
+ template_url_service_->Load(); |
+ template_url_service_->AddObserver(this); |
+ OnTemplateURLServiceChanged(); |
+ } |
+} |
+ |
+void BrowserOptionsHandler::UpdateStartupPages() { |
+ Profile* profile = Profile::FromWebUI(web_ui_); |
+ const SessionStartupPref startup_pref = |
+ SessionStartupPref::GetStartupPref(profile->GetPrefs()); |
+ startup_custom_pages_table_model_->SetURLs(startup_pref.urls); |
+} |
+ |
+void BrowserOptionsHandler::OnModelChanged() { |
+ ListValue startup_pages; |
+ int page_count = startup_custom_pages_table_model_->RowCount(); |
+ std::vector<GURL> urls = startup_custom_pages_table_model_->GetURLs(); |
+ for (int i = 0; i < page_count; ++i) { |
+ DictionaryValue* entry = new DictionaryValue(); |
+ entry->SetString("title", startup_custom_pages_table_model_->GetText(i, 0)); |
+ entry->SetString("url", urls[i].spec()); |
+ entry->SetString("tooltip", |
+ startup_custom_pages_table_model_->GetTooltip(i)); |
+ entry->SetString("modelIndex", base::IntToString(i)); |
+ startup_pages.Append(entry); |
+ } |
+ |
+ web_ui_->CallJavascriptFunction("BrowserOptions.updateStartupPages", |
+ startup_pages); |
+} |
+ |
+void BrowserOptionsHandler::OnItemsChanged(int start, int length) { |
+ OnModelChanged(); |
+} |
+ |
+void BrowserOptionsHandler::OnItemsAdded(int start, int length) { |
+ OnModelChanged(); |
+} |
+ |
+void BrowserOptionsHandler::OnItemsRemoved(int start, int length) { |
+ OnModelChanged(); |
+} |
+ |
+void BrowserOptionsHandler::Observe( |
+ int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ if (type == chrome::NOTIFICATION_PREF_CHANGED) { |
+ std::string* pref = content::Details<std::string>(details).ptr(); |
+ if (*pref == prefs::kDefaultBrowserSettingEnabled) { |
+ UpdateDefaultBrowserState(); |
+ } else if (*pref == prefs::kURLsToRestoreOnStartup) { |
+ UpdateStartupPages(); |
+ } else { |
+ NOTREACHED(); |
+ } |
+ } else { |
+ NOTREACHED(); |
+ } |
+} |
+ |
+void BrowserOptionsHandler::SetStartupPagesToCurrentPages( |
+ const ListValue* args) { |
+ startup_custom_pages_table_model_->SetToCurrentlyOpenPages(); |
+ SaveStartupPagesPref(); |
+} |
+ |
+void BrowserOptionsHandler::RemoveStartupPages(const ListValue* args) { |
+ for (int i = args->GetSize() - 1; i >= 0; --i) { |
+ std::string string_value; |
+ CHECK(args->GetString(i, &string_value)); |
+ |
+ int selected_index; |
+ base::StringToInt(string_value, &selected_index); |
+ if (selected_index < 0 || |
+ selected_index >= startup_custom_pages_table_model_->RowCount()) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ startup_custom_pages_table_model_->Remove(selected_index); |
+ } |
+ |
+ SaveStartupPagesPref(); |
+} |
+ |
+void BrowserOptionsHandler::AddStartupPage(const ListValue* args) { |
+ std::string url_string; |
+ CHECK_EQ(args->GetSize(), 1U); |
+ CHECK(args->GetString(0, &url_string)); |
+ |
+ GURL url = URLFixerUpper::FixupURL(url_string, std::string()); |
+ if (!url.is_valid()) |
+ return; |
+ int index = startup_custom_pages_table_model_->RowCount(); |
+ startup_custom_pages_table_model_->Add(index, url); |
+ SaveStartupPagesPref(); |
+} |
+ |
+void BrowserOptionsHandler::EditStartupPage(const ListValue* args) { |
+ std::string url_string; |
+ std::string index_string; |
+ int index; |
+ CHECK_EQ(args->GetSize(), 2U); |
+ CHECK(args->GetString(0, &index_string)); |
+ CHECK(base::StringToInt(index_string, &index)); |
+ CHECK(args->GetString(1, &url_string)); |
+ |
+ if (index < 0 || index > startup_custom_pages_table_model_->RowCount()) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ std::vector<GURL> urls = startup_custom_pages_table_model_->GetURLs(); |
+ urls[index] = URLFixerUpper::FixupURL(url_string, std::string()); |
+ startup_custom_pages_table_model_->SetURLs(urls); |
+ SaveStartupPagesPref(); |
+} |
+ |
+void BrowserOptionsHandler::DragDropStartupPage(const ListValue* args) { |
+ CHECK_EQ(args->GetSize(), 2U); |
+ |
+ std::string value; |
+ int to_index; |
+ |
+ CHECK(args->GetString(0, &value)); |
+ base::StringToInt(value, &to_index); |
+ |
+ ListValue* selected; |
+ CHECK(args->GetList(1, &selected)); |
+ |
+ std::vector<int> index_list; |
+ for (size_t i = 0; i < selected->GetSize(); ++i) { |
+ int index; |
+ CHECK(selected->GetString(i, &value)); |
+ base::StringToInt(value, &index); |
+ index_list.push_back(index); |
+ } |
+ |
+ startup_custom_pages_table_model_->MoveURLs(to_index, index_list); |
+ SaveStartupPagesPref(); |
+} |
+ |
+void BrowserOptionsHandler::SaveStartupPagesPref() { |
+ PrefService* prefs = Profile::FromWebUI(web_ui_)->GetPrefs(); |
+ |
+ SessionStartupPref pref = SessionStartupPref::GetStartupPref(prefs); |
+ pref.urls = startup_custom_pages_table_model_->GetURLs(); |
+ |
+ SessionStartupPref::SetStartupPref(prefs, pref); |
+} |
+ |
+void BrowserOptionsHandler::RequestAutocompleteSuggestions( |
+ const ListValue* args) { |
+ string16 input; |
+ CHECK_EQ(args->GetSize(), 1U); |
+ CHECK(args->GetString(0, &input)); |
+ |
+ autocomplete_controller_->Start(input, string16(), true, false, false, |
+ AutocompleteInput::ALL_MATCHES); |
+} |
+ |
+void BrowserOptionsHandler::EnableInstant(const ListValue* args) { |
+ InstantController::Enable(Profile::FromWebUI(web_ui_)); |
+} |
+ |
+void BrowserOptionsHandler::DisableInstant(const ListValue* args) { |
+ InstantController::Disable(Profile::FromWebUI(web_ui_)); |
+} |
+ |
+void BrowserOptionsHandler::GetInstantFieldTrialStatus(const ListValue* args) { |
+ Profile* profile = Profile::FromWebUI(web_ui_); |
+ base::FundamentalValue enabled( |
+ InstantFieldTrial::IsInstantExperiment(profile) && |
+ !InstantFieldTrial::IsHiddenExperiment(profile)); |
+ web_ui_->CallJavascriptFunction("BrowserOptions.setInstantFieldTrialStatus", |
+ enabled); |
+} |
+ |
+void BrowserOptionsHandler::OnResultChanged(bool default_match_changed) { |
+ const AutocompleteResult& result = autocomplete_controller_->result(); |
+ ListValue suggestions; |
+ for (size_t i = 0; i < result.size(); ++i) { |
+ const AutocompleteMatch& match = result.match_at(i); |
+ AutocompleteMatch::Type type = match.type; |
+ if (type != AutocompleteMatch::HISTORY_URL && |
+ type != AutocompleteMatch::HISTORY_TITLE && |
+ type != AutocompleteMatch::HISTORY_BODY && |
+ type != AutocompleteMatch::HISTORY_KEYWORD && |
+ type != AutocompleteMatch::NAVSUGGEST) |
+ continue; |
+ DictionaryValue* entry = new DictionaryValue(); |
+ entry->SetString("title", match.description); |
+ entry->SetString("displayURL", match.contents); |
+ entry->SetString("url", match.destination_url.spec()); |
+ suggestions.Append(entry); |
+ } |
+ |
+ web_ui_->CallJavascriptFunction( |
+ "BrowserOptions.updateAutocompleteSuggestions", suggestions); |
+} |