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