Cookies Tree: Reduce header size, merge declarations/definitions

* Move definitions of various internal CookieTreeXXXNode types
   from .h into .cc
* IWYU fixes
* Remove redundant StorageUsageInfo members in DetailedInfo
* Make a dummy callback a OnceClosure to satisfy presubmit

No functional changes.

Change-Id: I6d338e7baa5cc4b9571765b88480208a1b301743
Reviewed-on: https://chromium-review.googlesource.com/c/1416112
Commit-Queue: Joshua Bell <jsbell@chromium.org>
Reviewed-by: Steven Bennetts <stevenjb@chromium.org>
Reviewed-by: Christian Dullweber <dullweber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#623762}
diff --git a/chrome/browser/browsing_data/cookies_tree_model.cc b/chrome/browser/browsing_data/cookies_tree_model.cc
index 799f13e..e365b84d 100644
--- a/chrome/browser/browsing_data/cookies_tree_model.cc
+++ b/chrome/browser/browsing_data/cookies_tree_model.cc
@@ -17,8 +17,17 @@
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_cache_storage_helper.h"
 #include "chrome/browser/browsing_data/browsing_data_cookie_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_database_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_file_system_helper.h"
 #include "chrome/browser/browsing_data/browsing_data_flash_lso_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_quota_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_service_worker_helper.h"
+#include "chrome/browser/browsing_data/browsing_data_shared_worker_helper.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/grit/generated_resources.h"
@@ -31,7 +40,6 @@
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "net/cookies/canonical_cookie.h"
 #include "net/url_request/url_request_context.h"
-#include "third_party/blink/public/mojom/appcache/appcache_info.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/color_palette.h"
@@ -227,10 +235,10 @@
 }
 
 CookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitIndexedDB(
-    const content::StorageUsageInfo* indexed_db_info) {
+    const content::StorageUsageInfo* usage_info) {
   Init(TYPE_INDEXED_DB);
-  this->indexed_db_info = indexed_db_info;
-  this->origin = indexed_db_info->origin;
+  this->usage_info = usage_info;
+  this->origin = usage_info->origin;
   return *this;
 }
 
@@ -250,10 +258,10 @@
 }
 
 CookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitServiceWorker(
-    const content::StorageUsageInfo* service_worker_info) {
+    const content::StorageUsageInfo* usage_info) {
   Init(TYPE_SERVICE_WORKER);
-  this->service_worker_info = service_worker_info;
-  this->origin = service_worker_info->origin;
+  this->usage_info = usage_info;
+  this->origin = usage_info->origin;
   return *this;
 }
 
@@ -267,10 +275,10 @@
 }
 
 CookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitCacheStorage(
-    const content::StorageUsageInfo* cache_storage_info) {
+    const content::StorageUsageInfo* usage_info) {
   Init(TYPE_CACHE_STORAGE);
-  this->cache_storage_info = cache_storage_info;
-  this->origin = cache_storage_info->origin;
+  this->usage_info = usage_info;
+  this->origin = usage_info->origin;
   return *this;
 }
 
@@ -306,371 +314,515 @@
 
 void CookieTreeNode::RetrieveSize(const SizeRetrievalCallback& callback) {}
 
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeCookieNode, public:
-
-CookieTreeCookieNode::CookieTreeCookieNode(
-    std::list<net::CanonicalCookie>::iterator cookie)
-    : CookieTreeNode(base::UTF8ToUTF16(cookie->Name())),
-      cookie_(cookie) {
-}
-
-CookieTreeCookieNode::~CookieTreeCookieNode() {}
-
-void CookieTreeCookieNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
-  container->cookie_helper_->DeleteCookie(*cookie_);
-  container->cookie_list_.erase(cookie_);
-}
-
-CookieTreeNode::DetailedInfo CookieTreeCookieNode::GetDetailedInfo() const {
-  return DetailedInfo().InitCookie(&*cookie_);
+void CookieTreeNode::AddChildSortedByTitle(
+    std::unique_ptr<CookieTreeNode> new_child) {
+  DCHECK(new_child);
+  auto iter = std::lower_bound(children().begin(), children().end(), new_child,
+                               NodeTitleComparator());
+  GetModel()->Add(this, std::move(new_child), iter - children().begin());
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeAppCacheNode, public:
+// CookieTreeCookieNode
 
-CookieTreeAppCacheNode::CookieTreeAppCacheNode(
-    const url::Origin& origin,
-    std::list<blink::mojom::AppCacheInfo>::iterator appcache_info)
-    : CookieTreeNode(base::UTF8ToUTF16(appcache_info->manifest_url.spec())),
-      origin_(origin),
-      appcache_info_(appcache_info) {}
+class CookieTreeCookieNode : public CookieTreeNode {
+ public:
+  friend class CookieTreeCookiesNode;
 
-CookieTreeAppCacheNode::~CookieTreeAppCacheNode() {
-}
+  // The cookie should remain valid at least as long as the
+  // CookieTreeCookieNode is valid.
+  explicit CookieTreeCookieNode(
+      std::list<net::CanonicalCookie>::iterator cookie)
+      : CookieTreeNode(base::UTF8ToUTF16(cookie->Name())), cookie_(cookie) {}
 
-void CookieTreeAppCacheNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  ~CookieTreeCookieNode() override {}
 
-  if (container) {
-    DCHECK(container->appcache_helper_.get());
-    container->appcache_helper_
-        ->DeleteAppCacheGroup(appcache_info_->manifest_url);
-    container->appcache_info_[origin_].erase(appcache_info_);
+  // CookieTreeNode methods:
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
+    container->cookie_helper_->DeleteCookie(*cookie_);
+    container->cookie_list_.erase(cookie_);
   }
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitCookie(&*cookie_);
+  }
 
-CookieTreeNode::DetailedInfo CookieTreeAppCacheNode::GetDetailedInfo() const {
-  return DetailedInfo().InitAppCache(origin_.GetURL(), &*appcache_info_);
-}
+ private:
+  // |cookie_| is expected to remain valid as long as the CookieTreeCookieNode
+  // is valid.
+  std::list<net::CanonicalCookie>::iterator cookie_;
 
-void CookieTreeAppCacheNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  callback.Run(this->GetDetailedInfo().origin,
-               this->GetDetailedInfo().appcache_info->size);
-}
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeCookieNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeDatabaseNode, public:
+// CookieTreeAppCacheNode
 
-CookieTreeDatabaseNode::CookieTreeDatabaseNode(
-    std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator database_info)
-    : CookieTreeNode(database_info->database_name.empty() ?
-          l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASE_UNNAMED_NAME) :
-          base::UTF8ToUTF16(database_info->database_name)),
-      database_info_(database_info) {
-}
+class CookieTreeAppCacheNode : public CookieTreeNode {
+ public:
+  friend class CookieTreeAppCachesNode;
 
-CookieTreeDatabaseNode::~CookieTreeDatabaseNode() {}
+  // |appcache_info| should remain valid at least as long as the
+  // CookieTreeAppCacheNode is valid.
+  explicit CookieTreeAppCacheNode(
+      const url::Origin& origin,
+      std::list<blink::mojom::AppCacheInfo>::iterator appcache_info)
+      : CookieTreeNode(base::UTF8ToUTF16(appcache_info->manifest_url.spec())),
+        origin_(origin),
+        appcache_info_(appcache_info) {}
+  ~CookieTreeAppCacheNode() override {}
 
-void CookieTreeDatabaseNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
 
-  if (container) {
-    container->database_helper_->DeleteDatabase(
-        database_info_->identifier.ToString(), database_info_->database_name);
-    container->database_info_list_.erase(database_info_);
+    if (container) {
+      DCHECK(container->appcache_helper_.get());
+      container->appcache_helper_->DeleteAppCacheGroup(
+          appcache_info_->manifest_url);
+      container->appcache_info_[origin_].erase(appcache_info_);
+    }
   }
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitAppCache(origin_.GetURL(), &*appcache_info_);
+  }
 
-CookieTreeNode::DetailedInfo CookieTreeDatabaseNode::GetDetailedInfo() const {
-  return DetailedInfo().InitDatabase(&*database_info_);
-}
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    callback.Run(this->GetDetailedInfo().origin,
+                 this->GetDetailedInfo().appcache_info->size);
+  }
 
-void CookieTreeDatabaseNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  callback.Run(this->GetDetailedInfo().origin,
-               this->GetDetailedInfo().database_info->size);
-}
+ private:
+  url::Origin origin_;
+  std::list<blink::mojom::AppCacheInfo>::iterator appcache_info_;
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeAppCacheNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeLocalStorageNode, public:
+// CookieTreeDatabaseNode
 
