diff options
9 files changed, 81 insertions, 12 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 965dbda..7eb7761 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -6665,6 +6665,9 @@ The following plug-in is unresponsive: <ph name="PLUGIN_NAME">$1 <message name="IDS_DEL_FORM_DATA_CHKBOX" desc="Checkbox for deleting form data saved for Autofill"> Clear saved Autofill form data </message> + <message name="IDS_DEL_HOSTED_APPS_DATA_CHKBOX" desc="Checkbox for deleting data of hosted apps"> + Clear data from hosted apps + </message> <message name="IDS_DEAUTHORIZE_CONTENT_LICENSES_CHKBOX" desc="Checkbox for deauthorizing content licenses (DRM videos, etc.)"> Deauthorize content licenses </message> diff --git a/chrome/browser/resources/options2/clear_browser_data_overlay.html b/chrome/browser/resources/options2/clear_browser_data_overlay.html index bbad513..d3e7a52 100644 --- a/chrome/browser/resources/options2/clear_browser_data_overlay.html +++ b/chrome/browser/resources/options2/clear_browser_data_overlay.html @@ -54,6 +54,13 @@ <span i18n-content="deleteFormDataCheckbox"></span> </label> </div> + <div class="checkbox"> + <label> + <input id="deleteHostedAppsDataCheckbox" + pref="browser.clear_data.hosted_apps_data" type="checkbox"> + <span i18n-content="deleteHostedAppsDataCheckbox"></span> + </label> + </div> <div class="checkbox pepper-flash-settings"> <label> <input id="deauthorizeContentLicensesCheckbox" diff --git a/chrome/browser/resources/options2/clear_browser_data_overlay.js b/chrome/browser/resources/options2/clear_browser_data_overlay.js index 50b3baf..72be1dd 100644 --- a/chrome/browser/resources/options2/clear_browser_data_overlay.js +++ b/chrome/browser/resources/options2/clear_browser_data_overlay.js @@ -36,6 +36,7 @@ cr.define('options', function() { 'browser.clear_data.cookies', 'browser.clear_data.passwords', 'browser.clear_data.form_data', + 'browser.clear_data.hosted_apps_data', 'browser.clear_data.content_licenses']; types.forEach(function(type) { Preferences.getInstance().addEventListener(type, f); @@ -52,6 +53,7 @@ cr.define('options', function() { ClearBrowserDataOverlay.dismiss(); }; $('clearBrowserDataCommit').onclick = function(event) { + ClearBrowserDataOverlay.setClearingState(true); chrome.send('performClearBrowserData'); }; }, @@ -81,9 +83,11 @@ cr.define('options', function() { $('deleteCookiesCheckbox').disabled = state; $('deletePasswordsCheckbox').disabled = state; $('deleteFormDataCheckbox').disabled = state; + $('deleteHostedAppsDataCheckbox').disabled = state; $('deauthorizeContentLicensesCheckbox').disabled = state; $('clearBrowserDataTimePeriod').disabled = state; $('cbdThrobber').style.visibility = state ? 'visible' : 'hidden'; + $('clearBrowserDataDismiss').disabled = state; if (state) $('clearBrowserDataCommit').disabled = true; diff --git a/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc b/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc index 4ac1a9d..6c72862 100644 --- a/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc @@ -322,6 +322,7 @@ IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, ClearData) { ASSERT_TRUE(BooleanPrefMatches(prefs::kDeleteCookies)); ASSERT_TRUE(BooleanPrefMatches(prefs::kDeletePasswords)); ASSERT_TRUE(BooleanPrefMatches(prefs::kDeleteFormData)); + ASSERT_TRUE(BooleanPrefMatches(prefs::kDeleteHostedAppsData)); ChangeBooleanPref(0, prefs::kDeleteBrowsingHistory); ChangeBooleanPref(0, prefs::kDeleteDownloadHistory); @@ -329,6 +330,7 @@ IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, ClearData) { ChangeBooleanPref(0, prefs::kDeleteCookies); ChangeBooleanPref(0, prefs::kDeletePasswords); ChangeBooleanPref(0, prefs::kDeleteFormData); + ChangeBooleanPref(0, prefs::kDeleteHostedAppsData); ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1))); ASSERT_TRUE(BooleanPrefMatches( prefs::kDeleteBrowsingHistory)); @@ -338,6 +340,7 @@ IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, ClearData) { ASSERT_TRUE(BooleanPrefMatches(prefs::kDeleteCookies)); ASSERT_TRUE(BooleanPrefMatches(prefs::kDeletePasswords)); ASSERT_TRUE(BooleanPrefMatches(prefs::kDeleteFormData)); + ASSERT_TRUE(BooleanPrefMatches(prefs::kDeleteHostedAppsData)); } // TCM ID - 3686300. diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 9154d11..dfdd730 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc @@ -2133,6 +2133,9 @@ void Browser::RegisterUserPrefs(PrefService* prefs) { prefs->RegisterBooleanPref(prefs::kDeleteFormData, false, PrefService::SYNCABLE_PREF); + prefs->RegisterBooleanPref(prefs::kDeleteHostedAppsData, + false, + PrefService::SYNCABLE_PREF); prefs->RegisterIntegerPref(prefs::kDeleteTimePeriod, 0, PrefService::SYNCABLE_PREF); diff --git a/chrome/browser/ui/webui/options2/clear_browser_data_handler2.cc b/chrome/browser/ui/webui/options2/clear_browser_data_handler2.cc index 620b567..9ba13e3 100644 --- a/chrome/browser/ui/webui/options2/clear_browser_data_handler2.cc +++ b/chrome/browser/ui/webui/options2/clear_browser_data_handler2.cc @@ -24,7 +24,9 @@ namespace options2 { -ClearBrowserDataHandler::ClearBrowserDataHandler() : remover_(NULL) { +ClearBrowserDataHandler::ClearBrowserDataHandler() + : remover_(NULL), + remove_hosted_app_data_pending_(false) { } ClearBrowserDataHandler::~ClearBrowserDataHandler() { @@ -51,6 +53,7 @@ void ClearBrowserDataHandler::GetLocalizedValues( { "deleteCookiesFlashCheckbox", IDS_DEL_COOKIES_FLASH_CHKBOX }, { "deletePasswordsCheckbox", IDS_DEL_PASSWORDS_CHKBOX }, { "deleteFormDataCheckbox", IDS_DEL_FORM_DATA_CHKBOX }, + { "deleteHostedAppsDataCheckbox", IDS_DEL_HOSTED_APPS_DATA_CHKBOX }, { "deauthorizeContentLicensesCheckbox", IDS_DEAUTHORIZE_CONTENT_LICENSES_CHKBOX }, { "clearBrowserDataCommit", IDS_CLEAR_BROWSING_DATA_COMMIT }, @@ -97,6 +100,8 @@ void ClearBrowserDataHandler::RegisterMessages() { } void ClearBrowserDataHandler::HandleClearBrowserData(const ListValue* value) { + DCHECK(!remover_); + Profile* profile = Profile::FromWebUI(web_ui()); PrefService* prefs = profile->GetPrefs(); @@ -121,29 +126,59 @@ void ClearBrowserDataHandler::HandleClearBrowserData(const ListValue* value) { if (prefs->GetBoolean(prefs::kDeauthorizeContentLicenses)) remove_mask |= BrowsingDataRemover::REMOVE_CONTENT_LICENSES; - int period_selected = prefs->GetInteger(prefs::kDeleteTimePeriod); + remove_hosted_app_data_pending_ = + prefs->GetBoolean(prefs::kDeleteHostedAppsData); + + if (!remove_mask) { + // If no unprotected data should be removed, skip straight to removing + // hosted app data. If nothing should be removed (which would mean that the + // JS-side is buggy), skip straight to cleaning up. + if (remove_hosted_app_data_pending_) + ClearHostedAppData(); + else + OnAllDataRemoved(); + } else { + // BrowsingDataRemover deletes itself when done. + int period_selected = prefs->GetInteger(prefs::kDeleteTimePeriod); + remover_ = new BrowsingDataRemover(profile, + static_cast<BrowsingDataRemover::TimePeriod>(period_selected), + base::Time()); + remover_->AddObserver(this); + remover_->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); + } +} - base::FundamentalValue state(true); - web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.setClearingState", - state); +void ClearBrowserDataHandler::ClearHostedAppData() { + DCHECK(!remover_); + DCHECK(remove_hosted_app_data_pending_); - // If we are still observing a previous data remover, we need to stop - // observing. - if (remover_) - remover_->RemoveObserver(this); + remove_hosted_app_data_pending_ = false; + Profile* profile = Profile::FromWebUI(web_ui()); + PrefService* prefs = profile->GetPrefs(); + int period_selected = prefs->GetInteger(prefs::kDeleteTimePeriod); // BrowsingDataRemover deletes itself when done. - remover_ = new BrowsingDataRemover(profile, + remover_ = new BrowsingDataRemover( + profile, static_cast<BrowsingDataRemover::TimePeriod>(period_selected), base::Time()); remover_->AddObserver(this); - remover_->Remove(remove_mask, BrowsingDataHelper::UNPROTECTED_WEB); + remover_->Remove(BrowsingDataRemover::REMOVE_SITE_DATA, + BrowsingDataHelper::PROTECTED_WEB); } void ClearBrowserDataHandler::OnBrowsingDataRemoverDone() { // No need to remove ourselves as an observer as BrowsingDataRemover deletes // itself after we return. remover_ = NULL; + + if (remove_hosted_app_data_pending_) + ClearHostedAppData(); + else + OnAllDataRemoved(); +} + +void ClearBrowserDataHandler::OnAllDataRemoved() { web_ui()->CallJavascriptFunction("ClearBrowserDataOverlay.doneClearing"); } diff --git a/chrome/browser/ui/webui/options2/clear_browser_data_handler2.h b/chrome/browser/ui/webui/options2/clear_browser_data_handler2.h index 9e54812..bd232c2 100644 --- a/chrome/browser/ui/webui/options2/clear_browser_data_handler2.h +++ b/chrome/browser/ui/webui/options2/clear_browser_data_handler2.h @@ -30,9 +30,17 @@ class ClearBrowserDataHandler : public OptionsPageUIHandler, // Javascript callback to start clearing data. void HandleClearBrowserData(const ListValue* value); - // Callback from BrowsingDataRemover. Closes the dialog. + // Callback from BrowsingDataRemover. Calls OnAllDataRemoved once both + // protected and unprotected data are removed. virtual void OnBrowsingDataRemoverDone() OVERRIDE; + // Closes the dialog once all requested data has been removed. + void OnAllDataRemoved(); + + // Clears the data of hosted apps, which is otherwise protected from deletion + // when the user clears regular browsing data. + void ClearHostedAppData(); + // If non-null it means removal is in progress. BrowsingDataRemover takes care // of deleting itself when done. BrowsingDataRemover* remover_; @@ -40,6 +48,10 @@ class ClearBrowserDataHandler : public OptionsPageUIHandler, // Keeps track of whether clearing LSO data is supported. BooleanPrefMember clear_plugin_lso_data_enabled_; + // Indicates that we also need to delete hosted app data after finishing the + // first removal operation. + bool remove_hosted_app_data_pending_; + DISALLOW_COPY_AND_ASSIGN(ClearBrowserDataHandler); }; diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index f6dd8a8..32a2837 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc @@ -721,6 +721,7 @@ const char kDeleteCache[] = "browser.clear_data.cache"; const char kDeleteCookies[] = "browser.clear_data.cookies"; const char kDeletePasswords[] = "browser.clear_data.passwords"; const char kDeleteFormData[] = "browser.clear_data.form_data"; +const char kDeleteHostedAppsData[] = "browser.clear_data.hosted_apps_data"; const char kDeauthorizeContentLicenses[] = "browser.clear_data.content_licenses"; const char kDeleteTimePeriod[] = "browser.clear_data.time_period"; diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 16343be..fd10825 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h @@ -273,6 +273,7 @@ extern const char kDeleteCache[]; extern const char kDeleteCookies[]; extern const char kDeletePasswords[]; extern const char kDeleteFormData[]; +extern const char kDeleteHostedAppsData[]; extern const char kDeauthorizeContentLicenses[]; extern const char kEnableSpellCheck[]; extern const char kSpeechInputTrayNotificationShown[]; |