diff options
author | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-24 11:59:35 +0000 |
---|---|---|
committer | battre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-24 11:59:35 +0000 |
commit | 380532aa316df3370f1c26d85b239771eea6c52f (patch) | |
tree | fb65f63e3923bd3e3af6df95bdb130879fc90566 | |
parent | 575a11db587cab53119edf7c60adf7e7e7e33903 (diff) | |
download | chromium_src-380532aa316df3370f1c26d85b239771eea6c52f.zip chromium_src-380532aa316df3370f1c26d85b239771eea6c52f.tar.gz chromium_src-380532aa316df3370f1c26d85b239771eea6c52f.tar.bz2 |
WebUI for Profile Settings Reset
This CL implements chrome://settings/profileSettingsReset, a feature to reset
profile settings that malware often modifies.
BUG=235037
Review URL: https://chromiumcodereview.appspot.com/14924002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202064 0039d316-1c4b-4281-b951-d872f2087c98
24 files changed, 555 insertions, 0 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index d4328f5..226cea1 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -6818,6 +6818,12 @@ Keep your key file in a safe place. You will need it to create new versions of y <message name="IDS_FLAGS_ENABLE_WEBP_IN_ACCEPT_HEADER_DESCRIPTION" desc="Description for the flag to enable 'image/webp' in accept header."> Enables 'image/webp' accept header in HTTP requests for images, to denote WebP image support. </message> + <message name="IDS_FLAGS_ENABLE_RESET_PROFILE_SETTINGS_NAME" desc="Title for the flag to enable a feature to reset profile settings that are often modified by malware."> + Enable reset profile settings + </message> + <message name="IDS_FLAGS_ENABLE_RESET_PROFILE_SETTINGS_DESCRIPTION" desc="Description for the flag to enable a feature to reset profile settings that are often modified by malware."> + Enables the option in chrome://settings to reset settings in your profile that are often modified by malware. + </message> <message name="IDS_GENERIC_EXPERIMENT_CHOICE_AUTOMATIC" desc="Generic 'Automatic' experiment choice option name."> Automatic @@ -15267,6 +15273,47 @@ First, create a limited user in Chrome on this device. You can then configure th Try it </message> + <!-- Reset Profile Settings strings --> + <message name="IDS_RESET_PROFILE_SETTINGS_SECTION_TITLE" desc="The title of the section in chrome://settings that allows resetting some settings in a profile"> + Reset + </message> + <message name="IDS_RESET_PROFILE_SETTINGS_DESCRIPTION" desc="A label describing the purpose of the 'reset profile settings' feature"> + Things got out of control? Revert your Chrome profile to a clean, post install state. + </message> + <message name="IDS_RESET_PROFILE_SETTINGS_BUTTON" desc="The text on the button in chrome://settings that allows resetting some settings in a profile"> + Reset profile settings... + </message> + <message name="IDS_RESET_PROFILE_SETTINGS_TITLE" desc="Dialog title"> + Reset profile settings + </message> + <message name="IDS_RESET_PROFILE_SETTINGS_LABEL" desc="Label at the top of the client area of the dialog"> + What would you like to reset? + </message> + <message name="IDS_RESET_PROFILE_DEFAULT_SEARCH_ENGINE_CHECKBOX" desc="Checkbox of the Reset Profile Settings dialog"> + Default Search Engine + </message> + <message name="IDS_RESET_PROFILE_HOMEPAGE_CHECKBOX" desc="Checkbox of the Reset Profile Settings dialog"> + Homepage + </message> + <message name="IDS_RESET_PROFILE_CONTENT_SETTINGS_CHECKBOX" desc="Checkbox of the Reset Profile Settings dialog"> + Content settings + </message> + <message name="IDS_RESET_PROFILE_COOKIES_CHECKBOX" desc="Checkbox of the Reset Profile Settings dialog"> + Cookies and site data + </message> + <message name="IDS_RESET_PROFILE_EXTENSIONS_CHECKBOX" desc="Checkbox of the Reset Profile Settings dialog"> + Extensions, new tab page and themes + </message> + <message name="IDS_RESET_PROFILE_EXTENSIONS_DISABLE" desc="Listbox item of the Reset Profile Settings dialog, indicating how to handle extensions"> + Disable + </message> + <message name="IDS_RESET_PROFILE_EXTENSIONS_UNINSTALL" desc="Listbox item of the Reset Profile Settings dialog, indicating how to handle extensions"> + Uninstall + </message> + <message name="IDS_RESET_PROFILE_SETTINGS_COMMIT_BUTTON" desc="Checkbox of the Reset Profile Settings dialog"> + Reset + </message> + </messages> <structures fallback_to_english="true"> diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 235c23a..70b3a5d 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -1461,6 +1461,13 @@ const Experiment kExperiments[] = { kOsAndroid, SINGLE_VALUE_TYPE(switches::kEnableDraggableMenuButton) }, + { + "enable-reset-profile-settings", + IDS_FLAGS_ENABLE_RESET_PROFILE_SETTINGS_NAME, + IDS_FLAGS_ENABLE_RESET_PROFILE_SETTINGS_DESCRIPTION, + kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableResetProfileSettings) + }, }; const Experiment* experiments = kExperiments; diff --git a/chrome/browser/profile_resetter/profile_resetter.cc b/chrome/browser/profile_resetter/profile_resetter.cc index 947bc6b..95fbd4a 100644 --- a/chrome/browser/profile_resetter/profile_resetter.cc +++ b/chrome/browser/profile_resetter/profile_resetter.cc @@ -68,6 +68,11 @@ void ProfileResetter::Reset(ProfileResetter::ResettableFlags resettable_flags, DCHECK_EQ(resettable_flags, reset_triggered_for_flags); } +bool ProfileResetter::IsActive() const { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + return pending_reset_flags_ != 0; +} + void ProfileResetter::MarkAsDone(Resettable resettable) { DCHECK(CalledOnValidThread()); diff --git a/chrome/browser/profile_resetter/profile_resetter.h b/chrome/browser/profile_resetter/profile_resetter.h index 9adbaf3..1030fb4 100644 --- a/chrome/browser/profile_resetter/profile_resetter.h +++ b/chrome/browser/profile_resetter/profile_resetter.h @@ -52,6 +52,8 @@ class ProfileResetter : public base::NonThreadSafe { ExtensionHandling extension_handling, const base::Closure& callback); + bool IsActive() const; + private: // Marks |resettable| as done and triggers |callback_| if all pending jobs // have completed. diff --git a/chrome/browser/resources/options/browser_options.html b/chrome/browser/resources/options/browser_options.html index c3596fb..00e2783 100644 --- a/chrome/browser/resources/options/browser_options.html +++ b/chrome/browser/resources/options/browser_options.html @@ -717,6 +717,15 @@ </div> </section> </if> + <section id="reset-profile-settings-section" hidden> + <h3 i18n-content="resetProfileSettingsSectionTitle"></h3> + <div> + <span class="settings-row" i18n-content="resetProfileSettingsDescription"> + </span> + <button id="reset-profile-settings" i18n-content="resetProfileSettings"> + </button> + </div> + </section> </div> <!-- advanced-settings-container --> </div> <!-- advanced-settings --> <footer> diff --git a/chrome/browser/resources/options/browser_options.js b/chrome/browser/resources/options/browser_options.js index affabb8..51e498d 100644 --- a/chrome/browser/resources/options/browser_options.js +++ b/chrome/browser/resources/options/browser_options.js @@ -466,6 +466,13 @@ cr.define('options', function() { }; updateGpuRestartButton(); } + + // Reset profile settings section. + $('reset-profile-settings-section').hidden = + !loadTimeData.getValue('enableResetProfileSettingsSection'); + $('reset-profile-settings').onclick = function(event) { + OptionsPage.navigateToPage('resetProfileSettings'); + }; }, /** @override */ diff --git a/chrome/browser/resources/options/options.html b/chrome/browser/resources/options/options.html index d94503e..eb7824b 100644 --- a/chrome/browser/resources/options/options.html +++ b/chrome/browser/resources/options/options.html @@ -33,6 +33,7 @@ <link rel="stylesheet" href="managed_user_learn_more.css"> <link rel="stylesheet" href="password_manager.css"> <link rel="stylesheet" href="password_manager_list.css"> +<link rel="stylesheet" href="reset_profile_settings_overlay.css"> <link rel="stylesheet" href="search_engine_manager.css"> <link rel="stylesheet" href="search_page.css"> <link rel="stylesheet" href="spelling_confirm_overlay.css"> @@ -102,6 +103,7 @@ <include src="language_options.html"> <include src="manage_profile_overlay.html"> <include src="password_manager.html"> + <include src="reset_profile_settings_overlay.html"> <include src="search_engine_manager.html"> <include src="spelling_confirm_overlay.html"> <include src="startup_overlay.html"> diff --git a/chrome/browser/resources/options/options.js b/chrome/browser/resources/options/options.js index 4d1aee6..160ca0f 100644 --- a/chrome/browser/resources/options/options.js +++ b/chrome/browser/resources/options/options.js @@ -30,6 +30,7 @@ var OptionsPage = options.OptionsPage; var PasswordManager = options.PasswordManager; var Preferences = options.Preferences; var PreferredNetworks = options.PreferredNetworks; +var ResetProfileSettingsOverlay = options.ResetProfileSettingsOverlay; var SearchEngineManager = options.SearchEngineManager; var SearchPage = options.SearchPage; var StartupOverlay = options.StartupOverlay; @@ -143,6 +144,9 @@ function load() { OptionsPage.registerOverlay(PasswordManager.getInstance(), BrowserOptions.getInstance(), [$('manage-passwords')]); + OptionsPage.registerOverlay(ResetProfileSettingsOverlay.getInstance(), + BrowserOptions.getInstance(), + [$('reset-profile-settings')]); OptionsPage.registerOverlay(SearchEngineManager.getInstance(), BrowserOptions.getInstance(), [$('manage-default-search-engines')]); diff --git a/chrome/browser/resources/options/options_bundle.js b/chrome/browser/resources/options/options_bundle.js index 0708f4c..451ea4f 100644 --- a/chrome/browser/resources/options/options_bundle.js +++ b/chrome/browser/resources/options/options_bundle.js @@ -96,6 +96,7 @@ <include src="password_manager.js"></include> <include src="password_manager_list.js"></include> <include src="profiles_icon_grid.js"></include> +<include src="reset_profile_settings_overlay.js"></include> <include src="search_engine_manager.js"></include> <include src="search_engine_manager_engine_list.js"></include> <include src="search_page.js"></include> diff --git a/chrome/browser/resources/options/reset_profile_settings_overlay.css b/chrome/browser/resources/options/reset_profile_settings_overlay.css new file mode 100644 index 0000000..d9a1555 --- /dev/null +++ b/chrome/browser/resources/options/reset_profile_settings_overlay.css @@ -0,0 +1,18 @@ +/* Copyright 2013 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. */ + +#reset-profile-settings-overlay { + min-width: 500px; +} + +#reset-profile-settings-checkboxes { + -webkit-padding-start: 8px; + margin: 5px 0; +} + +#reset-profile-settings-throbber { + margin: 4px 10px; + vertical-align: middle; + visibility: hidden; +} diff --git a/chrome/browser/resources/options/reset_profile_settings_overlay.html b/chrome/browser/resources/options/reset_profile_settings_overlay.html new file mode 100644 index 0000000..ae9fd92 --- /dev/null +++ b/chrome/browser/resources/options/reset_profile_settings_overlay.html @@ -0,0 +1,69 @@ +<div id="reset-profile-settings-overlay" class="page" hidden> + <div class="close-button"></div> + <h1 i18n-content="resetProfileSettingsOverlay"></h1> + <div id="reset-profile-settings-content-area" class="content-area"> + <span i18n-content="resetProfileSettingsLabel"></span> + <div id="reset-profile-settings-checkboxes"> + <div class="checkbox"> + <label> + <input id="reset-default-search-engine-checkbox" + pref="browser.reset_profile_settings.default_search_engine" + type="checkbox"> + <span i18n-content="resetDefaultSearchEngineCheckbox"></span> + </label> + </div> + <div class="checkbox"> + <label> + <input id="reset-homepage-checkbox" + pref="browser.reset_profile_settings.homepage" type="checkbox"> + <span i18n-content="resetHomepageCheckbox"></span> + </label> + </div> + <div class="checkbox"> + <label> + <input id="reset-content-settings-checkbox" + pref="browser.reset_profile_settings.content_settings" + type="checkbox"> + <span i18n-content="resetContentSettingsCheckbox"></span> + </label> + </div> + <div class="checkbox"> + <label> + <input id="reset-cookies-and-site-data-checkbox" + pref="browser.reset_profile_settings.cookies_and_site_data" + type="checkbox"> + <span i18n-content="resetCookiesAndSiteDataCheckbox"></span> + </label> + </div> + <div class="checkbox"> + <label> + <input id="reset-extensions-checkbox" + pref="browser.reset_profile_settings.extensions" type="checkbox"> + <span i18n-content="resetExtensionsCheckbox"></span> + </label> + <select id="reset-extensions-handling" + i18n-options="resetExtensionsHandling" + pref="browser.reset_profile_settings.extensions_handling" + data-type="number"> + </select> + </div> + </div> + </div> + <div class="action-area"> + <div class="hbox stretch"> + <a target="_blank" i18n-content="learnMore" + i18n-values="href:resetProfileSettingsLearnMoreUrl"> + </a> + </div> + <div class="action-area-right"> + <div id="reset-profile-settings-throbber" class="throbber"></div> + <div class="button-strip"> + <button id="reset-profile-settings-dismiss" i18n-content="cancel"> + </button> + <button id="reset-profile-settings-commit" + i18n-content="resetProfileSettingsCommit"> + </button> + </div> + </div> + </div> +</div> diff --git a/chrome/browser/resources/options/reset_profile_settings_overlay.js b/chrome/browser/resources/options/reset_profile_settings_overlay.js new file mode 100644 index 0000000..2abda16 --- /dev/null +++ b/chrome/browser/resources/options/reset_profile_settings_overlay.js @@ -0,0 +1,112 @@ +// Copyright 2013 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. + +cr.define('options', function() { + var OptionsPage = options.OptionsPage; + + /** + * ResetProfileSettingsOverlay class + * Encapsulated handling of the 'Reset Profile Settings' overlay page. + * @class + */ + function ResetProfileSettingsOverlay() { + OptionsPage.call( + this, 'resetProfileSettings', + loadTimeData.getString('resetProfileSettingsOverlayTabTitle'), + 'reset-profile-settings-overlay'); + } + + cr.addSingletonGetter(ResetProfileSettingsOverlay); + + ResetProfileSettingsOverlay.prototype = { + // Inherit ResetProfileSettingsOverlay from OptionsPage. + __proto__: OptionsPage.prototype, + + /** + * Initialize the page. + */ + initializePage: function() { + OptionsPage.prototype.initializePage.call(this); + + var f = this.updateCommitButtonState_.bind(this); + var types = ['browser.reset_profile_settings.default_search_engine', + 'browser.reset_profile_settings.homepage', + 'browser.reset_profile_settings.content_settings', + 'browser.reset_profile_settings.cookies_and_site_data', + 'browser.reset_profile_settings.extensions']; + types.forEach(function(type) { + Preferences.getInstance().addEventListener(type, f); + }); + + var checkboxes = document.querySelectorAll( + '#reset-profile-settings-content-area input[type=checkbox]'); + for (var i = 0; i < checkboxes.length; i++) + checkboxes[i].onclick = f; + this.updateCommitButtonState_(); + + $('reset-profile-settings-dismiss').onclick = function(event) { + ResetProfileSettingsOverlay.dismiss(); + }; + $('reset-profile-settings-commit').onclick = function(event) { + ResetProfileSettingsOverlay.setResettingState(true); + chrome.send('performResetProfileSettings'); + }; + }, + + // Sets the enabled state of the commit button. + updateCommitButtonState_: function() { + var sel = + '#reset-profile-settings-content-area input[type=checkbox]:checked'; + $('reset-profile-settings-commit').disabled = + !document.querySelector(sel); + }, + }; + + /** + * Enables/disables UI elements after/while Chrome is performing a reset. + * @param {boolean} state If true, UI elements are disabled. + */ + ResetProfileSettingsOverlay.setResettingState = function(state) { + $('reset-default-search-engine-checkbox').disabled = state; + $('reset-homepage-checkbox').disabled = state; + $('reset-content-settings-checkbox').disabled = state; + $('reset-cookies-and-site-data-checkbox').disabled = state; + $('reset-extensions-checkbox').disabled = state; + $('reset-extensions-handling').disabled = state; + $('reset-profile-settings-throbber').style.visibility = + state ? 'visible' : 'hidden'; + $('reset-profile-settings-dismiss').disabled = state; + + if (state) + $('reset-profile-settings-commit').disabled = true; + else + ResetProfileSettingsOverlay.getInstance().updateCommitButtonState_(); + }; + + /** + * Chrome callback to notify ResetProfileSettingsOverlay that the reset + * operation has terminated. + */ + ResetProfileSettingsOverlay.doneResetting = function() { + // The delay gives the user some feedback that the resetting + // actually worked. Otherwise the dialog just vanishes instantly in most + // cases. + window.setTimeout(function() { + ResetProfileSettingsOverlay.dismiss(); + }, 200); + }; + + /** + * Dismisses the overlay. + */ + ResetProfileSettingsOverlay.dismiss = function() { + OptionsPage.closeOverlay(); + ResetProfileSettingsOverlay.setResettingState(false); + }; + + // Export + return { + ResetProfileSettingsOverlay: ResetProfileSettingsOverlay + }; +}); diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc index 830d5423..969b4dd 100644 --- a/chrome/browser/ui/browser_ui_prefs.cc +++ b/chrome/browser/ui/browser_ui_prefs.cc @@ -192,6 +192,31 @@ void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry) { prefs::kHideWebStoreIcon, false, user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); + + registry->RegisterBooleanPref( + prefs::kResetDefaultSearchEngine, + true, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterBooleanPref( + prefs::kResetHomepage, + true, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterBooleanPref( + prefs::kResetContentSettings, + true, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterBooleanPref( + prefs::kResetCookiesAndSiteData, + true, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterBooleanPref( + prefs::kResetExtensions, + true, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + registry->RegisterIntegerPref( + prefs::kResetExtensionsHandling, + 0, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); } void RegisterAppPrefs(const std::string& app_name, Profile* profile) { diff --git a/chrome/browser/ui/webui/options/browser_options_handler.cc b/chrome/browser/ui/webui/options/browser_options_handler.cc index 66fe9f0c..cd6c008 100644 --- a/chrome/browser/ui/webui/options/browser_options_handler.cc +++ b/chrome/browser/ui/webui/options/browser_options_handler.cc @@ -285,6 +285,11 @@ void BrowserOptionsHandler::GetLocalizedValues(DictionaryValue* values) { { "proxiesLabelExtension", IDS_OPTIONS_EXTENSION_PROXIES_LABEL }, { "proxiesLabelSystem", IDS_OPTIONS_SYSTEM_PROXIES_LABEL, IDS_PRODUCT_NAME }, + { "resetProfileSettings", IDS_RESET_PROFILE_SETTINGS_BUTTON }, + { "resetProfileSettingsDescription", + IDS_RESET_PROFILE_SETTINGS_DESCRIPTION }, + { "resetProfileSettingsSectionTitle", + IDS_RESET_PROFILE_SETTINGS_SECTION_TITLE }, { "safeBrowsingEnableProtection", IDS_OPTIONS_SAFEBROWSING_ENABLEPROTECTION }, { "sectionTitleAppearance", IDS_APPEARANCE_GROUP_NAME }, @@ -510,6 +515,10 @@ void BrowserOptionsHandler::GetLocalizedValues(DictionaryValue* values) { "gpuEnabledAtStart", g_browser_process->gpu_mode_manager()->initial_gpu_mode_pref()); #endif + + values->SetBoolean("enableResetProfileSettingsSection", + CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableResetProfileSettings)); } void BrowserOptionsHandler::RegisterCloudPrintValues(DictionaryValue* values) { diff --git a/chrome/browser/ui/webui/options/options_ui.cc b/chrome/browser/ui/webui/options/options_ui.cc index 494d18e..11cfa35 100644 --- a/chrome/browser/ui/webui/options/options_ui.cc +++ b/chrome/browser/ui/webui/options/options_ui.cc @@ -40,6 +40,7 @@ #include "chrome/browser/ui/webui/options/media_galleries_handler.h" #include "chrome/browser/ui/webui/options/options_sync_setup_handler.h" #include "chrome/browser/ui/webui/options/password_manager_handler.h" +#include "chrome/browser/ui/webui/options/reset_profile_settings_handler.h" #include "chrome/browser/ui/webui/options/search_engine_manager_handler.h" #include "chrome/browser/ui/webui/options/startup_pages_handler.h" #include "chrome/browser/ui/webui/theme_source.h" @@ -270,6 +271,7 @@ OptionsUI::OptionsUI(content::WebUI* web_ui) AddOptionsPageUIHandler(localized_strings, new ManageProfileHandler()); AddOptionsPageUIHandler(localized_strings, new ManagedUserLearnMoreHandler()); AddOptionsPageUIHandler(localized_strings, new PasswordManagerHandler()); + AddOptionsPageUIHandler(localized_strings, new ResetProfileSettingsHandler()); AddOptionsPageUIHandler(localized_strings, new SearchEngineManagerHandler()); AddOptionsPageUIHandler(localized_strings, new ImportDataHandler()); AddOptionsPageUIHandler(localized_strings, new StartupPagesHandler()); diff --git a/chrome/browser/ui/webui/options/profile_settings_reset_browsertest.js b/chrome/browser/ui/webui/options/profile_settings_reset_browsertest.js new file mode 100644 index 0000000..ba40eaa --- /dev/null +++ b/chrome/browser/ui/webui/options/profile_settings_reset_browsertest.js @@ -0,0 +1,25 @@ +// Copyright 2013 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. + +/** + * TestFixture for profile settings reset WebUI testing. + * @extends {testing.Test} + * @constructor + **/ +function ProfileSettingsResetWebUITest() {} + +ProfileSettingsResetWebUITest.prototype = { + __proto__: testing.Test.prototype, + + /** + * Browse to the reset profile settings page. + **/ + browsePreload: 'chrome://settings-frame/resetProfileSettings', +}; + +// Test opening the profile settings reset has correct location. +TEST_F('ProfileSettingsResetWebUITest', 'testOpenProfileSettingsReset', + function() { + assertEquals(this.browsePreload, document.location.href); + }); diff --git a/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc b/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc new file mode 100644 index 0000000..de84fdf --- /dev/null +++ b/chrome/browser/ui/webui/options/reset_profile_settings_handler.cc @@ -0,0 +1,133 @@ +// Copyright 2013 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/options/reset_profile_settings_handler.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/prefs/pref_service.h" +#include "base/string16.h" +#include "base/values.h" +#include "chrome/browser/google/google_util.h" +#include "chrome/browser/profile_resetter/profile_resetter.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/common/pref_names.h" +#include "content/public/browser/web_ui.h" +#include "grit/generated_resources.h" +#include "ui/base/l10n/l10n_util.h" + +namespace { +const char kResetProfileSettingsLearnMoreUrl[] = + "https://support.google.com/chrome/?p=settings_reset_profile_settings"; +} // namespace + +namespace options { + +ResetProfileSettingsHandler::ResetProfileSettingsHandler() { +} + +ResetProfileSettingsHandler::~ResetProfileSettingsHandler() { +} + +void ResetProfileSettingsHandler::InitializeHandler() { + Profile* profile = Profile::FromWebUI(web_ui()); + resetter_.reset(new ProfileResetter(profile)); +} + +void ResetProfileSettingsHandler::GetLocalizedValues( + DictionaryValue* localized_strings) { + DCHECK(localized_strings); + + static OptionsStringResource resources[] = { + { "resetProfileSettingsLabel", IDS_RESET_PROFILE_SETTINGS_LABEL }, + { "resetDefaultSearchEngineCheckbox", + IDS_RESET_PROFILE_DEFAULT_SEARCH_ENGINE_CHECKBOX }, + { "resetHomepageCheckbox", IDS_RESET_PROFILE_HOMEPAGE_CHECKBOX }, + { "resetContentSettingsCheckbox", + IDS_RESET_PROFILE_CONTENT_SETTINGS_CHECKBOX }, + { "resetCookiesAndSiteDataCheckbox", IDS_RESET_PROFILE_COOKIES_CHECKBOX }, + { "resetExtensionsCheckbox", IDS_RESET_PROFILE_EXTENSIONS_CHECKBOX }, + { "resetProfileSettingsCommit", IDS_RESET_PROFILE_SETTINGS_COMMIT_BUTTON }, + }; + + RegisterStrings(localized_strings, resources, arraysize(resources)); + RegisterTitle(localized_strings, "resetProfileSettingsOverlay", + IDS_RESET_PROFILE_SETTINGS_TITLE); + localized_strings->SetString( + "resetProfileSettingsLearnMoreUrl", + google_util::StringAppendGoogleLocaleParam( + kResetProfileSettingsLearnMoreUrl)); + + scoped_ptr<ListValue> reset_extensions_handling(new ListValue); + for (int i = 0; i < 2; i++) { + string16 label_string; + switch (i) { + case 0: + label_string = l10n_util::GetStringUTF16( + IDS_RESET_PROFILE_EXTENSIONS_DISABLE); + break; + case 1: + label_string = l10n_util::GetStringUTF16( + IDS_RESET_PROFILE_EXTENSIONS_UNINSTALL); + break; + } + scoped_ptr<ListValue> option(new ListValue); + option->Append(new base::FundamentalValue(i)); + option->Append(new base::StringValue(label_string)); + reset_extensions_handling->Append(option.release()); + } + localized_strings->Set("resetExtensionsHandling", + reset_extensions_handling.release()); +} + +void ResetProfileSettingsHandler::RegisterMessages() { + // Setup handlers specific to this panel. + web_ui()->RegisterMessageCallback("performResetProfileSettings", + base::Bind(&ResetProfileSettingsHandler::HandleResetProfileSettings, + base::Unretained(this))); +} + +void ResetProfileSettingsHandler::HandleResetProfileSettings( + const ListValue* /*value*/) { + DCHECK(resetter_); + DCHECK(!resetter_->IsActive()); + + Profile* profile = Profile::FromWebUI(web_ui()); + PrefService* prefs = profile->GetPrefs(); + + ProfileResetter::ResettableFlags reset_mask = 0; + + struct { + const char* flag_name; + ProfileResetter::Resettable mask; + } name_to_flag[] = { + { prefs::kResetDefaultSearchEngine, + ProfileResetter::DEFAULT_SEARCH_ENGINE }, + { prefs::kResetHomepage, ProfileResetter::HOMEPAGE }, + { prefs::kResetContentSettings, ProfileResetter::CONTENT_SETTINGS }, + { prefs::kResetCookiesAndSiteData, ProfileResetter::COOKIES_AND_SITE_DATA }, + { prefs::kResetExtensions, ProfileResetter::EXTENSIONS }, + }; + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(name_to_flag); ++i) { + if (prefs->GetBoolean(name_to_flag[i].flag_name)) + reset_mask |= name_to_flag[i].mask; + } + + ProfileResetter::ExtensionHandling extension_handling = + (prefs->GetInteger(prefs::kResetExtensionsHandling) == 0) + ? ProfileResetter::DISABLE_EXTENSIONS + : ProfileResetter::UNINSTALL_EXTENSIONS; + + resetter_->Reset( + reset_mask, + extension_handling, + base::Bind(&ResetProfileSettingsHandler::OnResetProfileSettingsDone, + AsWeakPtr())); +} + +void ResetProfileSettingsHandler::OnResetProfileSettingsDone() { + web_ui()->CallJavascriptFunction("ResetProfileSettingsOverlay.doneResetting"); +} + +} // namespace options diff --git a/chrome/browser/ui/webui/options/reset_profile_settings_handler.h b/chrome/browser/ui/webui/options/reset_profile_settings_handler.h new file mode 100644 index 0000000..3375fdf --- /dev/null +++ b/chrome/browser/ui/webui/options/reset_profile_settings_handler.h @@ -0,0 +1,51 @@ +// Copyright 2013 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. + +#ifndef CHROME_BROWSER_UI_WEBUI_OPTIONS_RESET_PROFILE_SETTINGS_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_OPTIONS_RESET_PROFILE_SETTINGS_HANDLER_H_ + +#include "base/compiler_specific.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/ui/webui/options/options_ui.h" + +namespace base { +class DictionaryValue; +class ListValue; +} // namespace base + +class ProfileResetter; + +namespace options { + +// Reset Profile Settings handler page UI handler. +class ResetProfileSettingsHandler + : public OptionsPageUIHandler, + public base::SupportsWeakPtr<ResetProfileSettingsHandler> { + public: + ResetProfileSettingsHandler(); + virtual ~ResetProfileSettingsHandler(); + + // OptionsPageUIHandler implementation. + virtual void GetLocalizedValues( + base::DictionaryValue* localized_strings) OVERRIDE; + virtual void InitializeHandler() OVERRIDE; + + // WebUIMessageHandler implementation. + virtual void RegisterMessages() OVERRIDE; + + private: + // Javascript callback to start clearing data. + void HandleResetProfileSettings(const base::ListValue* value); + + // Closes the dialog once all requested settings has been reset. + void OnResetProfileSettingsDone(); + + scoped_ptr<ProfileResetter> resetter_; + + DISALLOW_COPY_AND_ASSIGN(ResetProfileSettingsHandler); +}; + +} // namespace options + +#endif // CHROME_BROWSER_UI_WEBUI_OPTIONS_RESET_PROFILE_SETTINGS_HANDLER_H_ diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index e5c77b4..0caf902 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi @@ -2219,6 +2219,8 @@ 'browser/ui/webui/options/password_manager_handler.h', 'browser/ui/webui/options/pepper_flash_content_settings_utils.cc', 'browser/ui/webui/options/pepper_flash_content_settings_utils.h', + 'browser/ui/webui/options/reset_profile_settings_handler.cc', + 'browser/ui/webui/options/reset_profile_settings_handler.h', 'browser/ui/webui/options/search_engine_manager_handler.cc', 'browser/ui/webui/options/search_engine_manager_handler.h', 'browser/ui/webui/options/startup_pages_handler.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 99baf27..a397c6a 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1642,6 +1642,7 @@ 'browser/ui/webui/options/options_ui_browsertest.cc', 'browser/ui/webui/options/options_ui_browsertest.h', 'browser/ui/webui/options/password_manager_browsertest.js', + 'browser/ui/webui/options/profile_settings_reset_browsertest.js', 'browser/ui/webui/options/preferences_browsertest.cc', 'browser/ui/webui/options/preferences_browsertest.h', 'browser/ui/webui/options/search_engine_manager_browsertest.js', diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index fb33e71..bde0dd1 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -631,6 +631,10 @@ const char kEnableProfiling[] = "enable-profiling"; // Enables support for the QUIC protocol. This is a temporary testing flag. const char kEnableQuic[] = "enable-quic"; +// Enables support in chrome://settings to reset settings in your profile +// that are often touched by malware. +const char kEnableResetProfileSettings[] = "enable-reset-profile-settings"; + // Enables content settings based on host *and* plug-in in the user // preferences. const char kEnableResourceContentSettings[] = diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 789f580..9610a1f 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -179,6 +179,7 @@ extern const char kEnablePasswordGeneration[]; extern const char kEnablePnacl[]; extern const char kEnableProfiling[]; extern const char kEnableQuic[]; +extern const char kEnableResetProfileSettings[]; extern const char kEnableResourceContentSettings[]; extern const char kEnableSdch[]; extern const char kDisableSpdy31[]; diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index f58fbb1..4a47c51 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc @@ -1339,6 +1339,18 @@ const char kProfileMetrics[] = "user_experience_metrics.profiles"; // kProfileMetrics.kProfilePrefix<hashed-profile-id>. const char kProfilePrefix[] = "profile-"; +// Reset Profile Data dialog preferences +const char kResetDefaultSearchEngine[] = + "browser.reset_profile_settings.default_search_engine"; +const char kResetHomepage[] = "browser.reset_profile_settings.homepage"; +const char kResetContentSettings[] = + "browser.reset_profile_settings.content_settings"; +const char kResetCookiesAndSiteData[] = + "browser.reset_profile_settings.cookies_and_site_data"; +const char kResetExtensions[] = "browser.reset_profile_settings.extensions"; +const char kResetExtensionsHandling[] = + "browser.reset_profile_settings.extensions_handling"; + // True if the previous run of the program exited cleanly. const char kStabilityExitedCleanly[] = "user_experience_metrics.stability.exited_cleanly"; diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index c33a0be..26c8e2a 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h @@ -476,6 +476,13 @@ extern const char kProfileCreatedByVersion[]; extern const char kProfileMetrics[]; extern const char kProfilePrefix[]; +extern const char kResetDefaultSearchEngine[]; +extern const char kResetHomepage[]; +extern const char kResetContentSettings[]; +extern const char kResetCookiesAndSiteData[]; +extern const char kResetExtensions[]; +extern const char kResetExtensionsHandling[]; + extern const char kStabilityExitedCleanly[]; extern const char kStabilityStatsVersion[]; extern const char kStabilityStatsBuildTime[]; |