diff options
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r-- | chrome/browser/cocoa/cookie_tree_node.h | 47 | ||||
-rw-r--r-- | chrome/browser/cocoa/cookie_tree_node.mm | 58 | ||||
-rw-r--r-- | chrome/browser/cocoa/cookies_window_controller.h | 7 | ||||
-rw-r--r-- | chrome/browser/cocoa/cookies_window_controller.mm | 19 | ||||
-rw-r--r-- | chrome/browser/cocoa/cookies_window_controller_unittest.mm | 81 |
5 files changed, 180 insertions, 32 deletions
diff --git a/chrome/browser/cocoa/cookie_tree_node.h b/chrome/browser/cocoa/cookie_tree_node.h index 0ff6465..693895e 100644 --- a/chrome/browser/cocoa/cookie_tree_node.h +++ b/chrome/browser/cocoa/cookie_tree_node.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// 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. @@ -7,27 +7,46 @@ #include "base/scoped_nsobject.h" #include "chrome/browser/cookies_tree_model.h" +// This enum specifies the type of display node a CocoaCookieTreeNode is. If +// this system is rewritten to not use bindings, this class should be +// subclassed and specialized, rather than using an enum to determine type. +enum CocoaCookieTreeNodeType { + // Represents grouping data for the actual data. + kCocoaCookieTreeNodeTypeFolder = 0, + + // A cookie node. + kCocoaCookieTreeNodeTypeCookie = 1, + + // A local storage node. + kCocoaCookieTreeNodeTypeLocalStorage = 2 +}; + // This class is used by CookiesWindowController and represents a node in the // cookie tree view. @interface CocoaCookieTreeNode : NSObject { scoped_nsobject<NSString> title_; scoped_nsobject<NSMutableArray> children_; - // We lazily create children, so we need to know if we are a leaf. - BOOL isLeaf_; + + CocoaCookieTreeNodeType nodeType_; // The platform-independent model node. CookieTreeNode* treeNode_; // weak - // These members are only set for true cookie nodes. - BOOL isCookie_; + // These members are only set for kCocoaCookieTreeNodeTypeCookie nodes. scoped_nsobject<NSString> name_; scoped_nsobject<NSString> content_; - scoped_nsobject<NSString> domain_; scoped_nsobject<NSString> path_; scoped_nsobject<NSString> sendFor_; // Stringifed dates. scoped_nsobject<NSString> created_; scoped_nsobject<NSString> expires_; + + // These members are only set for kCocoaCookieTreeNodeTypeLocalStorage nodes. + scoped_nsobject<NSString> fileSize_; + scoped_nsobject<NSString> lastModified_; + + // These members are set for both of the two specialized node types. + scoped_nsobject<NSString> domain_; } // Designated initializer. @@ -36,20 +55,18 @@ // Re-sets all the members of the node based on |treeNode_|. - (void)rebuild; -- (BOOL)isLeaf; - -// Getters. +// Common getters.. - (NSString*)title; +- (CocoaCookieTreeNodeType)nodeType; +- (TreeModelNode*)treeNode; // |-mutableChildren| exists so that the CookiesTreeModelObserverBridge can // operate on the children. Note that this lazily creates children. - (NSMutableArray*)mutableChildren; - (NSArray*)children; +- (BOOL)isLeaf; -- (TreeModelNode*)treeNode; - -// Used only by cookies. Nil for non-cookie nodes. -- (BOOL)isCookie; +// Used only by kCocoaCookieTreeNodeTypeCookie. Nil for other types. - (NSString*)name; - (NSString*)content; - (NSString*)domain; @@ -58,4 +75,8 @@ - (NSString*)created; - (NSString*)expires; +// Used by kCocoaCookieTreeNodeTypeLocalStorage nodes. Nil for other types. +- (NSString*)fileSize; +- (NSString*)lastModified; + @end diff --git a/chrome/browser/cocoa/cookie_tree_node.mm b/chrome/browser/cocoa/cookie_tree_node.mm index 32e5cdc..a4642a4 100644 --- a/chrome/browser/cocoa/cookie_tree_node.mm +++ b/chrome/browser/cocoa/cookie_tree_node.mm @@ -7,6 +7,7 @@ #include "app/l10n_util_mac.h" #import "base/i18n/time_formatting.h" #include "base/sys_string_conversions.h" +#include "chrome/browser/browsing_data_local_storage_helper.h" #include "grit/generated_resources.h" @implementation CocoaCookieTreeNode @@ -15,8 +16,6 @@ if ((self = [super init])) { DCHECK(node); treeNode_ = node; - isLeaf_ = (node->GetChildCount() == 0); - [self rebuild]; } return self; @@ -24,11 +23,13 @@ - (void)rebuild { title_.reset([base::SysWideToNSString(treeNode_->GetTitle()) retain]); - isCookie_ = NO; + children_.reset(); + nodeType_ = kCocoaCookieTreeNodeTypeFolder; CookieTreeNode::DetailedInfo info = treeNode_->GetDetailedInfo(); - if (info.node_type == CookieTreeNode::DetailedInfo::TYPE_COOKIE) { - isCookie_ = YES; + CookieTreeNode::DetailedInfo::NodeType nodeType = info.node_type; + if (nodeType == CookieTreeNode::DetailedInfo::TYPE_COOKIE) { + nodeType_ = kCocoaCookieTreeNodeTypeCookie; net::CookieMonster::CanonicalCookie cookie = info.cookie->second; name_.reset([base::SysUTF8ToNSString(cookie.Name()) retain]); @@ -55,17 +56,31 @@ sendFor_.reset([l10n_util::GetNSStringWithFixup( IDS_COOKIES_COOKIE_SENDFOR_ANY) retain]); } + } else if (nodeType == CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE) { + const BrowsingDataLocalStorageHelper::LocalStorageInfo* storageInfo = + info.local_storage_info; + nodeType_ = kCocoaCookieTreeNodeTypeLocalStorage; + domain_.reset([base::SysUTF8ToNSString(storageInfo->origin) retain]); + fileSize_.reset([base::SysWideToNSString(FormatBytes(storageInfo->size, + GetByteDisplayUnits(storageInfo->size), true)) retain]); + lastModified_.reset([base::SysWideToNSString( + base::TimeFormatFriendlyDateAndTime( + storageInfo->last_modified)) retain]); } } -- (BOOL)isLeaf { - return isLeaf_; -} - - (NSString*)title { return title_.get(); } +- (CocoaCookieTreeNodeType)nodeType { + return nodeType_; +} + +- (TreeModelNode*)treeNode { + return treeNode_; +} + - (NSMutableArray*)mutableChildren { if (!children_.get()) { const int childCount = treeNode_->GetChildCount(); @@ -84,16 +99,19 @@ return [self mutableChildren]; } -- (TreeModelNode*)treeNode { - return treeNode_; +- (BOOL)isLeaf { + return nodeType_ != kCocoaCookieTreeNodeTypeFolder; } -#pragma mark Cookie Accessors - -- (BOOL)isCookie { - return isCookie_; +- (NSString*)description { + NSString* format = + @"<CocoaCookieTreeNode @ %p (title=%@, nodeType=%d, childCount=%u)"; + return [NSString stringWithFormat:format, self, [self title], + [self nodeType], [[self children] count]]; } +#pragma mark Cookie Accessors + - (NSString*)name { return name_.get(); } @@ -122,4 +140,14 @@ return expires_.get(); } +#pragma mark Local Storage Accessors + +- (NSString*)fileSize { + return fileSize_.get(); +} + +- (NSString*)lastModified { + return lastModified_.get(); +} + @end diff --git a/chrome/browser/cocoa/cookies_window_controller.h b/chrome/browser/cocoa/cookies_window_controller.h index b6ccf13..9c354bd 100644 --- a/chrome/browser/cocoa/cookies_window_controller.h +++ b/chrome/browser/cocoa/cookies_window_controller.h @@ -94,6 +94,11 @@ class CookiesTreeModelObserverBridge : public TreeModelObserver { IBOutlet NSOutlineView* outlineView_; IBOutlet NSSearchField* searchField_; + // These views are laid out inside a NSBox and are shown/hidden to detail + // information about the selected node. + IBOutlet NSView* cookieInfo_; + IBOutlet NSView* localStorageInfo_; + Profile* profile_; // weak BrowsingDataLocalStorageHelper* storageHelper_; // weak } @@ -130,5 +135,7 @@ class CookiesTreeModelObserverBridge : public TreeModelObserver { - (void)clearBrowsingDataNotification:(NSNotification*)notif; - (CookiesTreeModelObserverBridge*)modelObserver; - (NSArray*)icons; +- (NSView*)cookieInfoView; +- (NSView*)localStorageInfoView; - (void)loadTreeModelFromProfile; @end diff --git a/chrome/browser/cocoa/cookies_window_controller.mm b/chrome/browser/cocoa/cookies_window_controller.mm index 4266577..b760c41 100644 --- a/chrome/browser/cocoa/cookies_window_controller.mm +++ b/chrome/browser/cocoa/cookies_window_controller.mm @@ -320,7 +320,8 @@ bool CookiesTreeModelObserverBridge::HasCocoaModel() { - (void)outlineViewSelectionDidChange:(NSNotification*)notif { // Multi-selection should be disabled in the UI, but for sanity, double-check // that they can't do it here. - NSUInteger count = [[treeController_ selectedObjects] count]; + NSArray* selectedObjects = [treeController_ selectedObjects]; + NSUInteger count = [selectedObjects count]; if (count != 1U) { DCHECK_LT(count, 1U) << "User was able to select more than 1 cookie node!"; [self setRemoveButtonEnabled:NO]; @@ -342,6 +343,14 @@ bool CookiesTreeModelObserverBridge::HasCocoaModel() { } [self setRemoveButtonEnabled:YES]; + CocoaCookieTreeNodeType nodeType = [[selectedObjects lastObject] nodeType]; + if (nodeType == kCocoaCookieTreeNodeTypeLocalStorage) { + [cookieInfo_ setHidden:YES]; + [localStorageInfo_ setHidden:NO]; + } else { + [cookieInfo_ setHidden:NO]; + [localStorageInfo_ setHidden:YES]; + } } #pragma mark Unit Testing @@ -354,6 +363,14 @@ bool CookiesTreeModelObserverBridge::HasCocoaModel() { return icons_.get(); } +- (NSView*)cookieInfoView { + return cookieInfo_; +} + +- (NSView*)localStorageInfoView { + return localStorageInfo_; +} + // Re-initializes the |treeModel_|, creates a new observer for it, and re- // builds the |cocoaTreeModel_|. We use this to initialize the controller and // to rebuild after the user clears browsing data. Because the models get diff --git a/chrome/browser/cocoa/cookies_window_controller_unittest.mm b/chrome/browser/cocoa/cookies_window_controller_unittest.mm index 3adf73d..3ea8819 100644 --- a/chrome/browser/cocoa/cookies_window_controller_unittest.mm +++ b/chrome/browser/cocoa/cookies_window_controller_unittest.mm @@ -1,4 +1,4 @@ -// Copyright (c) 2009-2010 The Chromium Authors. All rights reserved. +// 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. @@ -73,7 +73,7 @@ class CookiesWindowControllerTest : public CocoaTest { protected: BrowserTestHelper browser_helper_; scoped_nsobject<CookiesWindowController> controller_; - BrowsingDataLocalStorageHelper* local_storage_helper_; + MockBrowsingDataLocalStorageHelper* local_storage_helper_; }; TEST_F(CookiesWindowControllerTest, Construction) { @@ -437,9 +437,12 @@ TEST_F(CookiesWindowControllerTest, RemoveButtonEnabled) { // This will clean itself up when we call |-closeSheet:|. If we reset the // scoper, we'd get a double-free. + local_storage_helper_ = new MockBrowsingDataLocalStorageHelper(profile); + local_storage_helper_->AddLocalStorageSamples(); CookiesWindowController* controller = [[CookiesWindowController alloc] initWithProfile:profile storageHelper:local_storage_helper_]; + local_storage_helper_->Notify(); [controller attachSheetTo:test_window()]; // Nothing should be selected right now. @@ -452,6 +455,8 @@ TEST_F(CookiesWindowControllerTest, RemoveButtonEnabled) { [[controller treeController] setSelectionIndexPath:indexPath]; [controller outlineViewSelectionDidChange:nil]; EXPECT_TRUE([controller removeButtonEnabled]); + EXPECT_FALSE([[controller cookieInfoView] isHidden]); + EXPECT_TRUE([[controller localStorageInfoView] isHidden]); } { @@ -461,6 +466,19 @@ TEST_F(CookiesWindowControllerTest, RemoveButtonEnabled) { [[controller treeController] setSelectionIndexPath:indexPath]; [controller outlineViewSelectionDidChange:nil]; EXPECT_TRUE([controller removeButtonEnabled]); + EXPECT_FALSE([[controller cookieInfoView] isHidden]); + EXPECT_TRUE([[controller localStorageInfoView] isHidden]); + } + + { + // Select a local storage node. + NSUInteger path[3] = {2, 0, 0}; + NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:path length:3]; + [[controller treeController] setSelectionIndexPath:indexPath]; + [controller outlineViewSelectionDidChange:nil]; + EXPECT_TRUE([controller removeButtonEnabled]); + EXPECT_TRUE([[controller cookieInfoView] isHidden]); + EXPECT_FALSE([[controller localStorageInfoView] isHidden]); } { @@ -474,7 +492,7 @@ TEST_F(CookiesWindowControllerTest, RemoveButtonEnabled) { { // Try selecting something that doesn't exist again. - NSUInteger path[3] = {3, 1, 4}; + NSUInteger path[3] = {7, 1, 4}; NSIndexPath* indexPath = [NSIndexPath indexPathWithIndexes:path length:3]; [[controller treeController] setSelectionIndexPath:indexPath]; [controller outlineViewSelectionDidChange:nil]; @@ -536,4 +554,61 @@ TEST_F(CookiesWindowControllerTest, UpdateFilter) EXPECT_EQ(1U, [[[controller_ cocoaTreeModel] children] count]); } +TEST_F(CookiesWindowControllerTest, CreateLocalStorageNodes) { + TestingProfile* profile = browser_helper_.profile(); + net::CookieMonster* cm = profile->GetCookieMonster(); + cm->SetCookie(GURL("http://google.com"), "A=B"); + cm->SetCookie(GURL("http://dev.chromium.org"), "C=D"); + local_storage_helper_ = new MockBrowsingDataLocalStorageHelper(profile); + local_storage_helper_->AddLocalStorageSamples(); + controller_.reset( + [[CookiesWindowController alloc] initWithProfile:profile + storageHelper:local_storage_helper_]); + local_storage_helper_->Notify(); + + ASSERT_EQ(4U, [[[controller_ cocoaTreeModel] children] count]); + + // Root --> host1. + CocoaCookieTreeNode* node = + [[[controller_ cocoaTreeModel] children] objectAtIndex:2]; + EXPECT_TRUE([@"host1" isEqualToString:[node title]]); + EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]); + EXPECT_EQ(1U, [[node children] count]); + + // host1 --> Local Storage. + node = [[node children] lastObject]; + EXPECT_TRUE([@"Local Storage" isEqualToString:[node title]]); + EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]); + EXPECT_EQ(1U, [[node children] count]); + + // Local Storage --> origin1. + node = [[node children] lastObject]; + EXPECT_TRUE([@"origin1" isEqualToString:[node title]]); + EXPECT_EQ(kCocoaCookieTreeNodeTypeLocalStorage, [node nodeType]); + EXPECT_TRUE([@"origin1" isEqualToString:[node domain]]); + EXPECT_TRUE([node lastModified]); + EXPECT_TRUE([node fileSize]); + + // Root --> host2. + node = + [[[controller_ cocoaTreeModel] children] objectAtIndex:3]; + EXPECT_TRUE([@"host2" isEqualToString:[node title]]); + EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]); + EXPECT_EQ(1U, [[node children] count]); + + // host2 --> Local Storage. + node = [[node children] lastObject]; + EXPECT_TRUE([@"Local Storage" isEqualToString:[node title]]); + EXPECT_EQ(kCocoaCookieTreeNodeTypeFolder, [node nodeType]); + EXPECT_EQ(1U, [[node children] count]); + + // Local Storage --> origin2. + node = [[node children] lastObject]; + EXPECT_TRUE([@"origin2" isEqualToString:[node title]]); + EXPECT_EQ(kCocoaCookieTreeNodeTypeLocalStorage, [node nodeType]); + EXPECT_TRUE([@"origin2" isEqualToString:[node domain]]); + EXPECT_TRUE([node lastModified]); + EXPECT_TRUE([node fileSize]); +} + } // namespace |