| Index: chrome/browser/cocoa/clear_browsing_data_controller.mm
|
| ===================================================================
|
| --- chrome/browser/cocoa/clear_browsing_data_controller.mm (revision 62782)
|
| +++ chrome/browser/cocoa/clear_browsing_data_controller.mm (working copy)
|
| @@ -5,20 +5,15 @@
|
| #import "chrome/browser/cocoa/clear_browsing_data_controller.h"
|
|
|
| #include "app/l10n_util.h"
|
| -#include "base/command_line.h"
|
| #include "base/mac_util.h"
|
| #include "base/scoped_nsobject.h"
|
| #include "base/singleton.h"
|
| #include "chrome/browser/browser.h"
|
| #include "chrome/browser/browser_window.h"
|
| #include "chrome/browser/browsing_data_remover.h"
|
| -#include "chrome/browser/platform_util.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/profile.h"
|
| -#include "chrome/browser/sync/profile_sync_service.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/pref_names.h"
|
| -#include "grit/generated_resources.h"
|
| #include "grit/locale_settings.h"
|
| #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
|
|
|
| @@ -27,43 +22,27 @@
|
| NSString* const kClearBrowsingDataControllerRemoveMask =
|
| @"kClearBrowsingDataControllerRemoveMask";
|
|
|
| -namespace {
|
| -
|
| -// Compare function for -[NSArray sortedArrayUsingFunction:context:] that
|
| -// sorts the views in Y order top down.
|
| -NSInteger CompareFrameY(id view1, id view2, void* context) {
|
| - CGFloat y1 = NSMinY([view1 frame]);
|
| - CGFloat y2 = NSMinY([view2 frame]);
|
| - if (y1 < y2)
|
| - return NSOrderedDescending;
|
| - else if (y1 > y2)
|
| - return NSOrderedAscending;
|
| - else
|
| - return NSOrderedSame;
|
| -}
|
| -
|
| -typedef std::map<Profile*, ClearBrowsingDataController*> ProfileControllerMap;
|
| -
|
| -} // namespace
|
| -
|
| @interface ClearBrowsingDataController(Private)
|
| - (void)initFromPrefs;
|
| - (void)persistToPrefs;
|
| - (void)dataRemoverDidFinish;
|
| -- (void)syncStateChanged;
|
| @end
|
|
|
| -class ClearBrowsingObserver : public BrowsingDataRemover::Observer,
|
| - public ProfileSyncServiceObserver {
|
| +class ClearBrowsingObserver : public BrowsingDataRemover::Observer {
|
| public:
|
| ClearBrowsingObserver(ClearBrowsingDataController* controller)
|
| : controller_(controller) { }
|
| void OnBrowsingDataRemoverDone() { [controller_ dataRemoverDidFinish]; }
|
| - void OnStateChanged() { [controller_ syncStateChanged]; }
|
| private:
|
| ClearBrowsingDataController* controller_;
|
| };
|
|
|
| +namespace {
|
| +
|
| +typedef std::map<Profile*, ClearBrowsingDataController*> ProfileControllerMap;
|
| +
|
| +} // namespace
|
| +
|
| @implementation ClearBrowsingDataController
|
|
|
| @synthesize clearBrowsingHistory = clearBrowsingHistory_;
|
| @@ -74,15 +53,14 @@
|
| @synthesize clearFormData = clearFormData_;
|
| @synthesize timePeriod = timePeriod_;
|
| @synthesize isClearing = isClearing_;
|
| -@synthesize clearingStatus = clearingStatus_;
|
|
|
| + (void)showClearBrowsingDialogForProfile:(Profile*)profile {
|
| ClearBrowsingDataController* controller =
|
| [ClearBrowsingDataController controllerForProfile:profile];
|
| if (![controller isWindowLoaded]) {
|
| - // This function needs to return instead of blocking, to match the Windows
|
| - // version. It caused problems when launching the dialog from the
|
| - // DomUI history page. See bug and code review for more details.
|
| + // This function needs to return instead of blocking, to match the windows
|
| + // api call. It caused problems when launching the dialog from the
|
| + // DomUI history page. See bug and code review for more details.
|
| // http://crbug.com/37976
|
| [controller performSelector:@selector(runModalDialog)
|
| withObject:nil
|
| @@ -123,8 +101,6 @@
|
| if ((self = [super initWithWindowNibPath:nibpath owner:self])) {
|
| profile_ = profile;
|
| observer_.reset(new ClearBrowsingObserver(self));
|
| - profile_->GetProfileSyncService()->ResetClearServerDataState();
|
| - profile_->GetProfileSyncService()->AddObserver(observer_.get());
|
| [self initFromPrefs];
|
| }
|
| return self;
|
| @@ -137,8 +113,6 @@
|
| // while clearing is in progress as the dialog is modal and not closeable).
|
| remover_->RemoveObserver(observer_.get());
|
| }
|
| - profile_->GetProfileSyncService()->RemoveObserver(observer_.get());
|
| - [self setClearingStatus:nil];
|
|
|
| [super dealloc];
|
| }
|
| @@ -150,65 +124,28 @@
|
| // triggered twice.
|
| DCHECK([NSThread isMainThread]);
|
| if (![self isWindowLoaded]) {
|
| - // It takes two passes to adjust the window size. The first pass is to
|
| - // determine the width of all the non-wrappable items. The window is then
|
| - // resized to that width. Once the width is fixed, the heights of the
|
| - // variable-height items can then be calculated, the items can be spaced,
|
| - // and the window resized (again) if necessary.
|
| -
|
| - NSWindow* window = [self window];
|
| -
|
| - // Adjust the widths of non-wrappable items.
|
| + // The Window size in the nib is a min size, loop over the views collecting
|
| + // the max they grew by, that is how much the window needs to be widened by.
|
| CGFloat maxWidthGrowth = 0.0;
|
| + NSWindow* window = [self window];
|
| + NSView* contentView = [window contentView];
|
| Class widthBasedTweakerClass = [GTMWidthBasedTweaker class];
|
| - for (NSTabViewItem* tabViewItem in [tabView_ tabViewItems])
|
| - for (NSView* subView in [[tabViewItem view] subviews])
|
| - if ([subView isKindOfClass:widthBasedTweakerClass]) {
|
| - GTMWidthBasedTweaker* tweaker = (GTMWidthBasedTweaker*)subView;
|
| - CGFloat delta = [tweaker changedWidth];
|
| - maxWidthGrowth = std::max(maxWidthGrowth, delta);
|
| - }
|
| -
|
| - // Adjust the width of the window.
|
| - if (maxWidthGrowth > 0.0) {
|
| - NSSize adjustSize = NSMakeSize(maxWidthGrowth, 0);
|
| - adjustSize = [[window contentView] convertSize:adjustSize toView:nil];
|
| - NSRect windowFrame = [window frame];
|
| - windowFrame.size.width += adjustSize.width;
|
| - [window setFrame:windowFrame display:NO];
|
| - }
|
| -
|
| - // Adjust the heights and locations of the items on the "Other data" tab.
|
| - CGFloat cumulativeHeightGrowth = 0.0;
|
| - NSArray* subViews =
|
| - [[otherDataTab_ subviews] sortedArrayUsingFunction:CompareFrameY
|
| - context:NULL];
|
| - for (NSView* view in subViews) {
|
| - if ([view isHidden])
|
| - continue;
|
| -
|
| - if ([objectsToVerticallySize_ containsObject:view]) {
|
| - DCHECK([view isKindOfClass:[NSTextField class]]);
|
| - CGFloat viewHeightGrowth = [GTMUILocalizerAndLayoutTweaker
|
| - sizeToFitFixedWidthTextField:(NSTextField*)view];
|
| - if (viewHeightGrowth > 0.0)
|
| - cumulativeHeightGrowth += viewHeightGrowth;
|
| + for (id subView in [contentView subviews]) {
|
| + if ([subView isKindOfClass:widthBasedTweakerClass]) {
|
| + GTMWidthBasedTweaker* tweaker = subView;
|
| + CGFloat delta = [tweaker changedWidth];
|
| + maxWidthGrowth = std::max(maxWidthGrowth, delta);
|
| }
|
| -
|
| - NSRect viewFrame = [view frame];
|
| - viewFrame.origin.y -= cumulativeHeightGrowth;
|
| - [view setFrame:viewFrame];
|
| }
|
| -
|
| - // Adjust the height of the window.
|
| - if (cumulativeHeightGrowth > 0.0) {
|
| - NSSize adjustSize = NSMakeSize(0, cumulativeHeightGrowth);
|
| - adjustSize = [[window contentView] convertSize:adjustSize toView:nil];
|
| - NSRect windowFrame = [window frame];
|
| - windowFrame.size.height += adjustSize.height;
|
| - [window setFrame:windowFrame display:NO];
|
| + if (maxWidthGrowth > 0.0) {
|
| + NSRect rect = [contentView convertRect:[window frame] fromView:nil];
|
| + rect.size.width += maxWidthGrowth;
|
| + rect = [contentView convertRect:rect toView:nil];
|
| + [window setFrame:rect display:NO];
|
| + // For some reason the content view is resizing, but some times not
|
| + // adjusting its origin, so correct it manually.
|
| + [contentView setFrameOrigin:NSZeroPoint];
|
| }
|
| -
|
| // Now start the modal loop.
|
| [NSApp runModalForWindow:window];
|
| }
|
| @@ -223,9 +160,9 @@
|
| if (emptyCache_)
|
| removeMask |= BrowsingDataRemover::REMOVE_CACHE;
|
| if (deleteCookies_)
|
| - removeMask |= BrowsingDataRemover::REMOVE_COOKIES;
|
| + removeMask |= BrowsingDataRemover::REMOVE_COOKIES;
|
| if (clearSavedPasswords_)
|
| - removeMask |= BrowsingDataRemover::REMOVE_PASSWORDS;
|
| + removeMask |= BrowsingDataRemover::REMOVE_PASSWORDS;
|
| if (clearFormData_)
|
| removeMask |= BrowsingDataRemover::REMOVE_FORM_DATA;
|
| return removeMask;
|
| @@ -237,7 +174,6 @@
|
| // While we're working, dim the buttons so the user can't click them.
|
| - (IBAction)clearData:(id)sender {
|
| // Set that we're working so that the buttons disable.
|
| - [self setClearingStatus:l10n_util::GetNSString(IDS_CLEAR_DATA_DELETING)];
|
| [self setIsClearing:YES];
|
|
|
| [self persistToPrefs];
|
| @@ -268,17 +204,6 @@
|
| browser->window()->Show();
|
| }
|
|
|
| -- (IBAction)openGoogleDashboard:(id)sender {
|
| - // The "Clear Data" dialog is app-modal on OS X. Hence, close it before
|
| - // opening a tab with the dashboard.
|
| - [self closeDialog];
|
| -
|
| - Browser* browser = Browser::Create(profile_);
|
| - browser->OpenURL(GURL(l10n_util::GetStringUTF8(IDS_PRIVACY_DASHBOARD_URL)),
|
| - GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
|
| - browser->window()->Show();
|
| -}
|
| -
|
| - (void)closeDialog {
|
| ProfileControllerMap* map = Singleton<ProfileControllerMap>::get();
|
| ProfileControllerMap::iterator it = map->find(profile_);
|
| @@ -331,73 +256,9 @@
|
| userInfo:userInfo];
|
|
|
| [self closeDialog];
|
| - [self setClearingStatus:nil];
|
| + [[self window] orderOut:self];
|
| [self setIsClearing:NO];
|
| remover_ = NULL;
|
| }
|
|
|
| -- (IBAction)stopSyncAndDeleteData:(id)sender {
|
| - // Protect against the unlikely case where the server received a message, and
|
| - // the syncer syncs and resets itself before the user tries pressing the Clear
|
| - // button in this dialog again. TODO(raz) Confirm whether we have an issue
|
| - // here
|
| - if (profile_->GetProfileSyncService()->HasSyncSetupCompleted()) {
|
| - bool clear = platform_util::SimpleYesNoBox(
|
| - nil,
|
| - l10n_util::GetStringUTF16(IDS_CONFIRM_CLEAR_TITLE),
|
| - l10n_util::GetStringUTF16(IDS_CONFIRM_CLEAR_DESCRIPTION));
|
| - if (clear) {
|
| - profile_->GetProfileSyncService()->ClearServerData();
|
| - [self syncStateChanged];
|
| - }
|
| - }
|
| -}
|
| -
|
| -- (void)syncStateChanged {
|
| - bool deleteInProgress = false;
|
| -
|
| - ProfileSyncService::ClearServerDataState clearState =
|
| - profile_->GetProfileSyncService()->GetClearServerDataState();
|
| - profile_->GetProfileSyncService()->ResetClearServerDataState();
|
| -
|
| - switch (clearState) {
|
| - case ProfileSyncService::CLEAR_NOT_STARTED:
|
| - // This can occur on a first start and after a failed clear (which does
|
| - // not close the tab). Do nothing.
|
| - break;
|
| - case ProfileSyncService::CLEAR_CLEARING:
|
| - // Clearing buttons on all tabs are disabled at this point, throbber is
|
| - // going.
|
| - [self setClearingStatus:l10n_util::GetNSString(IDS_CLEAR_DATA_SENDING)];
|
| - deleteInProgress = true;
|
| - break;
|
| - case ProfileSyncService::CLEAR_FAILED:
|
| - // Show an error and reallow clearing.
|
| - [self setClearingStatus:l10n_util::GetNSString(IDS_CLEAR_DATA_ERROR)];
|
| - deleteInProgress = false;
|
| - break;
|
| - case ProfileSyncService::CLEAR_SUCCEEDED:
|
| - // Close the dialog box, success!
|
| - [self setClearingStatus:nil];
|
| - deleteInProgress = false;
|
| - [self closeDialog];
|
| - break;
|
| - }
|
| -
|
| - [self setIsClearing:deleteInProgress];
|
| -}
|
| -
|
| -- (BOOL)isSyncEnabled {
|
| - BOOL allowClearServerDataUI =
|
| - CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kEnableClearServerData);
|
| -
|
| - return allowClearServerDataUI &&
|
| - profile_->GetProfileSyncService()->HasSyncSetupCompleted();
|
| -}
|
| -
|
| -- (NSFont*)labelFont {
|
| - return [NSFont boldSystemFontOfSize:13];
|
| -}
|
| -
|
| @end
|
|
|