1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import <Cocoa/Cocoa.h>
6
7#include "base/memory/scoped_nsobject.h"
8#include "chrome/browser/browsing_data_database_helper.h"
9#include "chrome/browser/browsing_data_indexed_db_helper.h"
10#include "chrome/browser/browsing_data_local_storage_helper.h"
11#include "net/base/cookie_monster.h"
12#include "webkit/appcache/appcache_service.h"
13
14class CookieTreeNode;
15class CookiePromptModalDialog;
16
17// This enum specifies the type of information contained in the
18// cookie details.
19enum CocoaCookieDetailsType {
20  // Represents grouping of cookie data, used in the cookie tree.
21  kCocoaCookieDetailsTypeFolder = 0,
22
23  // Detailed information about a cookie, used both in the cookie
24  // tree and the cookie prompt.
25  kCocoaCookieDetailsTypeCookie,
26
27  // Detailed information about a web database used for
28  // display in the cookie tree.
29  kCocoaCookieDetailsTypeTreeDatabase,
30
31  // Detailed information about local storage used for
32  // display in the cookie tree.
33  kCocoaCookieDetailsTypeTreeLocalStorage,
34
35  // Detailed information about an appcache used for display in the
36  // cookie tree.
37  kCocoaCookieDetailsTypeTreeAppCache,
38
39  // Detailed information about an IndexedDB used for display in the
40  // cookie tree.
41  kCocoaCookieDetailsTypeTreeIndexedDB,
42
43  // Detailed information about a web database used for display
44  // in the cookie prompt dialog.
45  kCocoaCookieDetailsTypePromptDatabase,
46
47  // Detailed information about local storage used for display
48  // in the cookie prompt dialog.
49  kCocoaCookieDetailsTypePromptLocalStorage,
50
51  // Detailed information about app caches used for display
52  // in the cookie prompt dialog.
53  kCocoaCookieDetailsTypePromptAppCache
54};
55
56// This class contains all of the information that can be displayed in
57// a cookie details view. Because the view uses bindings to display
58// the cookie information, the methods that provide that information
59// for display must be implemented directly on this class and not on any
60// of its subclasses.
61// If this system is rewritten to not use bindings, this class should be
62// subclassed and specialized, rather than using an enum to determine type.
63@interface CocoaCookieDetails : NSObject {
64 @private
65  CocoaCookieDetailsType type_;
66
67  // Used for type kCocoaCookieDetailsTypeCookie to indicate whether
68  // it should be possible to edit the expiration.
69  BOOL canEditExpiration_;
70
71  // Indicates whether a cookie has an explcit expiration. If not
72  // it will expire with the session.
73  BOOL hasExpiration_;
74
75  // Only set for type kCocoaCookieDetailsTypeCookie.
76  scoped_nsobject<NSString> content_;
77  scoped_nsobject<NSString> path_;
78  scoped_nsobject<NSString> sendFor_;
79  // Stringifed dates.
80  scoped_nsobject<NSString> expires_;
81
82  // Only set for type kCocoaCookieDetailsTypeCookie and
83  // kCocoaCookieDetailsTypeTreeAppCache nodes.
84  scoped_nsobject<NSString> created_;
85
86  // Only set for types kCocoaCookieDetailsTypeCookie, and
87  // kCocoaCookieDetailsTypePromptDatabase nodes.
88  scoped_nsobject<NSString> name_;
89
90  // Only set for type kCocoaCookieDetailsTypeTreeLocalStorage,
91  // kCocoaCookieDetailsTypeTreeDatabase,
92  // kCocoaCookieDetailsTypePromptDatabase,
93  // kCocoaCookieDetailsTypeTreeIndexedDB, and
94  // kCocoaCookieDetailsTypeTreeAppCache nodes.
95  scoped_nsobject<NSString> fileSize_;
96
97  // Only set for types kCocoaCookieDetailsTypeTreeLocalStorage,
98  // kCocoaCookieDetailsTypeTreeDatabase, and
99  // kCocoaCookieDetailsTypeTreeIndexedDB nodes.
100  scoped_nsobject<NSString> lastModified_;
101
102  // Only set for type kCocoaCookieDetailsTypeTreeAppCache nodes.
103  scoped_nsobject<NSString> lastAccessed_;
104
105  // Only set for type kCocoaCookieDetailsTypeCookie,
106  // kCocoaCookieDetailsTypePromptDatabase,
107  // kCocoaCookieDetailsTypePromptLocalStorage, and
108  // kCocoaCookieDetailsTypeTreeIndexedDB nodes.
109  scoped_nsobject<NSString> domain_;
110
111  // Only set for type kCocoaCookieTreeNodeTypeDatabaseStorage and
112  // kCocoaCookieDetailsTypePromptDatabase nodes.
113  scoped_nsobject<NSString> databaseDescription_;
114
115  // Only set for type kCocoaCookieDetailsTypePromptLocalStorage.
116  scoped_nsobject<NSString> localStorageKey_;
117  scoped_nsobject<NSString> localStorageValue_;
118
119  // Only set for type kCocoaCookieDetailsTypeTreeAppCache and
120  // kCocoaCookieDetailsTypePromptAppCache.
121  scoped_nsobject<NSString> manifestURL_;
122}
123
124@property(nonatomic, readonly) BOOL canEditExpiration;
125@property(nonatomic) BOOL hasExpiration;
126@property(nonatomic, readonly) CocoaCookieDetailsType type;
127
128// The following methods are used in the bindings of subviews inside
129// the cookie detail view. Note that the method that tests the
130// visibility of the subview for cookie-specific information has a different
131// polarity than the other visibility testing methods. This ensures that
132// this subview is shown when there is no selection in the cookie tree,
133// because a hidden value of |false| is generated when the key value binding
134// is evaluated through a nil object. The other methods are bound using a
135// |NSNegateBoolean| transformer, so that when there is a empty selection the
136// hidden value is |true|.
137- (BOOL)shouldHideCookieDetailsView;
138- (BOOL)shouldShowLocalStorageTreeDetailsView;
139- (BOOL)shouldShowLocalStoragePromptDetailsView;
140- (BOOL)shouldShowDatabaseTreeDetailsView;
141- (BOOL)shouldShowDatabasePromptDetailsView;
142- (BOOL)shouldShowAppCachePromptDetailsView;
143- (BOOL)shouldShowAppCacheTreeDetailsView;
144- (BOOL)shouldShowIndexedDBTreeDetailsView;
145
146- (NSString*)name;
147- (NSString*)content;
148- (NSString*)domain;
149- (NSString*)path;
150- (NSString*)sendFor;
151- (NSString*)created;
152- (NSString*)expires;
153- (NSString*)fileSize;
154- (NSString*)lastModified;
155- (NSString*)lastAccessed;
156- (NSString*)databaseDescription;
157- (NSString*)localStorageKey;
158- (NSString*)localStorageValue;
159- (NSString*)manifestURL;
160
161// Used for folders in the cookie tree.
162- (id)initAsFolder;
163
164// Used for cookie details in both the cookie tree and the cookie prompt dialog.
165- (id)initWithCookie:(const net::CookieMonster::CanonicalCookie*)treeNode
166              origin:(NSString*)origin
167   canEditExpiration:(BOOL)canEditExpiration;
168
169// Used for database details in the cookie tree.
170- (id)initWithDatabase:
171    (const BrowsingDataDatabaseHelper::DatabaseInfo*)databaseInfo;
172
173// Used for local storage details in the cookie tree.
174- (id)initWithLocalStorage:
175    (const BrowsingDataLocalStorageHelper::LocalStorageInfo*)localStorageInfo;
176
177// Used for database details in the cookie prompt dialog.
178- (id)initWithDatabase:(const std::string&)domain
179          databaseName:(const string16&)databaseName
180   databaseDescription:(const string16&)databaseDescription
181              fileSize:(unsigned long)fileSize;
182
183// -initWithAppCacheInfo: creates a cookie details with the manifest URL plus
184// all of this additional information that is available after an appcache is
185// actually created, including it's creation date, size and last accessed time.
186- (id)initWithAppCacheInfo:(const appcache::AppCacheInfo*)appcacheInfo;
187
188// Used for local storage details in the cookie prompt dialog.
189- (id)initWithLocalStorage:(const std::string&)domain
190                       key:(const string16&)key
191                     value:(const string16&)value;
192
193// -initWithAppCacheManifestURL: is called when the cookie prompt is displayed
194// for an appcache, at that time only the manifest URL of the appcache is known.
195- (id)initWithAppCacheManifestURL:(const std::string&)manifestURL;
196
197// Used for IndexedDB details in the cookie tree.
198- (id)initWithIndexedDBInfo:
199    (const BrowsingDataIndexedDBHelper::IndexedDBInfo*)indexedDB;
200
201// A factory method to create a configured instance given a node from
202// the cookie tree in |treeNode|.
203+ (CocoaCookieDetails*)createFromCookieTreeNode:(CookieTreeNode*)treeNode;
204
205@end
206
207// The subpanes of the cookie details view expect to be able to bind to methods
208// through a key path in the form |content.details.xxxx|. This class serves as
209// an adapter that simply wraps a |CocoaCookieDetails| object. An instance of
210// this class is set as the content object for cookie details view's object
211// controller so that key paths are properly resolved through to the
212// |CocoaCookieDetails| object for the cookie prompt.
213@interface CookiePromptContentDetailsAdapter : NSObject {
214 @private
215  scoped_nsobject<CocoaCookieDetails> details_;
216}
217
218- (CocoaCookieDetails*)details;
219
220// The adapter assumes ownership of the details object
221// in its initializer.
222- (id)initWithDetails:(CocoaCookieDetails*)details;
223@end
224
225