-CookieTreeLocalStorageNode::CookieTreeLocalStorageNode(
-    std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
-        local_storage_info)
-    : CookieTreeNode(base::UTF8ToUTF16(local_storage_info->origin_url.spec())),
-      local_storage_info_(local_storage_info) {
-}
+class CookieTreeDatabaseNode : public CookieTreeNode {
+ public:
+  friend class CookieTreeDatabasesNode;
 
-CookieTreeLocalStorageNode::~CookieTreeLocalStorageNode() {}
+  // |database_info| should remain valid at least as long as the
+  // CookieTreeDatabaseNode is valid.
+  explicit CookieTreeDatabaseNode(
+      std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator
+          database_info)
+      : CookieTreeNode(database_info->database_name.empty()
+                           ? l10n_util::GetStringUTF16(
+                                 IDS_COOKIES_WEB_DATABASE_UNNAMED_NAME)
+                           : base::UTF8ToUTF16(database_info->database_name)),
+        database_info_(database_info) {}
 
-void CookieTreeLocalStorageNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  ~CookieTreeDatabaseNode() override {}
 
-  if (container) {
-    container->local_storage_helper_->DeleteOrigin(
-        local_storage_info_->origin_url, base::DoNothing());
-    container->local_storage_info_list_.erase(local_storage_info_);
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
+
+    if (container) {
+      container->database_helper_->DeleteDatabase(
+          database_info_->identifier.ToString(), database_info_->database_name);
+      container->database_info_list_.erase(database_info_);
+    }
   }
-}
 
-CookieTreeNode::DetailedInfo
-CookieTreeLocalStorageNode::GetDetailedInfo() const {
-  return DetailedInfo().InitLocalStorage(
-      &*local_storage_info_);
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitDatabase(&*database_info_);
+  }
 
-void CookieTreeLocalStorageNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  callback.Run(this->GetDetailedInfo().origin,
-               this->GetDetailedInfo().local_storage_info->size);
-}
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    callback.Run(this->GetDetailedInfo().origin,
+                 this->GetDetailedInfo().database_info->size);
+  }
+
+ private:
+  // |database_info_| is expected to remain valid as long as the
+  // CookieTreeDatabaseNode is valid.
+  std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator database_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeDatabaseNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeSessionStorageNode, public:
+// CookieTreeLocalStorageNode
 
-CookieTreeSessionStorageNode::CookieTreeSessionStorageNode(
-    std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
-        session_storage_info)
-    : CookieTreeNode(
-          base::UTF8ToUTF16(session_storage_info->origin_url.spec())),
-      session_storage_info_(session_storage_info) {
-}
+class CookieTreeLocalStorageNode : public CookieTreeNode {
+ public:
+  // |local_storage_info| should remain valid at least as long as the
+  // CookieTreeLocalStorageNode is valid.
+  explicit CookieTreeLocalStorageNode(
+      std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
+          local_storage_info)
+      : CookieTreeNode(
+            base::UTF8ToUTF16(local_storage_info->origin_url.spec())),
+        local_storage_info_(local_storage_info) {}
 
-CookieTreeSessionStorageNode::~CookieTreeSessionStorageNode() {}
+  ~CookieTreeLocalStorageNode() override {}
 
-void CookieTreeSessionStorageNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  // CookieTreeNode methods:
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
 
-  if (container) {
-    // TODO(rsesek): There's no easy way to get the namespace_id for a session
-    // storage, nor is there an easy way to clear session storage just by
-    // origin. This is probably okay since session storage is not persistent.
-    // http://crbug.com/168996
-    container->session_storage_info_list_.erase(session_storage_info_);
+    if (container) {
+      container->local_storage_helper_->DeleteOrigin(
+          local_storage_info_->origin_url, base::DoNothing());
+      container->local_storage_info_list_.erase(local_storage_info_);
+    }
   }
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitLocalStorage(&*local_storage_info_);
+  }
 
-CookieTreeNode::DetailedInfo
-CookieTreeSessionStorageNode::GetDetailedInfo() const {
-  return DetailedInfo().InitSessionStorage(&*session_storage_info_);
-}
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    callback.Run(this->GetDetailedInfo().origin,
+                 this->GetDetailedInfo().local_storage_info->size);
+  }
+
+ private:
+  // |local_storage_info_| is expected to remain valid as long as the
+  // CookieTreeLocalStorageNode is valid.
+  std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
+      local_storage_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeLocalStorageNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeIndexedDBNode, public:
+// CookieTreeSessionStorageNode
 
-CookieTreeIndexedDBNode::CookieTreeIndexedDBNode(
-    std::list<content::StorageUsageInfo>::iterator indexed_db_info)
-    : CookieTreeNode(base::UTF8ToUTF16(indexed_db_info->origin.Serialize())),
-      indexed_db_info_(indexed_db_info) {}
+class CookieTreeSessionStorageNode : public CookieTreeNode {
+ public:
+  // |session_storage_info| should remain valid at least as long as the
+  // CookieTreeSessionStorageNode is valid.
+  explicit CookieTreeSessionStorageNode(
+      std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
+          session_storage_info)
+      : CookieTreeNode(
+            base::UTF8ToUTF16(session_storage_info->origin_url.spec())),
+        session_storage_info_(session_storage_info) {}
 
-CookieTreeIndexedDBNode::~CookieTreeIndexedDBNode() {}
+  ~CookieTreeSessionStorageNode() override {}
 
-void CookieTreeIndexedDBNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  // CookieTreeNode methods:
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
 
-  if (container) {
-    container->indexed_db_helper_->DeleteIndexedDB(
-        indexed_db_info_->origin.GetURL());
-    container->indexed_db_info_list_.erase(indexed_db_info_);
+    if (container) {
+      // TODO(rsesek): There's no easy way to get the namespace_id for a session
+      // storage, nor is there an easy way to clear session storage just by
+      // origin. This is probably okay since session storage is not persistent.
+      // http://crbug.com/168996
+      container->session_storage_info_list_.erase(session_storage_info_);
+    }
   }
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitSessionStorage(&*session_storage_info_);
+  }
 
-CookieTreeNode::DetailedInfo CookieTreeIndexedDBNode::GetDetailedInfo() const {
-  return DetailedInfo().InitIndexedDB(&*indexed_db_info_);
-}
+ private:
+  // |session_storage_info_| is expected to remain valid as long as the
+  // CookieTreeSessionStorageNode is valid.
+  std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
+      session_storage_info_;
 
-void CookieTreeIndexedDBNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  callback.Run(this->GetDetailedInfo().origin,
-               this->GetDetailedInfo().indexed_db_info->total_size_bytes);
-}
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeSessionStorageNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeFileSystemNode, public:
+// CookieTreeIndexedDBNode
 
-CookieTreeFileSystemNode::CookieTreeFileSystemNode(
-    std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
-        file_system_info)
-    : CookieTreeNode(base::UTF8ToUTF16(file_system_info->origin.Serialize())),
-      file_system_info_(file_system_info) {}
+class CookieTreeIndexedDBNode : public CookieTreeNode {
+ public:
+  // |usage_info| should remain valid at least as long as the
+  // CookieTreeIndexedDBNode is valid.
+  explicit CookieTreeIndexedDBNode(
+      std::list<content::StorageUsageInfo>::iterator usage_info)
+      : CookieTreeNode(base::UTF8ToUTF16(usage_info->origin.Serialize())),
+        usage_info_(usage_info) {}
 
-CookieTreeFileSystemNode::~CookieTreeFileSystemNode() {}
+  ~CookieTreeIndexedDBNode() override {}
 
-void CookieTreeFileSystemNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  // CookieTreeNode methods:
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
 
-  if (container) {
-    container->file_system_helper_->DeleteFileSystemOrigin(
-        file_system_info_->origin);
-    container->file_system_info_list_.erase(file_system_info_);
+    if (container) {
+      container->indexed_db_helper_->DeleteIndexedDB(
+          usage_info_->origin.GetURL());
+      container->indexed_db_info_list_.erase(usage_info_);
+    }
   }
-}
 
-CookieTreeNode::DetailedInfo CookieTreeFileSystemNode::GetDetailedInfo() const {
-  return DetailedInfo().InitFileSystem(&*file_system_info_);
-}
-
-void CookieTreeFileSystemNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  int64_t size = 0;
-  for (auto const& usage :
-       this->GetDetailedInfo().file_system_info->usage_map) {
-    size += usage.second;
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitIndexedDB(&*usage_info_);
   }
-  callback.Run(this->GetDetailedInfo().origin, size);
-}
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    callback.Run(this->GetDetailedInfo().origin,
+                 this->GetDetailedInfo().usage_info->total_size_bytes);
+  }
+
+ private:
+  // |usage_info_| is expected to remain valid as long as the
+  // CookieTreeIndexedDBNode is valid.
+  std::list<content::StorageUsageInfo>::iterator usage_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeIndexedDBNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeQuotaNode, public:
+// CookieTreeFileSystemNode
 
