Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(787)

Side by Side Diff: chrome/browser/ui/webui/options2/browser_options_handler.cc

Issue 8895023: Options2: Pull the trigger. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: DIAF. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/webui/options2/browser_options_handler.h"
6
7 #include "base/basictypes.h"
8 #include "base/bind.h"
9 #include "base/bind_helpers.h"
10 #include "base/memory/singleton.h"
11 #include "base/string_number_conversions.h"
12 #include "base/utf_string_conversions.h"
13 #include "base/values.h"
14 #include "chrome/browser/autocomplete/autocomplete.h"
15 #include "chrome/browser/autocomplete/autocomplete_match.h"
16 #include "chrome/browser/browser_process.h"
17 #include "chrome/browser/custom_home_pages_table_model.h"
18 #include "chrome/browser/instant/instant_confirm_dialog.h"
19 #include "chrome/browser/instant/instant_controller.h"
20 #include "chrome/browser/instant/instant_field_trial.h"
21 #include "chrome/browser/net/url_fixer_upper.h"
22 #include "chrome/browser/prefs/pref_service.h"
23 #include "chrome/browser/prefs/session_startup_pref.h"
24 #include "chrome/browser/profiles/profile.h"
25 #include "chrome/browser/search_engines/template_url.h"
26 #include "chrome/browser/search_engines/template_url_service.h"
27 #include "chrome/browser/search_engines/template_url_service_factory.h"
28 #include "chrome/browser/ui/webui/favicon_source.h"
29 #include "chrome/common/chrome_notification_types.h"
30 #include "chrome/common/pref_names.h"
31 #include "chrome/common/url_constants.h"
32 #include "content/public/browser/browser_thread.h"
33 #include "content/public/browser/notification_details.h"
34 #include "content/public/browser/notification_source.h"
35 #include "content/public/browser/user_metrics.h"
36 #include "grit/chromium_strings.h"
37 #include "grit/generated_resources.h"
38 #include "ui/base/l10n/l10n_util.h"
39
40 using content::UserMetricsAction;
41
42 BrowserOptionsHandler::BrowserOptionsHandler()
43 : template_url_service_(NULL), startup_custom_pages_table_model_(NULL) {
44 #if !defined(OS_MACOSX)
45 default_browser_worker_ = new ShellIntegration::DefaultBrowserWorker(this);
46 #endif
47 }
48
49 BrowserOptionsHandler::~BrowserOptionsHandler() {
50 if (default_browser_worker_.get())
51 default_browser_worker_->ObserverDestroyed();
52 if (template_url_service_)
53 template_url_service_->RemoveObserver(this);
54 }
55
56 void BrowserOptionsHandler::GetLocalizedValues(
57 DictionaryValue* localized_strings) {
58 DCHECK(localized_strings);
59
60 static OptionsStringResource resources[] = {
61 { "startupGroupName", IDS_OPTIONS_STARTUP_GROUP_NAME },
62 { "startupShowDefaultAndNewTab",
63 IDS_OPTIONS_STARTUP_SHOW_DEFAULT_AND_NEWTAB},
64 { "startupShowLastSession", IDS_OPTIONS_STARTUP_SHOW_LAST_SESSION },
65 { "startupShowPages", IDS_OPTIONS_STARTUP_SHOW_PAGES },
66 { "startupAddLabel", IDS_OPTIONS_STARTUP_ADD_LABEL },
67 { "startupUseCurrent", IDS_OPTIONS_STARTUP_USE_CURRENT },
68 { "homepageGroupName", IDS_OPTIONS_HOMEPAGE_GROUP_NAME },
69 { "homepageUseNewTab", IDS_OPTIONS_HOMEPAGE_USE_NEWTAB },
70 { "homepageUseURL", IDS_OPTIONS_HOMEPAGE_USE_URL },
71 { "toolbarGroupName", IDS_OPTIONS_TOOLBAR_GROUP_NAME },
72 { "toolbarShowHomeButton", IDS_OPTIONS_TOOLBAR_SHOW_HOME_BUTTON },
73 { "toolbarShowBookmarksBar", IDS_OPTIONS_TOOLBAR_SHOW_BOOKMARKS_BAR },
74 { "defaultSearchGroupName", IDS_OPTIONS_DEFAULTSEARCH_GROUP_NAME },
75 { "defaultSearchManageEngines", IDS_OPTIONS_DEFAULTSEARCH_MANAGE_ENGINES },
76 { "instantName", IDS_INSTANT_PREF },
77 { "instantWarningText", IDS_INSTANT_PREF_WARNING },
78 { "instantConfirmTitle", IDS_INSTANT_OPT_IN_TITLE },
79 { "instantConfirmMessage", IDS_INSTANT_OPT_IN_MESSAGE },
80 { "defaultBrowserGroupName", IDS_OPTIONS_DEFAULTBROWSER_GROUP_NAME },
81 };
82
83 RegisterStrings(localized_strings, resources, arraysize(resources));
84 RegisterTitle(localized_strings, "browserPage",
85 IDS_OPTIONS_GENERAL_TAB_LABEL);
86
87 localized_strings->SetString("instantLearnMoreLink",
88 ASCIIToUTF16(browser::InstantLearnMoreURL().spec()));
89 localized_strings->SetString("defaultBrowserUnknown",
90 l10n_util::GetStringFUTF16(IDS_OPTIONS_DEFAULTBROWSER_UNKNOWN,
91 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
92 localized_strings->SetString("defaultBrowserUseAsDefault",
93 l10n_util::GetStringFUTF16(IDS_OPTIONS_DEFAULTBROWSER_USEASDEFAULT,
94 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
95 }
96
97 void BrowserOptionsHandler::RegisterMessages() {
98 web_ui_->RegisterMessageCallback("becomeDefaultBrowser",
99 base::Bind(&BrowserOptionsHandler::BecomeDefaultBrowser,
100 base::Unretained(this)));
101 web_ui_->RegisterMessageCallback("setDefaultSearchEngine",
102 base::Bind(&BrowserOptionsHandler::SetDefaultSearchEngine,
103 base::Unretained(this)));
104 web_ui_->RegisterMessageCallback("removeStartupPages",
105 base::Bind(&BrowserOptionsHandler::RemoveStartupPages,
106 base::Unretained(this)));
107 web_ui_->RegisterMessageCallback("addStartupPage",
108 base::Bind(&BrowserOptionsHandler::AddStartupPage,
109 base::Unretained(this)));
110 web_ui_->RegisterMessageCallback("editStartupPage",
111 base::Bind(&BrowserOptionsHandler::EditStartupPage,
112 base::Unretained(this)));
113 web_ui_->RegisterMessageCallback("setStartupPagesToCurrentPages",
114 base::Bind(&BrowserOptionsHandler::SetStartupPagesToCurrentPages,
115 base::Unretained(this)));
116 web_ui_->RegisterMessageCallback("dragDropStartupPage",
117 base::Bind(&BrowserOptionsHandler::DragDropStartupPage,
118 base::Unretained(this)));
119 web_ui_->RegisterMessageCallback("requestAutocompleteSuggestions",
120 base::Bind(&BrowserOptionsHandler::RequestAutocompleteSuggestions,
121 base::Unretained(this)));
122 web_ui_->RegisterMessageCallback("enableInstant",
123 base::Bind(&BrowserOptionsHandler::EnableInstant,
124 base::Unretained(this)));
125 web_ui_->RegisterMessageCallback("disableInstant",
126 base::Bind(&BrowserOptionsHandler::DisableInstant,
127 base::Unretained(this)));
128 web_ui_->RegisterMessageCallback("getInstantFieldTrialStatus",
129 base::Bind(&BrowserOptionsHandler::GetInstantFieldTrialStatus,
130 base::Unretained(this)));
131 }
132
133 void BrowserOptionsHandler::Initialize() {
134 Profile* profile = Profile::FromWebUI(web_ui_);
135
136 // Create our favicon data source.
137 profile->GetChromeURLDataManager()->AddDataSource(
138 new FaviconSource(profile, FaviconSource::FAVICON));
139
140 homepage_.Init(prefs::kHomePage, profile->GetPrefs(), NULL);
141 default_browser_policy_.Init(prefs::kDefaultBrowserSettingEnabled,
142 g_browser_process->local_state(),
143 this);
144 UpdateDefaultBrowserState();
145
146 startup_custom_pages_table_model_.reset(
147 new CustomHomePagesTableModel(profile));
148 startup_custom_pages_table_model_->SetObserver(this);
149 UpdateStartupPages();
150
151 pref_change_registrar_.Init(profile->GetPrefs());
152 pref_change_registrar_.Add(prefs::kURLsToRestoreOnStartup, this);
153
154 UpdateSearchEngines();
155
156 autocomplete_controller_.reset(new AutocompleteController(profile, this));
157 }
158
159 void BrowserOptionsHandler::UpdateDefaultBrowserState() {
160 // Check for side-by-side first.
161 if (!ShellIntegration::CanSetAsDefaultBrowser()) {
162 SetDefaultBrowserUIString(IDS_OPTIONS_DEFAULTBROWSER_SXS);
163 return;
164 }
165
166 #if defined(OS_MACOSX)
167 ShellIntegration::DefaultWebClientState state =
168 ShellIntegration::IsDefaultBrowser();
169 int status_string_id;
170 if (state == ShellIntegration::IS_DEFAULT_WEB_CLIENT)
171 status_string_id = IDS_OPTIONS_DEFAULTBROWSER_DEFAULT;
172 else if (state == ShellIntegration::NOT_DEFAULT_WEB_CLIENT)
173 status_string_id = IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT;
174 else
175 status_string_id = IDS_OPTIONS_DEFAULTBROWSER_UNKNOWN;
176
177 SetDefaultBrowserUIString(status_string_id);
178 #else
179 default_browser_worker_->StartCheckIsDefault();
180 #endif
181 }
182
183 void BrowserOptionsHandler::BecomeDefaultBrowser(const ListValue* args) {
184 // If the default browser setting is managed then we should not be able to
185 // call this function.
186 if (default_browser_policy_.IsManaged())
187 return;
188
189 content::RecordAction(UserMetricsAction("Options_SetAsDefaultBrowser"));
190 #if defined(OS_MACOSX)
191 if (ShellIntegration::SetAsDefaultBrowser())
192 UpdateDefaultBrowserState();
193 #else
194 default_browser_worker_->StartSetAsDefault();
195 // Callback takes care of updating UI.
196 #endif
197
198 // If the user attempted to make Chrome the default browser, then he/she
199 // arguably wants to be notified when that changes.
200 PrefService* prefs = Profile::FromWebUI(web_ui_)->GetPrefs();
201 prefs->SetBoolean(prefs::kCheckDefaultBrowser, true);
202 }
203
204 int BrowserOptionsHandler::StatusStringIdForState(
205 ShellIntegration::DefaultWebClientState state) {
206 if (state == ShellIntegration::IS_DEFAULT_WEB_CLIENT)
207 return IDS_OPTIONS_DEFAULTBROWSER_DEFAULT;
208 if (state == ShellIntegration::NOT_DEFAULT_WEB_CLIENT)
209 return IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT;
210 return IDS_OPTIONS_DEFAULTBROWSER_UNKNOWN;
211 }
212
213 void BrowserOptionsHandler::SetDefaultWebClientUIState(
214 ShellIntegration::DefaultWebClientUIState state) {
215 int status_string_id;
216 if (state == ShellIntegration::STATE_IS_DEFAULT)
217 status_string_id = IDS_OPTIONS_DEFAULTBROWSER_DEFAULT;
218 else if (state == ShellIntegration::STATE_NOT_DEFAULT)
219 status_string_id = IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT;
220 else if (state == ShellIntegration::STATE_UNKNOWN)
221 status_string_id = IDS_OPTIONS_DEFAULTBROWSER_UNKNOWN;
222 else
223 return; // Still processing.
224
225 SetDefaultBrowserUIString(status_string_id);
226 }
227
228 void BrowserOptionsHandler::SetDefaultBrowserUIString(int status_string_id) {
229 scoped_ptr<Value> status_string(Value::CreateStringValue(
230 l10n_util::GetStringFUTF16(status_string_id,
231 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))));
232
233 scoped_ptr<Value> is_default(Value::CreateBooleanValue(
234 status_string_id == IDS_OPTIONS_DEFAULTBROWSER_DEFAULT));
235
236 scoped_ptr<Value> can_be_default(Value::CreateBooleanValue(
237 !default_browser_policy_.IsManaged() &&
238 (status_string_id == IDS_OPTIONS_DEFAULTBROWSER_DEFAULT ||
239 status_string_id == IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT)));
240
241 web_ui_->CallJavascriptFunction("BrowserOptions.updateDefaultBrowserState",
242 *status_string, *is_default, *can_be_default);
243 }
244
245 void BrowserOptionsHandler::OnTemplateURLServiceChanged() {
246 if (!template_url_service_ || !template_url_service_->loaded())
247 return;
248
249 const TemplateURL* default_url =
250 template_url_service_->GetDefaultSearchProvider();
251
252 int default_index = 0;
253 ListValue search_engines;
254 std::vector<const TemplateURL*> model_urls =
255 template_url_service_->GetTemplateURLs();
256 for (size_t i = 0; i < model_urls.size(); ++i) {
257 if (!model_urls[i]->ShowInDefaultList())
258 continue;
259
260 DictionaryValue* entry = new DictionaryValue();
261 entry->SetString("name", model_urls[i]->short_name());
262 entry->SetInteger("index", i);
263 search_engines.Append(entry);
264 if (model_urls[i] == default_url)
265 default_index = i;
266 }
267
268 scoped_ptr<Value> default_value(Value::CreateIntegerValue(default_index));
269 scoped_ptr<Value> default_managed(Value::CreateBooleanValue(
270 template_url_service_->is_default_search_managed()));
271
272 web_ui_->CallJavascriptFunction("BrowserOptions.updateSearchEngines",
273 search_engines, *default_value,
274 *default_managed);
275 }
276
277 void BrowserOptionsHandler::SetDefaultSearchEngine(const ListValue* args) {
278 int selected_index = -1;
279 if (!ExtractIntegerValue(args, &selected_index)) {
280 NOTREACHED();
281 return;
282 }
283
284 std::vector<const TemplateURL*> model_urls =
285 template_url_service_->GetTemplateURLs();
286 if (selected_index >= 0 &&
287 selected_index < static_cast<int>(model_urls.size()))
288 template_url_service_->SetDefaultSearchProvider(model_urls[selected_index]);
289
290 content::RecordAction(UserMetricsAction("Options_SearchEngineChanged"));
291 }
292
293 void BrowserOptionsHandler::UpdateSearchEngines() {
294 template_url_service_ =
295 TemplateURLServiceFactory::GetForProfile(Profile::FromWebUI(web_ui_));
296 if (template_url_service_) {
297 template_url_service_->Load();
298 template_url_service_->AddObserver(this);
299 OnTemplateURLServiceChanged();
300 }
301 }
302
303 void BrowserOptionsHandler::UpdateStartupPages() {
304 Profile* profile = Profile::FromWebUI(web_ui_);
305 const SessionStartupPref startup_pref =
306 SessionStartupPref::GetStartupPref(profile->GetPrefs());
307 startup_custom_pages_table_model_->SetURLs(startup_pref.urls);
308 }
309
310 void BrowserOptionsHandler::OnModelChanged() {
311 ListValue startup_pages;
312 int page_count = startup_custom_pages_table_model_->RowCount();
313 std::vector<GURL> urls = startup_custom_pages_table_model_->GetURLs();
314 for (int i = 0; i < page_count; ++i) {
315 DictionaryValue* entry = new DictionaryValue();
316 entry->SetString("title", startup_custom_pages_table_model_->GetText(i, 0));
317 entry->SetString("url", urls[i].spec());
318 entry->SetString("tooltip",
319 startup_custom_pages_table_model_->GetTooltip(i));
320 entry->SetString("modelIndex", base::IntToString(i));
321 startup_pages.Append(entry);
322 }
323
324 web_ui_->CallJavascriptFunction("BrowserOptions.updateStartupPages",
325 startup_pages);
326 }
327
328 void BrowserOptionsHandler::OnItemsChanged(int start, int length) {
329 OnModelChanged();
330 }
331
332 void BrowserOptionsHandler::OnItemsAdded(int start, int length) {
333 OnModelChanged();
334 }
335
336 void BrowserOptionsHandler::OnItemsRemoved(int start, int length) {
337 OnModelChanged();
338 }
339
340 void BrowserOptionsHandler::Observe(
341 int type,
342 const content::NotificationSource& source,
343 const content::NotificationDetails& details) {
344 if (type == chrome::NOTIFICATION_PREF_CHANGED) {
345 std::string* pref = content::Details<std::string>(details).ptr();
346 if (*pref == prefs::kDefaultBrowserSettingEnabled) {
347 UpdateDefaultBrowserState();
348 } else if (*pref == prefs::kURLsToRestoreOnStartup) {
349 UpdateStartupPages();
350 } else {
351 NOTREACHED();
352 }
353 } else {
354 NOTREACHED();
355 }
356 }
357
358 void BrowserOptionsHandler::SetStartupPagesToCurrentPages(
359 const ListValue* args) {
360 startup_custom_pages_table_model_->SetToCurrentlyOpenPages();
361 SaveStartupPagesPref();
362 }
363
364 void BrowserOptionsHandler::RemoveStartupPages(const ListValue* args) {
365 for (int i = args->GetSize() - 1; i >= 0; --i) {
366 std::string string_value;
367 CHECK(args->GetString(i, &string_value));
368
369 int selected_index;
370 base::StringToInt(string_value, &selected_index);
371 if (selected_index < 0 ||
372 selected_index >= startup_custom_pages_table_model_->RowCount()) {
373 NOTREACHED();
374 return;
375 }
376 startup_custom_pages_table_model_->Remove(selected_index);
377 }
378
379 SaveStartupPagesPref();
380 }
381
382 void BrowserOptionsHandler::AddStartupPage(const ListValue* args) {
383 std::string url_string;
384 CHECK_EQ(args->GetSize(), 1U);
385 CHECK(args->GetString(0, &url_string));
386
387 GURL url = URLFixerUpper::FixupURL(url_string, std::string());
388 if (!url.is_valid())
389 return;
390 int index = startup_custom_pages_table_model_->RowCount();
391 startup_custom_pages_table_model_->Add(index, url);
392 SaveStartupPagesPref();
393 }
394
395 void BrowserOptionsHandler::EditStartupPage(const ListValue* args) {
396 std::string url_string;
397 std::string index_string;
398 int index;
399 CHECK_EQ(args->GetSize(), 2U);
400 CHECK(args->GetString(0, &index_string));
401 CHECK(base::StringToInt(index_string, &index));
402 CHECK(args->GetString(1, &url_string));
403
404 if (index < 0 || index > startup_custom_pages_table_model_->RowCount()) {
405 NOTREACHED();
406 return;
407 }
408
409 std::vector<GURL> urls = startup_custom_pages_table_model_->GetURLs();
410 urls[index] = URLFixerUpper::FixupURL(url_string, std::string());
411 startup_custom_pages_table_model_->SetURLs(urls);
412 SaveStartupPagesPref();
413 }
414
415 void BrowserOptionsHandler::DragDropStartupPage(const ListValue* args) {
416 CHECK_EQ(args->GetSize(), 2U);
417
418 std::string value;
419 int to_index;
420
421 CHECK(args->GetString(0, &value));
422 base::StringToInt(value, &to_index);
423
424 ListValue* selected;
425 CHECK(args->GetList(1, &selected));
426
427 std::vector<int> index_list;
428 for (size_t i = 0; i < selected->GetSize(); ++i) {
429 int index;
430 CHECK(selected->GetString(i, &value));
431 base::StringToInt(value, &index);
432 index_list.push_back(index);
433 }
434
435 startup_custom_pages_table_model_->MoveURLs(to_index, index_list);
436 SaveStartupPagesPref();
437 }
438
439 void BrowserOptionsHandler::SaveStartupPagesPref() {
440 PrefService* prefs = Profile::FromWebUI(web_ui_)->GetPrefs();
441
442 SessionStartupPref pref = SessionStartupPref::GetStartupPref(prefs);
443 pref.urls = startup_custom_pages_table_model_->GetURLs();
444
445 SessionStartupPref::SetStartupPref(prefs, pref);
446 }
447
448 void BrowserOptionsHandler::RequestAutocompleteSuggestions(
449 const ListValue* args) {
450 string16 input;
451 CHECK_EQ(args->GetSize(), 1U);
452 CHECK(args->GetString(0, &input));
453
454 autocomplete_controller_->Start(input, string16(), true, false, false,
455 AutocompleteInput::ALL_MATCHES);
456 }
457
458 void BrowserOptionsHandler::EnableInstant(const ListValue* args) {
459 InstantController::Enable(Profile::FromWebUI(web_ui_));
460 }
461
462 void BrowserOptionsHandler::DisableInstant(const ListValue* args) {
463 InstantController::Disable(Profile::FromWebUI(web_ui_));
464 }
465
466 void BrowserOptionsHandler::GetInstantFieldTrialStatus(const ListValue* args) {
467 Profile* profile = Profile::FromWebUI(web_ui_);
468 base::FundamentalValue enabled(
469 InstantFieldTrial::IsInstantExperiment(profile) &&
470 !InstantFieldTrial::IsHiddenExperiment(profile));
471 web_ui_->CallJavascriptFunction("BrowserOptions.setInstantFieldTrialStatus",
472 enabled);
473 }
474
475 void BrowserOptionsHandler::OnResultChanged(bool default_match_changed) {
476 const AutocompleteResult& result = autocomplete_controller_->result();
477 ListValue suggestions;
478 for (size_t i = 0; i < result.size(); ++i) {
479 const AutocompleteMatch& match = result.match_at(i);
480 AutocompleteMatch::Type type = match.type;
481 if (type != AutocompleteMatch::HISTORY_URL &&
482 type != AutocompleteMatch::HISTORY_TITLE &&
483 type != AutocompleteMatch::HISTORY_BODY &&
484 type != AutocompleteMatch::HISTORY_KEYWORD &&
485 type != AutocompleteMatch::NAVSUGGEST)
486 continue;
487 DictionaryValue* entry = new DictionaryValue();
488 entry->SetString("title", match.description);
489 entry->SetString("displayURL", match.contents);
490 entry->SetString("url", match.destination_url.spec());
491 suggestions.Append(entry);
492 }
493
494 web_ui_->CallJavascriptFunction(
495 "BrowserOptions.updateAutocompleteSuggestions", suggestions);
496 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698