1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/browsing_data/cookies_tree_model.h"
11 #include "base/bind.h"
12 #include "base/memory/linked_ptr.h"
13 #include "base/strings/string_util.h"
14 #include "base/strings/utf_string_conversions.h"
15 #include "chrome/browser/browsing_data/browsing_data_cookie_helper.h"
16 #include "chrome/browser/browsing_data/browsing_data_flash_lso_helper.h"
17 #include "chrome/browser/browsing_data/browsing_data_server_bound_cert_helper.h"
18 #include "chrome/browser/content_settings/cookie_settings.h"
19 #include "chrome/browser/extensions/extension_service.h"
20 #include "chrome/browser/extensions/extension_special_storage_policy.h"
21 #include "content/public/common/url_constants.h"
22 #include "extensions/common/extension_set.h"
23 #include "grit/generated_resources.h"
24 #include "grit/theme_resources.h"
25 #include "grit/ui_resources.h"
26 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
27 #include "net/cookies/canonical_cookie.h"
28 #include "net/url_request/url_request_context.h"
29 #include "ui/base/l10n/l10n_util.h"
30 #include "ui/base/resource/resource_bundle.h"
31 #include "ui/gfx/image/image_skia.h"
35 struct NodeTitleComparator
{
36 bool operator()(const CookieTreeNode
* lhs
, const CookieTreeNode
* rhs
) {
37 return lhs
->GetTitle() < rhs
->GetTitle();
41 // Comparison functor, for use in CookieTreeRootNode.
42 struct HostNodeComparator
{
43 bool operator()(const CookieTreeNode
* lhs
, const CookieTreeNode
* rhs
) {
44 // This comparator is only meant to compare CookieTreeHostNode types. Make
45 // sure we check this, as the static cast below is dangerous if we get the
47 CHECK_EQ(CookieTreeNode::DetailedInfo::TYPE_HOST
,
48 lhs
->GetDetailedInfo().node_type
);
49 CHECK_EQ(CookieTreeNode::DetailedInfo::TYPE_HOST
,
50 rhs
->GetDetailedInfo().node_type
);
52 const CookieTreeHostNode
* ltn
=
53 static_cast<const CookieTreeHostNode
*>(lhs
);
54 const CookieTreeHostNode
* rtn
=
55 static_cast<const CookieTreeHostNode
*>(rhs
);
57 // We want to order by registry controlled domain, so we would get
58 // google.com, ad.google.com, www.google.com,
59 // microsoft.com, ad.microsoft.com. CanonicalizeHost transforms the origins
60 // into a form like google.com.www so that string comparisons work.
61 return (ltn
->canonicalized_host() <
62 rtn
->canonicalized_host());
66 std::string
CanonicalizeHost(const GURL
& url
) {
67 // The canonicalized representation makes the registry controlled domain
68 // come first, and then adds subdomains in reverse order, e.g.
69 // 1.mail.google.com would become google.com.mail.1, and then a standard
70 // string comparison works to order hosts by registry controlled domain
71 // first. Leading dots are ignored, ".google.com" is the same as
74 if (url
.SchemeIsFile()) {
75 return std::string(content::kFileScheme
) +
76 content::kStandardSchemeSeparator
;
79 std::string host
= url
.host();
81 net::registry_controlled_domains::GetDomainAndRegistry(
83 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES
);
84 if (!retval
.length()) // Is an IP address or other special origin.
87 std::string::size_type position
= host
.rfind(retval
);
89 // The host may be the registry controlled domain, in which case fail fast.
90 if (position
== 0 || position
== std::string::npos
)
93 // If host is www.google.com, retval will contain google.com at this point.
94 // Start operating to the left of the registry controlled domain, e.g. in
95 // the www.google.com example, start at index 3.
98 // If position == 0, that means it's a dot; this will be ignored to treat
99 // ".google.com" the same as "google.com".
100 while (position
> 0) {
101 retval
+= std::string(".");
102 // Copy up to the next dot. host[position] is a dot so start after it.
103 std::string::size_type next_dot
= host
.rfind(".", position
- 1);
104 if (next_dot
== std::string::npos
) {
105 retval
+= host
.substr(0, position
);
108 retval
+= host
.substr(next_dot
+ 1, position
- (next_dot
+ 1));
114 bool TypeIsProtected(CookieTreeNode::DetailedInfo::NodeType type
) {
116 case CookieTreeNode::DetailedInfo::TYPE_COOKIE
:
118 case CookieTreeNode::DetailedInfo::TYPE_DATABASE
:
120 case CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE
:
122 case CookieTreeNode::DetailedInfo::TYPE_SESSION_STORAGE
:
124 case CookieTreeNode::DetailedInfo::TYPE_APPCACHE
:
126 case CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB
:
128 case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM
:
130 case CookieTreeNode::DetailedInfo::TYPE_QUOTA
:
132 case CookieTreeNode::DetailedInfo::TYPE_SERVER_BOUND_CERT
:
134 case CookieTreeNode::DetailedInfo::TYPE_FLASH_LSO
:
142 // This function returns the local data container associated with a leaf tree
143 // node. The app node is assumed to be 3 levels above the leaf because of the
144 // following structure:
145 // root -> origin -> storage type -> leaf node
146 LocalDataContainer
* GetLocalDataContainerForNode(CookieTreeNode
* node
) {
147 CookieTreeHostNode
* host
= static_cast<CookieTreeHostNode
*>(
148 node
->parent()->parent());
149 CHECK_EQ(host
->GetDetailedInfo().node_type
,
150 CookieTreeNode::DetailedInfo::TYPE_HOST
);
151 return node
->GetModel()->data_container();
156 CookieTreeNode::DetailedInfo::DetailedInfo()
157 : node_type(TYPE_NONE
),
160 local_storage_info(NULL
),
161 session_storage_info(NULL
),
163 indexed_db_info(NULL
),
164 file_system_info(NULL
),
166 server_bound_cert(NULL
) {}
168 CookieTreeNode::DetailedInfo::~DetailedInfo() {}
170 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::Init(
172 DCHECK_EQ(TYPE_NONE
, node_type
);
177 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitHost() {
182 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitCookie(
183 const net::CanonicalCookie
* cookie
) {
185 this->cookie
= cookie
;
189 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitDatabase(
190 const BrowsingDataDatabaseHelper::DatabaseInfo
* database_info
) {
192 this->database_info
= database_info
;
193 origin
= database_info
->identifier
.ToOrigin();
197 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitLocalStorage(
198 const BrowsingDataLocalStorageHelper::LocalStorageInfo
*
199 local_storage_info
) {
200 Init(TYPE_LOCAL_STORAGE
);
201 this->local_storage_info
= local_storage_info
;
202 origin
= local_storage_info
->origin_url
;
206 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitSessionStorage(
207 const BrowsingDataLocalStorageHelper::LocalStorageInfo
*
208 session_storage_info
) {
209 Init(TYPE_SESSION_STORAGE
);
210 this->session_storage_info
= session_storage_info
;
211 origin
= session_storage_info
->origin_url
;
215 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitAppCache(
217 const appcache::AppCacheInfo
* appcache_info
) {
219 this->appcache_info
= appcache_info
;
220 this->origin
= origin
;
224 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitIndexedDB(
225 const content::IndexedDBInfo
* indexed_db_info
) {
226 Init(TYPE_INDEXED_DB
);
227 this->indexed_db_info
= indexed_db_info
;
228 this->origin
= indexed_db_info
->origin_
;
232 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitFileSystem(
233 const BrowsingDataFileSystemHelper::FileSystemInfo
* file_system_info
) {
234 Init(TYPE_FILE_SYSTEM
);
235 this->file_system_info
= file_system_info
;
236 this->origin
= file_system_info
->origin
;
240 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitQuota(
241 const BrowsingDataQuotaHelper::QuotaInfo
* quota_info
) {
243 this->quota_info
= quota_info
;
247 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitServerBoundCert(
248 const net::ServerBoundCertStore::ServerBoundCert
* server_bound_cert
) {
249 Init(TYPE_SERVER_BOUND_CERT
);
250 this->server_bound_cert
= server_bound_cert
;
254 CookieTreeNode::DetailedInfo
& CookieTreeNode::DetailedInfo::InitFlashLSO(
255 const std::string
& flash_lso_domain
) {
256 Init(TYPE_FLASH_LSO
);
257 this->flash_lso_domain
= flash_lso_domain
;
261 ///////////////////////////////////////////////////////////////////////////////
262 // CookieTreeNode, public:
264 void CookieTreeNode::DeleteStoredObjects() {
265 std::for_each(children().begin(),
267 std::mem_fun(&CookieTreeNode::DeleteStoredObjects
));
270 CookiesTreeModel
* CookieTreeNode::GetModel() const {
272 return parent()->GetModel();
277 ///////////////////////////////////////////////////////////////////////////////
278 // CookieTreeCookieNode, public:
280 CookieTreeCookieNode::CookieTreeCookieNode(
281 std::list
<net::CanonicalCookie
>::iterator cookie
)
282 : CookieTreeNode(base::UTF8ToUTF16(cookie
->Name())),
286 CookieTreeCookieNode::~CookieTreeCookieNode() {}
288 void CookieTreeCookieNode::DeleteStoredObjects() {
289 LocalDataContainer
* container
= GetLocalDataContainerForNode(this);
291 container
->cookie_helper_
->DeleteCookie(*cookie_
);
292 container
->cookie_list_
.erase(cookie_
);
295 CookieTreeNode::DetailedInfo
CookieTreeCookieNode::GetDetailedInfo() const {
296 return DetailedInfo().InitCookie(&*cookie_
);
299 ///////////////////////////////////////////////////////////////////////////////
300 // CookieTreeAppCacheNode, public:
302 CookieTreeAppCacheNode::CookieTreeAppCacheNode(
303 const GURL
& origin_url
,
304 std::list
<appcache::AppCacheInfo
>::iterator appcache_info
)
305 : CookieTreeNode(base::UTF8ToUTF16(appcache_info
->manifest_url
.spec())),
306 origin_url_(origin_url
),
307 appcache_info_(appcache_info
) {
310 CookieTreeAppCacheNode::~CookieTreeAppCacheNode() {
313 void CookieTreeAppCacheNode::DeleteStoredObjects() {
314 LocalDataContainer
* container
= GetLocalDataContainerForNode(this);
317 DCHECK(container
->appcache_helper_
.get());
318 container
->appcache_helper_
319 ->DeleteAppCacheGroup(appcache_info_
->manifest_url
);
320 container
->appcache_info_
[origin_url_
].erase(appcache_info_
);
324 CookieTreeNode::DetailedInfo
CookieTreeAppCacheNode::GetDetailedInfo() const {
325 return DetailedInfo().InitAppCache(origin_url_
, &*appcache_info_
);
328 ///////////////////////////////////////////////////////////////////////////////
329 // CookieTreeDatabaseNode, public:
331 CookieTreeDatabaseNode::CookieTreeDatabaseNode(
332 std::list
<BrowsingDataDatabaseHelper::DatabaseInfo
>::iterator database_info
)
333 : CookieTreeNode(database_info
->database_name
.empty() ?
334 l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASE_UNNAMED_NAME
) :
335 base::UTF8ToUTF16(database_info
->database_name
)),
336 database_info_(database_info
) {
339 CookieTreeDatabaseNode::~CookieTreeDatabaseNode() {}
341 void CookieTreeDatabaseNode::DeleteStoredObjects() {
342 LocalDataContainer
* container
= GetLocalDataContainerForNode(this);
345 container
->database_helper_
->DeleteDatabase(
346 database_info_
->identifier
.ToString(), database_info_
->database_name
);
347 container
->database_info_list_
.erase(database_info_
);
351 CookieTreeNode::DetailedInfo
CookieTreeDatabaseNode::GetDetailedInfo() const {
352 return DetailedInfo().InitDatabase(&*database_info_
);
355 ///////////////////////////////////////////////////////////////////////////////
356 // CookieTreeLocalStorageNode, public:
358 CookieTreeLocalStorageNode::CookieTreeLocalStorageNode(
359 std::list
<BrowsingDataLocalStorageHelper::LocalStorageInfo
>::iterator
361 : CookieTreeNode(base::UTF8ToUTF16(local_storage_info
->origin_url
.spec())),
362 local_storage_info_(local_storage_info
) {
365 CookieTreeLocalStorageNode::~CookieTreeLocalStorageNode() {}
367 void CookieTreeLocalStorageNode::DeleteStoredObjects() {
368 LocalDataContainer
* container
= GetLocalDataContainerForNode(this);
371 container
->local_storage_helper_
->DeleteOrigin(
372 local_storage_info_
->origin_url
);
373 container
->local_storage_info_list_
.erase(local_storage_info_
);
377 CookieTreeNode::DetailedInfo
378 CookieTreeLocalStorageNode::GetDetailedInfo() const {
379 return DetailedInfo().InitLocalStorage(
380 &*local_storage_info_
);
383 ///////////////////////////////////////////////////////////////////////////////
384 // CookieTreeSessionStorageNode, public:
386 CookieTreeSessionStorageNode::CookieTreeSessionStorageNode(
387 std::list
<BrowsingDataLocalStorageHelper::LocalStorageInfo
>::iterator
388 session_storage_info
)
390 base::UTF8ToUTF16(session_storage_info
->origin_url
.spec())),
391 session_storage_info_(session_storage_info
) {
394 CookieTreeSessionStorageNode::~CookieTreeSessionStorageNode() {}
396 void CookieTreeSessionStorageNode::DeleteStoredObjects() {
397 LocalDataContainer
* container
= GetLocalDataContainerForNode(this);
400 // TODO(rsesek): There's no easy way to get the namespace_id for a session
401 // storage, nor is there an easy way to clear session storage just by
402 // origin. This is probably okay since session storage is not persistent.
403 // http://crbug.com/168996
404 container
->session_storage_info_list_
.erase(session_storage_info_
);
408 CookieTreeNode::DetailedInfo
409 CookieTreeSessionStorageNode::GetDetailedInfo() const {
410 return DetailedInfo().InitSessionStorage(&*session_storage_info_
);
413 ///////////////////////////////////////////////////////////////////////////////
414 // CookieTreeIndexedDBNode, public:
416 CookieTreeIndexedDBNode::CookieTreeIndexedDBNode(
417 std::list
<content::IndexedDBInfo
>::iterator
419 : CookieTreeNode(base::UTF8ToUTF16(
420 indexed_db_info
->origin_
.spec())),
421 indexed_db_info_(indexed_db_info
) {
424 CookieTreeIndexedDBNode::~CookieTreeIndexedDBNode() {}
426 void CookieTreeIndexedDBNode::DeleteStoredObjects() {
427 LocalDataContainer
* container
= GetLocalDataContainerForNode(this);
430 container
->indexed_db_helper_
->DeleteIndexedDB(
431 indexed_db_info_
->origin_
);
432 container
->indexed_db_info_list_
.erase(indexed_db_info_
);
436 CookieTreeNode::DetailedInfo
CookieTreeIndexedDBNode::GetDetailedInfo() const {
437 return DetailedInfo().InitIndexedDB(&*indexed_db_info_
);
440 ///////////////////////////////////////////////////////////////////////////////
441 // CookieTreeFileSystemNode, public:
443 CookieTreeFileSystemNode::CookieTreeFileSystemNode(
444 std::list
<BrowsingDataFileSystemHelper::FileSystemInfo
>::iterator
446 : CookieTreeNode(base::UTF8ToUTF16(
447 file_system_info
->origin
.spec())),
448 file_system_info_(file_system_info
) {
451 CookieTreeFileSystemNode::~CookieTreeFileSystemNode() {}
453 void CookieTreeFileSystemNode::DeleteStoredObjects() {
454 LocalDataContainer
* container
= GetLocalDataContainerForNode(this);
457 container
->file_system_helper_
->DeleteFileSystemOrigin(
458 file_system_info_
->origin
);
459 container
->file_system_info_list_
.erase(file_system_info_
);
463 CookieTreeNode::DetailedInfo
CookieTreeFileSystemNode::GetDetailedInfo() const {
464 return DetailedInfo().InitFileSystem(&*file_system_info_
);
467 ///////////////////////////////////////////////////////////////////////////////
468 // CookieTreeQuotaNode, public:
470 CookieTreeQuotaNode::CookieTreeQuotaNode(
471 std::list
<BrowsingDataQuotaHelper::QuotaInfo
>::iterator quota_info
)
472 : CookieTreeNode(base::UTF8ToUTF16(quota_info
->host
)),
473 quota_info_(quota_info
) {
476 CookieTreeQuotaNode::~CookieTreeQuotaNode() {}
478 void CookieTreeQuotaNode::DeleteStoredObjects() {
479 // Calling this function may cause unexpected over-quota state of origin.
480 // However, it'll caused no problem, just prevent usage growth of the origin.
481 LocalDataContainer
* container
= GetModel()->data_container();
484 container
->quota_helper_
->RevokeHostQuota(quota_info_
->host
);
485 container
->quota_info_list_
.erase(quota_info_
);
489 CookieTreeNode::DetailedInfo
CookieTreeQuotaNode::GetDetailedInfo() const {
490 return DetailedInfo().InitQuota(&*quota_info_
);
493 ///////////////////////////////////////////////////////////////////////////////
494 // CookieTreeServerBoundCertNode, public:
496 CookieTreeServerBoundCertNode::CookieTreeServerBoundCertNode(
497 net::ServerBoundCertStore::ServerBoundCertList::iterator cert
)
498 : CookieTreeNode(base::ASCIIToUTF16(cert
->server_identifier())),
499 server_bound_cert_(cert
) {
502 CookieTreeServerBoundCertNode::~CookieTreeServerBoundCertNode() {}
504 void CookieTreeServerBoundCertNode::DeleteStoredObjects() {
505 LocalDataContainer
* container
= GetLocalDataContainerForNode(this);
508 container
->server_bound_cert_helper_
->DeleteServerBoundCert(
509 server_bound_cert_
->server_identifier());
510 container
->server_bound_cert_list_
.erase(server_bound_cert_
);
514 CookieTreeNode::DetailedInfo
515 CookieTreeServerBoundCertNode::GetDetailedInfo() const {
516 return DetailedInfo().InitServerBoundCert(&*server_bound_cert_
);
519 ///////////////////////////////////////////////////////////////////////////////
520 // CookieTreeRootNode, public:
522 CookieTreeRootNode::CookieTreeRootNode(CookiesTreeModel
* model
)
526 CookieTreeRootNode::~CookieTreeRootNode() {}
528 CookieTreeHostNode
* CookieTreeRootNode::GetOrCreateHostNode(
530 scoped_ptr
<CookieTreeHostNode
> host_node(
531 new CookieTreeHostNode(url
));
533 // First see if there is an existing match.
534 std::vector
<CookieTreeNode
*>::iterator host_node_iterator
=
535 std::lower_bound(children().begin(), children().end(), host_node
.get(),
536 HostNodeComparator());
537 if (host_node_iterator
!= children().end() &&
538 CookieTreeHostNode::TitleForUrl(url
) ==
539 (*host_node_iterator
)->GetTitle())
540 return static_cast<CookieTreeHostNode
*>(*host_node_iterator
);
541 // Node doesn't exist, insert the new one into the (ordered) children.
543 model_
->Add(this, host_node
.get(),
544 (host_node_iterator
- children().begin()));
545 return host_node
.release();
548 CookiesTreeModel
* CookieTreeRootNode::GetModel() const {
552 CookieTreeNode::DetailedInfo
CookieTreeRootNode::GetDetailedInfo() const {
553 return DetailedInfo().Init(DetailedInfo::TYPE_ROOT
);
556 ///////////////////////////////////////////////////////////////////////////////
557 // CookieTreeHostNode, public:
560 base::string16
CookieTreeHostNode::TitleForUrl(const GURL
& url
) {
561 const std::string
file_origin_node_name(
562 std::string(content::kFileScheme
) + content::kStandardSchemeSeparator
);
563 return base::UTF8ToUTF16(url
.SchemeIsFile() ? file_origin_node_name
567 CookieTreeHostNode::CookieTreeHostNode(const GURL
& url
)
568 : CookieTreeNode(TitleForUrl(url
)),
569 cookies_child_(NULL
),
570 databases_child_(NULL
),
571 local_storages_child_(NULL
),
572 session_storages_child_(NULL
),
573 appcaches_child_(NULL
),
574 indexed_dbs_child_(NULL
),
575 file_systems_child_(NULL
),
577 server_bound_certs_child_(NULL
),
578 flash_lso_child_(NULL
),
580 canonicalized_host_(CanonicalizeHost(url
)) {}
582 CookieTreeHostNode::~CookieTreeHostNode() {}
584 const std::string
CookieTreeHostNode::GetHost() const {
585 const std::string
file_origin_node_name(
586 std::string(content::kFileScheme
) + content::kStandardSchemeSeparator
);
587 return url_
.SchemeIsFile() ? file_origin_node_name
: url_
.host();
590 CookieTreeNode::DetailedInfo
CookieTreeHostNode::GetDetailedInfo() const {
591 return DetailedInfo().InitHost();
594 CookieTreeCookiesNode
* CookieTreeHostNode::GetOrCreateCookiesNode() {
596 return cookies_child_
;
597 cookies_child_
= new CookieTreeCookiesNode
;
598 AddChildSortedByTitle(cookies_child_
);
599 return cookies_child_
;
602 CookieTreeDatabasesNode
* CookieTreeHostNode::GetOrCreateDatabasesNode() {
603 if (databases_child_
)
604 return databases_child_
;
605 databases_child_
= new CookieTreeDatabasesNode
;
606 AddChildSortedByTitle(databases_child_
);
607 return databases_child_
;
610 CookieTreeLocalStoragesNode
*
611 CookieTreeHostNode::GetOrCreateLocalStoragesNode() {
612 if (local_storages_child_
)
613 return local_storages_child_
;
614 local_storages_child_
= new CookieTreeLocalStoragesNode
;
615 AddChildSortedByTitle(local_storages_child_
);
616 return local_storages_child_
;
619 CookieTreeSessionStoragesNode
*
620 CookieTreeHostNode::GetOrCreateSessionStoragesNode() {
621 if (session_storages_child_
)
622 return session_storages_child_
;
623 session_storages_child_
= new CookieTreeSessionStoragesNode
;
624 AddChildSortedByTitle(session_storages_child_
);
625 return session_storages_child_
;
628 CookieTreeAppCachesNode
* CookieTreeHostNode::GetOrCreateAppCachesNode() {
629 if (appcaches_child_
)
630 return appcaches_child_
;
631 appcaches_child_
= new CookieTreeAppCachesNode
;
632 AddChildSortedByTitle(appcaches_child_
);
633 return appcaches_child_
;
636 CookieTreeIndexedDBsNode
* CookieTreeHostNode::GetOrCreateIndexedDBsNode() {
637 if (indexed_dbs_child_
)
638 return indexed_dbs_child_
;
639 indexed_dbs_child_
= new CookieTreeIndexedDBsNode
;
640 AddChildSortedByTitle(indexed_dbs_child_
);
641 return indexed_dbs_child_
;
644 CookieTreeFileSystemsNode
* CookieTreeHostNode::GetOrCreateFileSystemsNode() {
645 if (file_systems_child_
)
646 return file_systems_child_
;
647 file_systems_child_
= new CookieTreeFileSystemsNode
;
648 AddChildSortedByTitle(file_systems_child_
);
649 return file_systems_child_
;
652 CookieTreeQuotaNode
* CookieTreeHostNode::UpdateOrCreateQuotaNode(
653 std::list
<BrowsingDataQuotaHelper::QuotaInfo
>::iterator quota_info
) {
656 quota_child_
= new CookieTreeQuotaNode(quota_info
);
657 AddChildSortedByTitle(quota_child_
);
661 CookieTreeServerBoundCertsNode
*
662 CookieTreeHostNode::GetOrCreateServerBoundCertsNode() {
663 if (server_bound_certs_child_
)
664 return server_bound_certs_child_
;
665 server_bound_certs_child_
= new CookieTreeServerBoundCertsNode
;
666 AddChildSortedByTitle(server_bound_certs_child_
);
667 return server_bound_certs_child_
;
670 CookieTreeFlashLSONode
* CookieTreeHostNode::GetOrCreateFlashLSONode(
671 const std::string
& domain
) {
672 DCHECK_EQ(GetHost(), domain
);
673 if (flash_lso_child_
)
674 return flash_lso_child_
;
675 flash_lso_child_
= new CookieTreeFlashLSONode(domain
);
676 AddChildSortedByTitle(flash_lso_child_
);
677 return flash_lso_child_
;
680 void CookieTreeHostNode::CreateContentException(
681 CookieSettings
* cookie_settings
, ContentSetting setting
) const {
682 DCHECK(setting
== CONTENT_SETTING_ALLOW
||
683 setting
== CONTENT_SETTING_BLOCK
||
684 setting
== CONTENT_SETTING_SESSION_ONLY
);
685 if (CanCreateContentException()) {
686 cookie_settings
->ResetCookieSetting(
687 ContentSettingsPattern::FromURLNoWildcard(url_
),
688 ContentSettingsPattern::Wildcard());
689 cookie_settings
->SetCookieSetting(
690 ContentSettingsPattern::FromURL(url_
),
691 ContentSettingsPattern::Wildcard(), setting
);
695 bool CookieTreeHostNode::CanCreateContentException() const {
696 return !url_
.SchemeIsFile();
699 ///////////////////////////////////////////////////////////////////////////////
700 // CookieTreeCookiesNode, public:
702 CookieTreeCookiesNode::CookieTreeCookiesNode()
703 : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_COOKIES
)) {
706 CookieTreeCookiesNode::~CookieTreeCookiesNode() {
709 CookieTreeNode::DetailedInfo
CookieTreeCookiesNode::GetDetailedInfo() const {
710 return DetailedInfo().Init(DetailedInfo::TYPE_COOKIES
);
713 ///////////////////////////////////////////////////////////////////////////////
714 // CookieTreeAppCachesNode, public:
716 CookieTreeAppCachesNode::CookieTreeAppCachesNode()
717 : CookieTreeNode(l10n_util::GetStringUTF16(
718 IDS_COOKIES_APPLICATION_CACHES
)) {
721 CookieTreeAppCachesNode::~CookieTreeAppCachesNode() {}
723 CookieTreeNode::DetailedInfo
CookieTreeAppCachesNode::GetDetailedInfo() const {
724 return DetailedInfo().Init(DetailedInfo::TYPE_APPCACHES
);
727 ///////////////////////////////////////////////////////////////////////////////
728 // CookieTreeDatabasesNode, public:
730 CookieTreeDatabasesNode::CookieTreeDatabasesNode()
731 : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASES
)) {
734 CookieTreeDatabasesNode::~CookieTreeDatabasesNode() {}
736 CookieTreeNode::DetailedInfo
CookieTreeDatabasesNode::GetDetailedInfo() const {
737 return DetailedInfo().Init(DetailedInfo::TYPE_DATABASES
);
740 ///////////////////////////////////////////////////////////////////////////////
741 // CookieTreeLocalStoragesNode, public:
743 CookieTreeLocalStoragesNode::CookieTreeLocalStoragesNode()
744 : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_LOCAL_STORAGE
)) {
747 CookieTreeLocalStoragesNode::~CookieTreeLocalStoragesNode() {}
749 CookieTreeNode::DetailedInfo
750 CookieTreeLocalStoragesNode::GetDetailedInfo() const {
751 return DetailedInfo().Init(DetailedInfo::TYPE_LOCAL_STORAGES
);
754 ///////////////////////////////////////////////////////////////////////////////
755 // CookieTreeSessionStoragesNode, public:
757 CookieTreeSessionStoragesNode::CookieTreeSessionStoragesNode()
758 : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_SESSION_STORAGE
)) {
761 CookieTreeSessionStoragesNode::~CookieTreeSessionStoragesNode() {}
763 CookieTreeNode::DetailedInfo
764 CookieTreeSessionStoragesNode::GetDetailedInfo() const {
765 return DetailedInfo().Init(DetailedInfo::TYPE_SESSION_STORAGES
);
768 ///////////////////////////////////////////////////////////////////////////////
769 // CookieTreeIndexedDBsNode, public:
771 CookieTreeIndexedDBsNode::CookieTreeIndexedDBsNode()
772 : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_INDEXED_DBS
)) {
775 CookieTreeIndexedDBsNode::~CookieTreeIndexedDBsNode() {}
777 CookieTreeNode::DetailedInfo
778 CookieTreeIndexedDBsNode::GetDetailedInfo() const {
779 return DetailedInfo().Init(DetailedInfo::TYPE_INDEXED_DBS
);
782 ///////////////////////////////////////////////////////////////////////////////
783 // CookieTreeFileSystemsNode, public:
785 CookieTreeFileSystemsNode::CookieTreeFileSystemsNode()
786 : CookieTreeNode(l10n_util::GetStringUTF16(IDS_COOKIES_FILE_SYSTEMS
)) {
789 CookieTreeFileSystemsNode::~CookieTreeFileSystemsNode() {}
791 CookieTreeNode::DetailedInfo
792 CookieTreeFileSystemsNode::GetDetailedInfo() const {
793 return DetailedInfo().Init(DetailedInfo::TYPE_FILE_SYSTEMS
);
796 ///////////////////////////////////////////////////////////////////////////////
797 // CookieTreeServerBoundCertsNode, public:
799 CookieTreeServerBoundCertsNode::CookieTreeServerBoundCertsNode()
801 l10n_util::GetStringUTF16(IDS_COOKIES_SERVER_BOUND_CERTS
)) {
804 CookieTreeServerBoundCertsNode::~CookieTreeServerBoundCertsNode() {}
806 CookieTreeNode::DetailedInfo
807 CookieTreeServerBoundCertsNode::GetDetailedInfo() const {
808 return DetailedInfo().Init(DetailedInfo::TYPE_SERVER_BOUND_CERTS
);
811 void CookieTreeNode::AddChildSortedByTitle(CookieTreeNode
* new_child
) {
813 std::vector
<CookieTreeNode
*>::iterator iter
=
814 std::lower_bound(children().begin(), children().end(), new_child
,
815 NodeTitleComparator());
816 GetModel()->Add(this, new_child
, iter
- children().begin());
819 ///////////////////////////////////////////////////////////////////////////////
820 // CookieTreeFlashLSONode
821 CookieTreeFlashLSONode::CookieTreeFlashLSONode(
822 const std::string
& domain
)
824 CookieTreeFlashLSONode::~CookieTreeFlashLSONode() {}
826 void CookieTreeFlashLSONode::DeleteStoredObjects() {
827 // We are one level below the host node.
828 CookieTreeHostNode
* host
= static_cast<CookieTreeHostNode
*>(parent());
829 CHECK_EQ(host
->GetDetailedInfo().node_type
,
830 CookieTreeNode::DetailedInfo::TYPE_HOST
);
831 LocalDataContainer
* container
= GetModel()->data_container();
834 container
->flash_lso_helper_
->DeleteFlashLSOsForSite(domain_
);
837 CookieTreeNode::DetailedInfo
CookieTreeFlashLSONode::GetDetailedInfo() const {
838 return DetailedInfo().InitFlashLSO(domain_
);
841 ///////////////////////////////////////////////////////////////////////////////
842 // ScopedBatchUpdateNotifier
843 CookiesTreeModel::ScopedBatchUpdateNotifier::ScopedBatchUpdateNotifier(
844 CookiesTreeModel
* model
, CookieTreeNode
* node
)
845 : model_(model
), node_(node
), batch_in_progress_(false) {
848 CookiesTreeModel::ScopedBatchUpdateNotifier::~ScopedBatchUpdateNotifier() {
849 if (batch_in_progress_
) {
850 model_
->NotifyObserverTreeNodeChanged(node_
);
851 model_
->NotifyObserverEndBatch();
855 void CookiesTreeModel::ScopedBatchUpdateNotifier::StartBatchUpdate() {
856 if (!batch_in_progress_
) {
857 model_
->NotifyObserverBeginBatch();
858 batch_in_progress_
= true;
862 ///////////////////////////////////////////////////////////////////////////////
863 // CookiesTreeModel, public:
864 CookiesTreeModel::CookiesTreeModel(
865 LocalDataContainer
* data_container
,
866 ExtensionSpecialStoragePolicy
* special_storage_policy
,
867 bool group_by_cookie_source
)
868 : ui::TreeNodeModel
<CookieTreeNode
>(new CookieTreeRootNode(this)),
869 data_container_(data_container
),
870 special_storage_policy_(special_storage_policy
),
871 group_by_cookie_source_(group_by_cookie_source
),
873 data_container_
->Init(this);
876 CookiesTreeModel::~CookiesTreeModel() {
879 ///////////////////////////////////////////////////////////////////////////////
880 // CookiesTreeModel, TreeModel methods (public):
882 // TreeModel methods:
883 // Returns the set of icons for the nodes in the tree. You only need override
884 // this if you don't want to use the default folder icons.
885 void CookiesTreeModel::GetIcons(std::vector
<gfx::ImageSkia
>* icons
) {
886 icons
->push_back(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
887 IDR_DEFAULT_FAVICON
));
888 icons
->push_back(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
890 icons
->push_back(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
891 IDR_COOKIE_STORAGE_ICON
));
894 // Returns the index of the icon to use for |node|. Return -1 to use the
895 // default icon. The index is relative to the list of icons returned from
897 int CookiesTreeModel::GetIconIndex(ui::TreeModelNode
* node
) {
898 CookieTreeNode
* ct_node
= static_cast<CookieTreeNode
*>(node
);
899 switch (ct_node
->GetDetailedInfo().node_type
) {
900 case CookieTreeNode::DetailedInfo::TYPE_HOST
:
902 case CookieTreeNode::DetailedInfo::TYPE_COOKIE
:
904 case CookieTreeNode::DetailedInfo::TYPE_DATABASE
:
906 case CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE
:
907 return DATABASE
; // close enough
908 case CookieTreeNode::DetailedInfo::TYPE_SESSION_STORAGE
:
909 return DATABASE
; // ditto
910 case CookieTreeNode::DetailedInfo::TYPE_APPCACHE
:
911 return DATABASE
; // ditto
912 case CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB
:
913 return DATABASE
; // ditto
914 case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM
:
915 return DATABASE
; // ditto
916 case CookieTreeNode::DetailedInfo::TYPE_QUOTA
:
918 case CookieTreeNode::DetailedInfo::TYPE_SERVER_BOUND_CERT
:
919 return COOKIE
; // It's kinda like a cookie?
926 void CookiesTreeModel::DeleteAllStoredObjects() {
927 NotifyObserverBeginBatch();
928 CookieTreeNode
* root
= GetRoot();
929 root
->DeleteStoredObjects();
930 int num_children
= root
->child_count();
931 for (int i
= num_children
- 1; i
>= 0; --i
)
932 delete Remove(root
, root
->GetChild(i
));
933 NotifyObserverTreeNodeChanged(root
);
934 NotifyObserverEndBatch();
937 void CookiesTreeModel::DeleteCookieNode(CookieTreeNode
* cookie_node
) {
938 if (cookie_node
== GetRoot())
940 cookie_node
->DeleteStoredObjects();
941 CookieTreeNode
* parent_node
= cookie_node
->parent();
942 delete Remove(parent_node
, cookie_node
);
943 if (parent_node
->empty())
944 DeleteCookieNode(parent_node
);
947 void CookiesTreeModel::UpdateSearchResults(const base::string16
& filter
) {
948 CookieTreeNode
* root
= GetRoot();
949 ScopedBatchUpdateNotifier
notifier(this, root
);
950 int num_children
= root
->child_count();
951 notifier
.StartBatchUpdate();
952 for (int i
= num_children
- 1; i
>= 0; --i
)
953 delete Remove(root
, root
->GetChild(i
));
955 PopulateCookieInfoWithFilter(data_container(), ¬ifier
, filter
);
956 PopulateDatabaseInfoWithFilter(data_container(), ¬ifier
, filter
);
957 PopulateLocalStorageInfoWithFilter(data_container(), ¬ifier
, filter
);
958 PopulateSessionStorageInfoWithFilter(data_container(), ¬ifier
, filter
);
959 PopulateAppCacheInfoWithFilter(data_container(), ¬ifier
, filter
);
960 PopulateIndexedDBInfoWithFilter(data_container(), ¬ifier
, filter
);
961 PopulateFileSystemInfoWithFilter(data_container(), ¬ifier
, filter
);
962 PopulateQuotaInfoWithFilter(data_container(), ¬ifier
, filter
);
963 PopulateServerBoundCertInfoWithFilter(data_container(), ¬ifier
, filter
);
966 const extensions::ExtensionSet
* CookiesTreeModel::ExtensionsProtectingNode(
967 const CookieTreeNode
& cookie_node
) {
968 if (!special_storage_policy_
.get())
971 CookieTreeNode::DetailedInfo info
= cookie_node
.GetDetailedInfo();
973 if (!TypeIsProtected(info
.node_type
))
976 DCHECK(!info
.origin
.is_empty());
977 return special_storage_policy_
->ExtensionsProtectingOrigin(info
.origin
);
980 void CookiesTreeModel::AddCookiesTreeObserver(Observer
* observer
) {
981 cookies_observer_list_
.AddObserver(observer
);
982 // Call super so that TreeNodeModel can notify, too.
983 ui::TreeNodeModel
<CookieTreeNode
>::AddObserver(observer
);
986 void CookiesTreeModel::RemoveCookiesTreeObserver(Observer
* observer
) {
987 cookies_observer_list_
.RemoveObserver(observer
);
988 // Call super so that TreeNodeModel doesn't have dead pointers.
989 ui::TreeNodeModel
<CookieTreeNode
>::RemoveObserver(observer
);
992 void CookiesTreeModel::PopulateAppCacheInfo(LocalDataContainer
* container
) {
993 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
994 PopulateAppCacheInfoWithFilter(container
, ¬ifier
, base::string16());
997 void CookiesTreeModel::PopulateCookieInfo(LocalDataContainer
* container
) {
998 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
999 PopulateCookieInfoWithFilter(container
, ¬ifier
, base::string16());
1002 void CookiesTreeModel::PopulateDatabaseInfo(LocalDataContainer
* container
) {
1003 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
1004 PopulateDatabaseInfoWithFilter(container
, ¬ifier
, base::string16());
1007 void CookiesTreeModel::PopulateLocalStorageInfo(LocalDataContainer
* container
) {
1008 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
1009 PopulateLocalStorageInfoWithFilter(container
, ¬ifier
, base::string16());
1012 void CookiesTreeModel::PopulateSessionStorageInfo(
1013 LocalDataContainer
* container
) {
1014 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
1015 PopulateSessionStorageInfoWithFilter(container
, ¬ifier
, base::string16());
1018 void CookiesTreeModel::PopulateIndexedDBInfo(LocalDataContainer
* container
){
1019 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
1020 PopulateIndexedDBInfoWithFilter(container
, ¬ifier
, base::string16());
1023 void CookiesTreeModel::PopulateFileSystemInfo(LocalDataContainer
* container
) {
1024 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
1025 PopulateFileSystemInfoWithFilter(container
, ¬ifier
, base::string16());
1028 void CookiesTreeModel::PopulateQuotaInfo(LocalDataContainer
* container
) {
1029 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
1030 PopulateQuotaInfoWithFilter(container
, ¬ifier
, base::string16());
1033 void CookiesTreeModel::PopulateServerBoundCertInfo(
1034 LocalDataContainer
* container
) {
1035 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
1036 PopulateServerBoundCertInfoWithFilter(container
, ¬ifier
, base::string16());
1039 void CookiesTreeModel::PopulateFlashLSOInfo(
1040 LocalDataContainer
* container
) {
1041 ScopedBatchUpdateNotifier
notifier(this, GetRoot());
1042 PopulateFlashLSOInfoWithFilter(container
, ¬ifier
, base::string16());
1045 void CookiesTreeModel::PopulateAppCacheInfoWithFilter(
1046 LocalDataContainer
* container
,
1047 ScopedBatchUpdateNotifier
* notifier
,
1048 const base::string16
& filter
) {
1049 using appcache::AppCacheInfo
;
1050 typedef std::map
<GURL
, std::list
<AppCacheInfo
> > InfoByOrigin
;
1051 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1053 if (container
->appcache_info_
.empty())
1056 notifier
->StartBatchUpdate();
1057 for (InfoByOrigin::iterator origin
= container
->appcache_info_
.begin();
1058 origin
!= container
->appcache_info_
.end(); ++origin
) {
1059 base::string16 host_node_name
= base::UTF8ToUTF16(origin
->first
.host());
1060 if (filter
.empty() ||
1061 (host_node_name
.find(filter
) != base::string16::npos
)) {
1062 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(origin
->first
);
1063 CookieTreeAppCachesNode
* appcaches_node
=
1064 host_node
->GetOrCreateAppCachesNode();
1066 for (std::list
<AppCacheInfo
>::iterator info
= origin
->second
.begin();
1067 info
!= origin
->second
.end(); ++info
) {
1068 appcaches_node
->AddAppCacheNode(
1069 new CookieTreeAppCacheNode(origin
->first
, info
));
1075 void CookiesTreeModel::PopulateCookieInfoWithFilter(
1076 LocalDataContainer
* container
,
1077 ScopedBatchUpdateNotifier
* notifier
,
1078 const base::string16
& filter
) {
1079 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1081 notifier
->StartBatchUpdate();
1082 for (CookieList::iterator it
= container
->cookie_list_
.begin();
1083 it
!= container
->cookie_list_
.end(); ++it
) {
1084 std::string source_string
= it
->Source();
1085 if (source_string
.empty() || !group_by_cookie_source_
) {
1086 std::string domain
= it
->Domain();
1087 if (domain
.length() > 1 && domain
[0] == '.')
1088 domain
= domain
.substr(1);
1090 // We treat secure cookies just the same as normal ones.
1091 source_string
= std::string(content::kHttpScheme
) +
1092 content::kStandardSchemeSeparator
+ domain
+ "/";
1095 GURL
source(source_string
);
1096 if (!filter
.size() ||
1097 (CookieTreeHostNode::TitleForUrl(source
).find(filter
) !=
1098 base::string16::npos
)) {
1099 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(source
);
1100 CookieTreeCookiesNode
* cookies_node
=
1101 host_node
->GetOrCreateCookiesNode();
1102 CookieTreeCookieNode
* new_cookie
= new CookieTreeCookieNode(it
);
1103 cookies_node
->AddCookieNode(new_cookie
);
1108 void CookiesTreeModel::PopulateDatabaseInfoWithFilter(
1109 LocalDataContainer
* container
,
1110 ScopedBatchUpdateNotifier
* notifier
,
1111 const base::string16
& filter
) {
1112 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1114 if (container
->database_info_list_
.empty())
1117 notifier
->StartBatchUpdate();
1118 for (DatabaseInfoList::iterator database_info
=
1119 container
->database_info_list_
.begin();
1120 database_info
!= container
->database_info_list_
.end();
1122 GURL
origin(database_info
->identifier
.ToOrigin());
1124 if (!filter
.size() ||
1125 (CookieTreeHostNode::TitleForUrl(origin
).find(filter
) !=
1126 base::string16::npos
)) {
1127 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(origin
);
1128 CookieTreeDatabasesNode
* databases_node
=
1129 host_node
->GetOrCreateDatabasesNode();
1130 databases_node
->AddDatabaseNode(
1131 new CookieTreeDatabaseNode(database_info
));
1136 void CookiesTreeModel::PopulateLocalStorageInfoWithFilter(
1137 LocalDataContainer
* container
,
1138 ScopedBatchUpdateNotifier
* notifier
,
1139 const base::string16
& filter
) {
1140 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1142 if (container
->local_storage_info_list_
.empty())
1145 notifier
->StartBatchUpdate();
1146 for (LocalStorageInfoList::iterator local_storage_info
=
1147 container
->local_storage_info_list_
.begin();
1148 local_storage_info
!= container
->local_storage_info_list_
.end();
1149 ++local_storage_info
) {
1150 const GURL
& origin(local_storage_info
->origin_url
);
1152 if (!filter
.size() ||
1153 (CookieTreeHostNode::TitleForUrl(origin
).find(filter
) !=
1154 std::string::npos
)) {
1155 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(origin
);
1156 CookieTreeLocalStoragesNode
* local_storages_node
=
1157 host_node
->GetOrCreateLocalStoragesNode();
1158 local_storages_node
->AddLocalStorageNode(
1159 new CookieTreeLocalStorageNode(local_storage_info
));
1164 void CookiesTreeModel::PopulateSessionStorageInfoWithFilter(
1165 LocalDataContainer
* container
,
1166 ScopedBatchUpdateNotifier
* notifier
,
1167 const base::string16
& filter
) {
1168 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1170 if (container
->session_storage_info_list_
.empty())
1173 notifier
->StartBatchUpdate();
1174 for (LocalStorageInfoList::iterator session_storage_info
=
1175 container
->session_storage_info_list_
.begin();
1176 session_storage_info
!= container
->session_storage_info_list_
.end();
1177 ++session_storage_info
) {
1178 const GURL
& origin
= session_storage_info
->origin_url
;
1180 if (!filter
.size() ||
1181 (CookieTreeHostNode::TitleForUrl(origin
).find(filter
) !=
1182 base::string16::npos
)) {
1183 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(origin
);
1184 CookieTreeSessionStoragesNode
* session_storages_node
=
1185 host_node
->GetOrCreateSessionStoragesNode();
1186 session_storages_node
->AddSessionStorageNode(
1187 new CookieTreeSessionStorageNode(session_storage_info
));
1192 void CookiesTreeModel::PopulateIndexedDBInfoWithFilter(
1193 LocalDataContainer
* container
,
1194 ScopedBatchUpdateNotifier
* notifier
,
1195 const base::string16
& filter
) {
1196 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1198 if (container
->indexed_db_info_list_
.empty())
1201 notifier
->StartBatchUpdate();
1202 for (IndexedDBInfoList::iterator indexed_db_info
=
1203 container
->indexed_db_info_list_
.begin();
1204 indexed_db_info
!= container
->indexed_db_info_list_
.end();
1205 ++indexed_db_info
) {
1206 const GURL
& origin
= indexed_db_info
->origin_
;
1208 if (!filter
.size() ||
1209 (CookieTreeHostNode::TitleForUrl(origin
).find(filter
) !=
1210 base::string16::npos
)) {
1211 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(origin
);
1212 CookieTreeIndexedDBsNode
* indexed_dbs_node
=
1213 host_node
->GetOrCreateIndexedDBsNode();
1214 indexed_dbs_node
->AddIndexedDBNode(
1215 new CookieTreeIndexedDBNode(indexed_db_info
));
1220 void CookiesTreeModel::PopulateServerBoundCertInfoWithFilter(
1221 LocalDataContainer
* container
,
1222 ScopedBatchUpdateNotifier
* notifier
,
1223 const base::string16
& filter
) {
1224 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1226 if (container
->server_bound_cert_list_
.empty())
1229 notifier
->StartBatchUpdate();
1230 for (ServerBoundCertList::iterator cert_info
=
1231 container
->server_bound_cert_list_
.begin();
1232 cert_info
!= container
->server_bound_cert_list_
.end();
1234 GURL
origin(cert_info
->server_identifier());
1235 if (!origin
.is_valid()) {
1236 // Domain Bound Cert. Make a valid URL to satisfy the
1237 // CookieTreeRootNode::GetOrCreateHostNode interface.
1238 origin
= GURL(std::string(content::kHttpsScheme
) +
1239 content::kStandardSchemeSeparator
+
1240 cert_info
->server_identifier() + "/");
1242 base::string16 title
= CookieTreeHostNode::TitleForUrl(origin
);
1243 if (!filter
.size() || title
.find(filter
) != base::string16::npos
) {
1244 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(origin
);
1245 CookieTreeServerBoundCertsNode
* server_bound_certs_node
=
1246 host_node
->GetOrCreateServerBoundCertsNode();
1247 server_bound_certs_node
->AddServerBoundCertNode(
1248 new CookieTreeServerBoundCertNode(cert_info
));
1253 void CookiesTreeModel::PopulateFileSystemInfoWithFilter(
1254 LocalDataContainer
* container
,
1255 ScopedBatchUpdateNotifier
* notifier
,
1256 const base::string16
& filter
) {
1257 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1259 if (container
->file_system_info_list_
.empty())
1262 notifier
->StartBatchUpdate();
1263 for (FileSystemInfoList::iterator file_system_info
=
1264 container
->file_system_info_list_
.begin();
1265 file_system_info
!= container
->file_system_info_list_
.end();
1266 ++file_system_info
) {
1267 GURL
origin(file_system_info
->origin
);
1269 if (!filter
.size() ||
1270 (CookieTreeHostNode::TitleForUrl(origin
).find(filter
) !=
1271 base::string16::npos
)) {
1272 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(origin
);
1273 CookieTreeFileSystemsNode
* file_systems_node
=
1274 host_node
->GetOrCreateFileSystemsNode();
1275 file_systems_node
->AddFileSystemNode(
1276 new CookieTreeFileSystemNode(file_system_info
));
1281 void CookiesTreeModel::PopulateQuotaInfoWithFilter(
1282 LocalDataContainer
* container
,
1283 ScopedBatchUpdateNotifier
* notifier
,
1284 const base::string16
& filter
) {
1285 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1287 if (container
->quota_info_list_
.empty())
1290 notifier
->StartBatchUpdate();
1291 for (QuotaInfoList::iterator quota_info
= container
->quota_info_list_
.begin();
1292 quota_info
!= container
->quota_info_list_
.end();
1294 if (!filter
.size() ||
1295 (base::UTF8ToUTF16(quota_info
->host
).find(filter
) !=
1296 base::string16::npos
)) {
1297 CookieTreeHostNode
* host_node
=
1298 root
->GetOrCreateHostNode(GURL("http://" + quota_info
->host
));
1299 host_node
->UpdateOrCreateQuotaNode(quota_info
);
1304 void CookiesTreeModel::PopulateFlashLSOInfoWithFilter(
1305 LocalDataContainer
* container
,
1306 ScopedBatchUpdateNotifier
* notifier
,
1307 const base::string16
& filter
) {
1308 CookieTreeRootNode
* root
= static_cast<CookieTreeRootNode
*>(GetRoot());
1310 if (container
->flash_lso_domain_list_
.empty())
1313 std::string filter_utf8
= base::UTF16ToUTF8(filter
);
1314 notifier
->StartBatchUpdate();
1315 for (std::vector
<std::string
>::iterator it
=
1316 container
->flash_lso_domain_list_
.begin();
1317 it
!= container
->flash_lso_domain_list_
.end(); ++it
) {
1318 if (!filter_utf8
.size() || it
->find(filter_utf8
) != std::string::npos
) {
1319 // Create a fake origin for GetOrCreateHostNode().
1320 GURL
origin("http://" + *it
);
1321 CookieTreeHostNode
* host_node
= root
->GetOrCreateHostNode(origin
);
1322 host_node
->GetOrCreateFlashLSONode(*it
);
1327 void CookiesTreeModel::NotifyObserverBeginBatch() {
1328 // Only notify the model once if we're batching in a nested manner.
1329 if (batch_update_
++ == 0) {
1330 FOR_EACH_OBSERVER(Observer
,
1331 cookies_observer_list_
,
1332 TreeModelBeginBatch(this));
1336 void CookiesTreeModel::NotifyObserverEndBatch() {
1337 // Only notify the observers if this is the outermost call to EndBatch() if
1338 // called in a nested manner.
1339 if (--batch_update_
== 0) {
1340 FOR_EACH_OBSERVER(Observer
,
1341 cookies_observer_list_
,
1342 TreeModelEndBatch(this));