| Index: chrome/browser/cocoa/collected_cookies_mac.mm
|
| diff --git a/chrome/browser/cocoa/collected_cookies_mac.mm b/chrome/browser/cocoa/collected_cookies_mac.mm
|
| index 693c8e417b89bb0807bb7c8585adda7eb18f9b67..e01c62d523f7ecef56a0a3f3b9a71b8b45c74908 100644
|
| --- a/chrome/browser/cocoa/collected_cookies_mac.mm
|
| +++ b/chrome/browser/cocoa/collected_cookies_mac.mm
|
| @@ -10,7 +10,7 @@
|
| #include "app/resource_bundle.h"
|
| #import "base/mac_util.h"
|
| #include "base/sys_string_conversions.h"
|
| -#include "chrome/browser/cocoa/content_settings_dialog_controller.h"
|
| +#import "chrome/browser/cocoa/vertical_gradient_view.h"
|
| #include "chrome/browser/profile.h"
|
| #include "chrome/browser/tab_contents/tab_contents.h"
|
| #include "chrome/common/notification_service.h"
|
| @@ -19,8 +19,20 @@
|
| #include "skia/ext/skia_utils_mac.h"
|
| #include "third_party/apple/ImageAndTextCell.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| +#import "third_party/GTM/AppKit/GTMNSAnimation+Duration.h"
|
| +#import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h"
|
|
|
| -static const CGFloat kMinCollectedCookiesViewHeight = 116;
|
| +namespace {
|
| +// Colors for the infobar.
|
| +const double kBannerGradientColorTop[3] =
|
| + {255.0 / 255.0, 242.0 / 255.0, 183.0 / 255.0};
|
| +const double kBannerGradientColorBottom[3] =
|
| + {250.0 / 255.0, 230.0 / 255.0, 145.0 / 255.0};
|
| +const double kBannerStrokeColor = 135.0 / 255.0;
|
| +
|
| +// Minimal height for the collected cookies dialog.
|
| +const CGFloat kMinCollectedCookiesViewHeight = 116;
|
| +} // namespace
|
|
|
| #pragma mark Bridge between the constrained window delegate and the sheet
|
|
|
| @@ -101,6 +113,13 @@ void CollectedCookiesMac::OnSheetDidEnd(NSWindow* sheet) {
|
|
|
| #pragma mark Window Controller
|
|
|
| +@interface CollectedCookiesWindowController(Private)
|
| +-(void)showInfoBarForDomain:(const string16&)domain
|
| + setting:(ContentSetting)setting;
|
| +-(void)showInfoBarForMultipleDomainsAndSetting:(ContentSetting)setting;
|
| +-(void)animateInfoBar;
|
| +@end
|
| +
|
| @implementation CollectedCookiesWindowController
|
|
|
| @synthesize allowedCookiesButtonsEnabled =
|
| @@ -113,20 +132,78 @@ void CollectedCookiesMac::OnSheetDidEnd(NSWindow* sheet) {
|
|
|
| - (id)initWithTabContents:(TabContents*)tabContents {
|
| DCHECK(tabContents);
|
| + infoBarVisible_ = NO;
|
| + tabContents_ = tabContents;
|
| +
|
| NSString* nibpath =
|
| [mac_util::MainAppBundle() pathForResource:@"CollectedCookies"
|
| ofType:@"nib"];
|
| if ((self = [super initWithWindowNibPath:nibpath owner:self])) {
|
| - tabContents_ = tabContents;
|
| -
|
| [self loadTreeModelFromTabContents];
|
| +
|
| + animation_.reset([[NSViewAnimation alloc] init]);
|
| + [animation_ setAnimationBlockingMode:NSAnimationNonblocking];
|
| }
|
| return self;
|
| }
|
|
|
| +- (void)awakeFromNib {
|
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| + NSImage* infoIcon = rb.GetNSImageNamed(IDR_INFO);
|
| + DCHECK(infoIcon);
|
| + [infoBarIcon_ setImage:infoIcon];
|
| +
|
| + // Initialize the banner gradient and stroke color.
|
| + NSColor* bannerStartingColor =
|
| + [NSColor colorWithCalibratedRed:kBannerGradientColorTop[0]
|
| + green:kBannerGradientColorTop[1]
|
| + blue:kBannerGradientColorTop[2]
|
| + alpha:1.0];
|
| + NSColor* bannerEndingColor =
|
| + [NSColor colorWithCalibratedRed:kBannerGradientColorBottom[0]
|
| + green:kBannerGradientColorBottom[1]
|
| + blue:kBannerGradientColorBottom[2]
|
| + alpha:1.0];
|
| + scoped_nsobject<NSGradient> bannerGradient(
|
| + [[NSGradient alloc] initWithStartingColor:bannerStartingColor
|
| + endingColor:bannerEndingColor]);
|
| + [infoBar_ setGradient:bannerGradient];
|
| +
|
| + NSColor* bannerStrokeColor =
|
| + [NSColor colorWithCalibratedWhite:kBannerStrokeColor
|
| + alpha:1.0];
|
| + [infoBar_ setStrokeColor:bannerStrokeColor];
|
| +
|
| + // Change the label of the blocked cookies part if necessary.
|
| + if (tabContents_->profile()->GetHostContentSettingsMap()->
|
| + BlockThirdPartyCookies()) {
|
| + [blockedCookiesText_ setStringValue:l10n_util::GetNSString(
|
| + IDS_COLLECTED_COOKIES_BLOCKED_THIRD_PARTY_BLOCKING_ENABLED)];
|
| + CGFloat textDeltaY = [GTMUILocalizerAndLayoutTweaker
|
| + sizeToFitFixedWidthTextField:blockedCookiesText_];
|
| +
|
| + // Shrink the upper custom view.
|
| + NSView* upperContentView = [[splitView_ subviews] objectAtIndex:0];
|
| + NSRect frame = [upperContentView frame];
|
| + [splitView_ setPosition:(frame.size.height - textDeltaY/2.0)
|
| + ofDividerAtIndex:0];
|
| +
|
| + // Shrink the lower outline view.
|
| + frame = [lowerScrollView_ frame];
|
| + frame.size.height -= textDeltaY;
|
| + [lowerScrollView_ setFrame:frame];
|
| +
|
| + // Move the label down so it actually fits.
|
| + frame = [blockedCookiesText_ frame];
|
| + frame.origin.y -= textDeltaY;
|
| + [blockedCookiesText_ setFrame:frame];
|
| + }
|
| +}
|
| +
|
| - (void)windowWillClose:(NSNotification*)notif {
|
| [allowedOutlineView_ setDelegate:nil];
|
| [blockedOutlineView_ setDelegate:nil];
|
| + [animation_ stopAnimation];
|
| [self autorelease];
|
| }
|
|
|
| @@ -137,6 +214,8 @@ void CollectedCookiesMac::OnSheetDidEnd(NSWindow* sheet) {
|
| - (void)addException:(ContentSetting)setting
|
| forTreeController:(NSTreeController*)controller {
|
| NSArray* nodes = [controller selectedNodes];
|
| + BOOL multipleDomainsChanged = NO;
|
| + string16 lastDomain;
|
| for (NSTreeNode* treeNode in nodes) {
|
| CocoaCookieTreeNode* node = [treeNode representedObject];
|
| CookieTreeNode* cookie = static_cast<CookieTreeNode*>([node treeNode]);
|
| @@ -149,11 +228,14 @@ void CollectedCookiesMac::OnSheetDidEnd(NSWindow* sheet) {
|
| origin_node->CreateContentException(
|
| tabContents_->profile()->GetHostContentSettingsMap(),
|
| setting);
|
| + if (!lastDomain.empty())
|
| + multipleDomainsChanged = YES;
|
| + lastDomain = origin_node->GetTitleAsString16();
|
| }
|
| - [[ContentSettingsDialogController
|
| - showContentSettingsForType:CONTENT_SETTINGS_TYPE_COOKIES
|
| - profile:tabContents_->profile()]
|
| - showCookieExceptions:self];
|
| + if (multipleDomainsChanged)
|
| + [self showInfoBarForMultipleDomainsAndSetting:setting];
|
| + else
|
| + [self showInfoBarForDomain:lastDomain setting:setting];
|
| }
|
|
|
| - (IBAction)allowOrigin:(id)sender {
|
| @@ -299,4 +381,119 @@ void CollectedCookiesMac::OnSheetDidEnd(NSWindow* sheet) {
|
| [self setCocoaBlockedTreeModel:model.get()]; // Takes ownership.
|
| }
|
|
|
| +-(void)showInfoBarForMultipleDomainsAndSetting:(ContentSetting)setting {
|
| + NSString* label;
|
| + switch (setting) {
|
| + case CONTENT_SETTING_BLOCK:
|
| + label = l10n_util::GetNSString(
|
| + IDS_COLLECTED_COOKIES_MULTIPLE_BLOCK_RULES_CREATED);
|
| + break;
|
| +
|
| + case CONTENT_SETTING_ALLOW:
|
| + label = l10n_util::GetNSString(
|
| + IDS_COLLECTED_COOKIES_MULTIPLE_ALLOW_RULES_CREATED);
|
| + break;
|
| +
|
| + case CONTENT_SETTING_SESSION_ONLY:
|
| + label = l10n_util::GetNSString(
|
| + IDS_COLLECTED_COOKIES_MULTIPLE_SESSION_RULES_CREATED);
|
| + break;
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + label = [[[NSString alloc] init] autorelease];
|
| + }
|
| + [infoBarText_ setStringValue:label];
|
| + [self animateInfoBar];
|
| +}
|
| +
|
| +-(void)showInfoBarForDomain:(const string16&)domain
|
| + setting:(ContentSetting)setting {
|
| + NSString* label;
|
| + switch (setting) {
|
| + case CONTENT_SETTING_BLOCK:
|
| + label = l10n_util::GetNSStringF(
|
| + IDS_COLLECTED_COOKIES_BLOCK_RULE_CREATED,
|
| + domain);
|
| + break;
|
| +
|
| + case CONTENT_SETTING_ALLOW:
|
| + label = l10n_util::GetNSStringF(
|
| + IDS_COLLECTED_COOKIES_ALLOW_RULE_CREATED,
|
| + domain);
|
| + break;
|
| +
|
| + case CONTENT_SETTING_SESSION_ONLY:
|
| + label = l10n_util::GetNSStringF(
|
| + IDS_COLLECTED_COOKIES_SESSION_RULE_CREATED,
|
| + domain);
|
| + break;
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + label = [[[NSString alloc] init] autorelease];
|
| + }
|
| + [infoBarText_ setStringValue:label];
|
| + [self animateInfoBar];
|
| +}
|
| +
|
| +-(void)animateInfoBar {
|
| + if (infoBarVisible_)
|
| + return;
|
| +
|
| + infoBarVisible_ = YES;
|
| +
|
| + NSMutableArray* animations = [NSMutableArray arrayWithCapacity:3];
|
| +
|
| + NSWindow* sheet = [self window];
|
| + NSRect sheetFrame = [sheet frame];
|
| + NSRect infoBarFrame = [infoBar_ frame];
|
| + NSRect splitViewFrame = [splitView_ frame];
|
| +
|
| + // Calculate the end position of the info bar and set it to its start
|
| + // position.
|
| + infoBarFrame.origin.y = NSHeight(sheetFrame);
|
| + infoBarFrame.size.width = NSWidth(sheetFrame);
|
| + NSRect infoBarStartFrame = infoBarFrame;
|
| + infoBarStartFrame.origin.y += NSHeight(infoBarFrame);
|
| + infoBarStartFrame.size.height = 0.0;
|
| + [infoBar_ setFrame:infoBarStartFrame];
|
| + [[[self window] contentView] addSubview:infoBar_];
|
| +
|
| + // Calculate the new position of the sheet.
|
| + sheetFrame.origin.y -= NSHeight(infoBarFrame);
|
| + sheetFrame.size.height += NSHeight(infoBarFrame);
|
| +
|
| + // Slide the infobar in.
|
| + [animations addObject:
|
| + [NSDictionary dictionaryWithObjectsAndKeys:
|
| + infoBar_, NSViewAnimationTargetKey,
|
| + [NSValue valueWithRect:infoBarFrame],
|
| + NSViewAnimationEndFrameKey,
|
| + [NSValue valueWithRect:infoBarStartFrame],
|
| + NSViewAnimationStartFrameKey,
|
| + nil]];
|
| + // Make sure the split view ends up in the right position.
|
| + [animations addObject:
|
| + [NSDictionary dictionaryWithObjectsAndKeys:
|
| + splitView_, NSViewAnimationTargetKey,
|
| + [NSValue valueWithRect:splitViewFrame],
|
| + NSViewAnimationEndFrameKey,
|
| + nil]];
|
| +
|
| + // Grow the sheet.
|
| + [animations addObject:
|
| + [NSDictionary dictionaryWithObjectsAndKeys:
|
| + sheet, NSViewAnimationTargetKey,
|
| + [NSValue valueWithRect:sheetFrame],
|
| + NSViewAnimationEndFrameKey,
|
| + nil]];
|
| + [animation_ setViewAnimations:animations];
|
| + // The default duration is 0.5s, which actually feels slow in here, so speed
|
| + // it up a bit.
|
| + [animation_ gtm_setDuration:0.2
|
| + eventMask:NSLeftMouseUpMask];
|
| + [animation_ startAnimation];
|
| +}
|
| +
|
| @end
|
|
|