| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/clear_browsing_data_controller.h" | 5 #import "chrome/browser/ui/cocoa/clear_browsing_data_controller.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
| 9 #include "base/mac_util.h" | 9 #include "base/mac_util.h" |
| 10 #include "base/scoped_nsobject.h" | 10 #include "base/scoped_nsobject.h" |
| 11 #include "chrome/browser/browser_process.h" |
| 11 #include "chrome/browser/browsing_data_remover.h" | 12 #include "chrome/browser/browsing_data_remover.h" |
| 12 #include "chrome/browser/prefs/pref_service.h" | 13 #include "chrome/browser/prefs/pref_service.h" |
| 13 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 14 #include "chrome/browser/ui/browser.h" | 15 #include "chrome/browser/ui/browser.h" |
| 15 #include "chrome/browser/ui/browser_window.h" | 16 #include "chrome/browser/ui/browser_window.h" |
| 16 #include "chrome/common/pref_names.h" | 17 #include "chrome/common/pref_names.h" |
| 18 #include "chrome/common/notification_details.h" |
| 17 #include "grit/locale_settings.h" | 19 #include "grit/locale_settings.h" |
| 20 #include "grit/generated_resources.h" |
| 18 #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" | 21 #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" |
| 19 | 22 |
| 20 NSString* const kClearBrowsingDataControllerDidDelete = | 23 NSString* const kClearBrowsingDataControllerDidDelete = |
| 21 @"kClearBrowsingDataControllerDidDelete"; | 24 @"kClearBrowsingDataControllerDidDelete"; |
| 22 NSString* const kClearBrowsingDataControllerRemoveMask = | 25 NSString* const kClearBrowsingDataControllerRemoveMask = |
| 23 @"kClearBrowsingDataControllerRemoveMask"; | 26 @"kClearBrowsingDataControllerRemoveMask"; |
| 24 | 27 |
| 25 @interface ClearBrowsingDataController(Private) | 28 @interface ClearBrowsingDataController(Private) |
| 26 - (void)initFromPrefs; | 29 - (void)initFromPrefs; |
| 27 - (void)persistToPrefs; | 30 - (void)persistToPrefs; |
| 28 - (void)dataRemoverDidFinish; | 31 - (void)dataRemoverDidFinish; |
| 29 @end | 32 @end |
| 30 | 33 |
| 31 class ClearBrowsingObserver : public BrowsingDataRemover::Observer { | 34 class ClearBrowsingObserver : public BrowsingDataRemover::Observer { |
| 32 public: | 35 public: |
| 33 ClearBrowsingObserver(ClearBrowsingDataController* controller) | 36 ClearBrowsingObserver(ClearBrowsingDataController* controller) |
| 34 : controller_(controller) { } | 37 : controller_(controller) { } |
| 35 void OnBrowsingDataRemoverDone() { [controller_ dataRemoverDidFinish]; } | 38 void OnBrowsingDataRemoverDone() { [controller_ dataRemoverDidFinish]; } |
| 36 private: | 39 private: |
| 37 ClearBrowsingDataController* controller_; | 40 ClearBrowsingDataController* controller_; |
| 38 }; | 41 }; |
| 39 | 42 |
| 43 namespace clear_browsing_data_controller_internal { |
| 44 |
| 45 // A C++ class registered for changes in preferences. |
| 46 class PrefObserverBridge : public NotificationObserver { |
| 47 public: |
| 48 PrefObserverBridge(id controller) |
| 49 : controller_(controller) {} |
| 50 |
| 51 virtual ~PrefObserverBridge() {} |
| 52 |
| 53 virtual void Observe(NotificationType type, |
| 54 const NotificationSource& source, |
| 55 const NotificationDetails& details) { |
| 56 if (type == NotificationType::PREF_CHANGED) { |
| 57 const std::string& pref = *(Details<std::string>(details).ptr()); |
| 58 if (pref == prefs::kClearPluginLSODataEnabled) { |
| 59 [controller_ willChangeValueForKey:@"clearLSODataEnabled"]; |
| 60 [controller_ didChangeValueForKey:@"clearLSODataEnabled"]; |
| 61 [controller_ willChangeValueForKey:@"clearLSODataCheckbox"]; |
| 62 [controller_ didChangeValueForKey:@"clearLSODataCheckbox"]; |
| 63 [controller_ willChangeValueForKey:@"clearLSODataMessage"]; |
| 64 [controller_ didChangeValueForKey:@"clearLSODataMessage"]; |
| 65 } |
| 66 } else { |
| 67 NOTREACHED(); |
| 68 } |
| 69 } |
| 70 |
| 71 private: |
| 72 id controller_; // weak, owns us |
| 73 }; |
| 74 |
| 75 } // namespace clear_browsing_data_controller_internal |
| 76 |
| 40 namespace { | 77 namespace { |
| 41 | 78 |
| 42 typedef std::map<Profile*, ClearBrowsingDataController*> ProfileControllerMap; | 79 typedef std::map<Profile*, ClearBrowsingDataController*> ProfileControllerMap; |
| 43 | 80 |
| 44 static base::LazyInstance<ProfileControllerMap> g_profile_controller_map( | 81 static base::LazyInstance<ProfileControllerMap> g_profile_controller_map( |
| 45 base::LINKER_INITIALIZED); | 82 base::LINKER_INITIALIZED); |
| 46 | 83 |
| 47 } // namespace | 84 } // namespace |
| 48 | 85 |
| 49 @implementation ClearBrowsingDataController | 86 @implementation ClearBrowsingDataController |
| 50 | 87 |
| 51 @synthesize clearBrowsingHistory = clearBrowsingHistory_; | 88 @synthesize clearBrowsingHistory = clearBrowsingHistory_; |
| 52 @synthesize clearDownloadHistory = clearDownloadHistory_; | 89 @synthesize clearDownloadHistory = clearDownloadHistory_; |
| 53 @synthesize emptyCache = emptyCache_; | 90 @synthesize emptyCache = emptyCache_; |
| 54 @synthesize deleteCookies = deleteCookies_; | 91 @synthesize deleteCookies = deleteCookies_; |
| 55 @synthesize clearSavedPasswords = clearSavedPasswords_; | 92 @synthesize clearSavedPasswords = clearSavedPasswords_; |
| 93 @synthesize clearLSOData = clearLSOData_; |
| 56 @synthesize clearFormData = clearFormData_; | 94 @synthesize clearFormData = clearFormData_; |
| 57 @synthesize timePeriod = timePeriod_; | 95 @synthesize timePeriod = timePeriod_; |
| 58 @synthesize isClearing = isClearing_; | 96 @synthesize isClearing = isClearing_; |
| 59 | 97 |
| 98 - (BOOL)clearLSODataCheckbox { |
| 99 return clearLSOData_ && clearLSODataEnabled_.GetValue(); |
| 100 } |
| 101 |
| 102 - (void)setClearLSODataCheckbox:(BOOL)value { |
| 103 DCHECK(clearLSODataEnabled_.GetValue()); |
| 104 clearLSOData_ = value; |
| 105 } |
| 106 |
| 107 - (BOOL)clearLSODataEnabled { |
| 108 return clearLSODataEnabled_.GetValue(); |
| 109 } |
| 110 |
| 111 - (NSString*)clearLSODataMessage { |
| 112 if (self.clearLSODataEnabled) |
| 113 return nil; |
| 114 return l10n_util::GetNSString(IDS_LSO_CLEAR_MESSAGE); |
| 115 } |
| 116 |
| 60 + (void)showClearBrowsingDialogForProfile:(Profile*)profile { | 117 + (void)showClearBrowsingDialogForProfile:(Profile*)profile { |
| 61 ClearBrowsingDataController* controller = | 118 ClearBrowsingDataController* controller = |
| 62 [ClearBrowsingDataController controllerForProfile:profile]; | 119 [ClearBrowsingDataController controllerForProfile:profile]; |
| 63 if (![controller isWindowLoaded]) { | 120 if (![controller isWindowLoaded]) { |
| 64 // This function needs to return instead of blocking, to match the windows | 121 // This function needs to return instead of blocking, to match the windows |
| 65 // api call. It caused problems when launching the dialog from the | 122 // api call. It caused problems when launching the dialog from the |
| 66 // DomUI history page. See bug and code review for more details. | 123 // DomUI history page. See bug and code review for more details. |
| 67 // http://crbug.com/37976 | 124 // http://crbug.com/37976 |
| 68 [controller performSelector:@selector(runModalDialog) | 125 [controller performSelector:@selector(runModalDialog) |
| 69 withObject:nil | 126 withObject:nil |
| (...skipping 27 matching lines...) Expand all Loading... |
| 97 - (id)initWithProfile:(Profile*)profile { | 154 - (id)initWithProfile:(Profile*)profile { |
| 98 DCHECK(profile); | 155 DCHECK(profile); |
| 99 // Use initWithWindowNibPath:: instead of initWithWindowNibName: so we | 156 // Use initWithWindowNibPath:: instead of initWithWindowNibName: so we |
| 100 // can override it in a unit test. | 157 // can override it in a unit test. |
| 101 NSString *nibpath = [mac_util::MainAppBundle() | 158 NSString *nibpath = [mac_util::MainAppBundle() |
| 102 pathForResource:@"ClearBrowsingData" | 159 pathForResource:@"ClearBrowsingData" |
| 103 ofType:@"nib"]; | 160 ofType:@"nib"]; |
| 104 if ((self = [super initWithWindowNibPath:nibpath owner:self])) { | 161 if ((self = [super initWithWindowNibPath:nibpath owner:self])) { |
| 105 profile_ = profile; | 162 profile_ = profile; |
| 106 observer_.reset(new ClearBrowsingObserver(self)); | 163 observer_.reset(new ClearBrowsingObserver(self)); |
| 164 prefObserver_.reset( |
| 165 new clear_browsing_data_controller_internal::PrefObserverBridge(self)); |
| 166 clearLSODataEnabled_.Init(prefs::kClearPluginLSODataEnabled, |
| 167 g_browser_process->local_state(), |
| 168 prefObserver_.get()); |
| 107 [self initFromPrefs]; | 169 [self initFromPrefs]; |
| 108 } | 170 } |
| 109 return self; | 171 return self; |
| 110 } | 172 } |
| 111 | 173 |
| 112 - (void)dealloc { | 174 - (void)dealloc { |
| 113 if (remover_) { | 175 if (remover_) { |
| 114 // We were destroyed while clearing history was in progress. This can only | 176 // We were destroyed while clearing history was in progress. This can only |
| 115 // occur during automated tests (normally the user can't close the dialog | 177 // occur during automated tests (normally the user can't close the dialog |
| 116 // while clearing is in progress as the dialog is modal and not closeable). | 178 // while clearing is in progress as the dialog is modal and not closeable). |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 if (clearBrowsingHistory_) | 221 if (clearBrowsingHistory_) |
| 160 removeMask |= BrowsingDataRemover::REMOVE_HISTORY; | 222 removeMask |= BrowsingDataRemover::REMOVE_HISTORY; |
| 161 if (clearDownloadHistory_) | 223 if (clearDownloadHistory_) |
| 162 removeMask |= BrowsingDataRemover::REMOVE_DOWNLOADS; | 224 removeMask |= BrowsingDataRemover::REMOVE_DOWNLOADS; |
| 163 if (emptyCache_) | 225 if (emptyCache_) |
| 164 removeMask |= BrowsingDataRemover::REMOVE_CACHE; | 226 removeMask |= BrowsingDataRemover::REMOVE_CACHE; |
| 165 if (deleteCookies_) | 227 if (deleteCookies_) |
| 166 removeMask |= BrowsingDataRemover::REMOVE_COOKIES; | 228 removeMask |= BrowsingDataRemover::REMOVE_COOKIES; |
| 167 if (clearSavedPasswords_) | 229 if (clearSavedPasswords_) |
| 168 removeMask |= BrowsingDataRemover::REMOVE_PASSWORDS; | 230 removeMask |= BrowsingDataRemover::REMOVE_PASSWORDS; |
| 231 if (self.clearLSOData) |
| 232 removeMask |= BrowsingDataRemover::REMOVE_LSO_DATA; |
| 169 if (clearFormData_) | 233 if (clearFormData_) |
| 170 removeMask |= BrowsingDataRemover::REMOVE_FORM_DATA; | 234 removeMask |= BrowsingDataRemover::REMOVE_FORM_DATA; |
| 171 return removeMask; | 235 return removeMask; |
| 172 } | 236 } |
| 173 | 237 |
| 174 // Called when the user clicks the "clear" button. Do the work and persist | 238 // Called when the user clicks the "clear" button. Do the work and persist |
| 175 // the prefs for next time. We don't stop the modal session until we get | 239 // the prefs for next time. We don't stop the modal session until we get |
| 176 // the callback from the BrowsingDataRemover so the window stays on the screen. | 240 // the callback from the BrowsingDataRemover so the window stays on the screen. |
| 177 // While we're working, dim the buttons so the user can't click them. | 241 // While we're working, dim the buttons so the user can't click them. |
| 178 - (IBAction)clearData:(id)sender { | 242 - (IBAction)clearData:(id)sender { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 // Initialize the bools from prefs using the setters to be KVO-compliant. | 285 // Initialize the bools from prefs using the setters to be KVO-compliant. |
| 222 - (void)initFromPrefs { | 286 - (void)initFromPrefs { |
| 223 PrefService* prefs = profile_->GetPrefs(); | 287 PrefService* prefs = profile_->GetPrefs(); |
| 224 [self setClearBrowsingHistory: | 288 [self setClearBrowsingHistory: |
| 225 prefs->GetBoolean(prefs::kDeleteBrowsingHistory)]; | 289 prefs->GetBoolean(prefs::kDeleteBrowsingHistory)]; |
| 226 [self setClearDownloadHistory: | 290 [self setClearDownloadHistory: |
| 227 prefs->GetBoolean(prefs::kDeleteDownloadHistory)]; | 291 prefs->GetBoolean(prefs::kDeleteDownloadHistory)]; |
| 228 [self setEmptyCache:prefs->GetBoolean(prefs::kDeleteCache)]; | 292 [self setEmptyCache:prefs->GetBoolean(prefs::kDeleteCache)]; |
| 229 [self setDeleteCookies:prefs->GetBoolean(prefs::kDeleteCookies)]; | 293 [self setDeleteCookies:prefs->GetBoolean(prefs::kDeleteCookies)]; |
| 230 [self setClearSavedPasswords:prefs->GetBoolean(prefs::kDeletePasswords)]; | 294 [self setClearSavedPasswords:prefs->GetBoolean(prefs::kDeletePasswords)]; |
| 295 [self setClearLSOData:prefs->GetBoolean(prefs::kDeleteLSOData)]; |
| 231 [self setClearFormData:prefs->GetBoolean(prefs::kDeleteFormData)]; | 296 [self setClearFormData:prefs->GetBoolean(prefs::kDeleteFormData)]; |
| 232 [self setTimePeriod:prefs->GetInteger(prefs::kDeleteTimePeriod)]; | 297 [self setTimePeriod:prefs->GetInteger(prefs::kDeleteTimePeriod)]; |
| 233 } | 298 } |
| 234 | 299 |
| 235 // Save the checkbox values to the preferences. | 300 // Save the checkbox values to the preferences. |
| 236 - (void)persistToPrefs { | 301 - (void)persistToPrefs { |
| 237 PrefService* prefs = profile_->GetPrefs(); | 302 PrefService* prefs = profile_->GetPrefs(); |
| 238 prefs->SetBoolean(prefs::kDeleteBrowsingHistory, | 303 prefs->SetBoolean(prefs::kDeleteBrowsingHistory, |
| 239 [self clearBrowsingHistory]); | 304 [self clearBrowsingHistory]); |
| 240 prefs->SetBoolean(prefs::kDeleteDownloadHistory, | 305 prefs->SetBoolean(prefs::kDeleteDownloadHistory, |
| 241 [self clearDownloadHistory]); | 306 [self clearDownloadHistory]); |
| 242 prefs->SetBoolean(prefs::kDeleteCache, [self emptyCache]); | 307 prefs->SetBoolean(prefs::kDeleteCache, [self emptyCache]); |
| 243 prefs->SetBoolean(prefs::kDeleteCookies, [self deleteCookies]); | 308 prefs->SetBoolean(prefs::kDeleteCookies, [self deleteCookies]); |
| 244 prefs->SetBoolean(prefs::kDeletePasswords, [self clearSavedPasswords]); | 309 prefs->SetBoolean(prefs::kDeletePasswords, [self clearSavedPasswords]); |
| 310 prefs->SetBoolean(prefs::kDeleteLSOData, [self clearLSOData]); |
| 245 prefs->SetBoolean(prefs::kDeleteFormData, [self clearFormData]); | 311 prefs->SetBoolean(prefs::kDeleteFormData, [self clearFormData]); |
| 246 prefs->SetInteger(prefs::kDeleteTimePeriod, [self timePeriod]); | 312 prefs->SetInteger(prefs::kDeleteTimePeriod, [self timePeriod]); |
| 247 } | 313 } |
| 248 | 314 |
| 249 // Called when the data remover object is done with its work. Close the window. | 315 // Called when the data remover object is done with its work. Close the window. |
| 250 // The remover will delete itself. End the modal session at this point. | 316 // The remover will delete itself. End the modal session at this point. |
| 251 - (void)dataRemoverDidFinish { | 317 - (void)dataRemoverDidFinish { |
| 252 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; | 318 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; |
| 253 int removeMask = [self removeMask]; | 319 int removeMask = [self removeMask]; |
| 254 NSDictionary* userInfo = | 320 NSDictionary* userInfo = |
| 255 [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:removeMask] | 321 [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:removeMask] |
| 256 forKey:kClearBrowsingDataControllerRemoveMask]; | 322 forKey:kClearBrowsingDataControllerRemoveMask]; |
| 257 [center postNotificationName:kClearBrowsingDataControllerDidDelete | 323 [center postNotificationName:kClearBrowsingDataControllerDidDelete |
| 258 object:self | 324 object:self |
| 259 userInfo:userInfo]; | 325 userInfo:userInfo]; |
| 260 | 326 |
| 261 [self closeDialog]; | 327 [self closeDialog]; |
| 262 [[self window] orderOut:self]; | 328 [[self window] orderOut:self]; |
| 263 [self setIsClearing:NO]; | 329 [self setIsClearing:NO]; |
| 264 remover_ = NULL; | 330 remover_ = NULL; |
| 265 } | 331 } |
| 266 | 332 |
| 267 @end | 333 @end |
| OLD | NEW |