15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/cookies_tree_model_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/time_formatting.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/stl_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/cookies_tree_model.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/indexed_db_context.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/service_worker_context.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "net/ssl/ssl_client_cert_type.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_types.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/text/bytes_formatting.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/common/extension_set.h"
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyId[] = "id";
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyTitle[] = "title";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyIcon[] = "icon";
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyType[] = "type";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyHasChildren[] = "hasChildren";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyAppsProtectingThis[] = "appsProtectingThis";
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyName[] = "name";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyContent[] = "content";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyDomain[] = "domain";
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyPath[] = "path";
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeySendFor[] = "sendfor";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyAccessibleToScript[] = "accessibleToScript";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyDesc[] = "desc";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeySize[] = "size";
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyOrigin[] = "origin";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyManifest[] = "manifest";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyServerId[] = "serverId";
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyAccessed[] = "accessed";
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyCreated[] = "created";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyExpires[] = "expires";
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyModified[] = "modified";
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyPersistent[] = "persistent";
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyTemporary[] = "temporary";
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyTotalUsage[] = "totalUsage";
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyTemporaryUsage[] = "temporaryUsage";
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyPersistentUsage[] = "persistentUsage";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyCertType[] = "certType";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kKeyScopes[] = "scopes";
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kNegligibleUsage = 1024;  // 1KiB
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ClientCertTypeToString(net::SSLClientCertType type) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::CLIENT_CERT_RSA_SIGN:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF8(IDS_CLIENT_CERT_RSA_SIGN);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case net::CLIENT_CERT_DSS_SIGN:
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF8(IDS_CLIENT_CERT_DSS_SIGN);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::CLIENT_CERT_ECDSA_SIGN:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF8(IDS_CLIENT_CERT_ECDSA_SIGN);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return base::IntToString(type);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CookiesTreeModelUtil::CookiesTreeModelUtil() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CookiesTreeModelUtil::~CookiesTreeModelUtil() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CookiesTreeModelUtil::GetTreeNodeId(const CookieTreeNode* node) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieTreeNodeMap::const_iterator iter = node_map_.find(node);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter != node_map_.end())
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::IntToString(iter->second);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 new_id = id_map_.Add(node);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  node_map_[node] = new_id;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::IntToString(new_id);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CookiesTreeModelUtil::GetCookieTreeNodeDictionary(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CookieTreeNode& node,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* dict) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use node's address as an id for WebUI to look it up.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kKeyId, GetTreeNodeId(&node));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kKeyTitle, node.GetTitle());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBoolean(kKeyHasChildren, !node.empty());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (node.GetDetailedInfo().node_type) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_HOST: {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "origin");
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_BOOKMARK_BAR_FOLDER");
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_COOKIE: {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "cookie");
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_ICON");
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CanonicalCookie& cookie = *node.GetDetailedInfo().cookie;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyName, cookie.Name());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyContent, cookie.Value());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyDomain, cookie.Domain());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyPath, cookie.Path());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeySendFor, cookie.IsSecure() ?
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_SENDFOR_SECURE) :
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_SENDFOR_ANY));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string accessible = cookie.IsHttpOnly() ?
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_ACCESSIBLE_TO_SCRIPT_NO) :
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_ACCESSIBLE_TO_SCRIPT_YES);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyAccessibleToScript, accessible);
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyCreated, base::UTF16ToUTF8(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeFormatFriendlyDateAndTime(cookie.CreationDate())));
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyExpires, cookie.IsPersistent() ? base::UTF16ToUTF8(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeFormatFriendlyDateAndTime(cookie.ExpiryDate())) :
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_EXPIRES_SESSION));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_DATABASE: {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "database");
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON");
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const BrowsingDataDatabaseHelper::DatabaseInfo& database_info =
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *node.GetDetailedInfo().database_info;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyName, database_info.database_name.empty() ?
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringUTF8(IDS_COOKIES_WEB_DATABASE_UNNAMED_NAME) :
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          database_info.database_name);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyDesc, database_info.description);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeySize, ui::FormatBytes(database_info.size));
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyModified, base::UTF16ToUTF8(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeFormatFriendlyDateAndTime(database_info.last_modified)));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE: {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "local_storage");
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON");
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const BrowsingDataLocalStorageHelper::LocalStorageInfo&
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         local_storage_info = *node.GetDetailedInfo().local_storage_info;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyOrigin, local_storage_info.origin_url.spec());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeySize, ui::FormatBytes(local_storage_info.size));
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyModified, base::UTF16ToUTF8(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeFormatFriendlyDateAndTime(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              local_storage_info.last_modified)));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_APPCACHE: {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "app_cache");
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON");
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const content::AppCacheInfo& appcache_info =
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *node.GetDetailedInfo().appcache_info;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyManifest, appcache_info.manifest_url.spec());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeySize, ui::FormatBytes(appcache_info.size));
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyCreated, base::UTF16ToUTF8(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeFormatFriendlyDateAndTime(appcache_info.creation_time)));
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyAccessed, base::UTF16ToUTF8(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeFormatFriendlyDateAndTime(appcache_info.last_access_time)));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB: {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "indexed_db");
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON");
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const content::IndexedDBInfo& indexed_db_info =
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *node.GetDetailedInfo().indexed_db_info;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict->SetString(kKeyOrigin, indexed_db_info.origin_.spec());
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict->SetString(kKeySize, ui::FormatBytes(indexed_db_info.size_));
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyModified, base::UTF16ToUTF8(
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          base::TimeFormatFriendlyDateAndTime(indexed_db_info.last_modified_)));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM: {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "file_system");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON");
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const BrowsingDataFileSystemHelper::FileSystemInfo& file_system_info =
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *node.GetDetailedInfo().file_system_info;
21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::FileSystemType kPerm = storage::kFileSystemTypePersistent;
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::FileSystemType kTemp = storage::kFileSystemTypeTemporary;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyOrigin, file_system_info.origin.spec());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyPersistent,
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      ContainsKey(file_system_info.usage_map, kPerm) ?
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::UTF16ToUTF8(ui::FormatBytes(
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              file_system_info.usage_map.find(kPerm)->second)) :
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          l10n_util::GetStringUTF8(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              IDS_COOKIES_FILE_SYSTEM_USAGE_NONE));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyTemporary,
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      ContainsKey(file_system_info.usage_map, kTemp) ?
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::UTF16ToUTF8(ui::FormatBytes(
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              file_system_info.usage_map.find(kTemp)->second)) :
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          l10n_util::GetStringUTF8(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              IDS_COOKIES_FILE_SYSTEM_USAGE_NONE));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_QUOTA: {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "quota");
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON");
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const BrowsingDataQuotaHelper::QuotaInfo& quota_info =
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *node.GetDetailedInfo().quota_info;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (quota_info.temporary_usage + quota_info.persistent_usage <=
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kNegligibleUsage)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyOrigin, quota_info.host);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyTotalUsage,
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      base::UTF16ToUTF8(ui::FormatBytes(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          quota_info.temporary_usage +
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          quota_info.persistent_usage)));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyTemporaryUsage,
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      base::UTF16ToUTF8(ui::FormatBytes(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          quota_info.temporary_usage)));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyPersistentUsage,
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      base::UTF16ToUTF8(ui::FormatBytes(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          quota_info.persistent_usage)));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_CHANNEL_ID: {
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      dict->SetString(kKeyType, "channel_id");
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_ICON");
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const net::ChannelIDStore::ChannelID& channel_id =
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          *node.GetDetailedInfo().channel_id;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      dict->SetString(kKeyServerId, channel_id.server_identifier());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyCertType,
261bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                      ClientCertTypeToString(net::CLIENT_CERT_ECDSA_SIGN));
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyCreated, base::UTF16ToUTF8(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::TimeFormatFriendlyDateAndTime(
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              channel_id.creation_time())));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKER: {
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      dict->SetString(kKeyType, "service_worker");
2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON");
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const content::ServiceWorkerUsageInfo& service_worker_info =
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          *node.GetDetailedInfo().service_worker_info;
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      dict->SetString(kKeyOrigin, service_worker_info.origin.spec());
2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::ListValue* scopes = new base::ListValue;
2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      for (std::vector<GURL>::const_iterator it =
2776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)               service_worker_info.scopes.begin();
2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)           it != service_worker_info.scopes.end();
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)           ++it) {
2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        scopes->AppendString(it->spec());
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      dict->Set(kKeyScopes, scopes);
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CookieTreeNode::DetailedInfo::TYPE_FLASH_LSO: {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyType, "flash_lso");
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_ICON");
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyDomain, node.GetDetailedInfo().flash_lso_domain);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyIcon, "chrome://theme/IDR_BOOKMARK_BAR_FOLDER");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const extensions::ExtensionSet* protecting_apps =
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      node.GetModel()->ExtensionsProtectingNode(node);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (protecting_apps && !protecting_apps->is_empty()) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* app_infos = new base::ListValue;
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (extensions::ExtensionSet::const_iterator it = protecting_apps->begin();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != protecting_apps->end(); ++it) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::DictionaryValue* app_info = new base::DictionaryValue();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_info->SetString(kKeyId, (*it)->id());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_info->SetString(kKeyName, (*it)->name());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_infos->Append(app_info);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set(kKeyAppsProtectingThis, app_infos);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CookiesTreeModelUtil::GetChildNodeList(const CookieTreeNode* parent,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int start,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int count,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            base::ListValue* nodes) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < count; ++i) {
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CookieTreeNode* child = parent->GetChild(start + i);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetCookieTreeNodeDictionary(*child, dict.get()))
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nodes->Append(dict.release());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const CookieTreeNode* CookiesTreeModelUtil::GetTreeNodeFromPath(
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CookieTreeNode* root,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& path) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> node_ids;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitString(path, ',', &node_ids);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CookieTreeNode* child = NULL;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CookieTreeNode* parent = root;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int child_index = -1;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Validate the tree path and get the node pointer.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < node_ids.size(); ++i) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 node_id = 0;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!base::StringToInt(node_ids[i], &node_id))
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = id_map_.Lookup(node_id);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_index = parent->GetIndexOf(child);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (child_index == -1)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent = child;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return child_index >= 0 ? child : NULL;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355