14ee2ad04344446e610172a0e73949212923014dfSebastian Redl// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// Use of this source code is governed by a BSD-style license that can be
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// found in the LICENSE file.
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/browsing_data/cookies_tree_model.h"
62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <algorithm>
82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <functional>
92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <map>
10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include <vector>
112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/bind.h"
132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/memory/linked_ptr.h"
147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl#include "base/strings/string_util.h"
150eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis#include "base/strings/utf_string_conversions.h"
162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/browsing_data/browsing_data_channel_id_helper.h"
172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/browsing_data/browsing_data_cookie_helper.h"
182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/browsing_data/browsing_data_flash_lso_helper.h"
1989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "chrome/browser/content_settings/cookie_settings.h"
2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "chrome/grit/generated_resources.h"
210b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor#include "content/public/common/url_constants.h"
227a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall#include "grit/theme_resources.h"
232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
24a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#include "net/cookies/canonical_cookie.h"
2514f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "net/url_request/url_request_context.h"
2610e286aa8d39fb51a21412850265d9dae74613eeChris Lattner#include "ui/base/l10n/l10n_util.h"
273251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor#include "ui/base/resource/resource_bundle.h"
2814f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "ui/gfx/image/image_skia.h"
29bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor#include "ui/resources/grit/ui_resources.h"
302bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor
3157016dda61498294120b1a881d9e6606337b29d9Douglas Gregor#if defined(ENABLE_EXTENSIONS)
32ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor#include "chrome/browser/extensions/extension_special_storage_policy.h"
330a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor#include "extensions/common/extension_set.h"
3455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#endif
3555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth
3655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruthnamespace {
3755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth
3855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruthstruct NodeTitleComparator {
3955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth  bool operator()(const CookieTreeNode* lhs, const CookieTreeNode* rhs) {
4055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth    return lhs->GetTitle() < rhs->GetTitle();
4155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth  }
4255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth};
4317fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
4417fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor// Comparison functor, for use in CookieTreeRootNode.
452596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbarstruct HostNodeComparator {
462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  bool operator()(const CookieTreeNode* lhs, const CookieTreeNode* rhs) {
47fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer    // This comparator is only meant to compare CookieTreeHostNode types. Make
4814f79002e58556798e86168c63e48d533287eda5Douglas Gregor    // sure we check this, as the static cast below is dangerous if we get the
4903013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer    // wrong object type.
50f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    CHECK_EQ(CookieTreeNode::DetailedInfo::TYPE_HOST,
513c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner             lhs->GetDetailedInfo().node_type);
52cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    CHECK_EQ(CookieTreeNode::DetailedInfo::TYPE_HOST,
53f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor             rhs->GetDetailedInfo().node_type);
542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    const CookieTreeHostNode* ltn =
562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        static_cast<const CookieTreeHostNode*>(lhs);
57ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl    const CookieTreeHostNode* rtn =
585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        static_cast<const CookieTreeHostNode*>(rhs);
595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    // We want to order by registry controlled domain, so we would get
616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer    // google.com, ad.google.com, www.google.com,
62ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl    // microsoft.com, ad.microsoft.com. CanonicalizeHost transforms the origins
636e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer    // into a form like google.com.www so that string comparisons work.
646e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer    return (ltn->canonicalized_host() <
655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner            rtn->canonicalized_host());
665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  }
676e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer};
68ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
69ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redlstd::string CanonicalizeHost(const GURL& url) {
702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // The canonicalized representation makes the registry controlled domain
712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // come first, and then adds subdomains in reverse order, e.g.
722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // 1.mail.google.com would become google.com.mail.1, and then a standard
7312b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner  // string comparison works to order hosts by registry controlled domain
742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // first. Leading dots are ignored, ".google.com" is the same as
753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  // "google.com".
76a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
7789eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis  if (url.SchemeIsFile()) {
782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return std::string(url::kFileScheme) +
792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor           url::kStandardSchemeSeparator;
802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string host = url.host();
8389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis  std::string retval =
848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      net::registry_controlled_domains::GetDomainAndRegistry(
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor          host,
862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor          net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  if (!retval.length())  // Is an IP address or other special origin.
882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return host;
892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string::size_type position = host.rfind(retval);
912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // The host may be the registry controlled domain, in which case fail fast.
932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  if (position == 0 || position == std::string::npos)
942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return host;
952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  // If host is www.google.com, retval will contain google.com at this point.
97b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  // Start operating to the left of the registry controlled domain, e.g. in
982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // the www.google.com example, start at index 3.
992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  --position;
1003397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // If position == 0, that means it's a dot; this will be ignored to treat
1028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  // ".google.com" the same as "google.com".
1032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  while (position > 0) {
1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    retval += std::string(".");
1053397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    // Copy up to the next dot. host[position] is a dot so start after it.
1062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    std::string::size_type next_dot = host.rfind(".", position - 1);
1078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    if (next_dot == std::string::npos) {
1082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      retval += host.substr(0, position);
1092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      break;
1103397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    }
1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    retval += host.substr(next_dot + 1, position - (next_dot + 1));
1128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    position = next_dot;
1132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
1142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  return retval;
1153397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
116df1550fc59b51681d37225934fe4e3acac321621Richard Smith
117df1550fc59b51681d37225934fe4e3acac321621Richard Smith#if defined(ENABLE_EXTENSIONS)
1188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlbool TypeIsProtected(CookieTreeNode::DetailedInfo::NodeType type) {
1192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  switch (type) {
1202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_COOKIE:
1213397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      return false;
122df1550fc59b51681d37225934fe4e3acac321621Richard Smith    case CookieTreeNode::DetailedInfo::TYPE_DATABASE:
1238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      return true;
1242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE:
1252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return true;
1263397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    case CookieTreeNode::DetailedInfo::TYPE_SESSION_STORAGE:
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return true;
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case CookieTreeNode::DetailedInfo::TYPE_APPCACHE:
1298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      return true;
1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB:
1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return true;
1323397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM:
1332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return true;
1342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_QUOTA:
1350953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      return false;
1362cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_CHANNEL_ID:
1372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return false;
1383397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    case CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKER:
1392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return true;
1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_FLASH_LSO:
1418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      return false;
1422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    default:
1432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      break;
1443397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  }
1452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  return false;
1468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
1472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
1482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1493397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl// This function returns the local data container associated with a leaf tree
1502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// node. The app node is assumed to be 3 levels above the leaf because of the
1517e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor// following structure:
1527e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor//   root -> origin -> storage type -> leaf node
153c9490c000f515c29f200a1215328d8ab9a0f3818Douglas GregorLocalDataContainer* GetLocalDataContainerForNode(CookieTreeNode* node) {
1548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  CookieTreeHostNode* host = static_cast<CookieTreeHostNode*>(
1552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      node->parent()->parent());
1562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  CHECK_EQ(host->GetDetailedInfo().node_type,
1573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl           CookieTreeNode::DetailedInfo::TYPE_HOST);
1582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  return node->GetModel()->data_container();
1592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
160e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson
1618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}  // namespace
1622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeNode::DetailedInfo::DetailedInfo()
1643397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    : node_type(TYPE_NONE),
1652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      cookie(NULL),
1668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      database_info(NULL),
1672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      local_storage_info(NULL),
1682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      session_storage_info(NULL),
1693397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      appcache_info(NULL),
1702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      indexed_db_info(NULL),
171264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      file_system_info(NULL),
172264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      quota_info(NULL),
173a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman      channel_id(NULL),
174425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola      service_worker_info(NULL) {
175ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor}
176264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola
177f85e193739c953358c865005855253af4f68a497John McCallCookieTreeNode::DetailedInfo::~DetailedInfo() {}
1782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::Init(
1803397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    NodeType type) {
1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  DCHECK_EQ(TYPE_NONE, node_type);
1828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  node_type = type;
1832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  return *this;
1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1853397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitHost() {
1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  Init(TYPE_HOST);
1882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  return *this;
1892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
191eefb3d5b49c844347f212073a7e975b8118fe8e9Richard SmithCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitCookie(
1922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    const net::CanonicalCookie* cookie) {
193c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor  Init(TYPE_COOKIE);
19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  this->cookie = cookie;
19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  return *this;
19660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl}
19760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
19860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian RedlCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitDatabase(
19960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    const BrowsingDataDatabaseHelper::DatabaseInfo* database_info) {
20060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl  Init(TYPE_DATABASE);
2017bb698aa054de4c0e0aa23973b2c62dac9611262Richard Smith  this->database_info = database_info;
2027bb698aa054de4c0e0aa23973b2c62dac9611262Richard Smith  origin = database_info->identifier.ToOrigin();
2037bb698aa054de4c0e0aa23973b2c62dac9611262Richard Smith  return *this;
204b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith}
205b9d0b76e42fd2d4cdfd135220302458d03ad09feRichard Smith
20660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian RedlCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitLocalStorage(
2078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    const BrowsingDataLocalStorageHelper::LocalStorageInfo*
2082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    local_storage_info) {
2092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  Init(TYPE_LOCAL_STORAGE);
2103397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  this->local_storage_info = local_storage_info;
211ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  origin = local_storage_info->origin_url;
2128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  return *this;
213ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
214ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2153397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitSessionStorage(
2162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    const BrowsingDataLocalStorageHelper::LocalStorageInfo*
2179763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    session_storage_info) {
2189763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  Init(TYPE_SESSION_STORAGE);
2198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  this->session_storage_info = session_storage_info;
2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  origin = session_storage_info->origin_url;
2212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  return *this;
2223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
223c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
2248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitAppCache(
2252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    const GURL& origin,
2262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    const content::AppCacheInfo* appcache_info) {
2273397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  Init(TYPE_APPCACHE);
2282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  this->appcache_info = appcache_info;
2298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  this->origin = origin;
2302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  return *this;
2312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
2323397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
233f8af98286022f72157d84951b48fde5fb369ab29Douglas GregorCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitIndexedDB(
234395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    const content::IndexedDBInfo* indexed_db_info) {
2358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  Init(TYPE_INDEXED_DB);
236395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  this->indexed_db_info = indexed_db_info;
237395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  this->origin = indexed_db_info->origin_;
238ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  return *this;
239ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt}
240ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
241ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitFileSystem(
242ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    const BrowsingDataFileSystemHelper::FileSystemInfo* file_system_info) {
243ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  Init(TYPE_FILE_SYSTEM);
244ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  this->file_system_info = file_system_info;
24534b41d939a1328f484511c6002ba2456db879a29Richard Smith  this->origin = file_system_info->origin;
24634b41d939a1328f484511c6002ba2456db879a29Richard Smith  return *this;
24734b41d939a1328f484511c6002ba2456db879a29Richard Smith}
24834b41d939a1328f484511c6002ba2456db879a29Richard Smith
24934b41d939a1328f484511c6002ba2456db879a29Richard SmithCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitQuota(
2503397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    const BrowsingDataQuotaHelper::QuotaInfo* quota_info) {
251be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis  Init(TYPE_QUOTA);
25256ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor  this->quota_info = quota_info;
2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return *this;
2542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
2552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitChannelID(
2573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    const net::ChannelIDStore::ChannelID* channel_id) {
2582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  Init(TYPE_CHANNEL_ID);
2598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  this->channel_id = channel_id;
2602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  return *this;
2612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
2623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
2632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitServiceWorker(
2648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    const content::ServiceWorkerUsageInfo* service_worker_info) {
2652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  Init(TYPE_SERVICE_WORKER);
2662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  this->service_worker_info = service_worker_info;
2679d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  this->origin = service_worker_info->origin;
2689d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  return *this;
2699d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
2709d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2719d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallCookieTreeNode::DetailedInfo& CookieTreeNode::DetailedInfo::InitFlashLSO(
2729d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    const std::string& flash_lso_domain) {
2739d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  Init(TYPE_FLASH_LSO);
2741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  this->flash_lso_domain = flash_lso_domain;
2753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  return *this;
27649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
27749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
27849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall///////////////////////////////////////////////////////////////////////////////
2798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl// CookieTreeNode, public:
28049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
28149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallvoid CookieTreeNode::DeleteStoredObjects() {
28249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  std::for_each(children().begin(),
283c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                children().end(),
284c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                std::mem_fun(&CookieTreeNode::DeleteStoredObjects));
285c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
286c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
287c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorCookiesTreeModel* CookieTreeNode::GetModel() const {
288c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  if (parent())
289c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    return parent()->GetModel();
290c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  else
2913397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    return NULL;
2922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
293be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis
29490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis///////////////////////////////////////////////////////////////////////////////
29590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis// CookieTreeCookieNode, public:
29690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
29790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios KyrtzidisCookieTreeCookieNode::CookieTreeCookieNode(
29890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    std::list<net::CanonicalCookie>::iterator cookie)
2993e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    : CookieTreeNode(base::UTF8ToUTF16(cookie->Name())),
3003e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith      cookie_(cookie) {
3019763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis}
3029763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
3038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlCookieTreeCookieNode::~CookieTreeCookieNode() {}
30490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
30590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid CookieTreeCookieNode::DeleteStoredObjects() {
30690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  LocalDataContainer* container = GetLocalDataContainerForNode(this);
3073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  container->cookie_helper_->DeleteCookie(*cookie_);
308ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis  container->cookie_list_.erase(cookie_);
309ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis}
310ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis
3118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlCookieTreeNode::DetailedInfo CookieTreeCookieNode::GetDetailedInfo() const {
31290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  return DetailedInfo().InitCookie(&*cookie_);
31390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
31490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
3153397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl///////////////////////////////////////////////////////////////////////////////
31690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis// CookieTreeAppCacheNode, public:
31790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
318b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David BlaikieCookieTreeAppCacheNode::CookieTreeAppCacheNode(
31990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    const GURL& origin_url,
32090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    std::list<content::AppCacheInfo>::iterator appcache_info)
32190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    : CookieTreeNode(base::UTF8ToUTF16(appcache_info->manifest_url.spec())),
3223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      origin_url_(origin_url),
32390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis      appcache_info_(appcache_info) {
32490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
32590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
3264fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler CarruthCookieTreeAppCacheNode::~CookieTreeAppCacheNode() {
3278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
32890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
32990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid CookieTreeAppCacheNode::DeleteStoredObjects() {
33090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  LocalDataContainer* container = GetLocalDataContainerForNode(this);
3313397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
3328dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  if (container) {
3338dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    DCHECK(container->appcache_helper_.get());
3348dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    container->appcache_helper_
335f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis        ->DeleteAppCacheGroup(appcache_info_->manifest_url);
336f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis    container->appcache_info_[origin_url_].erase(appcache_info_);
337f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis  }
3388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
33990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
34090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios KyrtzidisCookieTreeNode::DetailedInfo CookieTreeAppCacheNode::GetDetailedInfo() const {
34190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  return DetailedInfo().InitAppCache(origin_url_, &*appcache_info_);
3423397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
34390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
3443acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis///////////////////////////////////////////////////////////////////////////////
3453acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis// CookieTreeDatabaseNode, public:
3463acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3473acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios KyrtzidisCookieTreeDatabaseNode::CookieTreeDatabaseNode(
3483acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator database_info)
3493acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    : CookieTreeNode(database_info->database_name.empty() ?
3503acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis          l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASE_UNNAMED_NAME) :
3518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl          base::UTF8ToUTF16(database_info->database_name)),
3522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      database_info_(database_info) {
3532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
3547536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
3557536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorCookieTreeDatabaseNode::~CookieTreeDatabaseNode() {}
356cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor
357cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregorvoid CookieTreeDatabaseNode::DeleteStoredObjects() {
358cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  LocalDataContainer* container = GetLocalDataContainerForNode(this);
359cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor
3607536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (container) {
3617536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    container->database_helper_->DeleteDatabase(
3627536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor        database_info_->identifier.ToString(), database_info_->database_name);
363075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    container->database_info_list_.erase(database_info_);
364075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
365075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara}
366075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
367075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraCookieTreeNode::DetailedInfo CookieTreeDatabaseNode::GetDetailedInfo() const {
3683397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  return DetailedInfo().InitDatabase(&*database_info_);
369465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara}
3703acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3713acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis///////////////////////////////////////////////////////////////////////////////
3728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl// CookieTreeLocalStorageNode, public:
3732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
3742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeLocalStorageNode::CookieTreeLocalStorageNode(
3753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
376a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor        local_storage_info)
37731f17ecbef57b5679c017c375db330546b7b5145John McCall    : CookieTreeNode(base::UTF8ToUTF16(local_storage_info->origin_url.spec())),
3788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      local_storage_info_(local_storage_info) {
3793cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
3803cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
3813397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlCookieTreeLocalStorageNode::~CookieTreeLocalStorageNode() {}
38256ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor
3838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid CookieTreeLocalStorageNode::DeleteStoredObjects() {
384c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  LocalDataContainer* container = GetLocalDataContainerForNode(this);
385c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
3863397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  if (container) {
387c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    container->local_storage_helper_->DeleteOrigin(
3882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        local_storage_info_->origin_url);
389c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    container->local_storage_info_list_.erase(local_storage_info_);
390446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff  }
391446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff}
3928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
3932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeNode::DetailedInfo
3942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeLocalStorageNode::GetDetailedInfo() const {
395d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  return DetailedInfo().InitLocalStorage(
3963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      &*local_storage_info_);
3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
3988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
3992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor///////////////////////////////////////////////////////////////////////////////
4002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// CookieTreeSessionStorageNode, public:
401b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
402b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanCookieTreeSessionStorageNode::CookieTreeSessionStorageNode(
403b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
404b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman        session_storage_info)
405b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    : CookieTreeNode(
406b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman          base::UTF8ToUTF16(session_storage_info->origin_url.spec())),
407a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      session_storage_info_(session_storage_info) {
408a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
409a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
410a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian RedlCookieTreeSessionStorageNode::~CookieTreeSessionStorageNode() {}
41189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis
412a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallvoid CookieTreeSessionStorageNode::DeleteStoredObjects() {
413a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  LocalDataContainer* container = GetLocalDataContainerForNode(this);
41489eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis
415a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  if (container) {
416a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    // TODO(rsesek): There's no easy way to get the namespace_id for a session
41751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    // storage, nor is there an easy way to clear session storage just by
418a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    // origin. This is probably okay since session storage is not persistent.
41951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    // http://crbug.com/168996
420a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    container->session_storage_info_list_.erase(session_storage_info_);
421a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  }
42251bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
42351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
424a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallCookieTreeNode::DetailedInfo
425a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallCookieTreeSessionStorageNode::GetDetailedInfo() const {
426a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  return DetailedInfo().InitSessionStorage(&*session_storage_info_);
427a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
42851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
42951bd803fbdade51d674598ed45da3d54190a656cJohn McCall///////////////////////////////////////////////////////////////////////////////
43051bd803fbdade51d674598ed45da3d54190a656cJohn McCall// CookieTreeIndexedDBNode, public:
43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
432ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas GregorCookieTreeIndexedDBNode::CookieTreeIndexedDBNode(
433ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    std::list<content::IndexedDBInfo>::iterator
434ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor        indexed_db_info)
435ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    : CookieTreeNode(base::UTF8ToUTF16(
436ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor          indexed_db_info->origin_.spec())),
437ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      indexed_db_info_(indexed_db_info) {
438ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor}
43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
44051bd803fbdade51d674598ed45da3d54190a656cJohn McCallCookieTreeIndexedDBNode::~CookieTreeIndexedDBNode() {}
44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
44251bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid CookieTreeIndexedDBNode::DeleteStoredObjects() {
44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  LocalDataContainer* container = GetLocalDataContainerForNode(this);
44451bd803fbdade51d674598ed45da3d54190a656cJohn McCall
44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  if (container) {
44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    container->indexed_db_helper_->DeleteIndexedDB(
44751bd803fbdade51d674598ed45da3d54190a656cJohn McCall        indexed_db_info_->origin_);
44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    container->indexed_db_info_list_.erase(indexed_db_info_);
44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
45051bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45251bd803fbdade51d674598ed45da3d54190a656cJohn McCallCookieTreeNode::DetailedInfo CookieTreeIndexedDBNode::GetDetailedInfo() const {
45351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return DetailedInfo().InitIndexedDB(&*indexed_db_info_);
45451bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45651bd803fbdade51d674598ed45da3d54190a656cJohn McCall///////////////////////////////////////////////////////////////////////////////
457b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara// CookieTreeFileSystemNode, public:
45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45951bd803fbdade51d674598ed45da3d54190a656cJohn McCallCookieTreeFileSystemNode::CookieTreeFileSystemNode(
46051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
46151bd803fbdade51d674598ed45da3d54190a656cJohn McCall        file_system_info)
46251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    : CookieTreeNode(base::UTF8ToUTF16(
46351bd803fbdade51d674598ed45da3d54190a656cJohn McCall          file_system_info->origin.spec())),
46451bd803fbdade51d674598ed45da3d54190a656cJohn McCall      file_system_info_(file_system_info) {
46551bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
46651bd803fbdade51d674598ed45da3d54190a656cJohn McCall
46751bd803fbdade51d674598ed45da3d54190a656cJohn McCallCookieTreeFileSystemNode::~CookieTreeFileSystemNode() {}
46851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
46951bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid CookieTreeFileSystemNode::DeleteStoredObjects() {
47051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  LocalDataContainer* container = GetLocalDataContainerForNode(this);
47151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
47251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  if (container) {
47351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    container->file_system_helper_->DeleteFileSystemOrigin(
47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall        file_system_info_->origin);
47551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    container->file_system_info_list_.erase(file_system_info_);
47651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
47751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
47851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
47951bd803fbdade51d674598ed45da3d54190a656cJohn McCallCookieTreeNode::DetailedInfo CookieTreeFileSystemNode::GetDetailedInfo() const {
48051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return DetailedInfo().InitFileSystem(&*file_system_info_);
48151bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
48251bd803fbdade51d674598ed45da3d54190a656cJohn McCall
48351bd803fbdade51d674598ed45da3d54190a656cJohn McCall///////////////////////////////////////////////////////////////////////////////
48451bd803fbdade51d674598ed45da3d54190a656cJohn McCall// CookieTreeQuotaNode, public:
48551bd803fbdade51d674598ed45da3d54190a656cJohn McCall
48651bd803fbdade51d674598ed45da3d54190a656cJohn McCallCookieTreeQuotaNode::CookieTreeQuotaNode(
48751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info)
48851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    : CookieTreeNode(base::UTF8ToUTF16(quota_info->host)),
48951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      quota_info_(quota_info) {
490796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara}
49159c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo Bagnara
49259c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo BagnaraCookieTreeQuotaNode::~CookieTreeQuotaNode() {}
493796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara
49451bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid CookieTreeQuotaNode::DeleteStoredObjects() {
49551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  // Calling this function may cause unexpected over-quota state of origin.
49651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  // However, it'll caused no problem, just prevent usage growth of the origin.
49751bd803fbdade51d674598ed45da3d54190a656cJohn McCall  LocalDataContainer* container = GetModel()->data_container();
49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
49951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  if (container) {
50051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    container->quota_helper_->RevokeHostQuota(quota_info_->host);
50151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    container->quota_info_list_.erase(quota_info_);
50251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
503ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
504ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
505ed97649e9574b9d854fa4d6109c9333ae0993554John McCallCookieTreeNode::DetailedInfo CookieTreeQuotaNode::GetDetailedInfo() const {
50651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return DetailedInfo().InitQuota(&*quota_info_);
50751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
50851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
50951bd803fbdade51d674598ed45da3d54190a656cJohn McCall///////////////////////////////////////////////////////////////////////////////
510cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// CookieTreeChannelIDNode, public:
511cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
512cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCallCookieTreeChannelIDNode::CookieTreeChannelIDNode(
51351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      net::ChannelIDStore::ChannelIDList::iterator channel_id)
51451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    : CookieTreeNode(base::ASCIIToUTF16(channel_id->server_identifier())),
515cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      channel_id_(channel_id) {
516cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall}
517cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
518cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCallCookieTreeChannelIDNode::~CookieTreeChannelIDNode() {}
51951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
52051bd803fbdade51d674598ed45da3d54190a656cJohn McCallvoid CookieTreeChannelIDNode::DeleteStoredObjects() {
52151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  LocalDataContainer* container = GetLocalDataContainerForNode(this);
522a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
523ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  if (container) {
524ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    container->channel_id_helper_->DeleteChannelID(
525ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt        channel_id_->server_identifier());
526ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    container->channel_id_list_.erase(channel_id_);
527ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  }
528ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt}
52934b41d939a1328f484511c6002ba2456db879a29Richard Smith
53034b41d939a1328f484511c6002ba2456db879a29Richard SmithCookieTreeNode::DetailedInfo
53134b41d939a1328f484511c6002ba2456db879a29Richard SmithCookieTreeChannelIDNode::GetDetailedInfo() const {
53251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return DetailedInfo().InitChannelID(&*channel_id_);
53351bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
534a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
53551bd803fbdade51d674598ed45da3d54190a656cJohn McCall///////////////////////////////////////////////////////////////////////////////
53651bd803fbdade51d674598ed45da3d54190a656cJohn McCall// CookieTreeServiceWorkerNode, public:
537a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
5389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallCookieTreeServiceWorkerNode::CookieTreeServiceWorkerNode(
5399d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    std::list<content::ServiceWorkerUsageInfo>::iterator service_worker_info)
5409d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    : CookieTreeNode(base::UTF8ToUTF16(service_worker_info->origin.spec())),
5419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      service_worker_info_(service_worker_info) {
5429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
5439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5449d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallCookieTreeServiceWorkerNode::~CookieTreeServiceWorkerNode() {
5459d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
5469d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5479d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallvoid CookieTreeServiceWorkerNode::DeleteStoredObjects() {
5489d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  LocalDataContainer* container = GetLocalDataContainerForNode(this);
5499d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5509d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (container) {
5519d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    container->service_worker_helper_->DeleteServiceWorkers(
5529d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall        service_worker_info_->origin);
55351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    container->service_worker_info_list_.erase(service_worker_info_);
55451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
555a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
55649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
55749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallCookieTreeNode::DetailedInfo CookieTreeServiceWorkerNode::GetDetailedInfo()
55849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    const {
55949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  return DetailedInfo().InitServiceWorker(&*service_worker_info_);
560c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
561c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
562c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor///////////////////////////////////////////////////////////////////////////////
563c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor// CookieTreeRootNode, public:
56451bd803fbdade51d674598ed45da3d54190a656cJohn McCall
56551bd803fbdade51d674598ed45da3d54190a656cJohn McCallCookieTreeRootNode::CookieTreeRootNode(CookiesTreeModel* model)
56655d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara    : model_(model) {
567833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
568833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
569833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallCookieTreeRootNode::~CookieTreeRootNode() {}
570833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
57144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios KyrtzidisCookieTreeHostNode* CookieTreeRootNode::GetOrCreateHostNode(
57244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis    const GURL& url) {
573a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  scoped_ptr<CookieTreeHostNode> host_node(
574075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      new CookieTreeHostNode(url));
575075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
576075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  // First see if there is an existing match.
577075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  std::vector<CookieTreeNode*>::iterator host_node_iterator =
578465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara        std::lower_bound(children().begin(), children().end(), host_node.get(),
57938a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara                         HostNodeComparator());
5809e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  if (host_node_iterator != children().end() &&
581a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      CookieTreeHostNode::TitleForUrl(url) ==
5823cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall      (*host_node_iterator)->GetTitle())
5833cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    return static_cast<CookieTreeHostNode*>(*host_node_iterator);
5843cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  // Node doesn't exist, insert the new one into the (ordered) children.
5854714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DCHECK(model_);
58638a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara  model_->Add(this, host_node.get(),
5872494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor              (host_node_iterator - children().begin()));
58851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return host_node.release();
589a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall}
59033500955d731c73717af52088b7fc0e7a85681e7John McCall
59133500955d731c73717af52088b7fc0e7a85681e7John McCallCookiesTreeModel* CookieTreeRootNode::GetModel() const {
59255d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  return model_;
59394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}
59466581d41527628d4b37f7b05c288f77be7415d7dAbramo Bagnara
59555d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo BagnaraCookieTreeNode::DetailedInfo CookieTreeRootNode::GetDetailedInfo() const {
59633500955d731c73717af52088b7fc0e7a85681e7John McCall  return DetailedInfo().Init(DetailedInfo::TYPE_ROOT);
59733500955d731c73717af52088b7fc0e7a85681e7John McCall}
59833500955d731c73717af52088b7fc0e7a85681e7John McCall
59944f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis///////////////////////////////////////////////////////////////////////////////
60044f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis// CookieTreeHostNode, public:
60133500955d731c73717af52088b7fc0e7a85681e7John McCall
6027536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor// static
6037536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregorbase::string16 CookieTreeHostNode::TitleForUrl(const GURL& url) {
6047536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  const std::string file_origin_node_name(
60551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      std::string(url::kFileScheme) + url::kStandardSchemeSeparator);
60651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return base::UTF8ToUTF16(url.SchemeIsFile() ? file_origin_node_name
607c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                              : url.host());
608c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
609c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
61054e14c4db764c0636160d26c5bbf491637c83a76John McCallCookieTreeHostNode::CookieTreeHostNode(const GURL& url)
61154e14c4db764c0636160d26c5bbf491637c83a76John McCall    : CookieTreeNode(TitleForUrl(url)),
61254e14c4db764c0636160d26c5bbf491637c83a76John McCall      cookies_child_(NULL),
61354e14c4db764c0636160d26c5bbf491637c83a76John McCall      databases_child_(NULL),
614a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      local_storages_child_(NULL),
61551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      session_storages_child_(NULL),
61651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      appcaches_child_(NULL),
617a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      indexed_dbs_child_(NULL),
618b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      file_systems_child_(NULL),
619b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      quota_child_(NULL),
620b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      channel_ids_child_(NULL),
621b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      service_workers_child_(NULL),
622b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      flash_lso_child_(NULL),
623a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      url_(url),
6244dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner      canonicalized_host_(CanonicalizeHost(url)) {
625a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl}
6262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
6272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorCookieTreeHostNode::~CookieTreeHostNode() {}
628b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
629b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerconst std::string CookieTreeHostNode::GetHost() const {
63089eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis  const std::string file_origin_node_name(
631b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      std::string(url::kFileScheme) + url::kStandardSchemeSeparator);
632b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  return url_.SchemeIsFile() ? file_origin_node_name : url_.host();
633b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
634b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
635b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeNode::DetailedInfo CookieTreeHostNode::GetDetailedInfo() const {
636b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  return DetailedInfo().InitHost();
637b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
638b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
639b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeCookiesNode* CookieTreeHostNode::GetOrCreateCookiesNode() {
640b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  if (cookies_child_)
641b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    return cookies_child_;
642b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  cookies_child_ = new CookieTreeCookiesNode;
643b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  AddChildSortedByTitle(cookies_child_);
644b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  return cookies_child_;
64589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis}
646b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
647b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeDatabasesNode* CookieTreeHostNode::GetOrCreateDatabasesNode() {
648b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  if (databases_child_)
649b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    return databases_child_;
650b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  databases_child_ = new CookieTreeDatabasesNode;
6510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddChildSortedByTitle(databases_child_);
6520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return databases_child_;
6530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
65489eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis
6558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlCookieTreeLocalStoragesNode*
6560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    CookieTreeHostNode::GetOrCreateLocalStoragesNode() {
6570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  if (local_storages_child_)
6580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    return local_storages_child_;
6590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  local_storages_child_ = new CookieTreeLocalStoragesNode;
6600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddChildSortedByTitle(local_storages_child_);
6610558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return local_storages_child_;
6620558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
663534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith
6640558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeSessionStoragesNode*
6650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    CookieTreeHostNode::GetOrCreateSessionStoragesNode() {
6660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  if (session_storages_child_)
6670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    return session_storages_child_;
6680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  session_storages_child_ = new CookieTreeSessionStoragesNode;
6690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddChildSortedByTitle(session_storages_child_);
6700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return session_storages_child_;
6710558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
6720558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6730558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeAppCachesNode* CookieTreeHostNode::GetOrCreateAppCachesNode() {
6740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  if (appcaches_child_)
675df5faf5e7ae6823d0af0b801c4ac26d47f2cee97Chad Rosier    return appcaches_child_;
676cd518a0ebc7c0a6aa41d717c360462540ef80a76Chad Rosier  appcaches_child_ = new CookieTreeAppCachesNode;
6770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddChildSortedByTitle(appcaches_child_);
6780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return appcaches_child_;
6790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
6800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6810558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeIndexedDBsNode* CookieTreeHostNode::GetOrCreateIndexedDBsNode() {
6820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  if (indexed_dbs_child_)
6830558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    return indexed_dbs_child_;
6840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  indexed_dbs_child_ = new CookieTreeIndexedDBsNode;
6850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddChildSortedByTitle(indexed_dbs_child_);
6860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return indexed_dbs_child_;
6870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
6880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6890558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeFileSystemsNode* CookieTreeHostNode::GetOrCreateFileSystemsNode() {
6900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  if (file_systems_child_)
6910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    return file_systems_child_;
6920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  file_systems_child_ = new CookieTreeFileSystemsNode;
6930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddChildSortedByTitle(file_systems_child_);
6940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return file_systems_child_;
6950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
6960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6970558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeQuotaNode* CookieTreeHostNode::UpdateOrCreateQuotaNode(
6980558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info) {
6990558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  if (quota_child_)
7000558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    return quota_child_;
7010558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  quota_child_ = new CookieTreeQuotaNode(quota_info);
7020558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddChildSortedByTitle(quota_child_);
7030558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return quota_child_;
7040558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
7050558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
7060558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeChannelIDsNode*
707f111d935722ed488144600cea5ed03a6b5069e8fPeter CollingbourneCookieTreeHostNode::GetOrCreateChannelIDsNode() {
7080558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  if (channel_ids_child_)
709eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beard    return channel_ids_child_;
710ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  channel_ids_child_ = new CookieTreeChannelIDsNode;
711ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  AddChildSortedByTitle(channel_ids_child_);
7120558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return channel_ids_child_;
7130558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
7140558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
7150558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeServiceWorkersNode*
7160558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeHostNode::GetOrCreateServiceWorkersNode() {
7170558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  if (service_workers_child_)
7180558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    return service_workers_child_;
7190558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  service_workers_child_ = new CookieTreeServiceWorkersNode;
7200558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddChildSortedByTitle(service_workers_child_);
7210558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  return service_workers_child_;
7220558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
7230558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
7240558df2da807646e65d4fa290f4e92114af1a746Chris LattnerCookieTreeFlashLSONode* CookieTreeHostNode::GetOrCreateFlashLSONode(
725ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    const std::string& domain) {
726eb7f96141f754150a92433286fa385910a22f494Sam Weinig  DCHECK_EQ(GetHost(), domain);
727eb7f96141f754150a92433286fa385910a22f494Sam Weinig  if (flash_lso_child_)
728eb7f96141f754150a92433286fa385910a22f494Sam Weinig    return flash_lso_child_;
729eb7f96141f754150a92433286fa385910a22f494Sam Weinig  flash_lso_child_ = new CookieTreeFlashLSONode(domain);
730eb7f96141f754150a92433286fa385910a22f494Sam Weinig  AddChildSortedByTitle(flash_lso_child_);
731eb7f96141f754150a92433286fa385910a22f494Sam Weinig  return flash_lso_child_;
732eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
7339fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith
734eb7f96141f754150a92433286fa385910a22f494Sam Weinigvoid CookieTreeHostNode::CreateContentException(
735eb7f96141f754150a92433286fa385910a22f494Sam Weinig    CookieSettings* cookie_settings, ContentSetting setting) const {
736b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  DCHECK(setting == CONTENT_SETTING_ALLOW ||
737b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         setting == CONTENT_SETTING_BLOCK ||
738b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         setting == CONTENT_SETTING_SESSION_ONLY);
739b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  if (CanCreateContentException()) {
740b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    cookie_settings->ResetCookieSetting(
741b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        ContentSettingsPattern::FromURLNoWildcard(url_),
742b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        ContentSettingsPattern::Wildcard());
743b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    cookie_settings->SetCookieSetting(
744b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        ContentSettingsPattern::FromURL(url_),
745b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor        ContentSettingsPattern::Wildcard(), setting);
746b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  }
747b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
748b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
749b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregorbool CookieTreeHostNode::CanCreateContentException() const {
750b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  return !url_.SchemeIsFile();
751b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
752b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
753b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor///////////////////////////////////////////////////////////////////////////////
754b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor// CookieTreeCookiesNode, public:
755b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
756b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookieTreeCookiesNode::CookieTreeCookiesNode()
757b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_COOKIES)) {
758b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
759b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
760b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookieTreeCookiesNode::~CookieTreeCookiesNode() {
761e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}
7620558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
763b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeNode::DetailedInfo CookieTreeCookiesNode::GetDetailedInfo() const {
7641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return DetailedInfo().Init(DetailedInfo::TYPE_COOKIES);
765a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl}
766b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
767b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner///////////////////////////////////////////////////////////////////////////////
7681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// CookieTreeAppCachesNode, public:
7698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
7708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlCookieTreeAppCachesNode::CookieTreeAppCachesNode()
7711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : CookieTreeNode(l10n_util::GetStringUTF16(
7727ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor                         IDS_COOKIES_APPLICATION_CACHES)) {
7737ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor}
7747ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor
7757ae467f02b0f2ba3897ee03e0d011433789b5434Douglas GregorCookieTreeAppCachesNode::~CookieTreeAppCachesNode() {}
7767ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor
7777ae467f02b0f2ba3897ee03e0d011433789b5434Douglas GregorCookieTreeNode::DetailedInfo CookieTreeAppCachesNode::GetDetailedInfo() const {
77839c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor  return DetailedInfo().Init(DetailedInfo::TYPE_APPCACHES);
7797ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor}
780992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis
781a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor///////////////////////////////////////////////////////////////////////////////
7825f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor// CookieTreeDatabasesNode, public:
7831b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor
784bbf38319edd4eddc55ec273934e990d7e84991deDouglas GregorCookieTreeDatabasesNode::CookieTreeDatabasesNode()
785a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASES)) {
786a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor}
787c337fefd7317714d365a2acf4f1d2939bbcf8e3bDouglas Gregor
788c337fefd7317714d365a2acf4f1d2939bbcf8e3bDouglas GregorCookieTreeDatabasesNode::~CookieTreeDatabasesNode() {}
789c337fefd7317714d365a2acf4f1d2939bbcf8e3bDouglas Gregor
7907ae467f02b0f2ba3897ee03e0d011433789b5434Douglas GregorCookieTreeNode::DetailedInfo CookieTreeDatabasesNode::GetDetailedInfo() const {
7917ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  return DetailedInfo().Init(DetailedInfo::TYPE_DATABASES);
792b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
793b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
794b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner///////////////////////////////////////////////////////////////////////////////
795b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner// CookieTreeLocalStoragesNode, public:
796b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
797b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeLocalStoragesNode::CookieTreeLocalStoragesNode()
798b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_LOCAL_STORAGE)) {
799b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
80049b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis
8015ea6ef490547917426d5e2ed14c9f36521bbeacfRichard SmithCookieTreeLocalStoragesNode::~CookieTreeLocalStoragesNode() {}
802b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
803b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeNode::DetailedInfo
804b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeLocalStoragesNode::GetDetailedInfo() const {
8057f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  return DetailedInfo().Init(DetailedInfo::TYPE_LOCAL_STORAGES);
8067f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor}
807b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor
808e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis///////////////////////////////////////////////////////////////////////////////
809320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian// CookieTreeSessionStoragesNode, public:
810b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
8112171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas GregorCookieTreeSessionStoragesNode::CookieTreeSessionStoragesNode()
812b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SESSION_STORAGE)) {
813b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
814b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
815b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookieTreeSessionStoragesNode::~CookieTreeSessionStoragesNode() {}
816b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
817b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookieTreeNode::DetailedInfo
818b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookieTreeSessionStoragesNode::GetDetailedInfo() const {
819b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  return DetailedInfo().Init(DetailedInfo::TYPE_SESSION_STORAGES);
820b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
82184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne
822cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor///////////////////////////////////////////////////////////////////////////////
82384bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne// CookieTreeIndexedDBsNode, public:
82484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne
825ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean HuntCookieTreeIndexedDBsNode::CookieTreeIndexedDBsNode()
826d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_INDEXED_DBS)) {
827837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor}
828837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor
829cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas GregorCookieTreeIndexedDBsNode::~CookieTreeIndexedDBsNode() {}
830a126651270acf17c434f60f86a3ab3687f87813aDouglas Gregor
831a126651270acf17c434f60f86a3ab3687f87813aDouglas GregorCookieTreeNode::DetailedInfo
8322171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas GregorCookieTreeIndexedDBsNode::GetDetailedInfo() const {
8332171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor  return DetailedInfo().Init(DetailedInfo::TYPE_INDEXED_DBS);
834cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor}
835a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor
836a8235d6c4093cd38dcf742909651f867de62e55bDouglas Gregor///////////////////////////////////////////////////////////////////////////////
8372171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor// CookieTreeFileSystemsNode, public:
838b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
8392f4efd10c805cb779618c1a22a35eb07b5043c4eChris LattnerCookieTreeFileSystemsNode::CookieTreeFileSystemsNode()
840b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_FILE_SYSTEMS)) {
841b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
842b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
843f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler CarruthCookieTreeFileSystemsNode::~CookieTreeFileSystemsNode() {}
8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
845b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeNode::DetailedInfo
8462f4efd10c805cb779618c1a22a35eb07b5043c4eChris LattnerCookieTreeFileSystemsNode::GetDetailedInfo() const {
847b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  return DetailedInfo().Init(DetailedInfo::TYPE_FILE_SYSTEMS);
848b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
849b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
850b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor///////////////////////////////////////////////////////////////////////////////
85161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor// CookieTreeChannelIDsNode, public:
85261d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor
853b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeChannelIDsNode::CookieTreeChannelIDsNode()
854b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    : CookieTreeNode(
855b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        l10n_util::GetStringUTF16(IDS_COOKIES_CHANNEL_IDS)) {
856b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
857b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
858b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeChannelIDsNode::~CookieTreeChannelIDsNode() {}
859b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
860b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeNode::DetailedInfo
861b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookieTreeChannelIDsNode::GetDetailedInfo() const {
862b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  return DetailedInfo().Init(DetailedInfo::TYPE_CHANNEL_IDS);
863b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
864b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
865b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnervoid CookieTreeNode::AddChildSortedByTitle(CookieTreeNode* new_child) {
866b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  DCHECK(new_child);
867b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  std::vector<CookieTreeNode*>::iterator iter =
868b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      std::lower_bound(children().begin(), children().end(), new_child,
869b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       NodeTitleComparator());
870b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  GetModel()->Add(this, new_child, iter - children().begin());
871b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
872b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
873a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCall///////////////////////////////////////////////////////////////////////////////
874d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff// CookieTreeServiceWorkersNode, public:
875b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
876b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookieTreeServiceWorkersNode::CookieTreeServiceWorkersNode()
877b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SERVICE_WORKERS)) {
878b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
879b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
880b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookieTreeServiceWorkersNode::~CookieTreeServiceWorkersNode() {
881b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
882b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
883b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookieTreeNode::DetailedInfo CookieTreeServiceWorkersNode::GetDetailedInfo()
884b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    const {
885b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  return DetailedInfo().Init(DetailedInfo::TYPE_SERVICE_WORKERS);
886b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
887b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
888b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor///////////////////////////////////////////////////////////////////////////////
889b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor// CookieTreeFlashLSONode
890b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanCookieTreeFlashLSONode::CookieTreeFlashLSONode(
8910ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    const std::string& domain)
8920ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    : domain_(domain) {}
8930ff8cda4442cff571aba1be91dd16f64a0bf16aaChris LattnerCookieTreeFlashLSONode::~CookieTreeFlashLSONode() {}
8940ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8950ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattnervoid CookieTreeFlashLSONode::DeleteStoredObjects() {
8960ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  // We are one level below the host node.
8970ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  CookieTreeHostNode* host = static_cast<CookieTreeHostNode*>(parent());
8980ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  CHECK_EQ(host->GetDetailedInfo().node_type,
8990ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner           CookieTreeNode::DetailedInfo::TYPE_HOST);
9000ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  LocalDataContainer* container = GetModel()->data_container();
9010ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  container->flash_lso_helper_->DeleteFlashLSOsForSite(domain_);
9020ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner}
9030ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
9040ff8cda4442cff571aba1be91dd16f64a0bf16aaChris LattnerCookieTreeNode::DetailedInfo CookieTreeFlashLSONode::GetDetailedInfo() const {
9050ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  return DetailedInfo().InitFlashLSO(domain_);
9060ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner}
907b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
908b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner///////////////////////////////////////////////////////////////////////////////
9090ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner// ScopedBatchUpdateNotifier
910b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerCookiesTreeModel::ScopedBatchUpdateNotifier::ScopedBatchUpdateNotifier(
9110ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  CookiesTreeModel* model, CookieTreeNode* node)
9120ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      : model_(model), node_(node), batch_in_progress_(false) {
9130ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner}
9140ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
915b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookiesTreeModel::ScopedBatchUpdateNotifier::~ScopedBatchUpdateNotifier() {
916b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  if (batch_in_progress_) {
917b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    model_->NotifyObserverTreeNodeChanged(node_);
918b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    model_->NotifyObserverEndBatch();
919b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  }
920b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
921b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
922b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregorvoid CookiesTreeModel::ScopedBatchUpdateNotifier::StartBatchUpdate() {
923b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  if (!batch_in_progress_) {
924b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    model_->NotifyObserverBeginBatch();
925b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    batch_in_progress_ = true;
926b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  }
927b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
928b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
929b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor///////////////////////////////////////////////////////////////////////////////
930b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor// CookiesTreeModel, public:
931b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorCookiesTreeModel::CookiesTreeModel(
932b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    LocalDataContainer* data_container,
933b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    ExtensionSpecialStoragePolicy* special_storage_policy,
934b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    bool group_by_cookie_source)
935b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    : ui::TreeNodeModel<CookieTreeNode>(new CookieTreeRootNode(this)),
936b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      data_container_(data_container),
937b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#if defined(ENABLE_EXTENSIONS)
938b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      special_storage_policy_(special_storage_policy),
939b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#endif
940b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      group_by_cookie_source_(group_by_cookie_source),
941b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      batch_update_(0) {
942b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  data_container_->Init(this);
943a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor}
944a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor
945a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas GregorCookiesTreeModel::~CookiesTreeModel() {
9464800a5c79023271408af49797e09be32aca93232Douglas Gregor}
947f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
9484800a5c79023271408af49797e09be32aca93232Douglas Gregor///////////////////////////////////////////////////////////////////////////////
9494800a5c79023271408af49797e09be32aca93232Douglas Gregor// CookiesTreeModel, TreeModel methods (public):
9504800a5c79023271408af49797e09be32aca93232Douglas Gregor
951b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner// TreeModel methods:
952b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner// Returns the set of icons for the nodes in the tree. You only need override
953b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner// this if you don't want to use the default folder icons.
954b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnervoid CookiesTreeModel::GetIcons(std::vector<gfx::ImageSkia>* icons) {
955b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  icons->push_back(*ResourceBundle::GetSharedInstance().GetNativeImageNamed(
956e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      IDR_DEFAULT_FAVICON).ToImageSkia());
957e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  icons->push_back(*ResourceBundle::GetSharedInstance().GetNativeImageNamed(
9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      IDR_COOKIE_ICON).ToImageSkia());
959e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  icons->push_back(*ResourceBundle::GetSharedInstance().GetNativeImageNamed(
960e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      IDR_COOKIE_STORAGE_ICON).ToImageSkia());
961e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor}
962e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
963e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor// Returns the index of the icon to use for |node|. Return -1 to use the
964e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor// default icon. The index is relative to the list of icons returned from
965e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor// GetIcons.
9661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpint CookiesTreeModel::GetIconIndex(ui::TreeModelNode* node) {
967832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor  CookieTreeNode* ct_node = static_cast<CookieTreeNode*>(node);
968e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  switch (ct_node->GetDetailedInfo().node_type) {
9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case CookieTreeNode::DetailedInfo::TYPE_HOST:
970832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor      return ORIGIN;
971e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_COOKIE:
9721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return COOKIE;
973e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_DATABASE:
974e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      return DATABASE;
975832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE:
976e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      return DATABASE;  // close enough
977e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_SESSION_STORAGE:
9781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return DATABASE;  // ditto
979e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_APPCACHE:
980e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      return DATABASE;  // ditto
981e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB:
9821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return DATABASE;  // ditto
983e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM:
984e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      return DATABASE;  // ditto
985e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_QUOTA:
986e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      return -1;
987e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_CHANNEL_ID:
9881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return COOKIE;  // It's kinda like a cookie?
989e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    case CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKER:
990e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      return DATABASE;  // Just like appcache
991b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    default:
9921d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor      break;
993bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  }
994bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  return -1;
9951d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor}
9962bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor
9977ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregorvoid CookiesTreeModel::DeleteAllStoredObjects() {
9987ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  NotifyObserverBeginBatch();
9991d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  CookieTreeNode* root = GetRoot();
1000e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  root->DeleteStoredObjects();
10017ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  int num_children = root->child_count();
10027ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  for (int i = num_children - 1; i >= 0; --i)
10037ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor    delete Remove(root, root->GetChild(i));
10047ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  NotifyObserverTreeNodeChanged(root);
10057ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  NotifyObserverEndBatch();
10067ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor}
10077ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor
10087ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregorvoid CookiesTreeModel::DeleteCookieNode(CookieTreeNode* cookie_node) {
10097ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  if (cookie_node == GetRoot())
10107ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor    return;
10117ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  cookie_node->DeleteStoredObjects();
10128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  CookieTreeNode* parent_node = cookie_node->parent();
10138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  delete Remove(parent_node, cookie_node);
1014e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  if (parent_node->empty())
1015e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    DeleteCookieNode(parent_node);
1016832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor}
1017bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis
10187ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregorvoid CookiesTreeModel::UpdateSearchResults(const base::string16& filter) {
10197ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  CookieTreeNode* root = GetRoot();
1020e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor  ScopedBatchUpdateNotifier notifier(this, root);
10211d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  int num_children = root->child_count();
1022e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor  notifier.StartBatchUpdate();
1023e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor  for (int i = num_children - 1; i >= 0; --i)
1024cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko    delete Remove(root, root->GetChild(i));
1025e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor
102610bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateCookieInfoWithFilter(data_container(), &notifier, filter);
102710bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateDatabaseInfoWithFilter(data_container(), &notifier, filter);
102810bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateLocalStorageInfoWithFilter(data_container(), &notifier, filter);
102910bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateSessionStorageInfoWithFilter(data_container(), &notifier, filter);
103010bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateAppCacheInfoWithFilter(data_container(), &notifier, filter);
103110bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateIndexedDBInfoWithFilter(data_container(), &notifier, filter);
103210bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateFileSystemInfoWithFilter(data_container(), &notifier, filter);
103310bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateQuotaInfoWithFilter(data_container(), &notifier, filter);
1034958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis  PopulateChannelIDInfoWithFilter(data_container(), &notifier, filter);
103510bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor  PopulateServiceWorkerUsageInfoWithFilter(data_container(), &notifier, filter);
103610bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor}
103710bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor
103810bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor#if defined(ENABLE_EXTENSIONS)
103910bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregorconst extensions::ExtensionSet* CookiesTreeModel::ExtensionsProtectingNode(
1040e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor    const CookieTreeNode& cookie_node) {
1041e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor  if (!special_storage_policy_.get())
10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return NULL;
10431d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor
10441d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  CookieTreeNode::DetailedInfo info = cookie_node.GetDetailedInfo();
10451d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor
10461d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  if (!TypeIsProtected(info.node_type))
10471d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor    return NULL;
10481d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor
10491d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  DCHECK(!info.origin.is_empty());
10501d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  return special_storage_policy_->ExtensionsProtectingOrigin(info.origin);
10511d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor}
10521d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor#endif
10531d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor
10541d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregorvoid CookiesTreeModel::AddCookiesTreeObserver(Observer* observer) {
10551d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  cookies_observer_list_.AddObserver(observer);
10561d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  // Call super so that TreeNodeModel can notify, too.
10571d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor  ui::TreeNodeModel<CookieTreeNode>::AddObserver(observer);
10581d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor}
1059ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor
1060ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregorvoid CookiesTreeModel::RemoveCookiesTreeObserver(Observer* observer) {
10617ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  cookies_observer_list_.RemoveObserver(observer);
10627ae467f02b0f2ba3897ee03e0d011433789b5434Douglas Gregor  // Call super so that TreeNodeModel doesn't have dead pointers.
1063ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor  ui::TreeNodeModel<CookieTreeNode>::RemoveObserver(observer);
1064ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor}
1065ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor
1066ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregorvoid CookiesTreeModel::PopulateAppCacheInfo(LocalDataContainer* container) {
1067ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
1068ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor  PopulateAppCacheInfoWithFilter(container, &notifier, base::string16());
1069ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor}
1070ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor
1071ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregorvoid CookiesTreeModel::PopulateCookieInfo(LocalDataContainer* container) {
1072ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
1073ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor  PopulateCookieInfoWithFilter(container, &notifier, base::string16());
1074ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor}
1075ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor
1076ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregorvoid CookiesTreeModel::PopulateDatabaseInfo(LocalDataContainer* container) {
1077ee097c1a3f5e02605dd585c0a9bf22976f09ccc2Douglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
10785f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor  PopulateDatabaseInfoWithFilter(container, &notifier, base::string16());
10795f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor}
10805f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor
10815f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregorvoid CookiesTreeModel::PopulateLocalStorageInfo(LocalDataContainer* container) {
10825f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
10835f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor  PopulateLocalStorageInfoWithFilter(container, &notifier, base::string16());
10845f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor}
10855f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor
10865f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregorvoid CookiesTreeModel::PopulateSessionStorageInfo(
10875f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor      LocalDataContainer* container) {
10885f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
10895f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor  PopulateSessionStorageInfoWithFilter(container, &notifier, base::string16());
10905f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor}
10915f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregor
10925f3d8224af99ad0d9107601c0c31b74693371cc1Douglas Gregorvoid CookiesTreeModel::PopulateIndexedDBInfo(LocalDataContainer* container) {
10931b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
10941b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor  PopulateIndexedDBInfoWithFilter(container, &notifier, base::string16());
10951b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor}
10961b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor
10971b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregorvoid CookiesTreeModel::PopulateFileSystemInfo(LocalDataContainer* container) {
10981b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
10991b2c3c0884e917ae5d59edde7d93b2af33c6a1b6Douglas Gregor  PopulateFileSystemInfoWithFilter(container, &notifier, base::string16());
1100bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor}
1101bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor
1102bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregorvoid CookiesTreeModel::PopulateQuotaInfo(LocalDataContainer* container) {
1103bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
1104bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  PopulateQuotaInfoWithFilter(container, &notifier, base::string16());
1105bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor}
1106bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor
1107bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregorvoid CookiesTreeModel::PopulateChannelIDInfo(
1108bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor      LocalDataContainer* container) {
1109bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
1110bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  PopulateChannelIDInfoWithFilter(container, &notifier, base::string16());
1111bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor}
1112bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor
1113bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregorvoid CookiesTreeModel::PopulateServiceWorkerUsageInfo(
1114bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor    LocalDataContainer* container) {
1115bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
1116bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  PopulateServiceWorkerUsageInfoWithFilter(
1117bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor      container, &notifier, base::string16());
1118bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor}
1119bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor
1120bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregorvoid CookiesTreeModel::PopulateFlashLSOInfo(
1121bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor      LocalDataContainer* container) {
1122bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  ScopedBatchUpdateNotifier notifier(this, GetRoot());
1123bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  PopulateFlashLSOInfoWithFilter(container, &notifier, base::string16());
1124bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor}
1125bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor
1126bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregorvoid CookiesTreeModel::PopulateAppCacheInfoWithFilter(
1127bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor    LocalDataContainer* container,
1128bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor    ScopedBatchUpdateNotifier* notifier,
1129bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor    const base::string16& filter) {
1130bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  using content::AppCacheInfo;
1131bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  typedef std::map<GURL, std::list<AppCacheInfo> > InfoByOrigin;
1132bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1133bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor
1134bbf38319edd4eddc55ec273934e990d7e84991deDouglas Gregor  if (container->appcache_info_.empty())
1135a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor    return;
1136a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor
1137a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor  notifier->StartBatchUpdate();
1138a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor  for (InfoByOrigin::iterator origin = container->appcache_info_.begin();
1139a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor       origin != container->appcache_info_.end(); ++origin) {
1140a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor    base::string16 host_node_name = base::UTF8ToUTF16(origin->first.host());
1141a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor    if (filter.empty() ||
1142a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor        (host_node_name.find(filter) != base::string16::npos)) {
1143a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin->first);
1144a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor      CookieTreeAppCachesNode* appcaches_node =
1145a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor          host_node->GetOrCreateAppCachesNode();
1146a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor
1147a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor      for (std::list<AppCacheInfo>::iterator info = origin->second.begin();
1148a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor           info != origin->second.end(); ++info) {
1149a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor        appcaches_node->AddAppCacheNode(
1150a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor            new CookieTreeAppCacheNode(origin->first, info));
1151a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor      }
1152a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor    }
1153a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor  }
1154a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor}
1155a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor
11564c0c7e86645dfa1719d17d70e009ab49347aba62Douglas Gregorvoid CookiesTreeModel::PopulateCookieInfoWithFilter(
1157a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor    LocalDataContainer* container,
1158a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor    ScopedBatchUpdateNotifier* notifier,
1159a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor    const base::string16& filter) {
1160a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1161a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor
116231d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor  notifier->StartBatchUpdate();
1163b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  for (CookieList::iterator it = container->cookie_list_.begin();
1164b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor       it != container->cookie_list_.end(); ++it) {
1165b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    std::string source_string = it->Source();
116639c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor    if (source_string.empty() || !group_by_cookie_source_) {
116739c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor      std::string domain = it->Domain();
1168b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      if (domain.length() > 1 && domain[0] == '.')
1169b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor        domain = domain.substr(1);
1170b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
1171f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith      // We treat secure cookies just the same as normal ones.
11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      source_string = std::string(url::kHttpScheme) +
1173fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer          url::kStandardSchemeSeparator + domain + "/";
1174b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    }
1175aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam
11761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    GURL source(source_string);
1177e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    if (filter.empty() || (CookieTreeHostNode::TitleForUrl(source)
1178a71a7d8a1ce4474e7bdb680658fb58b6caf391d3Douglas Gregor                               .find(filter) != base::string16::npos)) {
117939c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(source);
118039c497b6d5e99acecbe03ee173249ee21933e855Douglas Gregor      CookieTreeCookiesNode* cookies_node =
1181ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar          host_node->GetOrCreateCookiesNode();
1182b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      CookieTreeCookieNode* new_cookie = new CookieTreeCookieNode(it);
118311a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam      cookies_node->AddCookieNode(new_cookie);
1184992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis    }
1185992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis  }
1186992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis}
1187992d91742129c1f77563df0b3d0a40b36fd13e3eArgyrios Kyrtzidis
11888e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidisvoid CookiesTreeModel::PopulateDatabaseInfoWithFilter(
11898e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    LocalDataContainer* container,
11908e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    ScopedBatchUpdateNotifier* notifier,
11918e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    const base::string16& filter) {
11928e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
11938e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
11948e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  if (container->database_info_list_.empty())
1195f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    return;
11968e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
11978e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  notifier->StartBatchUpdate();
11988e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  for (DatabaseInfoList::iterator database_info =
11998e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis           container->database_info_list_.begin();
12008e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis       database_info != container->database_info_list_.end();
12018e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis       ++database_info) {
12028e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    GURL origin(database_info->identifier.ToOrigin());
12038e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
12048e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    if (filter.empty() || (CookieTreeHostNode::TitleForUrl(origin)
1205745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor                               .find(filter) != base::string16::npos)) {
1206745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin);
1207745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      CookieTreeDatabasesNode* databases_node =
1208745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor          host_node->GetOrCreateDatabasesNode();
1209745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      databases_node->AddDatabaseNode(
1210745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor          new CookieTreeDatabaseNode(database_info));
1211745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    }
1212745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  }
1213745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor}
1214745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor
1215745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregorvoid CookiesTreeModel::PopulateLocalStorageInfoWithFilter(
1216745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    LocalDataContainer* container,
1217a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor    ScopedBatchUpdateNotifier* notifier,
1218745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    const base::string16& filter) {
1219745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1220a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor
1221745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  if (container->local_storage_info_list_.empty())
1222745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    return;
1223745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor
1224745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  notifier->StartBatchUpdate();
1225745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  for (LocalStorageInfoList::iterator local_storage_info =
1226745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor           container->local_storage_info_list_.begin();
1227745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor       local_storage_info != container->local_storage_info_list_.end();
1228745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor       ++local_storage_info) {
1229bacc2c543c2236c5add893fabd8ecb798c1cdd76NAKAMURA Takumi    const GURL& origin(local_storage_info->origin_url);
1230745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor
1231745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    if (filter.empty() || (CookieTreeHostNode::TitleForUrl(origin)
1232745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor                               .find(filter) != std::string::npos)) {
1233745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin);
1234745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      CookieTreeLocalStoragesNode* local_storages_node =
1235a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor          host_node->GetOrCreateLocalStoragesNode();
1236745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      local_storages_node->AddLocalStorageNode(
1237745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor          new CookieTreeLocalStorageNode(local_storage_info));
1238a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis    }
1239a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis  }
1240a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis}
1241a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis
1242a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregorvoid CookiesTreeModel::PopulateSessionStorageInfoWithFilter(
1243a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor    LocalDataContainer* container,
1244a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis    ScopedBatchUpdateNotifier* notifier,
1245a89b618a04409c93b3b3c56d606a97a317567436Argyrios Kyrtzidis    const base::string16& filter) {
1246a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1247745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor
1248745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  if (container->session_storage_info_list_.empty())
1249a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor    return;
1250745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor
1251745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  notifier->StartBatchUpdate();
1252745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  for (LocalStorageInfoList::iterator session_storage_info =
1253745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor           container->session_storage_info_list_.begin();
1254745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor       session_storage_info != container->session_storage_info_list_.end();
1255a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor       ++session_storage_info) {
1256a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor    const GURL& origin = session_storage_info->origin_url;
1257a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor
1258745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    if (filter.empty() || (CookieTreeHostNode::TitleForUrl(origin)
1259745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor                               .find(filter) != base::string16::npos)) {
1260745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin);
1261745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      CookieTreeSessionStoragesNode* session_storages_node =
1262745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor          host_node->GetOrCreateSessionStoragesNode();
1263745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor      session_storages_node->AddSessionStorageNode(
1264745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor          new CookieTreeSessionStorageNode(session_storage_info));
1265745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    }
1266745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  }
1267745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor}
1268745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor
1269745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregorvoid CookiesTreeModel::PopulateIndexedDBInfoWithFilter(
1270745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    LocalDataContainer* container,
1271745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    ScopedBatchUpdateNotifier* notifier,
1272745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor    const base::string16& filter) {
1273745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1274745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor
1275745e6f168d0276c15fb72f3d90e3d93d60282b1bDouglas Gregor  if (container->indexed_db_info_list_.empty())
12761d9d9898ce2b338314161d92f39561a09a2a8b6fDouglas Gregor    return;
1277a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor
1278a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor  notifier->StartBatchUpdate();
1279a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor  for (IndexedDBInfoList::iterator indexed_db_info =
1280a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor           container->indexed_db_info_list_.begin();
1281a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor       indexed_db_info != container->indexed_db_info_list_.end();
1282a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor       ++indexed_db_info) {
1283a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor    const GURL& origin = indexed_db_info->origin_;
1284a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor
1285a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor    if (filter.empty() || (CookieTreeHostNode::TitleForUrl(origin)
1286a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor                               .find(filter) != base::string16::npos)) {
1287a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin);
1288a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor      CookieTreeIndexedDBsNode* indexed_dbs_node =
1289a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor          host_node->GetOrCreateIndexedDBsNode();
12900a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      indexed_dbs_node->AddIndexedDBNode(
12910a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor          new CookieTreeIndexedDBNode(indexed_db_info));
129214f79002e58556798e86168c63e48d533287eda5Douglas Gregor    }
12934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
12944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
12954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
12964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorvoid CookiesTreeModel::PopulateChannelIDInfoWithFilter(
12974fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    LocalDataContainer* container,
12983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    ScopedBatchUpdateNotifier* notifier,
12994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    const base::string16& filter) {
13004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
13014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
13021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (container->channel_id_list_.empty())
130374e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner    return;
130474e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner
13054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  notifier->StartBatchUpdate();
13064fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  for (ChannelIDList::iterator channel_id_info =
13072596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar           container->channel_id_list_.begin();
13084fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       channel_id_info != container->channel_id_list_.end();
13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump       ++channel_id_info) {
13101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    GURL origin(channel_id_info->server_identifier());
13115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    if (!origin.is_valid()) {
13124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      // Channel ID.  Make a valid URL to satisfy the
13134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      // CookieTreeRootNode::GetOrCreateHostNode interface.
13144fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      origin = GURL(std::string(url::kHttpsScheme) +
131574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner          url::kStandardSchemeSeparator +
13164fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor          channel_id_info->server_identifier() + "/");
13174fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    }
13184fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    base::string16 title = CookieTreeHostNode::TitleForUrl(origin);
13191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (filter.empty() || title.find(filter) != base::string16::npos) {
13205f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin);
13214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      CookieTreeChannelIDsNode* channel_ids_node =
13224fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor          host_node->GetOrCreateChannelIDsNode();
13231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      channel_ids_node->AddChannelIDNode(
13245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          new CookieTreeChannelIDNode(channel_id_info));
13254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    }
13264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
13274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
13281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
132974e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattnervoid CookiesTreeModel::PopulateServiceWorkerUsageInfoWithFilter(
133074e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner    LocalDataContainer* container,
133174e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner    ScopedBatchUpdateNotifier* notifier,
133274e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner    const base::string16& filter) {
133374e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
13344fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
13354fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  if (container->service_worker_info_list_.empty())
13364fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    return;
13374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
13384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  notifier->StartBatchUpdate();
13394fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  for (ServiceWorkerUsageInfoList::iterator service_worker_info =
13404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor           container->service_worker_info_list_.begin();
134114f79002e58556798e86168c63e48d533287eda5Douglas Gregor       service_worker_info != container->service_worker_info_list_.end();
134214f79002e58556798e86168c63e48d533287eda5Douglas Gregor       ++service_worker_info) {
134314f79002e58556798e86168c63e48d533287eda5Douglas Gregor    const GURL& origin = service_worker_info->origin;
134414f79002e58556798e86168c63e48d533287eda5Douglas Gregor
134514f79002e58556798e86168c63e48d533287eda5Douglas Gregor    if (filter.empty() || (CookieTreeHostNode::TitleForUrl(origin)
1346c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor                               .find(filter) != base::string16::npos)) {
134714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin);
134814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      CookieTreeServiceWorkersNode* service_workers_node =
13498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl          host_node->GetOrCreateServiceWorkersNode();
135014f79002e58556798e86168c63e48d533287eda5Douglas Gregor      service_workers_node->AddServiceWorkerNode(
135114f79002e58556798e86168c63e48d533287eda5Douglas Gregor          new CookieTreeServiceWorkerNode(service_worker_info));
135214f79002e58556798e86168c63e48d533287eda5Douglas Gregor    }
135314f79002e58556798e86168c63e48d533287eda5Douglas Gregor  }
13542d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor}
1355a930dc9b46572cb6e5bb54f3d724e8fe23a6b66eDouglas Gregor
1356d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidisvoid CookiesTreeModel::PopulateFileSystemInfoWithFilter(
135710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis    LocalDataContainer* container,
135810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis    ScopedBatchUpdateNotifier* notifier,
1359c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor    const base::string16& filter) {
136014f79002e58556798e86168c63e48d533287eda5Douglas Gregor  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
136114f79002e58556798e86168c63e48d533287eda5Douglas Gregor
136214f79002e58556798e86168c63e48d533287eda5Douglas Gregor  if (container->file_system_info_list_.empty())
136314f79002e58556798e86168c63e48d533287eda5Douglas Gregor    return;
1364c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
136514f79002e58556798e86168c63e48d533287eda5Douglas Gregor  notifier->StartBatchUpdate();
136614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  for (FileSystemInfoList::iterator file_system_info =
13678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl           container->file_system_info_list_.begin();
136814f79002e58556798e86168c63e48d533287eda5Douglas Gregor       file_system_info != container->file_system_info_list_.end();
136914f79002e58556798e86168c63e48d533287eda5Douglas Gregor       ++file_system_info) {
137014f79002e58556798e86168c63e48d533287eda5Douglas Gregor    GURL origin(file_system_info->origin);
137114f79002e58556798e86168c63e48d533287eda5Douglas Gregor
137214f79002e58556798e86168c63e48d533287eda5Douglas Gregor    if (filter.empty() || (CookieTreeHostNode::TitleForUrl(origin)
1373c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor                               .find(filter) != base::string16::npos)) {
137414f79002e58556798e86168c63e48d533287eda5Douglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin);
137514f79002e58556798e86168c63e48d533287eda5Douglas Gregor      CookieTreeFileSystemsNode* file_systems_node =
137614f79002e58556798e86168c63e48d533287eda5Douglas Gregor          host_node->GetOrCreateFileSystemsNode();
137714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      file_systems_node->AddFileSystemNode(
1378c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor          new CookieTreeFileSystemNode(file_system_info));
137914f79002e58556798e86168c63e48d533287eda5Douglas Gregor    }
138014f79002e58556798e86168c63e48d533287eda5Douglas Gregor  }
13818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
138214f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1383c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregorvoid CookiesTreeModel::PopulateQuotaInfoWithFilter(
138414f79002e58556798e86168c63e48d533287eda5Douglas Gregor    LocalDataContainer* container,
138514f79002e58556798e86168c63e48d533287eda5Douglas Gregor    ScopedBatchUpdateNotifier* notifier,
1386f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth    const base::string16& filter) {
1387f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1388f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
138914f79002e58556798e86168c63e48d533287eda5Douglas Gregor  if (container->quota_info_list_.empty())
139014f79002e58556798e86168c63e48d533287eda5Douglas Gregor    return;
1391f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
139214f79002e58556798e86168c63e48d533287eda5Douglas Gregor  notifier->StartBatchUpdate();
139314f79002e58556798e86168c63e48d533287eda5Douglas Gregor  for (QuotaInfoList::iterator quota_info = container->quota_info_list_.begin();
139414f79002e58556798e86168c63e48d533287eda5Douglas Gregor       quota_info != container->quota_info_list_.end();
139514f79002e58556798e86168c63e48d533287eda5Douglas Gregor       ++quota_info) {
1396f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor    if (filter.empty() || (base::UTF8ToUTF16(quota_info->host).find(filter) !=
1397c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor                           base::string16::npos)) {
139814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      CookieTreeHostNode* host_node =
139914f79002e58556798e86168c63e48d533287eda5Douglas Gregor          root->GetOrCreateHostNode(GURL("http://" + quota_info->host));
1400cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      host_node->UpdateOrCreateQuotaNode(quota_info);
1401cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    }
1402cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  }
1403cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1404cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1405b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregorvoid CookiesTreeModel::PopulateFlashLSOInfoWithFilter(
1406b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    LocalDataContainer* container,
1407b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    ScopedBatchUpdateNotifier* notifier,
1408b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    const base::string16& filter) {
1409cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1410facde171ae4b8926622a1bffa833732a06f1875bBenjamin Kramer
1411facde171ae4b8926622a1bffa833732a06f1875bBenjamin Kramer  if (container->flash_lso_domain_list_.empty())
1412cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    return;
1413cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1414cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string filter_utf8 = base::UTF16ToUTF8(filter);
1415cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  notifier->StartBatchUpdate();
1416cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  for (std::vector<std::string>::iterator it =
1417cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor           container->flash_lso_domain_list_.begin();
1418cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor       it != container->flash_lso_domain_list_.end(); ++it) {
1419cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    if (filter_utf8.empty() || it->find(filter_utf8) != std::string::npos) {
1420cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      // Create a fake origin for GetOrCreateHostNode().
1421cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      GURL origin("http://" + *it);
1422cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      CookieTreeHostNode* host_node = root->GetOrCreateHostNode(origin);
1423cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      host_node->GetOrCreateFlashLSONode(*it);
1424cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    }
1425cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  }
1426cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1427cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
14285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CookiesTreeModel::NotifyObserverBeginBatch() {
1429cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  // Only notify the model once if we're batching in a nested manner.
1430cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  if (batch_update_++ == 0) {
1431cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    FOR_EACH_OBSERVER(Observer,
1432b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                      cookies_observer_list_,
1433cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                      TreeModelBeginBatch(this));
1434cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  }
1435cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1436cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
14375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CookiesTreeModel::NotifyObserverEndBatch() {
1438cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  // Only notify the observers if this is the outermost call to EndBatch() if
1439cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  // called in a nested manner.
1440cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  if (--batch_update_ == 0) {
14415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    FOR_EACH_OBSERVER(Observer,
1442cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                      cookies_observer_list_,
1443cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                      TreeModelEndBatch(this));
1444cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  }
1445cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1446b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor