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