Index: chrome/browser/ui/cocoa/collected_cookies_mac.mm |
=================================================================== |
--- chrome/browser/ui/cocoa/collected_cookies_mac.mm (revision 71852) |
+++ chrome/browser/ui/cocoa/collected_cookies_mac.mm (working copy) |
@@ -1,500 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#import "chrome/browser/ui/cocoa/collected_cookies_mac.h" |
- |
-#include <vector> |
- |
-#include "app/l10n_util_mac.h" |
-#include "app/resource_bundle.h" |
-#import "base/mac/mac_util.h" |
-#include "base/sys_string_conversions.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/tab_contents/tab_contents.h" |
-#import "chrome/browser/ui/cocoa/vertical_gradient_view.h" |
-#include "chrome/common/notification_details.h" |
-#include "chrome/common/notification_source.h" |
-#include "grit/generated_resources.h" |
-#include "grit/theme_resources.h" |
-#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" |
- |
-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 |
- |
-// The delegate used to forward the events from the sheet to the constrained |
-// window delegate. |
-@interface CollectedCookiesSheetBridge : NSObject { |
- CollectedCookiesMac* collectedCookies_; // weak |
-} |
-- (id)initWithCollectedCookiesMac:(CollectedCookiesMac*)collectedCookies; |
-- (void)sheetDidEnd:(NSWindow*)sheet |
- returnCode:(int)returnCode |
- contextInfo:(void*)contextInfo; |
-@end |
- |
-@implementation CollectedCookiesSheetBridge |
-- (id)initWithCollectedCookiesMac:(CollectedCookiesMac*)collectedCookies { |
- if ((self = [super init])) { |
- collectedCookies_ = collectedCookies; |
- } |
- return self; |
-} |
- |
-- (void)sheetDidEnd:(NSWindow*)sheet |
- returnCode:(int)returnCode |
- contextInfo:(void*)contextInfo { |
- collectedCookies_->OnSheetDidEnd(sheet); |
-} |
-@end |
- |
-#pragma mark Constrained window delegate |
- |
-CollectedCookiesMac::CollectedCookiesMac(NSWindow* parent, |
- TabContents* tab_contents) |
- : ConstrainedWindowMacDelegateCustomSheet( |
- [[[CollectedCookiesSheetBridge alloc] |
- initWithCollectedCookiesMac:this] autorelease], |
- @selector(sheetDidEnd:returnCode:contextInfo:)), |
- tab_contents_(tab_contents) { |
- TabSpecificContentSettings* content_settings = |
- tab_contents->GetTabSpecificContentSettings(); |
- registrar_.Add(this, NotificationType::COLLECTED_COOKIES_SHOWN, |
- Source<TabSpecificContentSettings>(content_settings)); |
- |
- sheet_controller_ = [[CollectedCookiesWindowController alloc] |
- initWithTabContents:tab_contents]; |
- |
- set_sheet([sheet_controller_ window]); |
- |
- window_ = tab_contents->CreateConstrainedDialog(this); |
-} |
- |
-CollectedCookiesMac::~CollectedCookiesMac() { |
- NSWindow* window = [sheet_controller_ window]; |
- if (window_ && window && is_sheet_open()) { |
- window_ = NULL; |
- [NSApp endSheet:window]; |
- } |
-} |
- |
-void CollectedCookiesMac::DeleteDelegate() { |
- delete this; |
-} |
- |
-void CollectedCookiesMac::Observe(NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- DCHECK(type == NotificationType::COLLECTED_COOKIES_SHOWN); |
- DCHECK_EQ(Source<TabSpecificContentSettings>(source).ptr(), |
- tab_contents_->GetTabSpecificContentSettings()); |
- window_->CloseConstrainedWindow(); |
-} |
- |
-void CollectedCookiesMac::OnSheetDidEnd(NSWindow* sheet) { |
- [sheet orderOut:sheet_controller_]; |
- if (window_) |
- window_->CloseConstrainedWindow(); |
-} |
- |
-#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 = |
- allowedCookiesButtonsEnabled_; |
-@synthesize blockedCookiesButtonsEnabled = |
- blockedCookiesButtonsEnabled_; |
- |
-@synthesize allowedTreeController = allowedTreeController_; |
-@synthesize blockedTreeController = blockedTreeController_; |
- |
-- (id)initWithTabContents:(TabContents*)tabContents { |
- DCHECK(tabContents); |
- infoBarVisible_ = NO; |
- tabContents_ = tabContents; |
- |
- NSString* nibpath = |
- [base::mac::MainAppBundle() pathForResource:@"CollectedCookies" |
- ofType:@"nib"]; |
- if ((self = [super initWithWindowNibPath:nibpath owner:self])) { |
- [self loadTreeModelFromTabContents]; |
- |
- animation_.reset([[NSViewAnimation alloc] init]); |
- [animation_ setAnimationBlockingMode:NSAnimationNonblocking]; |
- } |
- return self; |
-} |
- |
-- (void)awakeFromNib { |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- NSImage* infoIcon = rb.GetNativeImageNamed(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]; |
-} |
- |
-- (IBAction)closeSheet:(id)sender { |
- [NSApp endSheet:[self window]]; |
-} |
- |
-- (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]); |
- if (cookie->GetDetailedInfo().node_type != |
- CookieTreeNode::DetailedInfo::TYPE_ORIGIN) { |
- continue; |
- } |
- CookieTreeOriginNode* origin_node = |
- static_cast<CookieTreeOriginNode*>(cookie); |
- origin_node->CreateContentException( |
- tabContents_->profile()->GetHostContentSettingsMap(), |
- setting); |
- if (!lastDomain.empty()) |
- multipleDomainsChanged = YES; |
- lastDomain = origin_node->GetTitle(); |
- } |
- if (multipleDomainsChanged) |
- [self showInfoBarForMultipleDomainsAndSetting:setting]; |
- else |
- [self showInfoBarForDomain:lastDomain setting:setting]; |
-} |
- |
-- (IBAction)allowOrigin:(id)sender { |
- [self addException:CONTENT_SETTING_ALLOW |
- forTreeController:blockedTreeController_]; |
-} |
- |
-- (IBAction)allowForSessionFromOrigin:(id)sender { |
- [self addException:CONTENT_SETTING_SESSION_ONLY |
- forTreeController:blockedTreeController_]; |
-} |
- |
-- (IBAction)blockOrigin:(id)sender { |
- [self addException:CONTENT_SETTING_BLOCK |
- forTreeController:allowedTreeController_]; |
-} |
- |
-- (CGFloat) splitView:(NSSplitView *)sender |
- constrainMinCoordinate:(CGFloat)proposedMin |
- ofSubviewAt:(NSInteger)offset { |
- return proposedMin + kMinCollectedCookiesViewHeight; |
-} |
-- (CGFloat) splitView:(NSSplitView *)sender |
- constrainMaxCoordinate:(CGFloat)proposedMax |
- ofSubviewAt:(NSInteger)offset { |
- return proposedMax - kMinCollectedCookiesViewHeight; |
-} |
-- (BOOL)splitView:(NSSplitView *)sender canCollapseSubview:(NSView *)subview { |
- return YES; |
-} |
- |
-- (CocoaCookieTreeNode*)cocoaAllowedTreeModel { |
- return cocoaAllowedTreeModel_.get(); |
-} |
-- (void)setCocoaAllowedTreeModel:(CocoaCookieTreeNode*)model { |
- cocoaAllowedTreeModel_.reset([model retain]); |
-} |
- |
-- (CookiesTreeModel*)allowedTreeModel { |
- return allowedTreeModel_.get(); |
-} |
- |
-- (CocoaCookieTreeNode*)cocoaBlockedTreeModel { |
- return cocoaBlockedTreeModel_.get(); |
-} |
-- (void)setCocoaBlockedTreeModel:(CocoaCookieTreeNode*)model { |
- cocoaBlockedTreeModel_.reset([model retain]); |
-} |
- |
-- (CookiesTreeModel*)blockedTreeModel { |
- return blockedTreeModel_.get(); |
-} |
- |
-- (void)outlineView:(NSOutlineView*)outlineView |
- willDisplayCell:(id)cell |
- forTableColumn:(NSTableColumn*)tableColumn |
- item:(id)item { |
- CocoaCookieTreeNode* node = [item representedObject]; |
- int index; |
- if (outlineView == allowedOutlineView_) |
- index = allowedTreeModel_->GetIconIndex([node treeNode]); |
- else |
- index = blockedTreeModel_->GetIconIndex([node treeNode]); |
- NSImage* icon = nil; |
- if (index >= 0) |
- icon = [icons_ objectAtIndex:index]; |
- else |
- icon = [icons_ lastObject]; |
- DCHECK([cell isKindOfClass:[ImageAndTextCell class]]); |
- [static_cast<ImageAndTextCell*>(cell) setImage:icon]; |
-} |
- |
-- (void)outlineViewSelectionDidChange:(NSNotification*)notif { |
- BOOL isAllowedOutlineView; |
- if ([notif object] == allowedOutlineView_) { |
- isAllowedOutlineView = YES; |
- } else if ([notif object] == blockedOutlineView_) { |
- isAllowedOutlineView = NO; |
- } else { |
- NOTREACHED(); |
- return; |
- } |
- NSTreeController* controller = |
- isAllowedOutlineView ? allowedTreeController_ : blockedTreeController_; |
- |
- NSArray* nodes = [controller selectedNodes]; |
- for (NSTreeNode* treeNode in nodes) { |
- CocoaCookieTreeNode* node = [treeNode representedObject]; |
- CookieTreeNode* cookie = static_cast<CookieTreeNode*>([node treeNode]); |
- if (cookie->GetDetailedInfo().node_type != |
- CookieTreeNode::DetailedInfo::TYPE_ORIGIN) { |
- continue; |
- } |
- CookieTreeOriginNode* origin_node = |
- static_cast<CookieTreeOriginNode*>(cookie); |
- if (origin_node->CanCreateContentException()) { |
- if (isAllowedOutlineView) { |
- [self setAllowedCookiesButtonsEnabled:YES]; |
- } else { |
- [self setBlockedCookiesButtonsEnabled:YES]; |
- } |
- return; |
- } |
- } |
- if (isAllowedOutlineView) { |
- [self setAllowedCookiesButtonsEnabled:NO]; |
- } else { |
- [self setBlockedCookiesButtonsEnabled:NO]; |
- } |
-} |
- |
-// Initializes the |allowedTreeModel_| and |blockedTreeModel_|, and builds |
-// the |cocoaAllowedTreeModel_| and |cocoaBlockedTreeModel_|. |
-- (void)loadTreeModelFromTabContents { |
- TabSpecificContentSettings* content_settings = |
- tabContents_->GetTabSpecificContentSettings(); |
- allowedTreeModel_.reset(content_settings->GetAllowedCookiesTreeModel()); |
- blockedTreeModel_.reset(content_settings->GetBlockedCookiesTreeModel()); |
- |
- // Convert the model's icons from Skia to Cocoa. |
- std::vector<SkBitmap> skiaIcons; |
- allowedTreeModel_->GetIcons(&skiaIcons); |
- icons_.reset([[NSMutableArray alloc] init]); |
- for (std::vector<SkBitmap>::iterator it = skiaIcons.begin(); |
- it != skiaIcons.end(); ++it) { |
- [icons_ addObject:gfx::SkBitmapToNSImage(*it)]; |
- } |
- |
- // Default icon will be the last item in the array. |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- // TODO(rsesek): Rename this resource now that it's in multiple places. |
- [icons_ addObject:rb.GetNativeImageNamed(IDR_BOOKMARK_BAR_FOLDER)]; |
- |
- // Create the Cocoa model. |
- CookieTreeNode* root = |
- static_cast<CookieTreeNode*>(allowedTreeModel_->GetRoot()); |
- scoped_nsobject<CocoaCookieTreeNode> model( |
- [[CocoaCookieTreeNode alloc] initWithNode:root]); |
- [self setCocoaAllowedTreeModel:model.get()]; // Takes ownership. |
- root = static_cast<CookieTreeNode*>(blockedTreeModel_->GetRoot()); |
- model.reset( |
- [[CocoaCookieTreeNode alloc] initWithNode:root]); |
- [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 |