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