summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-24 11:59:35 +0000
committerbattre@chromium.org <battre@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-24 11:59:35 +0000
commit380532aa316df3370f1c26d85b239771eea6c52f (patch)
treefb65f63e3923bd3e3af6df95bdb130879fc90566
parent575a11db587cab53119edf7c60adf7e7e7e33903 (diff)
downloadchromium_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
-rw-r--r--chrome/app/generated_resources.grd47
-rw-r--r--chrome/browser/about_flags.cc7
-rw-r--r--chrome/browser/profile_resetter/profile_resetter.cc5
-rw-r--r--chrome/browser/profile_resetter/profile_resetter.h2
-rw-r--r--chrome/browser/resources/options/browser_options.html9
-rw-r--r--chrome/browser/resources/options/browser_options.js7
-rw-r--r--chrome/browser/resources/options/options.html2
-rw-r--r--chrome/browser/resources/options/options.js4
-rw-r--r--chrome/browser/resources/options/options_bundle.js1
-rw-r--r--chrome/browser/resources/options/reset_profile_settings_overlay.css18
-rw-r--r--chrome/browser/resources/options/reset_profile_settings_overlay.html69
-rw-r--r--chrome/browser/resources/options/reset_profile_settings_overlay.js112
-rw-r--r--chrome/browser/ui/browser_ui_prefs.cc25
-rw-r--r--chrome/browser/ui/webui/options/browser_options_handler.cc9
-rw-r--r--chrome/browser/ui/webui/options/options_ui.cc2
-rw-r--r--chrome/browser/ui/webui/options/profile_settings_reset_browsertest.js25
-rw-r--r--chrome/browser/ui/webui/options/reset_profile_settings_handler.cc133
-rw-r--r--chrome/browser/ui/webui/options/reset_profile_settings_handler.h51
-rw-r--r--chrome/chrome_browser_ui.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/chrome_switches.cc4
-rw-r--r--chrome/common/chrome_switches.h1
-rw-r--r--chrome/common/pref_names.cc12
-rw-r--r--chrome/common/pref_names.h7
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[];