summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/collected_cookies_mac.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/cocoa/collected_cookies_mac.mm')
-rw-r--r--chrome/browser/cocoa/collected_cookies_mac.mm213
1 files changed, 205 insertions, 8 deletions
diff --git a/chrome/browser/cocoa/collected_cookies_mac.mm b/chrome/browser/cocoa/collected_cookies_mac.mm
index 693c8e4..e01c62d 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