• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_BROWSING_DATA_COOKIES_TREE_MODEL_H_
6 #define CHROME_BROWSER_BROWSING_DATA_COOKIES_TREE_MODEL_H_
7 
8 // TODO(viettrungluu): This header file #includes far too much and has too much
9 // inline code (which shouldn't be inline).
10 
11 #include <list>
12 #include <string>
13 #include <vector>
14 
15 #include "base/memory/ref_counted.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/observer_list.h"
18 #include "base/strings/string16.h"
19 #include "base/strings/utf_string_conversions.h"
20 #include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
21 #include "chrome/browser/browsing_data/browsing_data_database_helper.h"
22 #include "chrome/browser/browsing_data/browsing_data_file_system_helper.h"
23 #include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h"
24 #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h"
25 #include "chrome/browser/browsing_data/browsing_data_quota_helper.h"
26 #include "chrome/browser/browsing_data/local_data_container.h"
27 #include "chrome/common/content_settings.h"
28 #include "chrome/common/extensions/extension_set.h"
29 #include "net/ssl/server_bound_cert_store.h"
30 #include "ui/base/models/tree_node_model.h"
31 
32 class BrowsingDataCookieHelper;
33 class BrowsingDataServerBoundCertHelper;
34 class CookieSettings;
35 class CookiesTreeModel;
36 class CookieTreeAppCacheNode;
37 class CookieTreeAppCachesNode;
38 class CookieTreeCookieNode;
39 class CookieTreeCookiesNode;
40 class CookieTreeDatabaseNode;
41 class CookieTreeDatabasesNode;
42 class CookieTreeFileSystemNode;
43 class CookieTreeFileSystemsNode;
44 class CookieTreeFlashLSONode;
45 class CookieTreeHostNode;
46 class CookieTreeIndexedDBNode;
47 class CookieTreeIndexedDBsNode;
48 class CookieTreeLocalStorageNode;
49 class CookieTreeLocalStoragesNode;
50 class CookieTreeQuotaNode;
51 class CookieTreeServerBoundCertNode;
52 class CookieTreeServerBoundCertsNode;
53 class CookieTreeSessionStorageNode;
54 class CookieTreeSessionStoragesNode;
55 class ExtensionSpecialStoragePolicy;
56 
57 namespace net {
58 class CanonicalCookie;
59 }
60 
61 // CookieTreeNode -------------------------------------------------------------
62 // The base node type in the Cookies, Databases, and Local Storage options
63 // view, from which all other types are derived. Specialized from TreeNode in
64 // that it has a notion of deleting objects stored in the profile, and being
65 // able to have its children do the same.
66 class CookieTreeNode : public ui::TreeNode<CookieTreeNode> {
67  public:
68   // Used to pull out information for the InfoView (the details display below
69   // the tree control.)
70   struct DetailedInfo {
71     // NodeType corresponds to the various CookieTreeNode types.
72     enum NodeType {
73       TYPE_NONE,
74       TYPE_ROOT,  // This is used for CookieTreeRootNode nodes.
75       TYPE_HOST,  // This is used for CookieTreeHostNode nodes.
76       TYPE_COOKIES,  // This is used for CookieTreeCookiesNode nodes.
77       TYPE_COOKIE,  // This is used for CookieTreeCookieNode nodes.
78       TYPE_DATABASES,  // This is used for CookieTreeDatabasesNode.
79       TYPE_DATABASE,  // This is used for CookieTreeDatabaseNode.
80       TYPE_LOCAL_STORAGES,  // This is used for CookieTreeLocalStoragesNode.
81       TYPE_LOCAL_STORAGE,  // This is used for CookieTreeLocalStorageNode.
82       TYPE_SESSION_STORAGES,  // This is used for CookieTreeSessionStoragesNode.
83       TYPE_SESSION_STORAGE,  // This is used for CookieTreeSessionStorageNode.
84       TYPE_APPCACHES,  // This is used for CookieTreeAppCachesNode.
85       TYPE_APPCACHE,  // This is used for CookieTreeAppCacheNode.
86       TYPE_INDEXED_DBS,  // This is used for CookieTreeIndexedDBsNode.
87       TYPE_INDEXED_DB,  // This is used for CookieTreeIndexedDBNode.
88       TYPE_FILE_SYSTEMS,  // This is used for CookieTreeFileSystemsNode.
89       TYPE_FILE_SYSTEM,  // This is used for CookieTreeFileSystemNode.
90       TYPE_QUOTA,  // This is used for CookieTreeQuotaNode.
91       TYPE_SERVER_BOUND_CERTS, // Used for CookieTreeServerBoundCertsNode.
92       TYPE_SERVER_BOUND_CERT, // Used for CookieTreeServerBoundCertNode.
93       TYPE_FLASH_LSO,  // This is used for CookieTreeFlashLSONode.
94     };
95 
96     DetailedInfo();
97     ~DetailedInfo();
98 
99     DetailedInfo& Init(NodeType type);
100     DetailedInfo& InitHost();
101     DetailedInfo& InitCookie(const net::CanonicalCookie* cookie);
102     DetailedInfo& InitDatabase(
103         const BrowsingDataDatabaseHelper::DatabaseInfo* database_info);
104     DetailedInfo& InitLocalStorage(
105         const BrowsingDataLocalStorageHelper::LocalStorageInfo*
106         local_storage_info);
107     DetailedInfo& InitSessionStorage(
108         const BrowsingDataLocalStorageHelper::LocalStorageInfo*
109         session_storage_info);
110     DetailedInfo& InitAppCache(const GURL& origin,
111                                const appcache::AppCacheInfo* appcache_info);
112     DetailedInfo& InitIndexedDB(
113         const content::IndexedDBInfo* indexed_db_info);
114     DetailedInfo& InitFileSystem(
115         const BrowsingDataFileSystemHelper::FileSystemInfo* file_system_info);
116     DetailedInfo& InitQuota(
117         const BrowsingDataQuotaHelper::QuotaInfo* quota_info);
118     DetailedInfo& InitServerBoundCert(
119         const net::ServerBoundCertStore::ServerBoundCert* server_bound_cert);
120     DetailedInfo& InitFlashLSO(const std::string& flash_lso_domain);
121 
122     NodeType node_type;
123     GURL origin;
124     const net::CanonicalCookie* cookie;
125     const BrowsingDataDatabaseHelper::DatabaseInfo* database_info;
126     const BrowsingDataLocalStorageHelper::LocalStorageInfo* local_storage_info;
127     const BrowsingDataLocalStorageHelper::LocalStorageInfo*
128         session_storage_info;
129     const appcache::AppCacheInfo* appcache_info;
130     const content::IndexedDBInfo* indexed_db_info;
131     const BrowsingDataFileSystemHelper::FileSystemInfo* file_system_info;
132     const BrowsingDataQuotaHelper::QuotaInfo* quota_info;
133     const net::ServerBoundCertStore::ServerBoundCert* server_bound_cert;
134     std::string flash_lso_domain;
135   };
136 
CookieTreeNode()137   CookieTreeNode() {}
CookieTreeNode(const base::string16 & title)138   explicit CookieTreeNode(const base::string16& title)
139       : ui::TreeNode<CookieTreeNode>(title) {}
~CookieTreeNode()140   virtual ~CookieTreeNode() {}
141 
142   // Delete backend storage for this node, and any children nodes. (E.g. delete
143   // the cookie from CookieMonster, clear the database, and so forth.)
144   virtual void DeleteStoredObjects();
145 
146   // Gets a pointer back to the associated model for the tree we are in.
147   virtual CookiesTreeModel* GetModel() const;
148 
149   // Returns a struct with detailed information used to populate the details
150   // part of the view.
151   virtual DetailedInfo GetDetailedInfo() const = 0;
152 
153  protected:
154   void AddChildSortedByTitle(CookieTreeNode* new_child);
155 
156  private:
157   DISALLOW_COPY_AND_ASSIGN(CookieTreeNode);
158 };
159 
160 // CookieTreeRootNode ---------------------------------------------------------
161 // The node at the root of the CookieTree that gets inserted into the view.
162 class CookieTreeRootNode : public CookieTreeNode {
163  public:
164   explicit CookieTreeRootNode(CookiesTreeModel* model);
165   virtual ~CookieTreeRootNode();
166 
167   CookieTreeHostNode* GetOrCreateHostNode(const GURL& url);
168 
169   // CookieTreeNode methods:
170   virtual CookiesTreeModel* GetModel() const OVERRIDE;
171   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
172 
173  private:
174   CookiesTreeModel* model_;
175 
176   DISALLOW_COPY_AND_ASSIGN(CookieTreeRootNode);
177 };
178 
179 // CookieTreeHostNode -------------------------------------------------------
180 class CookieTreeHostNode : public CookieTreeNode {
181  public:
182   // Returns the host node's title to use for a given URL.
183   static base::string16 TitleForUrl(const GURL& url);
184 
185   explicit CookieTreeHostNode(const GURL& url);
186   virtual ~CookieTreeHostNode();
187 
188   // CookieTreeNode methods:
189   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
190 
191   // CookieTreeHostNode methods:
192   CookieTreeCookiesNode* GetOrCreateCookiesNode();
193   CookieTreeDatabasesNode* GetOrCreateDatabasesNode();
194   CookieTreeLocalStoragesNode* GetOrCreateLocalStoragesNode();
195   CookieTreeSessionStoragesNode* GetOrCreateSessionStoragesNode();
196   CookieTreeAppCachesNode* GetOrCreateAppCachesNode();
197   CookieTreeIndexedDBsNode* GetOrCreateIndexedDBsNode();
198   CookieTreeFileSystemsNode* GetOrCreateFileSystemsNode();
199   CookieTreeServerBoundCertsNode* GetOrCreateServerBoundCertsNode();
200   CookieTreeQuotaNode* UpdateOrCreateQuotaNode(
201       std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info);
202   CookieTreeFlashLSONode* GetOrCreateFlashLSONode(const std::string& domain);
203 
canonicalized_host()204   std::string canonicalized_host() const { return canonicalized_host_; }
205 
206   // Creates an content exception for this origin of type
207   // CONTENT_SETTINGS_TYPE_COOKIES.
208   void CreateContentException(CookieSettings* cookie_settings,
209                               ContentSetting setting) const;
210 
211   // True if a content exception can be created for this origin.
212   bool CanCreateContentException() const;
213 
214   const std::string GetHost() const;
215 
216  private:
217   // Pointers to the cookies, databases, local and session storage and appcache
218   // nodes.  When we build up the tree we need to quickly get a reference to
219   // the COOKIES node to add children. Checking each child and interrogating
220   // them to see if they are a COOKIES, APPCACHES, DATABASES etc node seems
221   // less preferable than storing an extra pointer per origin.
222   CookieTreeCookiesNode* cookies_child_;
223   CookieTreeDatabasesNode* databases_child_;
224   CookieTreeLocalStoragesNode* local_storages_child_;
225   CookieTreeSessionStoragesNode* session_storages_child_;
226   CookieTreeAppCachesNode* appcaches_child_;
227   CookieTreeIndexedDBsNode* indexed_dbs_child_;
228   CookieTreeFileSystemsNode* file_systems_child_;
229   CookieTreeQuotaNode* quota_child_;
230   CookieTreeServerBoundCertsNode* server_bound_certs_child_;
231   CookieTreeFlashLSONode* flash_lso_child_;
232 
233   // The URL for which this node was initially created.
234   GURL url_;
235 
236   std::string canonicalized_host_;
237 
238   DISALLOW_COPY_AND_ASSIGN(CookieTreeHostNode);
239 };
240 
241 // CookieTreeCookieNode ------------------------------------------------------
242 class CookieTreeCookieNode : public CookieTreeNode {
243  public:
244   friend class CookieTreeCookiesNode;
245 
246   // The cookie should remain valid at least as long as the
247   // CookieTreeCookieNode is valid.
248   explicit CookieTreeCookieNode(
249       std::list<net::CanonicalCookie>::iterator cookie);
250   virtual ~CookieTreeCookieNode();
251 
252   // CookieTreeNode methods:
253   virtual void DeleteStoredObjects() OVERRIDE;
254   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
255 
256  private:
257   // cookie_ is expected to remain valid as long as the CookieTreeCookieNode is
258   // valid.
259   std::list<net::CanonicalCookie>::iterator cookie_;
260 
261   DISALLOW_COPY_AND_ASSIGN(CookieTreeCookieNode);
262 };
263 
264 class CookieTreeCookiesNode : public CookieTreeNode {
265  public:
266   CookieTreeCookiesNode();
267   virtual ~CookieTreeCookiesNode();
268 
269   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
270 
AddCookieNode(CookieTreeCookieNode * child)271   void AddCookieNode(CookieTreeCookieNode* child) {
272     AddChildSortedByTitle(child);
273   }
274 
275  private:
276   DISALLOW_COPY_AND_ASSIGN(CookieTreeCookiesNode);
277 };
278 
279 // CookieTreeAppCacheNode -----------------------------------------------------
280 class CookieTreeAppCacheNode : public CookieTreeNode {
281  public:
282   friend class CookieTreeAppCachesNode;
283 
284   // appcache_info should remain valid at least as long as the
285   // CookieTreeAppCacheNode is valid.
286   explicit CookieTreeAppCacheNode(
287       const GURL& origin_url,
288       std::list<appcache::AppCacheInfo>::iterator appcache_info);
289   virtual ~CookieTreeAppCacheNode();
290 
291   virtual void DeleteStoredObjects() OVERRIDE;
292   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
293 
294  private:
295   GURL origin_url_;
296   std::list<appcache::AppCacheInfo>::iterator appcache_info_;
297   DISALLOW_COPY_AND_ASSIGN(CookieTreeAppCacheNode);
298 };
299 
300 class CookieTreeAppCachesNode : public CookieTreeNode {
301  public:
302   CookieTreeAppCachesNode();
303   virtual ~CookieTreeAppCachesNode();
304 
305   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
306 
AddAppCacheNode(CookieTreeAppCacheNode * child)307   void AddAppCacheNode(CookieTreeAppCacheNode* child) {
308     AddChildSortedByTitle(child);
309   }
310 
311  private:
312   DISALLOW_COPY_AND_ASSIGN(CookieTreeAppCachesNode);
313 };
314 
315 // CookieTreeDatabaseNode -----------------------------------------------------
316 class CookieTreeDatabaseNode : public CookieTreeNode {
317  public:
318   friend class CookieTreeDatabasesNode;
319 
320   // database_info should remain valid at least as long as the
321   // CookieTreeDatabaseNode is valid.
322   explicit CookieTreeDatabaseNode(
323       std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator
324           database_info);
325   virtual ~CookieTreeDatabaseNode();
326 
327   virtual void DeleteStoredObjects() OVERRIDE;
328   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
329 
330  private:
331   // database_info_ is expected to remain valid as long as the
332   // CookieTreeDatabaseNode is valid.
333   std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator
334       database_info_;
335 
336   DISALLOW_COPY_AND_ASSIGN(CookieTreeDatabaseNode);
337 };
338 
339 class CookieTreeDatabasesNode : public CookieTreeNode {
340  public:
341   CookieTreeDatabasesNode();
342   virtual ~CookieTreeDatabasesNode();
343 
344   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
345 
AddDatabaseNode(CookieTreeDatabaseNode * child)346   void AddDatabaseNode(CookieTreeDatabaseNode* child) {
347     AddChildSortedByTitle(child);
348   }
349 
350  private:
351   DISALLOW_COPY_AND_ASSIGN(CookieTreeDatabasesNode);
352 };
353 
354 // CookieTreeFileSystemNode --------------------------------------------------
355 class CookieTreeFileSystemNode : public CookieTreeNode {
356  public:
357   friend class CookieTreeFileSystemsNode;
358 
359   // file_system_info should remain valid at least as long as the
360   // CookieTreeFileSystemNode is valid.
361   explicit CookieTreeFileSystemNode(
362       std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
363           file_system_info);
364   virtual ~CookieTreeFileSystemNode();
365 
366   virtual void DeleteStoredObjects() OVERRIDE;
367   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
368 
369  private:
370   // file_system_info_ expected to remain valid as long as the
371   // CookieTreeFileSystemNode is valid.
372   std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
373       file_system_info_;
374 
375   DISALLOW_COPY_AND_ASSIGN(CookieTreeFileSystemNode);
376 };
377 
378 class CookieTreeFileSystemsNode : public CookieTreeNode {
379  public:
380   CookieTreeFileSystemsNode();
381   virtual ~CookieTreeFileSystemsNode();
382 
383   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
384 
AddFileSystemNode(CookieTreeFileSystemNode * child)385   void AddFileSystemNode(CookieTreeFileSystemNode* child) {
386     AddChildSortedByTitle(child);
387   }
388 
389  private:
390   DISALLOW_COPY_AND_ASSIGN(CookieTreeFileSystemsNode);
391 };
392 
393 // CookieTreeLocalStorageNode -------------------------------------------------
394 class CookieTreeLocalStorageNode : public CookieTreeNode {
395  public:
396   // local_storage_info should remain valid at least as long as the
397   // CookieTreeLocalStorageNode is valid.
398   explicit CookieTreeLocalStorageNode(
399       std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
400           local_storage_info);
401   virtual ~CookieTreeLocalStorageNode();
402 
403   // CookieTreeNode methods:
404   virtual void DeleteStoredObjects() OVERRIDE;
405   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
406 
407  private:
408   // local_storage_info_ is expected to remain valid as long as the
409   // CookieTreeLocalStorageNode is valid.
410   std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
411       local_storage_info_;
412 
413   DISALLOW_COPY_AND_ASSIGN(CookieTreeLocalStorageNode);
414 };
415 
416 class CookieTreeLocalStoragesNode : public CookieTreeNode {
417  public:
418   CookieTreeLocalStoragesNode();
419   virtual ~CookieTreeLocalStoragesNode();
420 
421   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
422 
AddLocalStorageNode(CookieTreeLocalStorageNode * child)423   void AddLocalStorageNode(CookieTreeLocalStorageNode* child) {
424     AddChildSortedByTitle(child);
425   }
426 
427  private:
428 
429   DISALLOW_COPY_AND_ASSIGN(CookieTreeLocalStoragesNode);
430 };
431 
432 
433 // CookieTreeSessionStorageNode -----------------------------------------------
434 class CookieTreeSessionStorageNode : public CookieTreeNode {
435  public:
436   // session_storage_info should remain valid at least as long as the
437   // CookieTreeSessionStorageNode is valid.
438   explicit CookieTreeSessionStorageNode(
439       std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
440           session_storage_info);
441   virtual ~CookieTreeSessionStorageNode();
442 
443   // CookieTreeNode methods:
444   virtual void DeleteStoredObjects() OVERRIDE;
445   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
446 
447  private:
448   // session_storage_info_ is expected to remain valid as long as the
449   // CookieTreeSessionStorageNode is valid.
450   std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
451       session_storage_info_;
452 
453   DISALLOW_COPY_AND_ASSIGN(CookieTreeSessionStorageNode);
454 };
455 
456 class CookieTreeSessionStoragesNode : public CookieTreeNode {
457  public:
458   CookieTreeSessionStoragesNode();
459   virtual ~CookieTreeSessionStoragesNode();
460 
461   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
462 
AddSessionStorageNode(CookieTreeSessionStorageNode * child)463   void AddSessionStorageNode(CookieTreeSessionStorageNode* child) {
464     AddChildSortedByTitle(child);
465   }
466 
467  private:
468 
469   DISALLOW_COPY_AND_ASSIGN(CookieTreeSessionStoragesNode);
470 };
471 
472 // CookieTreeIndexedDBNode -----------------------------------------------
473 class CookieTreeIndexedDBNode : public CookieTreeNode {
474  public:
475   // indexed_db_info should remain valid at least as long as the
476   // CookieTreeIndexedDBNode is valid.
477   explicit CookieTreeIndexedDBNode(
478       std::list<content::IndexedDBInfo>::iterator
479           indexed_db_info);
480   virtual ~CookieTreeIndexedDBNode();
481 
482   // CookieTreeNode methods:
483   virtual void DeleteStoredObjects() OVERRIDE;
484   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
485 
486  private:
487   // indexed_db_info_ is expected to remain valid as long as the
488   // CookieTreeIndexedDBNode is valid.
489   std::list<content::IndexedDBInfo>::iterator
490       indexed_db_info_;
491 
492   DISALLOW_COPY_AND_ASSIGN(CookieTreeIndexedDBNode);
493 };
494 
495 class CookieTreeIndexedDBsNode : public CookieTreeNode {
496  public:
497   CookieTreeIndexedDBsNode();
498   virtual ~CookieTreeIndexedDBsNode();
499 
500   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
501 
AddIndexedDBNode(CookieTreeIndexedDBNode * child)502   void AddIndexedDBNode(CookieTreeIndexedDBNode* child) {
503     AddChildSortedByTitle(child);
504   }
505 
506  private:
507   DISALLOW_COPY_AND_ASSIGN(CookieTreeIndexedDBsNode);
508 };
509 
510 // CookieTreeQuotaNode --------------------------------------------------
511 class CookieTreeQuotaNode : public CookieTreeNode {
512  public:
513   // quota_info should remain valid at least as long as the CookieTreeQuotaNode
514   // is valid.
515   explicit CookieTreeQuotaNode(
516       std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info);
517   virtual ~CookieTreeQuotaNode();
518 
519   virtual void DeleteStoredObjects() OVERRIDE;
520   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
521 
522  private:
523   // quota_info_ is expected to remain valid as long as the CookieTreeQuotaNode
524   // is valid.
525   std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info_;
526 
527   DISALLOW_COPY_AND_ASSIGN(CookieTreeQuotaNode);
528 };
529 
530 // CookieTreeServerBoundCertNode ---------------------------------------------
531 class CookieTreeServerBoundCertNode : public CookieTreeNode {
532  public:
533   friend class CookieTreeServerBoundCertsNode;
534 
535   // The iterator should remain valid at least as long as the
536   // CookieTreeServerBoundCertNode is valid.
537   explicit CookieTreeServerBoundCertNode(
538       net::ServerBoundCertStore::ServerBoundCertList::iterator cert);
539   virtual ~CookieTreeServerBoundCertNode();
540 
541   // CookieTreeNode methods:
542   virtual void DeleteStoredObjects() OVERRIDE;
543   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
544 
545  private:
546   // server_bound_cert_ is expected to remain valid as long as the
547   // CookieTreeServerBoundCertNode is valid.
548   net::ServerBoundCertStore::ServerBoundCertList::iterator server_bound_cert_;
549 
550   DISALLOW_COPY_AND_ASSIGN(CookieTreeServerBoundCertNode);
551 };
552 
553 class CookieTreeServerBoundCertsNode : public CookieTreeNode {
554  public:
555   CookieTreeServerBoundCertsNode();
556   virtual ~CookieTreeServerBoundCertsNode();
557 
558   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
559 
AddServerBoundCertNode(CookieTreeServerBoundCertNode * child)560   void AddServerBoundCertNode(CookieTreeServerBoundCertNode* child) {
561     AddChildSortedByTitle(child);
562   }
563 
564  private:
565   DISALLOW_COPY_AND_ASSIGN(CookieTreeServerBoundCertsNode);
566 };
567 
568 // CookieTreeFlashLSONode ----------------------------------------------------
569 class CookieTreeFlashLSONode : public CookieTreeNode {
570  public:
571   explicit CookieTreeFlashLSONode(const std::string& domain);
572   virtual ~CookieTreeFlashLSONode();
573 
574   // CookieTreeNode methods:
575   virtual void DeleteStoredObjects() OVERRIDE;
576   virtual DetailedInfo GetDetailedInfo() const OVERRIDE;
577 
578  private:
579   std::string domain_;
580 
581   DISALLOW_COPY_AND_ASSIGN(CookieTreeFlashLSONode);
582 };
583 
584 // CookiesTreeModel -----------------------------------------------------------
585 class CookiesTreeModel : public ui::TreeNodeModel<CookieTreeNode> {
586  public:
587   CookiesTreeModel(LocalDataContainer* data_container,
588                    ExtensionSpecialStoragePolicy* special_storage_policy,
589                    bool group_by_cookie_source);
590   virtual ~CookiesTreeModel();
591 
592   // Because non-cookie nodes are fetched in a background thread, they are not
593   // present at the time the Model is created. The Model then notifies its
594   // observers for every item added from databases, local storage, and
595   // appcache. We extend the Observer interface to add notifications before and
596   // after these batch inserts.
597   class Observer : public ui::TreeModelObserver {
598    public:
TreeModelBeginBatch(CookiesTreeModel * model)599     virtual void TreeModelBeginBatch(CookiesTreeModel* model) {}
TreeModelEndBatch(CookiesTreeModel * model)600     virtual void TreeModelEndBatch(CookiesTreeModel* model) {}
601   };
602 
603   // This class defines the scope for batch updates. It can be created as a
604   // local variable and the destructor will terminate the batch update, if one
605   // has been started.
606   class ScopedBatchUpdateNotifier {
607    public:
608     ScopedBatchUpdateNotifier(CookiesTreeModel* model,
609                               CookieTreeNode* node);
610     ~ScopedBatchUpdateNotifier();
611 
612     void StartBatchUpdate();
613 
614    private:
615     CookiesTreeModel* model_;
616     CookieTreeNode* node_;
617     bool batch_in_progress_;
618   };
619 
620   // ui::TreeModel methods:
621   // Returns the set of icons for the nodes in the tree. You only need override
622   // this if you don't want to use the default folder icons.
623   virtual void GetIcons(std::vector<gfx::ImageSkia>* icons) OVERRIDE;
624 
625   // Returns the index of the icon to use for |node|. Return -1 to use the
626   // default icon. The index is relative to the list of icons returned from
627   // GetIcons.
628   virtual int GetIconIndex(ui::TreeModelNode* node) OVERRIDE;
629 
630   // CookiesTreeModel methods:
631   void DeleteAllStoredObjects();
632 
633   // Deletes a specific node in the tree, identified by |cookie_node|, and its
634   // subtree.
635   void DeleteCookieNode(CookieTreeNode* cookie_node);
636 
637   // Filter the origins to only display matched results.
638   void UpdateSearchResults(const base::string16& filter);
639 
640   // Returns the set of extensions which protect the data item represented by
641   // this node from deletion.
642   // Returns NULL if the node doesn't represent a protected data item or the
643   // special storage policy is NULL.
644   const ExtensionSet* ExtensionsProtectingNode(
645       const CookieTreeNode& cookie_node);
646 
647   // Manages CookiesTreeModel::Observers. This will also call
648   // TreeNodeModel::AddObserver so that it gets all the proper notifications.
649   // Note that the converse is not true: simply adding a TreeModelObserver will
650   // not get CookiesTreeModel::Observer notifications.
651   virtual void AddCookiesTreeObserver(Observer* observer);
652   virtual void RemoveCookiesTreeObserver(Observer* observer);
653 
654   // Methods that update the model based on the data retrieved by the browsing
655   // data helpers.
656   void PopulateAppCacheInfo(LocalDataContainer* container);
657   void PopulateCookieInfo(LocalDataContainer* container);
658   void PopulateDatabaseInfo(LocalDataContainer* container);
659   void PopulateLocalStorageInfo(LocalDataContainer* container);
660   void PopulateSessionStorageInfo(LocalDataContainer* container);
661   void PopulateIndexedDBInfo(LocalDataContainer* container);
662   void PopulateFileSystemInfo(LocalDataContainer* container);
663   void PopulateQuotaInfo(LocalDataContainer* container);
664   void PopulateServerBoundCertInfo(LocalDataContainer* container);
665   void PopulateFlashLSOInfo(LocalDataContainer* container);
666 
667   BrowsingDataCookieHelper* GetCookieHelper(const std::string& app_id);
data_container()668   LocalDataContainer* data_container() {
669     return data_container_.get();
670   }
671 
672  private:
673   enum CookieIconIndex {
674     ORIGIN = 0,
675     COOKIE = 1,
676     DATABASE = 2
677   };
678 
679   void NotifyObserverBeginBatch();
680   void NotifyObserverEndBatch();
681 
682   void PopulateAppCacheInfoWithFilter(LocalDataContainer* container,
683                                       ScopedBatchUpdateNotifier* notifier,
684                                       const base::string16& filter);
685   void PopulateCookieInfoWithFilter(LocalDataContainer* container,
686                                     ScopedBatchUpdateNotifier* notifier,
687                                     const base::string16& filter);
688   void PopulateDatabaseInfoWithFilter(LocalDataContainer* container,
689                                       ScopedBatchUpdateNotifier* notifier,
690                                       const base::string16& filter);
691   void PopulateLocalStorageInfoWithFilter(LocalDataContainer* container,
692                                           ScopedBatchUpdateNotifier* notifier,
693                                           const base::string16& filter);
694   void PopulateSessionStorageInfoWithFilter(LocalDataContainer* container,
695                                             ScopedBatchUpdateNotifier* notifier,
696                                             const base::string16& filter);
697   void PopulateIndexedDBInfoWithFilter(LocalDataContainer* container,
698                                        ScopedBatchUpdateNotifier* notifier,
699                                        const base::string16& filter);
700   void PopulateFileSystemInfoWithFilter(LocalDataContainer* container,
701                                         ScopedBatchUpdateNotifier* notifier,
702                                         const base::string16& filter);
703   void PopulateQuotaInfoWithFilter(LocalDataContainer* container,
704                                    ScopedBatchUpdateNotifier* notifier,
705                                    const base::string16& filter);
706   void PopulateServerBoundCertInfoWithFilter(
707       LocalDataContainer* container,
708       ScopedBatchUpdateNotifier* notifier,
709       const base::string16& filter);
710   void PopulateFlashLSOInfoWithFilter(LocalDataContainer* container,
711                                       ScopedBatchUpdateNotifier* notifier,
712                                       const base::string16& filter);
713 
714   // Map of app ids to LocalDataContainer objects to use when retrieving
715   // locally stored data.
716   scoped_ptr<LocalDataContainer> data_container_;
717 
718   // The extension special storage policy; see ExtensionsProtectingNode() above.
719   scoped_refptr<ExtensionSpecialStoragePolicy> special_storage_policy_;
720 
721   // The CookiesTreeModel maintains a separate list of observers that are
722   // specifically of the type CookiesTreeModel::Observer.
723   ObserverList<Observer> cookies_observer_list_;
724 
725   // If true, use the CanonicalCookie::Source attribute to group cookies.
726   // Otherwise, use the CanonicalCookie::Domain attribute.
727   bool group_by_cookie_source_;
728 
729   // If this is non-zero, then this model is batching updates (there's a lot of
730   // notifications coming down the pipe). This is an integer is used to balance
731   // calls to Begin/EndBatch() if they're called in a nested manner.
732   int batch_update_;
733 };
734 
735 #endif  // CHROME_BROWSER_BROWSING_DATA_COOKIES_TREE_MODEL_H_
736