-CookieTreeQuotaNode::CookieTreeQuotaNode(
-    std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info)
-    : CookieTreeNode(base::UTF8ToUTF16(quota_info->host)),
-      quota_info_(quota_info) {
-}
+class CookieTreeFileSystemNode : public CookieTreeNode {
+ public:
+  friend class CookieTreeFileSystemsNode;
 
-CookieTreeQuotaNode::~CookieTreeQuotaNode() {}
+  // |file_system_info| should remain valid at least as long as the
+  // CookieTreeFileSystemNode is valid.
+  explicit CookieTreeFileSystemNode(
+      std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
+          file_system_info)
+      : CookieTreeNode(base::UTF8ToUTF16(file_system_info->origin.Serialize())),
+        file_system_info_(file_system_info) {}
+  ~CookieTreeFileSystemNode() override {}
 
-void CookieTreeQuotaNode::DeleteStoredObjects() {
-  // Calling this function may cause unexpected over-quota state of origin.
-  // However, it'll caused no problem, just prevent usage growth of the origin.
-  LocalDataContainer* container = GetModel()->data_container();
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
 
-  if (container) {
-    container->quota_helper_->RevokeHostQuota(quota_info_->host);
-    container->quota_info_list_.erase(quota_info_);
+    if (container) {
+      container->file_system_helper_->DeleteFileSystemOrigin(
+          file_system_info_->origin);
+      container->file_system_info_list_.erase(file_system_info_);
+    }
   }
-}
 
-CookieTreeNode::DetailedInfo CookieTreeQuotaNode::GetDetailedInfo() const {
-  return DetailedInfo().InitQuota(&*quota_info_);
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitFileSystem(&*file_system_info_);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    int64_t size = 0;
+    for (auto const& usage :
+         this->GetDetailedInfo().file_system_info->usage_map) {
+      size += usage.second;
+    }
+    callback.Run(this->GetDetailedInfo().origin, size);
+  }
+
+ private:
+  // file_system_info_ expected to remain valid as long as the
+  // CookieTreeFileSystemNode is valid.
+  std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
+      file_system_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeFileSystemNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeServiceWorkerNode, public:
+// CookieTreeQuotaNode
 
-CookieTreeServiceWorkerNode::CookieTreeServiceWorkerNode(
-    std::list<content::StorageUsageInfo>::iterator service_worker_info)
-    : CookieTreeNode(
-          base::UTF8ToUTF16(service_worker_info->origin.Serialize())),
-      service_worker_info_(service_worker_info) {}
+class CookieTreeQuotaNode : public CookieTreeNode {
+ public:
+  // |quota_info| should remain valid at least as long as the
+  // CookieTreeQuotaNode is valid.
+  explicit CookieTreeQuotaNode(
+      std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info)
+      : CookieTreeNode(base::UTF8ToUTF16(quota_info->host)),
+        quota_info_(quota_info) {}
 
-CookieTreeServiceWorkerNode::~CookieTreeServiceWorkerNode() {
-}
+  ~CookieTreeQuotaNode() override {}
 
-void CookieTreeServiceWorkerNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  void DeleteStoredObjects() override {
+    // Calling this function may cause unexpected over-quota state of origin.
+    // However, it'll caused no problem, just prevent usage growth of the
+    // origin.
+    LocalDataContainer* container = GetModel()->data_container();
 
-  if (container) {
-    container->service_worker_helper_->DeleteServiceWorkers(
-        service_worker_info_->origin.GetURL());
-    container->service_worker_info_list_.erase(service_worker_info_);
+    if (container) {
+      container->quota_helper_->RevokeHostQuota(quota_info_->host);
+      container->quota_info_list_.erase(quota_info_);
+    }
   }
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitQuota(&*quota_info_);
+  }
 
-CookieTreeNode::DetailedInfo CookieTreeServiceWorkerNode::GetDetailedInfo()
-    const {
-  return DetailedInfo().InitServiceWorker(&*service_worker_info_);
-}
+ private:
+  // |quota_info_| is expected to remain valid as long as the
+  // CookieTreeQuotaNode is valid.
+  std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info_;
 
-void CookieTreeServiceWorkerNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  callback.Run(this->GetDetailedInfo().origin,
-               this->GetDetailedInfo().service_worker_info->total_size_bytes);
-}
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeQuotaNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeSharedWorkerNode, public:
+// CookieTreeServiceWorkerNode
 
-CookieTreeSharedWorkerNode::CookieTreeSharedWorkerNode(
-    std::list<BrowsingDataSharedWorkerHelper::SharedWorkerInfo>::iterator
-        shared_worker_info)
-    : CookieTreeNode(base::UTF8ToUTF16(shared_worker_info->worker.spec())),
-      shared_worker_info_(shared_worker_info) {}
+class CookieTreeServiceWorkerNode : public CookieTreeNode {
+ public:
+  // |usage_info| should remain valid at least as long as the
+  // CookieTreeServiceWorkerNode is valid.
+  explicit CookieTreeServiceWorkerNode(
+      std::list<content::StorageUsageInfo>::iterator usage_info)
+      : CookieTreeNode(base::UTF8ToUTF16(usage_info->origin.Serialize())),
+        usage_info_(usage_info) {}
 
-CookieTreeSharedWorkerNode::~CookieTreeSharedWorkerNode() {}
+  ~CookieTreeServiceWorkerNode() override {}
 
-void CookieTreeSharedWorkerNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  // CookieTreeNode methods:
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
 
-  if (container) {
-    container->shared_worker_helper_->DeleteSharedWorker(
-        shared_worker_info_->worker, shared_worker_info_->name,
-        shared_worker_info_->constructor_origin);
-    container->shared_worker_info_list_.erase(shared_worker_info_);
+    if (container) {
+      container->service_worker_helper_->DeleteServiceWorkers(
+          usage_info_->origin.GetURL());
+      container->service_worker_info_list_.erase(usage_info_);
+    }
   }
-}
 
-CookieTreeNode::DetailedInfo CookieTreeSharedWorkerNode::GetDetailedInfo()
-    const {
-  return DetailedInfo().InitSharedWorker(&*shared_worker_info_);
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitServiceWorker(&*usage_info_);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    callback.Run(this->GetDetailedInfo().origin,
+                 this->GetDetailedInfo().usage_info->total_size_bytes);
+  }
+
+ private:
+  // |usage_info_| is expected to remain valid as long as the
+  // CookieTreeServiceWorkerNode is valid.
+  std::list<content::StorageUsageInfo>::iterator usage_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeServiceWorkerNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeCacheStorageNode, public:
+// CookieTreeSharedWorkerNode
 
-CookieTreeCacheStorageNode::CookieTreeCacheStorageNode(
-    std::list<content::StorageUsageInfo>::iterator cache_storage_info)
-    : CookieTreeNode(base::UTF8ToUTF16(cache_storage_info->origin.Serialize())),
-      cache_storage_info_(cache_storage_info) {}
+class CookieTreeSharedWorkerNode : public CookieTreeNode {
+ public:
+  // |shared_worker_info| should remain valid at least as long as the
+  // CookieTreeSharedWorkerNode is valid.
+  explicit CookieTreeSharedWorkerNode(
+      std::list<BrowsingDataSharedWorkerHelper::SharedWorkerInfo>::iterator
+          shared_worker_info)
+      : CookieTreeNode(base::UTF8ToUTF16(shared_worker_info->worker.spec())),
+        shared_worker_info_(shared_worker_info) {}
 
-CookieTreeCacheStorageNode::~CookieTreeCacheStorageNode() {}
+  ~CookieTreeSharedWorkerNode() override {}
 
-void CookieTreeCacheStorageNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  // CookieTreeNode methods:
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
 
-  if (container) {
-    container->cache_storage_helper_->DeleteCacheStorage(
-        cache_storage_info_->origin.GetURL());
-    container->cache_storage_info_list_.erase(cache_storage_info_);
+    if (container) {
+      container->shared_worker_helper_->DeleteSharedWorker(
+          shared_worker_info_->worker, shared_worker_info_->name,
+          shared_worker_info_->constructor_origin);
+      container->shared_worker_info_list_.erase(shared_worker_info_);
+    }
   }
-}
 
-CookieTreeNode::DetailedInfo CookieTreeCacheStorageNode::GetDetailedInfo()
-    const {
-  return DetailedInfo().InitCacheStorage(&*cache_storage_info_);
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitSharedWorker(&*shared_worker_info_);
+  }
 
-void CookieTreeCacheStorageNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  callback.Run(this->GetDetailedInfo().origin,
-               this->GetDetailedInfo().cache_storage_info->total_size_bytes);
-}
+ private:
+  // |shared_worker_info_| is expected to remain valid as long as the
+  // CookieTreeSharedWorkerNode is valid.
+  std::list<BrowsingDataSharedWorkerHelper::SharedWorkerInfo>::iterator
+      shared_worker_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeSharedWorkerNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeMediaLicenseNode, public:
+// CookieTreeCacheStorageNode
 
