summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/collected_cookies_mac.mm
diff options
context:
space:
mode:
authorjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-15 15:54:19 +0000
committerjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-15 15:54:19 +0000
commitfacc6ada0300c8e9a67b0cf283257a2c70fa15c2 (patch)
tree7abfb80d70b15b344e2c246fc4d3bf13bc8f7d4e /chrome/browser/cocoa/collected_cookies_mac.mm
parent0dad8074499c8a2784505f826505bd8862d618a1 (diff)
downloadchromium_src-facc6ada0300c8e9a67b0cf283257a2c70fa15c2.zip
chromium_src-facc6ada0300c8e9a67b0cf283257a2c70fa15c2.tar.gz
chromium_src-facc6ada0300c8e9a67b0cf283257a2c70fa15c2.tar.bz2
Display a tab modal dialog of the allowed/blocked cookies.
BUG=45230 TEST=CollectedCookiesTest.* Review URL: http://codereview.chromium.org/2907003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52486 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/collected_cookies_mac.mm')
-rw-r--r--chrome/browser/cocoa/collected_cookies_mac.mm203
1 files changed, 203 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/collected_cookies_mac.mm b/chrome/browser/cocoa/collected_cookies_mac.mm
new file mode 100644
index 0000000..25cc43c
--- /dev/null
+++ b/chrome/browser/cocoa/collected_cookies_mac.mm
@@ -0,0 +1,203 @@
+// 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/cocoa/collected_cookies_mac.h"
+
+#include <vector>
+
+#include "app/l10n_util_mac.h"
+#include "app/resource_bundle.h"
+#import "base/mac_util.h"
+#include "base/sys_string_conversions.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/common/notification_service.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"
+
+#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
+
+@implementation CollectedCookiesWindowController
+
+@synthesize allowedTreeController = allowedTreeController_;
+@synthesize blockedTreeController = blockedTreeController_;
+
+- (id)initWithTabContents:(TabContents*)tabContents {
+ DCHECK(tabContents);
+ NSString* nibpath =
+ [mac_util::MainAppBundle() pathForResource:@"CollectedCookies"
+ ofType:@"nib"];
+ if ((self = [super initWithWindowNibPath:nibpath owner:self])) {
+ tabContents_ = tabContents;
+
+ [self loadTreeModelFromTabContents];
+ }
+ return self;
+}
+
+- (void)windowWillClose:(NSNotification*)notif {
+ [allowedOutlineView_ setDelegate:nil];
+ [blockedOutlineView_ setDelegate:nil];
+ [self autorelease];
+}
+
+- (IBAction)closeSheet:(id)sender {
+ [NSApp endSheet:[self window]];
+}
+
+- (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];
+}
+
+// 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.GetNSImageNamed(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.
+}
+
+@end