// 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 #include #include #include #include "base/bind.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/settings_utils.h" #include "chrome/common/pref_names.h" #include "content/public/browser/web_ui.h" #include "url/gurl.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::BindRepeating(&StartupPagesHandler::HandleAddStartupPage, base::Unretained(this))); web_ui()->RegisterMessageCallback( "editStartupPage", base::BindRepeating(&StartupPagesHandler::HandleEditStartupPage, base::Unretained(this))); web_ui()->RegisterMessageCallback( "onStartupPrefsPageLoad", base::BindRepeating(&StartupPagesHandler::HandleOnStartupPrefsPageLoad, base::Unretained(this))); web_ui()->RegisterMessageCallback( "removeStartupPage", base::BindRepeating(&StartupPagesHandler::HandleRemoveStartupPage, base::Unretained(this))); web_ui()->RegisterMessageCallback( "setStartupPagesToCurrentPages", base::BindRepeating( &StartupPagesHandler::HandleSetStartupPagesToCurrentPages, base::Unretained(this))); } void StartupPagesHandler::OnJavascriptAllowed() { 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))); } void StartupPagesHandler::OnJavascriptDisallowed() { startup_custom_pages_table_model_.SetObserver(nullptr); pref_change_registrar_.RemoveAll(); } void StartupPagesHandler::OnModelChanged() { base::ListValue startup_pages; int page_count = startup_custom_pages_table_model_.RowCount(); std::vector urls = startup_custom_pages_table_model_.GetURLs(); for (int i = 0; i < page_count; ++i) { std::unique_ptr 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(std::move(entry)); } FireWebUIListener("update-startup-pages", 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::HandleAddStartupPage(const base::ListValue* args) { CHECK_EQ(2U, args->GetSize()); const base::Value* callback_id; CHECK(args->Get(0, &callback_id)); std::string url_string; CHECK(args->GetString(1, &url_string)); GURL url; if (!settings_utils::FixupAndValidateStartupPage(url_string, &url)) { ResolveJavascriptCallback(*callback_id, base::Value(false)); 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(); ResolveJavascriptCallback(*callback_id, base::Value(true)); } void StartupPagesHandler::HandleEditStartupPage(const base::ListValue* args) { CHECK_EQ(args->GetSize(), 3U); const base::Value* callback_id; CHECK(args->Get(0, &callback_id)); int index; CHECK(args->GetInteger(1, &index)); if (index < 0 || index > startup_custom_pages_table_model_.RowCount()) { RejectJavascriptCallback(*callback_id, base::Value()); NOTREACHED(); return; } std::string url_string; CHECK(args->GetString(2, &url_string)); GURL fixed_url; if (settings_utils::FixupAndValidateStartupPage(url_string, &fixed_url)) { std::vector urls = startup_custom_pages_table_model_.GetURLs(); urls[index] = fixed_url; startup_custom_pages_table_model_.SetURLs(urls); SaveStartupPagesPref(); ResolveJavascriptCallback(*callback_id, base::Value(true)); } else { ResolveJavascriptCallback(*callback_id, base::Value(false)); } } void StartupPagesHandler::HandleOnStartupPrefsPageLoad( const base::ListValue* args) { AllowJavascript(); } void StartupPagesHandler::HandleRemoveStartupPage(const base::ListValue* args) { int selected_index; if (!args->GetInteger(0, &selected_index)) { NOTREACHED(); return; } if (selected_index < 0 || selected_index >= startup_custom_pages_table_model_.RowCount()) { NOTREACHED(); return; } startup_custom_pages_table_model_.Remove(selected_index); SaveStartupPagesPref(); } void StartupPagesHandler::HandleSetStartupPagesToCurrentPages( const base::ListValue* args) { startup_custom_pages_table_model_.SetToCurrentlyOpenPages( web_ui()->GetWebContents()); 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::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