-CookieTreeMediaLicenseNode::CookieTreeMediaLicenseNode(
-    const std::list<BrowsingDataMediaLicenseHelper::MediaLicenseInfo>::iterator
-        media_license_info)
-    : CookieTreeNode(base::UTF8ToUTF16(media_license_info->origin.spec())),
-      media_license_info_(media_license_info) {}
+class CookieTreeCacheStorageNode : public CookieTreeNode {
+ public:
+  // |usage_info| should remain valid at least as long as the
+  // CookieTreeCacheStorageNode is valid.
+  explicit CookieTreeCacheStorageNode(
+      std::list<content::StorageUsageInfo>::iterator usage_info)
+      : CookieTreeNode(base::UTF8ToUTF16(usage_info->origin.Serialize())),
+        usage_info_(usage_info) {}
 
-CookieTreeMediaLicenseNode::~CookieTreeMediaLicenseNode() {}
+  ~CookieTreeCacheStorageNode() override {}
 
-void CookieTreeMediaLicenseNode::DeleteStoredObjects() {
-  LocalDataContainer* container = GetLocalDataContainerForNode(this);
+  // CookieTreeNode methods:
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
 
-  if (container) {
-    container->media_license_helper_->DeleteMediaLicenseOrigin(
-        media_license_info_->origin);
-    container->media_license_info_list_.erase(media_license_info_);
+    if (container) {
+      container->cache_storage_helper_->DeleteCacheStorage(
+          usage_info_->origin.GetURL());
+      container->cache_storage_info_list_.erase(usage_info_);
+    }
   }
-}
 
-CookieTreeNode::DetailedInfo CookieTreeMediaLicenseNode::GetDetailedInfo()
-    const {
-  return DetailedInfo().InitMediaLicense(&*media_license_info_);
-}
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitCacheStorage(&*usage_info_);
+  }
 
-void CookieTreeMediaLicenseNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  callback.Run(this->GetDetailedInfo().origin,
-               this->GetDetailedInfo().media_license_info->size);
-}
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    callback.Run(this->GetDetailedInfo().origin,
+                 this->GetDetailedInfo().usage_info->total_size_bytes);
+  }
+
+ private:
+  // |usage_info_| is expected to remain valid as long as the
+  // CookieTreeCacheStorageNode is valid.
+  std::list<content::StorageUsageInfo>::iterator usage_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeCacheStorageNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeMediaLicenseNode
+
+class CookieTreeMediaLicenseNode : public CookieTreeNode {
+ public:
+  friend class CookieTreeMediaLicensesNode;
+
+  // |media_license_info| is expected to remain valid as long as the
+  // CookieTreeMediaLicenseNode is valid.
+  explicit CookieTreeMediaLicenseNode(
+      const std::list<BrowsingDataMediaLicenseHelper::MediaLicenseInfo>::
+          iterator media_license_info)
+      : CookieTreeNode(base::UTF8ToUTF16(media_license_info->origin.spec())),
+        media_license_info_(media_license_info) {}
+
+  ~CookieTreeMediaLicenseNode() override {}
+
+  void DeleteStoredObjects() override {
+    LocalDataContainer* container = GetLocalDataContainerForNode(this);
+
+    if (container) {
+      container->media_license_helper_->DeleteMediaLicenseOrigin(
+          media_license_info_->origin);
+      container->media_license_info_list_.erase(media_license_info_);
+    }
+  }
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitMediaLicense(&*media_license_info_);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    callback.Run(this->GetDetailedInfo().origin,
+                 this->GetDetailedInfo().media_license_info->size);
+  }
+
+ private:
+  // |media_license_info_| is expected to remain valid as long as the
+  // CookieTreeMediaLicenseNode is valid.
+  std::list<BrowsingDataMediaLicenseHelper::MediaLicenseInfo>::iterator
+      media_license_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeMediaLicenseNode);
+};
 
 ///////////////////////////////////////////////////////////////////////////////
 // CookieTreeRootNode, public:
@@ -713,6 +865,333 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
+// CookieTreeCookiesNode
+
+class CookieTreeCookiesNode : public CookieTreeNode {
+ public:
+  CookieTreeCookiesNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_COOKIES)) {}
+
+  ~CookieTreeCookiesNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_COOKIES);
+  }
+
+  void AddCookieNode(std::unique_ptr<CookieTreeCookieNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeCookiesNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeAppCachesNode
+
+class CookieTreeAppCachesNode : public CookieTreeNode {
+ public:
+  CookieTreeAppCachesNode()
+      : CookieTreeNode(
+            l10n_util::GetStringUTF16(IDS_COOKIES_APPLICATION_CACHES)) {}
+
+  ~CookieTreeAppCachesNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_APPCACHES);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    for (int i = 0; i < this->child_count(); ++i) {
+      this->GetChild(i)->RetrieveSize(callback);
+    }
+  }
+
+  void AddAppCacheNode(std::unique_ptr<CookieTreeAppCacheNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeAppCachesNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeDatabasesNode
+
+class CookieTreeDatabasesNode : public CookieTreeNode {
+ public:
+  CookieTreeDatabasesNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASES)) {}
+
+  ~CookieTreeDatabasesNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_DATABASES);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    for (int i = 0; i < this->child_count(); ++i) {
+      this->GetChild(i)->RetrieveSize(callback);
+    }
+  }
+
+  void AddDatabaseNode(std::unique_ptr<CookieTreeDatabaseNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeDatabasesNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeLocalStoragesNode
+
+class CookieTreeLocalStoragesNode : public CookieTreeNode {
+ public:
+  CookieTreeLocalStoragesNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_LOCAL_STORAGE)) {}
+
+  ~CookieTreeLocalStoragesNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_LOCAL_STORAGES);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    for (int i = 0; i < this->child_count(); ++i) {
+      this->GetChild(i)->RetrieveSize(callback);
+    }
+  }
+
+  void AddLocalStorageNode(std::unique_ptr<CookieTreeLocalStorageNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeLocalStoragesNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeSessionStoragesNode
+
+class CookieTreeSessionStoragesNode : public CookieTreeNode {
+ public:
+  CookieTreeSessionStoragesNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SESSION_STORAGE)) {
+  }
+
+  ~CookieTreeSessionStoragesNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_SESSION_STORAGES);
+  }
+
+  void AddSessionStorageNode(
+      std::unique_ptr<CookieTreeSessionStorageNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeSessionStoragesNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeIndexedDBsNode
+
+class CookieTreeIndexedDBsNode : public CookieTreeNode {
+ public:
+  CookieTreeIndexedDBsNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_INDEXED_DBS)) {}
+
+  ~CookieTreeIndexedDBsNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_INDEXED_DBS);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    for (int i = 0; i < this->child_count(); ++i) {
+      this->GetChild(i)->RetrieveSize(callback);
+    }
+  }
+
+  void AddIndexedDBNode(std::unique_ptr<CookieTreeIndexedDBNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeIndexedDBsNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeFileSystemsNode
+
+class CookieTreeFileSystemsNode : public CookieTreeNode {
+ public:
+  CookieTreeFileSystemsNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_FILE_SYSTEMS)) {}
+
+  ~CookieTreeFileSystemsNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_FILE_SYSTEMS);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    for (int i = 0; i < this->child_count(); ++i) {
+      this->GetChild(i)->RetrieveSize(callback);
+    }
+  }
+
+  void AddFileSystemNode(std::unique_ptr<CookieTreeFileSystemNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeFileSystemsNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeServiceWorkersNode
+
+class CookieTreeServiceWorkersNode : public CookieTreeNode {
+ public:
+  CookieTreeServiceWorkersNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SERVICE_WORKERS)) {
+  }
+
+  ~CookieTreeServiceWorkersNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_SERVICE_WORKERS);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    for (int i = 0; i < this->child_count(); ++i) {
+      this->GetChild(i)->RetrieveSize(callback);
+    }
+  }
+
+  void AddServiceWorkerNode(
+      std::unique_ptr<CookieTreeServiceWorkerNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeServiceWorkersNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeSharedWorkersNode
+
+class CookieTreeSharedWorkersNode : public CookieTreeNode {
+ public:
+  CookieTreeSharedWorkersNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SHARED_WORKERS)) {}
+
+  ~CookieTreeSharedWorkersNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_SHARED_WORKERS);
+  }
+
+  void AddSharedWorkerNode(std::unique_ptr<CookieTreeSharedWorkerNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeSharedWorkersNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeCacheStoragesNode
+
+class CookieTreeCacheStoragesNode : public CookieTreeNode {
+ public:
+  CookieTreeCacheStoragesNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_CACHE_STORAGE)) {}
+
+  ~CookieTreeCacheStoragesNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_CACHE_STORAGES);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    for (int i = 0; i < this->child_count(); ++i) {
+      this->GetChild(i)->RetrieveSize(callback);
+    }
+  }
+
+  void AddCacheStorageNode(std::unique_ptr<CookieTreeCacheStorageNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeCacheStoragesNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeFlashLSONode
+
+class CookieTreeFlashLSONode : public CookieTreeNode {
+ public:
+  explicit CookieTreeFlashLSONode(const std::string& domain)
+      : domain_(domain) {}
+  ~CookieTreeFlashLSONode() override {}
+
+  // CookieTreeNode methods:
+  void DeleteStoredObjects() override {
+    // We are one level below the host node.
+    CookieTreeHostNode* host = static_cast<CookieTreeHostNode*>(parent());
+    CHECK_EQ(host->GetDetailedInfo().node_type,
+             CookieTreeNode::DetailedInfo::TYPE_HOST);
+    LocalDataContainer* container = GetModel()->data_container();
+    container->flash_lso_helper_->DeleteFlashLSOsForSite(domain_,
+                                                         base::OnceClosure());
+    auto entry = std::find(container->flash_lso_domain_list_.begin(),
+                           container->flash_lso_domain_list_.end(), domain_);
+    container->flash_lso_domain_list_.erase(entry);
+  }
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().InitFlashLSO(domain_);
+  }
+
+ private:
+  std::string domain_;
+
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeFlashLSONode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// CookieTreeMediaLicensesNode
+
+class CookieTreeMediaLicensesNode : public CookieTreeNode {
+ public:
+  CookieTreeMediaLicensesNode()
+      : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_MEDIA_LICENSES)) {}
+
+  ~CookieTreeMediaLicensesNode() override {}
+
+  DetailedInfo GetDetailedInfo() const override {
+    return DetailedInfo().Init(DetailedInfo::TYPE_MEDIA_LICENSES);
+  }
+
+  void RetrieveSize(const SizeRetrievalCallback& callback) override {
+    for (int i = 0; i < this->child_count(); ++i) {
+      this->GetChild(i)->RetrieveSize(callback);
+    }
+  }
+
+  void AddMediaLicenseNode(std::unique_ptr<CookieTreeMediaLicenseNode> child) {
+    AddChildSortedByTitle(std::move(child));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CookieTreeMediaLicensesNode);
+};
+
+///////////////////////////////////////////////////////////////////////////////
 // CookieTreeHostNode, public:
 
 // static
