1 // Copyright (c) 2012 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/options/startup_pages_handler.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/prefs/pref_service.h"
10 #include "chrome/browser/autocomplete/autocomplete_classifier.h"
11 #include "chrome/browser/autocomplete/autocomplete_controller.h"
12 #include "chrome/browser/autocomplete/autocomplete_input.h"
13 #include "chrome/browser/autocomplete/autocomplete_result.h"
14 #include "chrome/browser/chrome_notification_types.h"
15 #include "chrome/browser/custom_home_pages_table_model.h"
16 #include "chrome/browser/prefs/session_startup_pref.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/common/net/url_fixer_upper.h"
19 #include "chrome/common/pref_names.h"
20 #include "content/public/browser/notification_details.h"
21 #include "content/public/browser/web_ui.h"
22 #include "grit/generated_resources.h"
23
24 namespace options {
25
StartupPagesHandler()26 StartupPagesHandler::StartupPagesHandler() {}
27
~StartupPagesHandler()28 StartupPagesHandler::~StartupPagesHandler() {
29
30 }
31
GetLocalizedValues(DictionaryValue * localized_strings)32 void StartupPagesHandler::GetLocalizedValues(
33 DictionaryValue* localized_strings) {
34 DCHECK(localized_strings);
35
36 static OptionsStringResource resources[] = {
37 { "startupAddLabel", IDS_OPTIONS_STARTUP_ADD_LABEL },
38 { "startupUseCurrent", IDS_OPTIONS_STARTUP_USE_CURRENT },
39 { "startupPagesPlaceholder", IDS_OPTIONS_STARTUP_PAGES_PLACEHOLDER },
40 };
41
42 RegisterStrings(localized_strings, resources, arraysize(resources));
43 RegisterTitle(localized_strings, "startupPagesOverlay",
44 IDS_OPTIONS_STARTUP_PAGES_DIALOG_TITLE);
45 }
46
RegisterMessages()47 void StartupPagesHandler::RegisterMessages() {
48 web_ui()->RegisterMessageCallback("removeStartupPages",
49 base::Bind(&StartupPagesHandler::RemoveStartupPages,
50 base::Unretained(this)));
51 web_ui()->RegisterMessageCallback("addStartupPage",
52 base::Bind(&StartupPagesHandler::AddStartupPage,
53 base::Unretained(this)));
54 web_ui()->RegisterMessageCallback("editStartupPage",
55 base::Bind(&StartupPagesHandler::EditStartupPage,
56 base::Unretained(this)));
57 web_ui()->RegisterMessageCallback("setStartupPagesToCurrentPages",
58 base::Bind(&StartupPagesHandler::SetStartupPagesToCurrentPages,
59 base::Unretained(this)));
60 web_ui()->RegisterMessageCallback("dragDropStartupPage",
61 base::Bind(&StartupPagesHandler::DragDropStartupPage,
62 base::Unretained(this)));
63 web_ui()->RegisterMessageCallback(
64 "requestAutocompleteSuggestionsForStartupPages",
65 base::Bind(&StartupPagesHandler::RequestAutocompleteSuggestions,
66 base::Unretained(this)));
67 web_ui()->RegisterMessageCallback("commitStartupPrefChanges",
68 base::Bind(&StartupPagesHandler::CommitChanges,
69 base::Unretained(this)));
70 web_ui()->RegisterMessageCallback("cancelStartupPrefChanges",
71 base::Bind(&StartupPagesHandler::CancelChanges,
72 base::Unretained(this)));
73 }
74
UpdateStartupPages()75 void StartupPagesHandler::UpdateStartupPages() {
76 Profile* profile = Profile::FromWebUI(web_ui());
77 const SessionStartupPref startup_pref =
78 SessionStartupPref::GetStartupPref(profile->GetPrefs());
79 startup_custom_pages_table_model_->SetURLs(startup_pref.urls);
80 }
81
InitializeHandler()82 void StartupPagesHandler::InitializeHandler() {
83 Profile* profile = Profile::FromWebUI(web_ui());
84
85 startup_custom_pages_table_model_.reset(
86 new CustomHomePagesTableModel(profile));
87 startup_custom_pages_table_model_->SetObserver(this);
88
89 pref_change_registrar_.Init(profile->GetPrefs());
90 pref_change_registrar_.Add(
91 prefs::kURLsToRestoreOnStartup,
92 base::Bind(&StartupPagesHandler::UpdateStartupPages,
93 base::Unretained(this)));
94
95 autocomplete_controller_.reset(new AutocompleteController(profile, this,
96 AutocompleteClassifier::kDefaultOmniboxProviders));
97 }
98
InitializePage()99 void StartupPagesHandler::InitializePage() {
100 UpdateStartupPages();
101 }
102
OnModelChanged()103 void StartupPagesHandler::OnModelChanged() {
104 ListValue startup_pages;
105 int page_count = startup_custom_pages_table_model_->RowCount();
106 std::vector<GURL> urls = startup_custom_pages_table_model_->GetURLs();
107 for (int i = 0; i < page_count; ++i) {
108 DictionaryValue* entry = new DictionaryValue();
109 entry->SetString("title", startup_custom_pages_table_model_->GetText(i, 0));
110 entry->SetString("url", urls[i].spec());
111 entry->SetString("tooltip",
112 startup_custom_pages_table_model_->GetTooltip(i));
113 entry->SetInteger("modelIndex", i);
114 startup_pages.Append(entry);
115 }
116
117 web_ui()->CallJavascriptFunction("StartupOverlay.updateStartupPages",
118 startup_pages);
119 }
120
OnItemsChanged(int start,int length)121 void StartupPagesHandler::OnItemsChanged(int start, int length) {
122 OnModelChanged();
123 }
124
OnItemsAdded(int start,int length)125 void StartupPagesHandler::OnItemsAdded(int start, int length) {
126 OnModelChanged();
127 }
128
OnItemsRemoved(int start,int length)129 void StartupPagesHandler::OnItemsRemoved(int start, int length) {
130 OnModelChanged();
131 }
132
SetStartupPagesToCurrentPages(const ListValue * args)133 void StartupPagesHandler::SetStartupPagesToCurrentPages(
134 const ListValue* args) {
135 startup_custom_pages_table_model_->SetToCurrentlyOpenPages();
136 }
137
RemoveStartupPages(const ListValue * args)138 void StartupPagesHandler::RemoveStartupPages(const ListValue* args) {
139 for (int i = args->GetSize() - 1; i >= 0; --i) {
140 int selected_index;
141 CHECK(args->GetInteger(i, &selected_index));
142
143 if (selected_index < 0 ||
144 selected_index >= startup_custom_pages_table_model_->RowCount()) {
145 NOTREACHED();
146 return;
147 }
148 startup_custom_pages_table_model_->Remove(selected_index);
149 }
150 }
151
AddStartupPage(const ListValue * args)152 void StartupPagesHandler::AddStartupPage(const ListValue* args) {
153 std::string url_string;
154 CHECK(args->GetString(0, &url_string));
155
156 GURL url = URLFixerUpper::FixupURL(url_string, std::string());
157 if (!url.is_valid())
158 return;
159
160 int row_count = startup_custom_pages_table_model_->RowCount();
161 int index;
162 if (!args->GetInteger(1, &index) || index > row_count)
163 index = row_count;
164
165 startup_custom_pages_table_model_->Add(index, url);
166 }
167
EditStartupPage(const ListValue * args)168 void StartupPagesHandler::EditStartupPage(const ListValue* args) {
169 std::string url_string;
170 int index;
171 CHECK_EQ(args->GetSize(), 2U);
172 CHECK(args->GetInteger(0, &index));
173 CHECK(args->GetString(1, &url_string));
174
175 if (index < 0 || index > startup_custom_pages_table_model_->RowCount()) {
176 NOTREACHED();
177 return;
178 }
179
180 std::vector<GURL> urls = startup_custom_pages_table_model_->GetURLs();
181 urls[index] = URLFixerUpper::FixupURL(url_string, std::string());
182 startup_custom_pages_table_model_->SetURLs(urls);
183 }
184
DragDropStartupPage(const ListValue * args)185 void StartupPagesHandler::DragDropStartupPage(const ListValue* args) {
186 CHECK_EQ(args->GetSize(), 2U);
187
188 int to_index;
189
190 CHECK(args->GetInteger(0, &to_index));
191
192 const ListValue* selected;
193 CHECK(args->GetList(1, &selected));
194
195 std::vector<int> index_list;
196 for (size_t i = 0; i < selected->GetSize(); ++i) {
197 int index;
198 CHECK(selected->GetInteger(i, &index));
199 index_list.push_back(index);
200 }
201
202 startup_custom_pages_table_model_->MoveURLs(to_index, index_list);
203 }
204
SaveStartupPagesPref()205 void StartupPagesHandler::SaveStartupPagesPref() {
206 PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
207
208 SessionStartupPref pref = SessionStartupPref::GetStartupPref(prefs);
209 pref.urls = startup_custom_pages_table_model_->GetURLs();
210
211 if (pref.urls.empty())
212 pref.type = SessionStartupPref::DEFAULT;
213
214 SessionStartupPref::SetStartupPref(prefs, pref);
215 }
216
CommitChanges(const ListValue * args)217 void StartupPagesHandler::CommitChanges(const ListValue* args) {
218 SaveStartupPagesPref();
219 }
220
CancelChanges(const ListValue * args)221 void StartupPagesHandler::CancelChanges(const ListValue* args) {
222 UpdateStartupPages();
223 }
224
RequestAutocompleteSuggestions(const ListValue * args)225 void StartupPagesHandler::RequestAutocompleteSuggestions(
226 const ListValue* args) {
227 base::string16 input;
228 CHECK_EQ(args->GetSize(), 1U);
229 CHECK(args->GetString(0, &input));
230
231 autocomplete_controller_->Start(AutocompleteInput(
232 input, base::string16::npos, base::string16(), GURL(),
233 AutocompleteInput::INVALID_SPEC, true,
234 false, false, AutocompleteInput::ALL_MATCHES));
235 }
236
OnResultChanged(bool default_match_changed)237 void StartupPagesHandler::OnResultChanged(bool default_match_changed) {
238 const AutocompleteResult& result = autocomplete_controller_->result();
239 ListValue suggestions;
240 OptionsUI::ProcessAutocompleteSuggestions(result, &suggestions);
241 web_ui()->CallJavascriptFunction(
242 "StartupOverlay.updateAutocompleteSuggestions", suggestions);
243 }
244
245 } // namespace options
246