summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r--chrome/browser/cocoa/cookie_tree_node.h47
-rw-r--r--chrome/browser/cocoa/cookie_tree_node.mm58
-rw-r--r--chrome/browser/cocoa/cookies_window_controller.h7
-rw-r--r--chrome/browser/cocoa/cookies_window_controller.mm19
-rw-r--r--chrome/browser/cocoa/cookies_window_controller_unittest.mm81
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