@@ -877,244 +1356,6 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
-// CookieTreeCookiesNode, public:
-
-CookieTreeCookiesNode::CookieTreeCookiesNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_COOKIES)) {
-}
-
-CookieTreeCookiesNode::~CookieTreeCookiesNode() {
-}
-
-CookieTreeNode::DetailedInfo CookieTreeCookiesNode::GetDetailedInfo() const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_COOKIES);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeAppCachesNode, public:
-
-CookieTreeAppCachesNode::CookieTreeAppCachesNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(
-                         IDS_COOKIES_APPLICATION_CACHES)) {
-}
-
-CookieTreeAppCachesNode::~CookieTreeAppCachesNode() {}
-
-CookieTreeNode::DetailedInfo CookieTreeAppCachesNode::GetDetailedInfo() const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_APPCACHES);
-}
-
-void CookieTreeAppCachesNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  for (int i = 0; i < this->child_count(); ++i) {
-    this->GetChild(i)->RetrieveSize(callback);
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeDatabasesNode, public:
-
-CookieTreeDatabasesNode::CookieTreeDatabasesNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASES)) {
-}
-
-CookieTreeDatabasesNode::~CookieTreeDatabasesNode() {}
-
-CookieTreeNode::DetailedInfo CookieTreeDatabasesNode::GetDetailedInfo() const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_DATABASES);
-}
-
-void CookieTreeDatabasesNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  for (int i = 0; i < this->child_count(); ++i) {
-    this->GetChild(i)->RetrieveSize(callback);
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeLocalStoragesNode, public:
-
-CookieTreeLocalStoragesNode::CookieTreeLocalStoragesNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_LOCAL_STORAGE)) {
-}
-
-CookieTreeLocalStoragesNode::~CookieTreeLocalStoragesNode() {}
-
-CookieTreeNode::DetailedInfo
-CookieTreeLocalStoragesNode::GetDetailedInfo() const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_LOCAL_STORAGES);
-}
-
-void CookieTreeLocalStoragesNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  for (int i = 0; i < this->child_count(); ++i) {
-    this->GetChild(i)->RetrieveSize(callback);
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeSessionStoragesNode, public:
-
-CookieTreeSessionStoragesNode::CookieTreeSessionStoragesNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SESSION_STORAGE)) {
-}
-
-CookieTreeSessionStoragesNode::~CookieTreeSessionStoragesNode() {}
-
-CookieTreeNode::DetailedInfo
-CookieTreeSessionStoragesNode::GetDetailedInfo() const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_SESSION_STORAGES);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeIndexedDBsNode, public:
-
-CookieTreeIndexedDBsNode::CookieTreeIndexedDBsNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_INDEXED_DBS)) {
-}
-
-CookieTreeIndexedDBsNode::~CookieTreeIndexedDBsNode() {}
-
-CookieTreeNode::DetailedInfo
-CookieTreeIndexedDBsNode::GetDetailedInfo() const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_INDEXED_DBS);
-}
-
-void CookieTreeIndexedDBsNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  for (int i = 0; i < this->child_count(); ++i) {
-    this->GetChild(i)->RetrieveSize(callback);
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeFileSystemsNode, public:
-
-CookieTreeFileSystemsNode::CookieTreeFileSystemsNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_FILE_SYSTEMS)) {
-}
-
-CookieTreeFileSystemsNode::~CookieTreeFileSystemsNode() {}
-
-CookieTreeNode::DetailedInfo
-CookieTreeFileSystemsNode::GetDetailedInfo() const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_FILE_SYSTEMS);
-}
-
-void CookieTreeFileSystemsNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  for (int i = 0; i < this->child_count(); ++i) {
-    this->GetChild(i)->RetrieveSize(callback);
-  }
-}
-
-void CookieTreeNode::AddChildSortedByTitle(
-    std::unique_ptr<CookieTreeNode> new_child) {
-  DCHECK(new_child);
-  auto iter = std::lower_bound(children().begin(), children().end(), new_child,
-                               NodeTitleComparator());
-  GetModel()->Add(this, std::move(new_child), iter - children().begin());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeServiceWorkersNode, public:
-
-CookieTreeServiceWorkersNode::CookieTreeServiceWorkersNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SERVICE_WORKERS)) {
-}
-
-CookieTreeServiceWorkersNode::~CookieTreeServiceWorkersNode() {
-}
-
-CookieTreeNode::DetailedInfo CookieTreeServiceWorkersNode::GetDetailedInfo()
-    const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_SERVICE_WORKERS);
-}
-
-void CookieTreeServiceWorkersNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  for (int i = 0; i < this->child_count(); ++i) {
-    this->GetChild(i)->RetrieveSize(callback);
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeSharedWorkersNode, public:
-
-CookieTreeSharedWorkersNode::CookieTreeSharedWorkersNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SHARED_WORKERS)) {}
-
-CookieTreeSharedWorkersNode::~CookieTreeSharedWorkersNode() {}
-
-CookieTreeNode::DetailedInfo CookieTreeSharedWorkersNode::GetDetailedInfo()
-    const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_SHARED_WORKERS);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeCacheStoragesNode, public:
-
-CookieTreeCacheStoragesNode::CookieTreeCacheStoragesNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_CACHE_STORAGE)) {}
-
-CookieTreeCacheStoragesNode::~CookieTreeCacheStoragesNode() {}
-
-CookieTreeNode::DetailedInfo CookieTreeCacheStoragesNode::GetDetailedInfo()
-    const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_CACHE_STORAGES);
-}
-
-void CookieTreeCacheStoragesNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  for (int i = 0; i < this->child_count(); ++i) {
-    this->GetChild(i)->RetrieveSize(callback);
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeFlashLSONode
-CookieTreeFlashLSONode::CookieTreeFlashLSONode(
-    const std::string& domain)
-    : domain_(domain) {}
-CookieTreeFlashLSONode::~CookieTreeFlashLSONode() {}
-
-void CookieTreeFlashLSONode::DeleteStoredObjects() {
-  // We are one level below the host node.
-  CookieTreeHostNode* host = static_cast<CookieTreeHostNode*>(parent());
-  CHECK_EQ(host->GetDetailedInfo().node_type,
-           CookieTreeNode::DetailedInfo::TYPE_HOST);
-  LocalDataContainer* container = GetModel()->data_container();
-  container->flash_lso_helper_->DeleteFlashLSOsForSite(
-      domain_, base::Closure());
-  auto entry = std::find(container->flash_lso_domain_list_.begin(),
-                         container->flash_lso_domain_list_.end(), domain_);
-  container->flash_lso_domain_list_.erase(entry);
-}
-
-CookieTreeNode::DetailedInfo CookieTreeFlashLSONode::GetDetailedInfo() const {
-  return DetailedInfo().InitFlashLSO(domain_);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CookieTreeMediaLicensesNode
-CookieTreeMediaLicensesNode::CookieTreeMediaLicensesNode()
-    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_MEDIA_LICENSES)) {}
-
-CookieTreeMediaLicensesNode::~CookieTreeMediaLicensesNode() {}
-
-CookieTreeNode::DetailedInfo CookieTreeMediaLicensesNode::GetDetailedInfo()
-    const {
-  return DetailedInfo().Init(DetailedInfo::TYPE_MEDIA_LICENSES);
-}
-
-void CookieTreeMediaLicensesNode::RetrieveSize(
-    const SizeRetrievalCallback& callback) {
-  for (int i = 0; i < this->child_count(); ++i) {
-    this->GetChild(i)->RetrieveSize(callback);
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
 // ScopedBatchUpdateNotifier
 CookiesTreeModel::ScopedBatchUpdateNotifier::ScopedBatchUpdateNotifier(
     CookiesTreeModel* model,
@@ -1734,29 +1975,25 @@
 // static
 std::unique_ptr<CookiesTreeModel> CookiesTreeModel::CreateForProfile(
     Profile* profile) {
-  content::StoragePartition* storage_partition =
+  auto* storage_partition =
       content::BrowserContext::GetDefaultStoragePartition(profile);
-  content::IndexedDBContext* indexed_db_context =
-      storage_partition->GetIndexedDBContext();
-  content::ServiceWorkerContext* service_worker_context =
-      storage_partition->GetServiceWorkerContext();
-  content::CacheStorageContext* cache_storage_context =
-      storage_partition->GetCacheStorageContext();
-  storage::FileSystemContext* file_system_context =
-      storage_partition->GetFileSystemContext();
+  auto* file_system_context = storage_partition->GetFileSystemContext();
+
   auto container = std::make_unique<LocalDataContainer>(
       new BrowsingDataCookieHelper(storage_partition),
       new BrowsingDataDatabaseHelper(profile),
       new BrowsingDataLocalStorageHelper(profile),
       /*session_storage_helper=*/nullptr,
       new BrowsingDataAppCacheHelper(profile),
-      new BrowsingDataIndexedDBHelper(indexed_db_context),
+      new BrowsingDataIndexedDBHelper(storage_partition->GetIndexedDBContext()),
       BrowsingDataFileSystemHelper::Create(file_system_context),
       BrowsingDataQuotaHelper::Create(profile),
-      new BrowsingDataServiceWorkerHelper(service_worker_context),
+      new BrowsingDataServiceWorkerHelper(
+          storage_partition->GetServiceWorkerContext()),
       new BrowsingDataSharedWorkerHelper(storage_partition,
                                          profile->GetResourceContext()),
-      new BrowsingDataCacheStorageHelper(cache_storage_context),
+      new BrowsingDataCacheStorageHelper(
+          storage_partition->GetCacheStorageContext()),
 #if defined(OS_ANDROID)
       // Android doesn't have flash LSO hence it cannot be created for
       // android build.
diff --git a/chrome/browser/browsing_data/cookies_tree_model.h b/chrome/browser/browsing_data/cookies_tree_model.h
index 1d997041..09291a5ff 100644
--- a/chrome/browser/browsing_data/cookies_tree_model.h
+++ b/chrome/browser/browsing_data/cookies_tree_model.h
@@ -5,29 +5,14 @@
 #ifndef CHROME_BROWSER_BROWSING_DATA_COOKIES_TREE_MODEL_H_
 #define CHROME_BROWSER_BROWSING_DATA_COOKIES_TREE_MODEL_H_
 
-// TODO(viettrungluu): This header file #includes far too much and has too much
-// inline code (which shouldn't be inline).
-
 #include <list>
 #include <memory>
 #include <string>
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/strings/string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_cache_storage_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_database_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_file_system_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_quota_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_service_worker_helper.h"
-#include "chrome/browser/browsing_data/browsing_data_shared_worker_helper.h"
 #include "chrome/browser/browsing_data/local_data_container.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "extensions/buildflags/buildflags.h"
@@ -127,25 +112,23 @@
         const BrowsingDataDatabaseHelper::DatabaseInfo* database_info);
     DetailedInfo& InitLocalStorage(
         const BrowsingDataLocalStorageHelper::LocalStorageInfo*
-        local_storage_info);
+            local_storage_info);
     DetailedInfo& InitSessionStorage(
         const BrowsingDataLocalStorageHelper::LocalStorageInfo*
-        session_storage_info);
+            session_storage_info);
     DetailedInfo& InitAppCache(const GURL& origin,
                                const blink::mojom::AppCacheInfo* appcache_info);
-    DetailedInfo& InitIndexedDB(
-        const content::StorageUsageInfo* indexed_db_info);
+    DetailedInfo& InitIndexedDB(const content::StorageUsageInfo* usage_info);
     DetailedInfo& InitFileSystem(
         const BrowsingDataFileSystemHelper::FileSystemInfo* file_system_info);
     DetailedInfo& InitQuota(
         const BrowsingDataQuotaHelper::QuotaInfo* quota_info);
     DetailedInfo& InitServiceWorker(
-        const content::StorageUsageInfo* service_worker_info);
+        const content::StorageUsageInfo* usage_info);
     DetailedInfo& InitSharedWorker(
         const BrowsingDataSharedWorkerHelper::SharedWorkerInfo*
             shared_worker_info);
-    DetailedInfo& InitCacheStorage(
-        const content::StorageUsageInfo* cache_storage_info);
+    DetailedInfo& InitCacheStorage(const content::StorageUsageInfo* usage_info);
     DetailedInfo& InitFlashLSO(const std::string& flash_lso_domain);
     DetailedInfo& InitMediaLicense(
         const BrowsingDataMediaLicenseHelper::MediaLicenseInfo*
@@ -160,14 +143,13 @@
     const BrowsingDataLocalStorageHelper::LocalStorageInfo*
         session_storage_info = nullptr;
     const blink::mojom::AppCacheInfo* appcache_info = nullptr;
-    const content::StorageUsageInfo* indexed_db_info = nullptr;
+    // Used for IndexedDB, Service Worker, and Cache Storage node types.
+    const content::StorageUsageInfo* usage_info = nullptr;
     const BrowsingDataFileSystemHelper::FileSystemInfo* file_system_info =
         nullptr;
     const BrowsingDataQuotaHelper::QuotaInfo* quota_info = nullptr;
-    const content::StorageUsageInfo* service_worker_info = nullptr;
     const BrowsingDataSharedWorkerHelper::SharedWorkerInfo* shared_worker_info =
         nullptr;
-    const content::StorageUsageInfo* cache_storage_info = nullptr;
     std::string flash_lso_domain;
     const BrowsingDataMediaLicenseHelper::MediaLicenseInfo* media_license_info =
         nullptr;
@@ -292,474 +274,6 @@
   DISALLOW_COPY_AND_ASSIGN(CookieTreeHostNode);
 };
 
-// CookieTreeCookieNode ------------------------------------------------------
-class CookieTreeCookieNode : public CookieTreeNode {
- public:
-  friend class CookieTreeCookiesNode;
-
-  // The cookie should remain valid at least as long as the
-  // CookieTreeCookieNode is valid.
-  explicit CookieTreeCookieNode(
-      std::list<net::CanonicalCookie>::iterator cookie);
-  ~CookieTreeCookieNode() override;
-
-  // CookieTreeNode methods:
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-
- private:
-  // cookie_ is expected to remain valid as long as the CookieTreeCookieNode is
-  // valid.
-  std::list<net::CanonicalCookie>::iterator cookie_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeCookieNode);
-};
-
-class CookieTreeCookiesNode : public CookieTreeNode {
- public:
-  CookieTreeCookiesNode();
-  ~CookieTreeCookiesNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-
-  void AddCookieNode(std::unique_ptr<CookieTreeCookieNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeCookiesNode);
-};
-
-// CookieTreeAppCacheNode -----------------------------------------------------
-class CookieTreeAppCacheNode : public CookieTreeNode {
- public:
-  friend class CookieTreeAppCachesNode;
-
-  // appcache_info should remain valid at least as long as the
-  // CookieTreeAppCacheNode is valid.
-  explicit CookieTreeAppCacheNode(
-      const url::Origin& origin,
-      std::list<blink::mojom::AppCacheInfo>::iterator appcache_info);
-  ~CookieTreeAppCacheNode() override;
-
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
- private:
-  url::Origin origin_;
-  std::list<blink::mojom::AppCacheInfo>::iterator appcache_info_;
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeAppCacheNode);
-};
-
-class CookieTreeAppCachesNode : public CookieTreeNode {
- public:
-  CookieTreeAppCachesNode();
-  ~CookieTreeAppCachesNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
-  void AddAppCacheNode(std::unique_ptr<CookieTreeAppCacheNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeAppCachesNode);
-};
-
-// CookieTreeDatabaseNode -----------------------------------------------------
-class CookieTreeDatabaseNode : public CookieTreeNode {
- public:
-  friend class CookieTreeDatabasesNode;
-
-  // database_info should remain valid at least as long as the
-  // CookieTreeDatabaseNode is valid.
-  explicit CookieTreeDatabaseNode(
-      std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator
-          database_info);
-  ~CookieTreeDatabaseNode() override;
-
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
- private:
-  // database_info_ is expected to remain valid as long as the
-  // CookieTreeDatabaseNode is valid.
-  std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator
-      database_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeDatabaseNode);
-};
-
-class CookieTreeDatabasesNode : public CookieTreeNode {
- public:
-  CookieTreeDatabasesNode();
-  ~CookieTreeDatabasesNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
-  void AddDatabaseNode(std::unique_ptr<CookieTreeDatabaseNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeDatabasesNode);
-};
-
-// CookieTreeFileSystemNode --------------------------------------------------
-class CookieTreeFileSystemNode : public CookieTreeNode {
- public:
-  friend class CookieTreeFileSystemsNode;
-
-  // file_system_info should remain valid at least as long as the
-  // CookieTreeFileSystemNode is valid.
-  explicit CookieTreeFileSystemNode(
-      std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
-          file_system_info);
-  ~CookieTreeFileSystemNode() override;
-
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
- private:
-  // file_system_info_ expected to remain valid as long as the
-  // CookieTreeFileSystemNode is valid.
-  std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
-      file_system_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeFileSystemNode);
-};
-
-class CookieTreeFileSystemsNode : public CookieTreeNode {
- public:
-  CookieTreeFileSystemsNode();
-  ~CookieTreeFileSystemsNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
-  void AddFileSystemNode(std::unique_ptr<CookieTreeFileSystemNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeFileSystemsNode);
-};
-
-// CookieTreeLocalStorageNode -------------------------------------------------
-class CookieTreeLocalStorageNode : public CookieTreeNode {
- public:
-  // local_storage_info should remain valid at least as long as the
-  // CookieTreeLocalStorageNode is valid.
-  explicit CookieTreeLocalStorageNode(
-      std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
-          local_storage_info);
-  ~CookieTreeLocalStorageNode() override;
-
-  // CookieTreeNode methods:
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
- private:
-  // local_storage_info_ is expected to remain valid as long as the
-  // CookieTreeLocalStorageNode is valid.
-  std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
-      local_storage_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeLocalStorageNode);
-};
-
-class CookieTreeLocalStoragesNode : public CookieTreeNode {
- public:
-  CookieTreeLocalStoragesNode();
-  ~CookieTreeLocalStoragesNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
-  void AddLocalStorageNode(std::unique_ptr<CookieTreeLocalStorageNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeLocalStoragesNode);
-};
-
-
-// CookieTreeSessionStorageNode -----------------------------------------------
-class CookieTreeSessionStorageNode : public CookieTreeNode {
- public:
-  // session_storage_info should remain valid at least as long as the
-  // CookieTreeSessionStorageNode is valid.
-  explicit CookieTreeSessionStorageNode(
-      std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
-          session_storage_info);
-  ~CookieTreeSessionStorageNode() override;
-
-  // CookieTreeNode methods:
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-
- private:
-  // session_storage_info_ is expected to remain valid as long as the
-  // CookieTreeSessionStorageNode is valid.
-  std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
-      session_storage_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeSessionStorageNode);
-};
-
-class CookieTreeSessionStoragesNode : public CookieTreeNode {
- public:
-  CookieTreeSessionStoragesNode();
-  ~CookieTreeSessionStoragesNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-
-  void AddSessionStorageNode(
-      std::unique_ptr<CookieTreeSessionStorageNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeSessionStoragesNode);
-};
-
-// CookieTreeIndexedDBNode -----------------------------------------------
-class CookieTreeIndexedDBNode : public CookieTreeNode {
- public:
-  // indexed_db_info should remain valid at least as long as the
-  // CookieTreeIndexedDBNode is valid.
-  explicit CookieTreeIndexedDBNode(
-      std::list<content::StorageUsageInfo>::iterator indexed_db_info);
-  ~CookieTreeIndexedDBNode() override;
-
-  // CookieTreeNode methods:
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
- private:
-  // indexed_db_info_ is expected to remain valid as long as the
-  // CookieTreeIndexedDBNode is valid.
-  std::list<content::StorageUsageInfo>::iterator indexed_db_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeIndexedDBNode);
-};
-
-class CookieTreeIndexedDBsNode : public CookieTreeNode {
- public:
-  CookieTreeIndexedDBsNode();
-  ~CookieTreeIndexedDBsNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
-  void AddIndexedDBNode(std::unique_ptr<CookieTreeIndexedDBNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeIndexedDBsNode);
-};
-
-// CookieTreeQuotaNode --------------------------------------------------
-class CookieTreeQuotaNode : public CookieTreeNode {
- public:
-  // quota_info should remain valid at least as long as the CookieTreeQuotaNode
-  // is valid.
-  explicit CookieTreeQuotaNode(
-      std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info);
-  ~CookieTreeQuotaNode() override;
-
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-
- private:
-  // quota_info_ is expected to remain valid as long as the CookieTreeQuotaNode
-  // is valid.
-  std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeQuotaNode);
-};
-
-// CookieTreeServiceWorkerNode -----------------------------------------------
-class CookieTreeServiceWorkerNode : public CookieTreeNode {
- public:
-  // service_worker_info should remain valid at least as long as the
-  // CookieTreeServiceWorkerNode is valid.
-  explicit CookieTreeServiceWorkerNode(
-      std::list<content::StorageUsageInfo>::iterator service_worker_info);
-  ~CookieTreeServiceWorkerNode() override;
-
-  // CookieTreeNode methods:
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
- private:
-  // service_worker_info_ is expected to remain valid as long as the
-  // CookieTreeServiceWorkerNode is valid.
-  std::list<content::StorageUsageInfo>::iterator service_worker_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeServiceWorkerNode);
-};
-
-class CookieTreeServiceWorkersNode : public CookieTreeNode {
- public:
-  CookieTreeServiceWorkersNode();
-  ~CookieTreeServiceWorkersNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
-  void AddServiceWorkerNode(
-      std::unique_ptr<CookieTreeServiceWorkerNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeServiceWorkersNode);
-};
-
-// CookieTreeSharedWorkerNode ------------------------------------------------
-class CookieTreeSharedWorkerNode : public CookieTreeNode {
- public:
-  // shared_worker_info should remain valid at least as long as the
-  // CookieTreeSharedWorkerNode is valid.
-  explicit CookieTreeSharedWorkerNode(
-      std::list<BrowsingDataSharedWorkerHelper::SharedWorkerInfo>::iterator
-          shared_worker_info);
-  ~CookieTreeSharedWorkerNode() override;
-
-  // CookieTreeNode methods:
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-
- private:
-  // shared_worker_info_ is expected to remain valid as long as the
-  // CookieTreeSharedWorkerNode is valid.
-  std::list<BrowsingDataSharedWorkerHelper::SharedWorkerInfo>::iterator
-      shared_worker_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeSharedWorkerNode);
-};
-
-class CookieTreeSharedWorkersNode : public CookieTreeNode {
- public:
-  CookieTreeSharedWorkersNode();
-  ~CookieTreeSharedWorkersNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-
-  void AddSharedWorkerNode(std::unique_ptr<CookieTreeSharedWorkerNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeSharedWorkersNode);
-};
-
-// CookieTreeCacheStorageNode -----------------------------------------------
-class CookieTreeCacheStorageNode : public CookieTreeNode {
- public:
-  // cache_storage_info should remain valid at least as long as the
-  // CookieTreeCacheStorageNode is valid.
-  explicit CookieTreeCacheStorageNode(
-      std::list<content::StorageUsageInfo>::iterator cache_storage_info);
-  ~CookieTreeCacheStorageNode() override;
-
-  // CookieTreeNode methods:
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
- private:
-  // cache_storage_info_ is expected to remain valid as long as the
-  // CookieTreeCacheStorageNode is valid.
-  std::list<content::StorageUsageInfo>::iterator cache_storage_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeCacheStorageNode);
-};
-
-class CookieTreeCacheStoragesNode : public CookieTreeNode {
- public:
-  CookieTreeCacheStoragesNode();
-  ~CookieTreeCacheStoragesNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
-  void AddCacheStorageNode(std::unique_ptr<CookieTreeCacheStorageNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeCacheStoragesNode);
-};
-
-// CookieTreeFlashLSONode ----------------------------------------------------
-class CookieTreeFlashLSONode : public CookieTreeNode {
- public:
-  explicit CookieTreeFlashLSONode(const std::string& domain);
-  ~CookieTreeFlashLSONode() override;
-
-  // CookieTreeNode methods:
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-
- private:
-  std::string domain_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeFlashLSONode);
-};
-
-// CookieTreeMediaLicenseNode -----------------------------------------------
-class CookieTreeMediaLicenseNode : public CookieTreeNode {
- public:
-  friend class CookieTreeMediaLicensesNode;
-
-  // |media_license_info| is expected to remain valid as long as the
-  // CookieTreeMediaLicenseNode is valid.
-  explicit CookieTreeMediaLicenseNode(
-      const std::list<BrowsingDataMediaLicenseHelper::MediaLicenseInfo>::
-          iterator media_license_info);
-  ~CookieTreeMediaLicenseNode() override;
-
-  void DeleteStoredObjects() override;
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
- private:
-  // |media_license_info_| is expected to remain valid as long as the
-  // CookieTreeMediaLicenseNode is valid.
-  std::list<BrowsingDataMediaLicenseHelper::MediaLicenseInfo>::iterator
-      media_license_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeMediaLicenseNode);
-};
-
-class CookieTreeMediaLicensesNode : public CookieTreeNode {
- public:
-  CookieTreeMediaLicensesNode();
-  ~CookieTreeMediaLicensesNode() override;
-
-  DetailedInfo GetDetailedInfo() const override;
-  void RetrieveSize(const SizeRetrievalCallback& callback) override;
-
-  void AddMediaLicenseNode(std::unique_ptr<CookieTreeMediaLicenseNode> child) {
-    AddChildSortedByTitle(std::move(child));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CookieTreeMediaLicensesNode);
-};
-
 // CookiesTreeModel -----------------------------------------------------------
 class CookiesTreeModel : public ui::TreeNodeModel<CookieTreeNode> {
  public:
diff --git a/chrome/browser/browsing_data/cookies_tree_model_unittest.cc b/chrome/browser/browsing_data/cookies_tree_model_unittest.cc
index ab1a812..5d8d4a7b 100644
--- a/chrome/browser/browsing_data/cookies_tree_model_unittest.cc
+++ b/chrome/browser/browsing_data/cookies_tree_model_unittest.cc
@@ -276,20 +276,20 @@
     switch (node_type) {
       case CookieTreeNode::DetailedInfo::TYPE_SESSION_STORAGE:
         return node->GetDetailedInfo().session_storage_info->origin_url.spec() +
-            ",";
+               ",";
       case CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE:
         return node->GetDetailedInfo().local_storage_info->origin_url.spec() +
-            ",";
+               ",";
       case CookieTreeNode::DetailedInfo::TYPE_DATABASE:
         return node->GetDetailedInfo().database_info->database_name + ",";
       case CookieTreeNode::DetailedInfo::TYPE_COOKIE:
         return node->GetDetailedInfo().cookie->Name() + ",";
       case CookieTreeNode::DetailedInfo::TYPE_APPCACHE:
-        return node->GetDetailedInfo().appcache_info->manifest_url.spec() +
-            ",";
+        return node->GetDetailedInfo().appcache_info->manifest_url.spec() + ",";
       case CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB:
-        return node->GetDetailedInfo().indexed_db_info->origin.GetURL().spec() +
-               ",";
+      case CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKER:
+      case CookieTreeNode::DetailedInfo::TYPE_CACHE_STORAGE:
+        return node->GetDetailedInfo().usage_info->origin.GetURL().spec() + ",";
       case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM:
         return node->GetDetailedInfo()
                    .file_system_info->origin.GetURL()
@@ -297,18 +297,8 @@
                ",";
       case CookieTreeNode::DetailedInfo::TYPE_QUOTA:
         return node->GetDetailedInfo().quota_info->host + ",";
-      case CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKER:
-        return node->GetDetailedInfo()
-                   .service_worker_info->origin.GetURL()
-                   .spec() +
-               ",";
       case CookieTreeNode::DetailedInfo::TYPE_SHARED_WORKER:
         return node->GetDetailedInfo().shared_worker_info->worker.spec() + ",";
-      case CookieTreeNode::DetailedInfo::TYPE_CACHE_STORAGE:
-        return node->GetDetailedInfo()
-                   .cache_storage_info->origin.GetURL()
-                   .spec() +
-               ",";
       case CookieTreeNode::DetailedInfo::TYPE_FLASH_LSO:
         return node->GetDetailedInfo().flash_lso_domain + ",";
       case CookieTreeNode::DetailedInfo::TYPE_MEDIA_LICENSE:
diff --git a/chrome/browser/ui/webui/cookies_tree_model_util.cc b/chrome/browser/ui/webui/cookies_tree_model_util.cc
index e29cad10..c1f1d7d 100644
--- a/chrome/browser/ui/webui/cookies_tree_model_util.cc
+++ b/chrome/browser/ui/webui/cookies_tree_model_util.cc
@@ -13,6 +13,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/browsing_data/cookies_tree_model.h"
@@ -171,15 +172,14 @@
     case CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB: {
       dict->SetString(kKeyType, "indexed_db");
 
-      const content::StorageUsageInfo& indexed_db_info =
-          *node.GetDetailedInfo().indexed_db_info;
+      const content::StorageUsageInfo& usage_info =
+          *node.GetDetailedInfo().usage_info;
 
-      dict->SetString(kKeyOrigin, indexed_db_info.origin.Serialize());
-      dict->SetString(kKeySize,
-                      ui::FormatBytes(indexed_db_info.total_size_bytes));
+      dict->SetString(kKeyOrigin, usage_info.origin.Serialize());
+      dict->SetString(kKeySize, ui::FormatBytes(usage_info.total_size_bytes));
       dict->SetString(kKeyModified,
                       base::UTF16ToUTF8(base::TimeFormatFriendlyDateAndTime(
-                          indexed_db_info.last_modified)));
+                          usage_info.last_modified)));
       break;
     }
     case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM: {
@@ -233,12 +233,11 @@
     case CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKER: {
       dict->SetString(kKeyType, "service_worker");
 
-      const content::StorageUsageInfo& service_worker_info =
-          *node.GetDetailedInfo().service_worker_info;
+      const content::StorageUsageInfo& usage_info =
+          *node.GetDetailedInfo().usage_info;
 
-      dict->SetString(kKeyOrigin, service_worker_info.origin.Serialize());
-      dict->SetString(kKeySize,
-                      ui::FormatBytes(service_worker_info.total_size_bytes));
+      dict->SetString(kKeyOrigin, usage_info.origin.Serialize());
+      dict->SetString(kKeySize, ui::FormatBytes(usage_info.total_size_bytes));
       // TODO(jsbell): Include kKeyModified like other storage types.
       break;
     }
@@ -255,15 +254,14 @@
     case CookieTreeNode::DetailedInfo::TYPE_CACHE_STORAGE: {
       dict->SetString(kKeyType, "cache_storage");
 
-      const content::StorageUsageInfo& cache_storage_info =
-          *node.GetDetailedInfo().cache_storage_info;
+      const content::StorageUsageInfo& usage_info =
+          *node.GetDetailedInfo().usage_info;
 
-      dict->SetString(kKeyOrigin, cache_storage_info.origin.Serialize());
-      dict->SetString(kKeySize,
-                      ui::FormatBytes(cache_storage_info.total_size_bytes));
+      dict->SetString(kKeyOrigin, usage_info.origin.Serialize());
+      dict->SetString(kKeySize, ui::FormatBytes(usage_info.total_size_bytes));
       dict->SetString(kKeyModified,
                       base::UTF16ToUTF8(base::TimeFormatFriendlyDateAndTime(
-                          cache_storage_info.last_modified)));
+                          usage_info.last_modified)));
       break;
     }
     case CookieTreeNode::DetailedInfo::TYPE_FLASH_LSO: {