blob: 233df7c3022041e7d9874885b1c08b363cf80017 [file] [log] [blame]
// Copyright 2015 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/settings/settings_startup_pages_handler.h"
#include <string>
#include <vector>
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "components/url_formatter/url_fixer.h"
#include "content/public/browser/web_ui.h"
namespace settings {
StartupPagesHandler::StartupPagesHandler(content::WebUI* webui)
: startup_custom_pages_table_model_(Profile::FromWebUI(webui)) {
}
StartupPagesHandler::~StartupPagesHandler() {
}
void StartupPagesHandler::RegisterMessages() {
if (Profile::FromWebUI(web_ui())->IsOffTheRecord())
return;
web_ui()->RegisterMessageCallback("addStartupPage",
base::Bind(&StartupPagesHandler::AddStartupPage,
base::Unretained(this)));
web_ui()->RegisterMessageCallback("onStartupPrefsPageLoad",
base::Bind(&StartupPagesHandler::OnStartupPrefsPageLoad,
base::Unretained(this)));
web_ui()->RegisterMessageCallback("removeStartupPage",
base::Bind(&StartupPagesHandler::RemoveStartupPage,
base::Unretained(this)));
web_ui()->RegisterMessageCallback("setStartupPagesToCurrentPages",
base::Bind(&StartupPagesHandler::SetStartupPagesToCurrentPages,
base::Unretained(this)));
}
void StartupPagesHandler::OnModelChanged() {
base::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) {
scoped_ptr<base::DictionaryValue> entry(new base::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->SetInteger("modelIndex", i);
startup_pages.Append(entry.release());
}
web_ui()->CallJavascriptFunction("Settings.updateStartupPages",
startup_pages);
}
void StartupPagesHandler::OnItemsChanged(int start, int length) {
OnModelChanged();
}
void StartupPagesHandler::OnItemsAdded(int start, int length) {
OnModelChanged();
}
void StartupPagesHandler::OnItemsRemoved(int start, int length) {
OnModelChanged();
}
void StartupPagesHandler::AddStartupPage(const base::ListValue* args) {
std::string url_string;
if (!args->GetString(0, &url_string)) {
DLOG(ERROR) << "Missing URL string parameter";
return;
}
GURL url = url_formatter::FixupURL(url_string, std::string());
if (!url.is_valid()) {
LOG(ERROR) << "FixupURL failed on " << url_string;
return;
}
int row_count = startup_custom_pages_table_model_.RowCount();
int index;
if (!args->GetInteger(1, &index) || index > row_count)
index = row_count;
startup_custom_pages_table_model_.Add(index, url);
SaveStartupPagesPref();
}
void StartupPagesHandler::OnStartupPrefsPageLoad(const base::ListValue* args) {
startup_custom_pages_table_model_.SetObserver(this);
PrefService* prefService = Profile::FromWebUI(web_ui())->GetPrefs();
SessionStartupPref pref = SessionStartupPref::GetStartupPref(
prefService);
startup_custom_pages_table_model_.SetURLs(pref.urls);
if (pref.urls.empty())
pref.type = SessionStartupPref::DEFAULT;
pref_change_registrar_.Init(prefService);
pref_change_registrar_.Add(
prefs::kURLsToRestoreOnStartup,
base::Bind(&StartupPagesHandler::UpdateStartupPages,
base::Unretained(this)));
const SessionStartupPref startup_pref = SessionStartupPref::GetStartupPref(
Profile::FromWebUI(web_ui())->GetPrefs());
startup_custom_pages_table_model_.SetURLs(startup_pref.urls);
}
void StartupPagesHandler::RemoveStartupPage(const base::ListValue* args) {
int selected_index;
if (!args->GetInteger(0, &selected_index)) {
DLOG(ERROR) << "Missing index parameter";
return;
}
if (selected_index < 0 ||
selected_index >= startup_custom_pages_table_model_.RowCount()) {
LOG(ERROR) << "Index out of range " << selected_index;
return;
}
startup_custom_pages_table_model_.Remove(selected_index);
SaveStartupPagesPref();
}
void StartupPagesHandler::SaveStartupPagesPref() {
PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
SessionStartupPref pref = SessionStartupPref::GetStartupPref(prefs);
pref.urls = startup_custom_pages_table_model_.GetURLs();
if (pref.urls.empty())
pref.type = SessionStartupPref::DEFAULT;
SessionStartupPref::SetStartupPref(prefs, pref);
}
void StartupPagesHandler::SetStartupPagesToCurrentPages(
const base::ListValue* args) {
startup_custom_pages_table_model_.SetToCurrentlyOpenPages();
SaveStartupPagesPref();
}
void StartupPagesHandler::UpdateStartupPages() {
const SessionStartupPref startup_pref = SessionStartupPref::GetStartupPref(
Profile::FromWebUI(web_ui())->GetPrefs());
startup_custom_pages_table_model_.SetURLs(startup_pref.urls);
// The change will go to the JS code in the
// StartupPagesHandler::OnModelChanged() method.
}
} // namespace settings