Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(34)

Side by Side Diff: chrome/browser/cookies_tree_model.cc

Issue 10636019: Adding Application Data dialog for isolated apps (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixes based on reviews by Thiago and Markus. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/cookies_tree_model.h" 5 #include "chrome/browser/cookies_tree_model.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 11 matching lines...) Expand all
22 #include "grit/ui_resources.h" 22 #include "grit/ui_resources.h"
23 #include "net/base/registry_controlled_domain.h" 23 #include "net/base/registry_controlled_domain.h"
24 #include "net/cookies/cookie_monster.h" 24 #include "net/cookies/cookie_monster.h"
25 #include "net/url_request/url_request_context.h" 25 #include "net/url_request/url_request_context.h"
26 #include "ui/base/l10n/l10n_util.h" 26 #include "ui/base/l10n/l10n_util.h"
27 #include "ui/base/resource/resource_bundle.h" 27 #include "ui/base/resource/resource_bundle.h"
28 #include "ui/gfx/image/image_skia.h" 28 #include "ui/gfx/image/image_skia.h"
29 29
30 static const char kFileOriginNodeName[] = "file://"; 30 static const char kFileOriginNodeName[] = "file://";
31 31
32 namespace {
33
34 // This function returns the local data container associated with a leaf tree
35 // node. The app node is assumed to be 3 levels above the leaf because of the
36 // following structure:
37 // root -> origin -> storage type -> leaf node
38 LocalDataContainer* GetLocalDataContainerForNode(CookieTreeNode* node) {
39 CookieTreeOriginNode* origin = static_cast<CookieTreeOriginNode*>(
40 node->parent()->parent());
41 return node->GetModel()->GetLocalDataContainer(origin->app_id());
42 }
43
44 } // namespace
45
32 /////////////////////////////////////////////////////////////////////////////// 46 ///////////////////////////////////////////////////////////////////////////////
33 // CookieTreeNode, public: 47 // CookieTreeNode, public:
34 48
35 void CookieTreeNode::DeleteStoredObjects() { 49 void CookieTreeNode::DeleteStoredObjects() {
36 std::for_each(children().begin(), 50 std::for_each(children().begin(),
37 children().end(), 51 children().end(),
38 std::mem_fun(&CookieTreeNode::DeleteStoredObjects)); 52 std::mem_fun(&CookieTreeNode::DeleteStoredObjects));
39 } 53 }
40 54
41 CookiesTreeModel* CookieTreeNode::GetModel() const { 55 CookiesTreeModel* CookieTreeNode::GetModel() const {
42 if (parent()) 56 if (parent())
43 return parent()->GetModel(); 57 return parent()->GetModel();
44 else 58 else
45 return NULL; 59 return NULL;
46 } 60 }
47 61
48 /////////////////////////////////////////////////////////////////////////////// 62 ///////////////////////////////////////////////////////////////////////////////
49 // CookieTreeCookieNode, public: 63 // CookieTreeCookieNode, public:
50 64
51 CookieTreeCookieNode::CookieTreeCookieNode( 65 CookieTreeCookieNode::CookieTreeCookieNode(
52 std::list<net::CookieMonster::CanonicalCookie>::iterator cookie) 66 std::list<net::CookieMonster::CanonicalCookie>::iterator cookie)
53 : CookieTreeNode(UTF8ToUTF16(cookie->Name())), 67 : CookieTreeNode(UTF8ToUTF16(cookie->Name())),
54 cookie_(cookie) { 68 cookie_(cookie) {
55 } 69 }
56 70
57 CookieTreeCookieNode::~CookieTreeCookieNode() {} 71 CookieTreeCookieNode::~CookieTreeCookieNode() {}
58 72
59 void CookieTreeCookieNode::DeleteStoredObjects() { 73 void CookieTreeCookieNode::DeleteStoredObjects() {
60 // notify CookieMonster that we should delete this cookie 74 // notify CookieMonster that we should delete this cookie
61 GetModel()->cookie_helper_->DeleteCookie(*cookie_); 75 LocalDataContainer* container = GetLocalDataContainerForNode(this);
62 GetModel()->cookie_list_.erase(cookie_); 76
77 if (container) {
78 container->cookie_helper_->DeleteCookie(*cookie_);
79 container->cookie_list_.erase(cookie_);
80 }
63 } 81 }
64 82
65 CookieTreeNode::DetailedInfo CookieTreeCookieNode::GetDetailedInfo() const { 83 CookieTreeNode::DetailedInfo CookieTreeCookieNode::GetDetailedInfo() const {
66 return DetailedInfo(parent()->parent()->GetTitle()).InitCookie(&*cookie_); 84 return DetailedInfo(parent()->parent()->GetTitle()).InitCookie(&*cookie_);
67 } 85 }
68 86
69 namespace { 87 namespace {
70 // comparison functor, for use in CookieTreeRootNode 88 // comparison functor, for use in CookieTreeRootNode
71 class OriginNodeComparator { 89 class OriginNodeComparator {
72 public: 90 public:
73 bool operator() (const CookieTreeNode* lhs, 91 bool operator() (const CookieTreeNode* lhs,
74 const CookieTreeNode* rhs) { 92 const CookieTreeNode* rhs) {
93 // This comparator is only meant to compare CookieTreeOriginNode types. Make
94 // sure we check this, as the static cast below is dangerous if we get the
95 // wrong object type.
96 CHECK_EQ(lhs->GetDetailedInfo().node_type,
97 CookieTreeNode::DetailedInfo::TYPE_ORIGIN);
98 CHECK_EQ(rhs->GetDetailedInfo().node_type,
99 CookieTreeNode::DetailedInfo::TYPE_ORIGIN);
100
101 const CookieTreeOriginNode* ltn = static_cast<const CookieTreeOriginNode*>(
102 lhs);
103 const CookieTreeOriginNode* rtn = static_cast<const CookieTreeOriginNode*>(
104 rhs);
105
106 if (ltn->app_id() != rtn->app_id()) {
107 return (ltn->app_name() < rtn->app_name());
108 }
109
75 // We want to order by registry controlled domain, so we would get 110 // We want to order by registry controlled domain, so we would get
76 // google.com, ad.google.com, www.google.com, 111 // google.com, ad.google.com, www.google.com,
77 // microsoft.com, ad.microsoft.com. CanonicalizeHost transforms the origins 112 // microsoft.com, ad.microsoft.com. CanonicalizeHost transforms the origins
78 // into a form like google.com.www so that string comparisons work. 113 // into a form like google.com.www so that string comparisons work.
79 return (CanonicalizeHost(lhs->GetTitle()) < 114 return (CanonicalizeHost(ltn->GetHost()) <
80 CanonicalizeHost(rhs->GetTitle())); 115 CanonicalizeHost(rtn->GetHost()));
81 } 116 }
82 117
83 private: 118 private:
84 static std::string CanonicalizeHost(const string16& host16) { 119 static std::string CanonicalizeHost(const std::string host) {
85 // The canonicalized representation makes the registry controlled domain 120 // The canonicalized representation makes the registry controlled domain
86 // come first, and then adds subdomains in reverse order, e.g. 121 // come first, and then adds subdomains in reverse order, e.g.
87 // 1.mail.google.com would become google.com.mail.1, and then a standard 122 // 1.mail.google.com would become google.com.mail.1, and then a standard
88 // string comparison works to order hosts by registry controlled domain 123 // string comparison works to order hosts by registry controlled domain
89 // first. Leading dots are ignored, ".google.com" is the same as 124 // first. Leading dots are ignored, ".google.com" is the same as
90 // "google.com". 125 // "google.com".
91 126
92 std::string host = UTF16ToUTF8(host16);
93 std::string retval = net::RegistryControlledDomainService:: 127 std::string retval = net::RegistryControlledDomainService::
94 GetDomainAndRegistry(host); 128 GetDomainAndRegistry(host);
95 if (!retval.length()) // Is an IP address or other special origin. 129 if (!retval.length()) // Is an IP address or other special origin.
96 return host; 130 return host;
97 131
98 std::string::size_type position = host.rfind(retval); 132 std::string::size_type position = host.rfind(retval);
99 133
100 // The host may be the registry controlled domain, in which case fail fast. 134 // The host may be the registry controlled domain, in which case fail fast.
101 if (position == 0 || position == std::string::npos) 135 if (position == 0 || position == std::string::npos)
102 return host; 136 return host;
(...skipping 30 matching lines...) Expand all
133 std::list<appcache::AppCacheInfo>::iterator appcache_info) 167 std::list<appcache::AppCacheInfo>::iterator appcache_info)
134 : CookieTreeNode(UTF8ToUTF16(appcache_info->manifest_url.spec())), 168 : CookieTreeNode(UTF8ToUTF16(appcache_info->manifest_url.spec())),
135 origin_url_(origin_url), 169 origin_url_(origin_url),
136 appcache_info_(appcache_info) { 170 appcache_info_(appcache_info) {
137 } 171 }
138 172
139 CookieTreeAppCacheNode::~CookieTreeAppCacheNode() { 173 CookieTreeAppCacheNode::~CookieTreeAppCacheNode() {
140 } 174 }
141 175
142 void CookieTreeAppCacheNode::DeleteStoredObjects() { 176 void CookieTreeAppCacheNode::DeleteStoredObjects() {
143 DCHECK(GetModel()->appcache_helper_); 177 LocalDataContainer* container = GetLocalDataContainerForNode(this);
144 GetModel()->appcache_helper_->DeleteAppCacheGroup( 178
145 appcache_info_->manifest_url); 179 if (container) {
146 GetModel()->appcache_info_[origin_url_].erase(appcache_info_); 180 DCHECK(container->appcache_helper_);
181 container->appcache_helper_->DeleteAppCacheGroup(
182 appcache_info_->manifest_url);
183 container->appcache_info_[origin_url_].erase(appcache_info_);
184 }
147 } 185 }
148 186
149 CookieTreeNode::DetailedInfo CookieTreeAppCacheNode::GetDetailedInfo() const { 187 CookieTreeNode::DetailedInfo CookieTreeAppCacheNode::GetDetailedInfo() const {
150 return DetailedInfo(parent()->parent()->GetTitle()).InitAppCache( 188 return DetailedInfo(parent()->parent()->GetTitle()).InitAppCache(
151 &*appcache_info_); 189 &*appcache_info_);
152 } 190 }
153 191
154 /////////////////////////////////////////////////////////////////////////////// 192 ///////////////////////////////////////////////////////////////////////////////
155 // CookieTreeDatabaseNode, public: 193 // CookieTreeDatabaseNode, public:
156 194
157 CookieTreeDatabaseNode::CookieTreeDatabaseNode( 195 CookieTreeDatabaseNode::CookieTreeDatabaseNode(
158 std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator database_info) 196 std::list<BrowsingDataDatabaseHelper::DatabaseInfo>::iterator database_info)
159 : CookieTreeNode(database_info->database_name.empty() ? 197 : CookieTreeNode(database_info->database_name.empty() ?
160 l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASE_UNNAMED_NAME) : 198 l10n_util::GetStringUTF16(IDS_COOKIES_WEB_DATABASE_UNNAMED_NAME) :
161 UTF8ToUTF16(database_info->database_name)), 199 UTF8ToUTF16(database_info->database_name)),
162 database_info_(database_info) { 200 database_info_(database_info) {
163 } 201 }
164 202
165 CookieTreeDatabaseNode::~CookieTreeDatabaseNode() {} 203 CookieTreeDatabaseNode::~CookieTreeDatabaseNode() {}
166 204
167 void CookieTreeDatabaseNode::DeleteStoredObjects() { 205 void CookieTreeDatabaseNode::DeleteStoredObjects() {
168 GetModel()->database_helper_->DeleteDatabase( 206 LocalDataContainer* container = GetLocalDataContainerForNode(this);
169 database_info_->origin_identifier, database_info_->database_name); 207
170 GetModel()->database_info_list_.erase(database_info_); 208 if (container) {
209 container->database_helper_->DeleteDatabase(
210 database_info_->origin_identifier, database_info_->database_name);
211 container->database_info_list_.erase(database_info_);
212 }
171 } 213 }
172 214
173 CookieTreeNode::DetailedInfo CookieTreeDatabaseNode::GetDetailedInfo() const { 215 CookieTreeNode::DetailedInfo CookieTreeDatabaseNode::GetDetailedInfo() const {
174 return DetailedInfo(parent()->parent()->GetTitle()).InitDatabase( 216 return DetailedInfo(parent()->parent()->GetTitle()).InitDatabase(
175 &*database_info_); 217 &*database_info_);
176 } 218 }
177 219
178 /////////////////////////////////////////////////////////////////////////////// 220 ///////////////////////////////////////////////////////////////////////////////
179 // CookieTreeLocalStorageNode, public: 221 // CookieTreeLocalStorageNode, public:
180 222
181 CookieTreeLocalStorageNode::CookieTreeLocalStorageNode( 223 CookieTreeLocalStorageNode::CookieTreeLocalStorageNode(
182 std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator 224 std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
183 local_storage_info) 225 local_storage_info)
184 : CookieTreeNode(UTF8ToUTF16(local_storage_info->origin_url.spec())), 226 : CookieTreeNode(UTF8ToUTF16(local_storage_info->origin_url.spec())),
185 local_storage_info_(local_storage_info) { 227 local_storage_info_(local_storage_info) {
186 } 228 }
187 229
188 CookieTreeLocalStorageNode::~CookieTreeLocalStorageNode() {} 230 CookieTreeLocalStorageNode::~CookieTreeLocalStorageNode() {}
189 231
190 void CookieTreeLocalStorageNode::DeleteStoredObjects() { 232 void CookieTreeLocalStorageNode::DeleteStoredObjects() {
191 GetModel()->local_storage_helper_->DeleteOrigin( 233 LocalDataContainer* container = GetLocalDataContainerForNode(this);
192 local_storage_info_->origin_url); 234
193 GetModel()->local_storage_info_list_.erase(local_storage_info_); 235 if (container) {
236 container->local_storage_helper_->DeleteOrigin(
237 local_storage_info_->origin_url);
238 container->local_storage_info_list_.erase(local_storage_info_);
239 }
194 } 240 }
195 241
196 CookieTreeNode::DetailedInfo 242 CookieTreeNode::DetailedInfo
197 CookieTreeLocalStorageNode::GetDetailedInfo() const { 243 CookieTreeLocalStorageNode::GetDetailedInfo() const {
198 return DetailedInfo(parent()->parent()->GetTitle()).InitLocalStorage( 244 return DetailedInfo(parent()->parent()->GetTitle()).InitLocalStorage(
199 &*local_storage_info_); 245 &*local_storage_info_);
200 } 246 }
201 247
202 /////////////////////////////////////////////////////////////////////////////// 248 ///////////////////////////////////////////////////////////////////////////////
203 // CookieTreeSessionStorageNode, public: 249 // CookieTreeSessionStorageNode, public:
204 250
205 CookieTreeSessionStorageNode::CookieTreeSessionStorageNode( 251 CookieTreeSessionStorageNode::CookieTreeSessionStorageNode(
206 std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator 252 std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>::iterator
207 session_storage_info) 253 session_storage_info)
208 : CookieTreeNode(UTF8ToUTF16(session_storage_info->origin_url.spec())), 254 : CookieTreeNode(UTF8ToUTF16(session_storage_info->origin_url.spec())),
209 session_storage_info_(session_storage_info) { 255 session_storage_info_(session_storage_info) {
210 } 256 }
211 257
212 CookieTreeSessionStorageNode::~CookieTreeSessionStorageNode() {} 258 CookieTreeSessionStorageNode::~CookieTreeSessionStorageNode() {}
213 259
214 void CookieTreeSessionStorageNode::DeleteStoredObjects() { 260 void CookieTreeSessionStorageNode::DeleteStoredObjects() {
215 GetModel()->session_storage_info_list_.erase(session_storage_info_); 261 LocalDataContainer* container = GetLocalDataContainerForNode(this);
262
263 if (container) {
264 container->session_storage_info_list_.erase(session_storage_info_);
265 }
216 } 266 }
217 267
218 CookieTreeNode::DetailedInfo 268 CookieTreeNode::DetailedInfo
219 CookieTreeSessionStorageNode::GetDetailedInfo() const { 269 CookieTreeSessionStorageNode::GetDetailedInfo() const {
220 return DetailedInfo(parent()->parent()->GetTitle()).InitSessionStorage( 270 return DetailedInfo(parent()->parent()->GetTitle()).InitSessionStorage(
221 &*session_storage_info_); 271 &*session_storage_info_);
222 } 272 }
223 273
224 /////////////////////////////////////////////////////////////////////////////// 274 ///////////////////////////////////////////////////////////////////////////////
225 // CookieTreeIndexedDBNode, public: 275 // CookieTreeIndexedDBNode, public:
226 276
227 CookieTreeIndexedDBNode::CookieTreeIndexedDBNode( 277 CookieTreeIndexedDBNode::CookieTreeIndexedDBNode(
228 std::list<BrowsingDataIndexedDBHelper::IndexedDBInfo>::iterator 278 std::list<BrowsingDataIndexedDBHelper::IndexedDBInfo>::iterator
229 indexed_db_info) 279 indexed_db_info)
230 : CookieTreeNode(UTF8ToUTF16( 280 : CookieTreeNode(UTF8ToUTF16(
231 indexed_db_info->origin.spec())), 281 indexed_db_info->origin.spec())),
232 indexed_db_info_(indexed_db_info) { 282 indexed_db_info_(indexed_db_info) {
233 } 283 }
234 284
235 CookieTreeIndexedDBNode::~CookieTreeIndexedDBNode() {} 285 CookieTreeIndexedDBNode::~CookieTreeIndexedDBNode() {}
236 286
237 void CookieTreeIndexedDBNode::DeleteStoredObjects() { 287 void CookieTreeIndexedDBNode::DeleteStoredObjects() {
238 GetModel()->indexed_db_helper_->DeleteIndexedDB( 288 LocalDataContainer* container = GetLocalDataContainerForNode(this);
239 indexed_db_info_->origin); 289
240 GetModel()->indexed_db_info_list_.erase(indexed_db_info_); 290 if (container) {
291 container->indexed_db_helper_->DeleteIndexedDB(
292 indexed_db_info_->origin);
293 container->indexed_db_info_list_.erase(indexed_db_info_);
294 }
241 } 295 }
242 296
243 CookieTreeNode::DetailedInfo CookieTreeIndexedDBNode::GetDetailedInfo() const { 297 CookieTreeNode::DetailedInfo CookieTreeIndexedDBNode::GetDetailedInfo() const {
244 return DetailedInfo(parent()->parent()->GetTitle()).InitIndexedDB( 298 return DetailedInfo(parent()->parent()->GetTitle()).InitIndexedDB(
245 &*indexed_db_info_); 299 &*indexed_db_info_);
246 } 300 }
247 301
248 /////////////////////////////////////////////////////////////////////////////// 302 ///////////////////////////////////////////////////////////////////////////////
249 // CookieTreeFileSystemNode, public: 303 // CookieTreeFileSystemNode, public:
250 304
251 CookieTreeFileSystemNode::CookieTreeFileSystemNode( 305 CookieTreeFileSystemNode::CookieTreeFileSystemNode(
252 std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator 306 std::list<BrowsingDataFileSystemHelper::FileSystemInfo>::iterator
253 file_system_info) 307 file_system_info)
254 : CookieTreeNode(UTF8ToUTF16( 308 : CookieTreeNode(UTF8ToUTF16(
255 file_system_info->origin.spec())), 309 file_system_info->origin.spec())),
256 file_system_info_(file_system_info) { 310 file_system_info_(file_system_info) {
257 } 311 }
258 312
259 CookieTreeFileSystemNode::~CookieTreeFileSystemNode() {} 313 CookieTreeFileSystemNode::~CookieTreeFileSystemNode() {}
260 314
261 void CookieTreeFileSystemNode::DeleteStoredObjects() { 315 void CookieTreeFileSystemNode::DeleteStoredObjects() {
262 GetModel()->file_system_helper_->DeleteFileSystemOrigin( 316 LocalDataContainer* container = GetLocalDataContainerForNode(this);
263 file_system_info_->origin); 317
264 GetModel()->file_system_info_list_.erase(file_system_info_); 318 if (container) {
319 container->file_system_helper_->DeleteFileSystemOrigin(
320 file_system_info_->origin);
321 container->file_system_info_list_.erase(file_system_info_);
322 }
265 } 323 }
266 324
267 CookieTreeNode::DetailedInfo CookieTreeFileSystemNode::GetDetailedInfo() const { 325 CookieTreeNode::DetailedInfo CookieTreeFileSystemNode::GetDetailedInfo() const {
268 return DetailedInfo(parent()->parent()->GetTitle()).InitFileSystem( 326 return DetailedInfo(parent()->parent()->GetTitle()).InitFileSystem(
269 &*file_system_info_); 327 &*file_system_info_);
270 } 328 }
271 329
272 /////////////////////////////////////////////////////////////////////////////// 330 ///////////////////////////////////////////////////////////////////////////////
273 // CookieTreeQuotaNode, public: 331 // CookieTreeQuotaNode, public:
274 332
275 CookieTreeQuotaNode::CookieTreeQuotaNode( 333 CookieTreeQuotaNode::CookieTreeQuotaNode(
276 std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info) 334 std::list<BrowsingDataQuotaHelper::QuotaInfo>::iterator quota_info)
277 : CookieTreeNode(UTF8ToUTF16(quota_info->host)), 335 : CookieTreeNode(UTF8ToUTF16(quota_info->host)),
278 quota_info_(quota_info) { 336 quota_info_(quota_info) {
279 } 337 }
280 338
281 CookieTreeQuotaNode::~CookieTreeQuotaNode() {} 339 CookieTreeQuotaNode::~CookieTreeQuotaNode() {}
282 340
283 void CookieTreeQuotaNode::DeleteStoredObjects() { 341 void CookieTreeQuotaNode::DeleteStoredObjects() {
284 // Calling this function may cause unexpected over-quota state of origin. 342 // Calling this function may cause unexpected over-quota state of origin.
285 // However, it'll caused no problem, just prevent usage growth of the origin. 343 // However, it'll caused no problem, just prevent usage growth of the origin.
286 GetModel()->quota_helper_->RevokeHostQuota(quota_info_->host); 344 CookieTreeOriginNode* app = static_cast<CookieTreeOriginNode*>(parent());
287 GetModel()->quota_info_list_.erase(quota_info_); 345 LocalDataContainer* container = GetModel()->GetLocalDataContainer(
346 app->app_id());
347
348 if (container) {
349 container->quota_helper_->RevokeHostQuota(quota_info_->host);
350 container->quota_info_list_.erase(quota_info_);
351 }
288 } 352 }
289 353
290 CookieTreeNode::DetailedInfo CookieTreeQuotaNode::GetDetailedInfo() const { 354 CookieTreeNode::DetailedInfo CookieTreeQuotaNode::GetDetailedInfo() const {
291 return DetailedInfo(parent()->parent()->GetTitle()).InitQuota( 355 return DetailedInfo(parent()->parent()->GetTitle()).InitQuota(
292 &*quota_info_); 356 &*quota_info_);
293 } 357 }
294 358
295 /////////////////////////////////////////////////////////////////////////////// 359 ///////////////////////////////////////////////////////////////////////////////
296 // CookieTreeServerBoundCertNode, public: 360 // CookieTreeServerBoundCertNode, public:
297 361
298 CookieTreeServerBoundCertNode::CookieTreeServerBoundCertNode( 362 CookieTreeServerBoundCertNode::CookieTreeServerBoundCertNode(
299 net::ServerBoundCertStore::ServerBoundCertList::iterator cert) 363 net::ServerBoundCertStore::ServerBoundCertList::iterator cert)
300 : CookieTreeNode(ASCIIToUTF16(cert->server_identifier())), 364 : CookieTreeNode(ASCIIToUTF16(cert->server_identifier())),
301 server_bound_cert_(cert) { 365 server_bound_cert_(cert) {
302 } 366 }
303 367
304 CookieTreeServerBoundCertNode::~CookieTreeServerBoundCertNode() {} 368 CookieTreeServerBoundCertNode::~CookieTreeServerBoundCertNode() {}
305 369
306 void CookieTreeServerBoundCertNode::DeleteStoredObjects() { 370 void CookieTreeServerBoundCertNode::DeleteStoredObjects() {
307 GetModel()->server_bound_cert_helper_->DeleteServerBoundCert( 371 LocalDataContainer* container = GetLocalDataContainerForNode(this);
308 server_bound_cert_->server_identifier()); 372
309 GetModel()->server_bound_cert_list_.erase(server_bound_cert_); 373 if (container) {
374 container->server_bound_cert_helper_->DeleteServerBoundCert(
375 server_bound_cert_->server_identifier());
376 container->server_bound_cert_list_.erase(server_bound_cert_);
377 }
310 } 378 }
311 379
312 CookieTreeNode::DetailedInfo 380 CookieTreeNode::DetailedInfo
313 CookieTreeServerBoundCertNode::GetDetailedInfo() const { 381 CookieTreeServerBoundCertNode::GetDetailedInfo() const {
314 return DetailedInfo(parent()->parent()->GetTitle()).InitServerBoundCert( 382 return DetailedInfo(parent()->parent()->GetTitle()).InitServerBoundCert(
315 &*server_bound_cert_); 383 &*server_bound_cert_);
316 } 384 }
317 385
318 /////////////////////////////////////////////////////////////////////////////// 386 ///////////////////////////////////////////////////////////////////////////////
319 // CookieTreeRootNode, public: 387 // CookieTreeRootNode, public:
320 388
321 CookieTreeRootNode::CookieTreeRootNode(CookiesTreeModel* model) 389 CookieTreeRootNode::CookieTreeRootNode(CookiesTreeModel* model)
322 : model_(model) { 390 : model_(model) {
323 } 391 }
324 392
325 CookieTreeRootNode::~CookieTreeRootNode() {} 393 CookieTreeRootNode::~CookieTreeRootNode() {}
326 394
327 CookieTreeOriginNode* CookieTreeRootNode::GetOrCreateOriginNode( 395 CookieTreeOriginNode* CookieTreeRootNode::GetOrCreateOriginNode(
328 const GURL& url) { 396 const GURL& url,
329 CookieTreeOriginNode origin_node(url); 397 const std::string& app_id,
398 const std::string& app_name) {
399 CookieTreeOriginNode origin_node(url, app_id, app_name);
330 400
331 // First see if there is an existing match. 401 // First see if there is an existing match.
332 std::vector<CookieTreeNode*>::iterator origin_node_iterator = 402 std::vector<CookieTreeNode*>::iterator origin_node_iterator =
333 std::lower_bound(children().begin(), 403 std::lower_bound(children().begin(),
334 children().end(), 404 children().end(),
335 &origin_node, 405 &origin_node,
336 OriginNodeComparator()); 406 OriginNodeComparator());
337
338 if (origin_node_iterator != children().end() && 407 if (origin_node_iterator != children().end() &&
339 WideToUTF16Hack(CookieTreeOriginNode::TitleForUrl(url)) == 408 CookieTreeOriginNode::TitleForUrl(url, app_id, app_name) ==
340 (*origin_node_iterator)->GetTitle()) 409 (*origin_node_iterator)->GetTitle())
341 return static_cast<CookieTreeOriginNode*>(*origin_node_iterator); 410 return static_cast<CookieTreeOriginNode*>(*origin_node_iterator);
342 // Node doesn't exist, create a new one and insert it into the (ordered) 411 // Node doesn't exist, create a new one and insert it into the (ordered)
343 // children. 412 // children.
344 CookieTreeOriginNode* retval = new CookieTreeOriginNode(url); 413 CookieTreeOriginNode* retval = new CookieTreeOriginNode(url, app_id,
414 app_name);
345 DCHECK(model_); 415 DCHECK(model_);
346 model_->Add(this, retval, (origin_node_iterator - children().begin())); 416 model_->Add(this, retval, (origin_node_iterator - children().begin()));
347 return retval; 417 return retval;
348 } 418 }
349 419
350 CookiesTreeModel* CookieTreeRootNode::GetModel() const { 420 CookiesTreeModel* CookieTreeRootNode::GetModel() const {
351 return model_; 421 return model_;
352 } 422 }
353 423
354 CookieTreeNode::DetailedInfo CookieTreeRootNode::GetDetailedInfo() const { 424 CookieTreeNode::DetailedInfo CookieTreeRootNode::GetDetailedInfo() const {
355 return DetailedInfo(string16()).Init(DetailedInfo::TYPE_ROOT); 425 return DetailedInfo(string16()).Init(DetailedInfo::TYPE_ROOT);
356 } 426 }
357 427
358 /////////////////////////////////////////////////////////////////////////////// 428 ///////////////////////////////////////////////////////////////////////////////
359 // CookieTreeOriginNode, public: 429 // CookieTreeOriginNode, public:
360 430
361 // static 431 // static
362 std::wstring CookieTreeOriginNode::TitleForUrl( 432 string16 CookieTreeOriginNode::TitleForUrl(
363 const GURL& url) { 433 const GURL& url,
364 return UTF8ToWide(url.SchemeIsFile() ? kFileOriginNodeName : url.host()); 434 const std::string& app_id,
435 const std::string& app_name) {
436 std::string title;
437 // Only prepend the app name, if the app id is not an empty string.
438 if (app_id != std::string()) {
Bernhard Bauer 2012/06/26 21:03:55 Nit: `if (!app_id.empty())`?
nasko 2012/06/26 22:33:16 Done.
439 title = app_name;
440 title.append(", ");
441 }
442 title.append(url.SchemeIsFile() ? kFileOriginNodeName : url.host());
443 return UTF8ToUTF16(title);
365 } 444 }
366 445
367 CookieTreeOriginNode::CookieTreeOriginNode(const GURL& url) 446 CookieTreeOriginNode::CookieTreeOriginNode(const GURL& url,
368 : CookieTreeNode(WideToUTF16Hack(TitleForUrl(url))), 447 const std::string& app_id,
448 const std::string& name)
449 : CookieTreeNode(TitleForUrl(url, app_id, name)),
369 cookies_child_(NULL), 450 cookies_child_(NULL),
370 databases_child_(NULL), 451 databases_child_(NULL),
371 local_storages_child_(NULL), 452 local_storages_child_(NULL),
372 session_storages_child_(NULL), 453 session_storages_child_(NULL),
373 appcaches_child_(NULL), 454 appcaches_child_(NULL),
374 indexed_dbs_child_(NULL), 455 indexed_dbs_child_(NULL),
375 file_systems_child_(NULL), 456 file_systems_child_(NULL),
376 quota_child_(NULL), 457 quota_child_(NULL),
377 server_bound_certs_child_(NULL), 458 server_bound_certs_child_(NULL),
459 app_id_(app_id),
460 app_name_(name),
378 url_(url) {} 461 url_(url) {}
379 462
380 CookieTreeOriginNode::~CookieTreeOriginNode() {} 463 CookieTreeOriginNode::~CookieTreeOriginNode() {}
381 464
465 const std::string CookieTreeOriginNode::GetHost() const {
466 return url_.SchemeIsFile() ? kFileOriginNodeName : url_.host();
467 }
468
382 CookieTreeNode::DetailedInfo CookieTreeOriginNode::GetDetailedInfo() const { 469 CookieTreeNode::DetailedInfo CookieTreeOriginNode::GetDetailedInfo() const {
383 return DetailedInfo(GetTitle()).Init(DetailedInfo::TYPE_ORIGIN); 470 return DetailedInfo(GetTitle()).InitOrigin(app_id_, app_name_);
384 } 471 }
385 472
386 CookieTreeCookiesNode* CookieTreeOriginNode::GetOrCreateCookiesNode() { 473 CookieTreeCookiesNode* CookieTreeOriginNode::GetOrCreateCookiesNode() {
387 if (cookies_child_) 474 if (cookies_child_)
388 return cookies_child_; 475 return cookies_child_;
389 cookies_child_ = new CookieTreeCookiesNode; 476 cookies_child_ = new CookieTreeCookiesNode;
390 AddChildSortedByTitle(cookies_child_); 477 AddChildSortedByTitle(cookies_child_);
391 return cookies_child_; 478 return cookies_child_;
392 } 479 }
393 480
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 std::vector<CookieTreeNode*>::iterator iter = 699 std::vector<CookieTreeNode*>::iterator iter =
613 std::lower_bound(children().begin(), 700 std::lower_bound(children().begin(),
614 children().end(), 701 children().end(),
615 new_child, 702 new_child,
616 NodeTitleComparator()); 703 NodeTitleComparator());
617 GetModel()->Add(this, new_child, iter - children().begin()); 704 GetModel()->Add(this, new_child, iter - children().begin());
618 } 705 }
619 706
620 /////////////////////////////////////////////////////////////////////////////// 707 ///////////////////////////////////////////////////////////////////////////////
621 // CookiesTreeModel, public: 708 // CookiesTreeModel, public:
622 709 CookiesTreeModel::CookiesTreeModel(const ContainerMap& apps_map,
623 CookiesTreeModel::CookiesTreeModel( 710 bool use_cookie_source)
624 BrowsingDataCookieHelper* cookie_helper,
625 BrowsingDataDatabaseHelper* database_helper,
626 BrowsingDataLocalStorageHelper* local_storage_helper,
627 BrowsingDataLocalStorageHelper* session_storage_helper,
628 BrowsingDataAppCacheHelper* appcache_helper,
629 BrowsingDataIndexedDBHelper* indexed_db_helper,
630 BrowsingDataFileSystemHelper* file_system_helper,
631 BrowsingDataQuotaHelper* quota_helper,
632 BrowsingDataServerBoundCertHelper* server_bound_cert_helper,
633 bool use_cookie_source)
634 : ALLOW_THIS_IN_INITIALIZER_LIST(ui::TreeNodeModel<CookieTreeNode>( 711 : ALLOW_THIS_IN_INITIALIZER_LIST(ui::TreeNodeModel<CookieTreeNode>(
635 new CookieTreeRootNode(this))), 712 new CookieTreeRootNode(this))),
636 appcache_helper_(appcache_helper),
637 cookie_helper_(cookie_helper),
638 database_helper_(database_helper),
639 local_storage_helper_(local_storage_helper),
640 session_storage_helper_(session_storage_helper),
641 indexed_db_helper_(indexed_db_helper),
642 file_system_helper_(file_system_helper),
643 quota_helper_(quota_helper),
644 server_bound_cert_helper_(server_bound_cert_helper),
645 batch_update_(0),
646 use_cookie_source_(use_cookie_source), 713 use_cookie_source_(use_cookie_source),
647 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { 714 batch_update_(0) {
648 DCHECK(cookie_helper_); 715 for (ContainerMap::const_iterator it = apps_map.begin();
649 cookie_helper_->StartFetching( 716 it != apps_map.end(); ++it) {
650 base::Bind(&CookiesTreeModel::OnCookiesModelInfoLoaded, 717 app_data_map_[it->first] = it->second;
Bernhard Bauer 2012/06/26 21:03:55 |apps_data_map_| starts out as a copy of |apps_map
nasko 2012/06/26 22:33:16 Done.
651 weak_ptr_factory_.GetWeakPtr())); 718 it->second->Init(this);
652 DCHECK(database_helper_);
653 database_helper_->StartFetching(
654 base::Bind(&CookiesTreeModel::OnDatabaseModelInfoLoaded,
655 weak_ptr_factory_.GetWeakPtr()));
656 DCHECK(local_storage_helper_);
657 local_storage_helper_->StartFetching(
658 base::Bind(&CookiesTreeModel::OnLocalStorageModelInfoLoaded,
659 weak_ptr_factory_.GetWeakPtr()));
660 if (session_storage_helper_) {
661 session_storage_helper_->StartFetching(
662 base::Bind(&CookiesTreeModel::OnSessionStorageModelInfoLoaded,
663 weak_ptr_factory_.GetWeakPtr()));
664 }
665
666 // TODO(michaeln): When all of the UI implementations have been updated, make
667 // this a required parameter.
668 if (appcache_helper_) {
669 appcache_helper_->StartFetching(
670 base::Bind(&CookiesTreeModel::OnAppCacheModelInfoLoaded,
671 weak_ptr_factory_.GetWeakPtr()));
672 }
673
674 if (indexed_db_helper_) {
675 indexed_db_helper_->StartFetching(
676 base::Bind(&CookiesTreeModel::OnIndexedDBModelInfoLoaded,
677 weak_ptr_factory_.GetWeakPtr()));
678 }
679
680 if (file_system_helper_) {
681 file_system_helper_->StartFetching(
682 base::Bind(&CookiesTreeModel::OnFileSystemModelInfoLoaded,
683 weak_ptr_factory_.GetWeakPtr()));
684 }
685
686 if (quota_helper_) {
687 quota_helper_->StartFetching(
688 base::Bind(&CookiesTreeModel::OnQuotaModelInfoLoaded,
689 weak_ptr_factory_.GetWeakPtr()));
690 }
691
692 if (server_bound_cert_helper_) {
693 server_bound_cert_helper_->StartFetching(
694 base::Bind(&CookiesTreeModel::OnServerBoundCertModelInfoLoaded,
695 weak_ptr_factory_.GetWeakPtr()));
696 } 719 }
697 } 720 }
698 721
699 CookiesTreeModel::~CookiesTreeModel() {} 722 CookiesTreeModel::~CookiesTreeModel() {
723 STLDeleteValues(&app_data_map_);
724 }
700 725
701 /////////////////////////////////////////////////////////////////////////////// 726 ///////////////////////////////////////////////////////////////////////////////
702 // CookiesTreeModel, TreeModel methods (public): 727 // CookiesTreeModel, TreeModel methods (public):
703 728
704 // TreeModel methods: 729 // TreeModel methods:
705 // Returns the set of icons for the nodes in the tree. You only need override 730 // Returns the set of icons for the nodes in the tree. You only need override
706 // this if you don't want to use the default folder icons. 731 // this if you don't want to use the default folder icons.
707 void CookiesTreeModel::GetIcons(std::vector<gfx::ImageSkia>* icons) { 732 void CookiesTreeModel::GetIcons(std::vector<gfx::ImageSkia>* icons) {
708 icons->push_back(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 733 icons->push_back(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
709 IDR_OMNIBOX_HTTP)); 734 IDR_OMNIBOX_HTTP));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 void CookiesTreeModel::DeleteCookieNode(CookieTreeNode* cookie_node) { 784 void CookiesTreeModel::DeleteCookieNode(CookieTreeNode* cookie_node) {
760 if (cookie_node == GetRoot()) 785 if (cookie_node == GetRoot())
761 return; 786 return;
762 cookie_node->DeleteStoredObjects(); 787 cookie_node->DeleteStoredObjects();
763 CookieTreeNode* parent_node = cookie_node->parent(); 788 CookieTreeNode* parent_node = cookie_node->parent();
764 delete Remove(parent_node, cookie_node); 789 delete Remove(parent_node, cookie_node);
765 if (parent_node->empty()) 790 if (parent_node->empty())
766 DeleteCookieNode(parent_node); 791 DeleteCookieNode(parent_node);
767 } 792 }
768 793
769 void CookiesTreeModel::UpdateSearchResults(const std::wstring& filter) { 794 void CookiesTreeModel::UpdateSearchResults(const string16& filter) {
770 CookieTreeNode* root = GetRoot(); 795 CookieTreeNode* root = GetRoot();
771 int num_children = root->child_count(); 796 int num_children = root->child_count();
772 NotifyObserverBeginBatch(); 797 NotifyObserverBeginBatch();
773 for (int i = num_children - 1; i >= 0; --i) 798 for (int i = num_children - 1; i >= 0; --i)
774 delete Remove(root, root->GetChild(i)); 799 delete Remove(root, root->GetChild(i));
775 PopulateCookieInfoWithFilter(filter); 800 PopulateCookieInfoWithFilter(NULL, filter);
776 PopulateDatabaseInfoWithFilter(filter); 801 PopulateDatabaseInfoWithFilter(NULL, filter);
777 PopulateLocalStorageInfoWithFilter(filter); 802 PopulateLocalStorageInfoWithFilter(NULL, filter);
778 PopulateSessionStorageInfoWithFilter(filter); 803 PopulateSessionStorageInfoWithFilter(NULL, filter);
779 PopulateAppCacheInfoWithFilter(filter); 804 PopulateAppCacheInfoWithFilter(NULL, filter);
780 PopulateIndexedDBInfoWithFilter(filter); 805 PopulateIndexedDBInfoWithFilter(NULL, filter);
781 PopulateFileSystemInfoWithFilter(filter); 806 PopulateFileSystemInfoWithFilter(NULL, filter);
782 PopulateQuotaInfoWithFilter(filter); 807 PopulateQuotaInfoWithFilter(NULL, filter);
783 PopulateServerBoundCertInfoWithFilter(filter); 808 PopulateServerBoundCertInfoWithFilter(NULL, filter);
784 NotifyObserverTreeNodeChanged(root); 809 NotifyObserverTreeNodeChanged(root);
785 NotifyObserverEndBatch(); 810 NotifyObserverEndBatch();
786 } 811 }
787 812
788 void CookiesTreeModel::AddCookiesTreeObserver(Observer* observer) { 813 void CookiesTreeModel::AddCookiesTreeObserver(Observer* observer) {
789 cookies_observer_list_.AddObserver(observer); 814 cookies_observer_list_.AddObserver(observer);
790 // Call super so that TreeNodeModel can notify, too. 815 // Call super so that TreeNodeModel can notify, too.
791 ui::TreeNodeModel<CookieTreeNode>::AddObserver(observer); 816 ui::TreeNodeModel<CookieTreeNode>::AddObserver(observer);
792 } 817 }
793 818
794 void CookiesTreeModel::RemoveCookiesTreeObserver(Observer* observer) { 819 void CookiesTreeModel::RemoveCookiesTreeObserver(Observer* observer) {
795 cookies_observer_list_.RemoveObserver(observer); 820 cookies_observer_list_.RemoveObserver(observer);
796 // Call super so that TreeNodeModel doesn't have dead pointers. 821 // Call super so that TreeNodeModel doesn't have dead pointers.
797 ui::TreeNodeModel<CookieTreeNode>::RemoveObserver(observer); 822 ui::TreeNodeModel<CookieTreeNode>::RemoveObserver(observer);
798 } 823 }
799 824
800 void CookiesTreeModel::OnAppCacheModelInfoLoaded() {
801 using appcache::AppCacheInfo;
802 using appcache::AppCacheInfoCollection;
803 using appcache::AppCacheInfoVector;
804 typedef std::map<GURL, AppCacheInfoVector> InfoByOrigin;
805
806 scoped_refptr<AppCacheInfoCollection> appcache_info =
807 appcache_helper_->info_collection();
808 if (!appcache_info || appcache_info->infos_by_origin.empty())
809 return;
810
811 for (InfoByOrigin::const_iterator origin =
812 appcache_info->infos_by_origin.begin();
813 origin != appcache_info->infos_by_origin.end(); ++origin) {
814 std::list<AppCacheInfo>& info_list = appcache_info_[origin->first];
815 info_list.insert(
816 info_list.begin(), origin->second.begin(), origin->second.end());
817 }
818
819 PopulateAppCacheInfoWithFilter(std::wstring());
820 }
821
822 void CookiesTreeModel::PopulateAppCacheInfoWithFilter( 825 void CookiesTreeModel::PopulateAppCacheInfoWithFilter(
823 const std::wstring& filter) { 826 const std::string* app_id,
827 const string16& filter) {
828
824 using appcache::AppCacheInfo; 829 using appcache::AppCacheInfo;
825 typedef std::map<GURL, std::list<AppCacheInfo> > InfoByOrigin; 830 typedef std::map<GURL, std::list<AppCacheInfo> > InfoByOrigin;
826 831 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
827 if (appcache_info_.empty()) 832 bool begin_batch = false;
828 return; 833
829 834 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
835 app_iterator != app_data_map_.end(); ++app_iterator ) {
836 LocalDataContainer* container = app_iterator->second;
837
838 if (container->appcache_info_.empty() ||
839 (app_id && *app_id != container->app_id()))
840 continue;
841
842 if (!begin_batch) {
843 NotifyObserverBeginBatch();
844 begin_batch = true;
845 }
846
847 for (InfoByOrigin::iterator origin = container->appcache_info_.begin();
848 origin != container->appcache_info_.end(); ++origin) {
849 string16 origin_node_name = UTF8ToUTF16(origin->first.host());
850 if (filter.empty() ||
851 (origin_node_name.find(filter) != string16::npos)) {
852 CookieTreeOriginNode* origin_node =
853 root->GetOrCreateOriginNode(origin->first,
854 container->app_id(),
855 container->app_name());
856 CookieTreeAppCachesNode* appcaches_node =
857 origin_node->GetOrCreateAppCachesNode();
858
859 for (std::list<AppCacheInfo>::iterator info = origin->second.begin();
860 info != origin->second.end(); ++info) {
861 appcaches_node->AddAppCacheNode(
862 new CookieTreeAppCacheNode(origin->first, info));
863 }
864 }
865 }
866 }
867
868 if (begin_batch) {
869 NotifyObserverTreeNodeChanged(root);
870 NotifyObserverEndBatch();
871 }
872 }
873
874 void CookiesTreeModel::PopulateCookieInfoWithFilter(
875 const std::string* app_id,
876 const string16& filter) {
830 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 877 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
831 NotifyObserverBeginBatch(); 878 NotifyObserverBeginBatch();
832 for (InfoByOrigin::iterator origin = appcache_info_.begin(); 879 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
833 origin != appcache_info_.end(); ++origin) { 880 app_iterator != app_data_map_.end(); ++app_iterator ) {
834 std::wstring origin_node_name = UTF8ToWide(origin->first.host()); 881 LocalDataContainer* container = app_iterator->second;
835 if (filter.empty() || 882
836 (origin_node_name.find(filter) != std::wstring::npos)) { 883 if (app_id && *app_id != container->app_id())
837 CookieTreeOriginNode* origin_node = 884 continue;
838 root->GetOrCreateOriginNode(origin->first); 885
839 CookieTreeAppCachesNode* appcaches_node = 886 for (CookieList::iterator it = container->cookie_list_.begin();
840 origin_node->GetOrCreateAppCachesNode(); 887 it != container->cookie_list_.end(); ++it) {
841 888 std::string source_string = it->Source();
842 for (std::list<AppCacheInfo>::iterator info = origin->second.begin(); 889 if (source_string.empty() || !use_cookie_source_) {
843 info != origin->second.end(); ++info) { 890 std::string domain = it->Domain();
844 appcaches_node->AddAppCacheNode( 891 if (domain.length() > 1 && domain[0] == '.')
845 new CookieTreeAppCacheNode(origin->first, info)); 892 domain = domain.substr(1);
893
894 // We treat secure cookies just the same as normal ones.
895 source_string = std::string(chrome::kHttpScheme) +
896 content::kStandardSchemeSeparator + domain + "/";
897 }
898
899 GURL source(source_string);
900 if (!filter.size() ||
901 (CookieTreeOriginNode::TitleForUrl(source, container->app_id(),
902 container->app_name()).find(filter) != string16::npos)) {
903 CookieTreeOriginNode* origin_node =
904 root->GetOrCreateOriginNode(source,
905 container->app_id(),
906 container->app_name());
907 CookieTreeCookiesNode* cookies_node =
908 origin_node->GetOrCreateCookiesNode();
909 CookieTreeCookieNode* new_cookie = new CookieTreeCookieNode(it);
910 cookies_node->AddCookieNode(new_cookie);
846 } 911 }
847 } 912 }
848 } 913 }
849 NotifyObserverTreeNodeChanged(root); 914 NotifyObserverTreeNodeChanged(root);
850 NotifyObserverEndBatch(); 915 NotifyObserverEndBatch();
851 } 916 }
852 917
853 void CookiesTreeModel::OnCookiesModelInfoLoaded(
854 const net::CookieList& cookie_list) {
855 cookie_list_.insert(cookie_list_.begin(),
856 cookie_list.begin(),
857 cookie_list.end());
858 PopulateCookieInfoWithFilter(std::wstring());
859 }
860
861 void CookiesTreeModel::PopulateCookieInfoWithFilter(
862 const std::wstring& filter) {
863 // mmargh mmargh mmargh! delicious!
864
865 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
866 NotifyObserverBeginBatch();
867 for (CookieList::iterator it = cookie_list_.begin();
868 it != cookie_list_.end(); ++it) {
869 std::string source_string = it->Source();
870 if (source_string.empty() || !use_cookie_source_) {
871 std::string domain = it->Domain();
872 if (domain.length() > 1 && domain[0] == '.')
873 domain = domain.substr(1);
874
875 // We treat secure cookies just the same as normal ones.
876 source_string = std::string(chrome::kHttpScheme) +
877 content::kStandardSchemeSeparator + domain + "/";
878 }
879
880 GURL source(source_string);
881 if (!filter.size() ||
882 (CookieTreeOriginNode::TitleForUrl(source).find(filter) !=
883 std::string::npos)) {
884 CookieTreeOriginNode* origin_node =
885 root->GetOrCreateOriginNode(source);
886 CookieTreeCookiesNode* cookies_node =
887 origin_node->GetOrCreateCookiesNode();
888 CookieTreeCookieNode* new_cookie = new CookieTreeCookieNode(it);
889 cookies_node->AddCookieNode(new_cookie);
890 }
891 }
892 NotifyObserverTreeNodeChanged(root);
893 NotifyObserverEndBatch();
894 }
895
896 void CookiesTreeModel::OnDatabaseModelInfoLoaded(
897 const DatabaseInfoList& database_info) {
898 database_info_list_ = database_info;
899 PopulateDatabaseInfoWithFilter(std::wstring());
900 }
901
902 void CookiesTreeModel::PopulateDatabaseInfoWithFilter( 918 void CookiesTreeModel::PopulateDatabaseInfoWithFilter(
903 const std::wstring& filter) { 919 const std::string* app_id,
904 if (database_info_list_.empty()) 920 const string16& filter) {
905 return; 921
906 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 922 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
907 NotifyObserverBeginBatch(); 923 bool begin_batch = false;
908 for (DatabaseInfoList::iterator database_info = database_info_list_.begin(); 924
909 database_info != database_info_list_.end(); 925 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
910 ++database_info) { 926 app_iterator != app_data_map_.end(); ++app_iterator ) {
911 GURL origin(database_info->origin); 927 LocalDataContainer* container = app_iterator->second;
912 928
913 if (!filter.size() || 929 if (container->database_info_list_.empty() ||
914 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 930 (app_id && *app_id != container->app_id()))
915 std::wstring::npos)) { 931 continue;
916 CookieTreeOriginNode* origin_node = 932
917 root->GetOrCreateOriginNode(origin); 933 if (!begin_batch) {
918 CookieTreeDatabasesNode* databases_node = 934 NotifyObserverBeginBatch();
919 origin_node->GetOrCreateDatabasesNode(); 935 begin_batch = true;
920 databases_node->AddDatabaseNode( 936 }
921 new CookieTreeDatabaseNode(database_info)); 937
922 } 938 for (DatabaseInfoList::iterator database_info =
923 } 939 container->database_info_list_.begin();
924 NotifyObserverTreeNodeChanged(root); 940 database_info != container->database_info_list_.end();
925 NotifyObserverEndBatch(); 941 ++database_info) {
926 } 942 GURL origin(database_info->origin);
927 943
928 void CookiesTreeModel::OnLocalStorageModelInfoLoaded( 944 if (!filter.size() ||
929 const LocalStorageInfoList& local_storage_info) { 945 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
930 local_storage_info_list_ = local_storage_info; 946 container->app_name()).find(filter) != string16::npos)) {
931 PopulateLocalStorageInfoWithFilter(std::wstring()); 947 CookieTreeOriginNode* origin_node =
948 root->GetOrCreateOriginNode(origin,
949 container->app_id(),
950 container->app_name());
951 CookieTreeDatabasesNode* databases_node =
952 origin_node->GetOrCreateDatabasesNode();
953 databases_node->AddDatabaseNode(
954 new CookieTreeDatabaseNode(database_info));
955 }
956 }
957 }
958
959 if (begin_batch) {
960 NotifyObserverTreeNodeChanged(root);
961 NotifyObserverEndBatch();
962 }
932 } 963 }
933 964
934 void CookiesTreeModel::PopulateLocalStorageInfoWithFilter( 965 void CookiesTreeModel::PopulateLocalStorageInfoWithFilter(
935 const std::wstring& filter) { 966 const std::string* app_id,
936 if (local_storage_info_list_.empty()) 967 const string16& filter) {
937 return; 968
938 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 969 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
939 NotifyObserverBeginBatch(); 970 bool begin_batch = false;
940 for (LocalStorageInfoList::iterator local_storage_info = 971
941 local_storage_info_list_.begin(); 972 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
942 local_storage_info != local_storage_info_list_.end(); 973 app_iterator != app_data_map_.end(); ++app_iterator ) {
943 ++local_storage_info) { 974 LocalDataContainer* container = app_iterator->second;
944 const GURL& origin(local_storage_info->origin_url); 975
945 976 if (container->local_storage_info_list_.empty() ||
946 if (!filter.size() || 977 (app_id && *app_id != container->app_id()))
947 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 978 continue;
948 std::wstring::npos)) { 979
949 CookieTreeOriginNode* origin_node = 980 if (!begin_batch) {
950 root->GetOrCreateOriginNode(origin); 981 NotifyObserverBeginBatch();
951 CookieTreeLocalStoragesNode* local_storages_node = 982 begin_batch = true;
952 origin_node->GetOrCreateLocalStoragesNode(); 983 }
953 local_storages_node->AddLocalStorageNode( 984
954 new CookieTreeLocalStorageNode(local_storage_info)); 985 for (LocalStorageInfoList::iterator local_storage_info =
955 } 986 container->local_storage_info_list_.begin();
956 } 987 local_storage_info != container->local_storage_info_list_.end();
957 NotifyObserverTreeNodeChanged(root); 988 ++local_storage_info) {
958 NotifyObserverEndBatch(); 989 const GURL& origin(local_storage_info->origin_url);
959 } 990
960 991 if (!filter.size() ||
961 void CookiesTreeModel::OnSessionStorageModelInfoLoaded( 992 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
962 const LocalStorageInfoList& session_storage_info) { 993 container->app_name()).find(filter) != std::string::npos)) {
963 session_storage_info_list_ = session_storage_info; 994 CookieTreeOriginNode* origin_node =
964 PopulateSessionStorageInfoWithFilter(std::wstring()); 995 root->GetOrCreateOriginNode(origin,
996 container->app_id(),
997 container->app_name());
998 CookieTreeLocalStoragesNode* local_storages_node =
999 origin_node->GetOrCreateLocalStoragesNode();
1000 local_storages_node->AddLocalStorageNode(
1001 new CookieTreeLocalStorageNode(local_storage_info));
1002 }
1003 }
1004 }
1005 if (begin_batch) {
1006 NotifyObserverTreeNodeChanged(root);
1007 NotifyObserverEndBatch();
1008 }
965 } 1009 }
966 1010
967 void CookiesTreeModel::PopulateSessionStorageInfoWithFilter( 1011 void CookiesTreeModel::PopulateSessionStorageInfoWithFilter(
968 const std::wstring& filter) { 1012 const std::string* app_id,
969 if (session_storage_info_list_.empty()) 1013 const string16& filter) {
970 return; 1014 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
971 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1015 bool begin_batch = false;
972 NotifyObserverBeginBatch(); 1016
973 for (LocalStorageInfoList::iterator session_storage_info = 1017 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
974 session_storage_info_list_.begin(); 1018 app_iterator != app_data_map_.end(); ++app_iterator ) {
975 session_storage_info != session_storage_info_list_.end(); 1019 LocalDataContainer* container = app_iterator->second;
976 ++session_storage_info) { 1020
977 const GURL& origin = session_storage_info->origin_url; 1021 if (container->session_storage_info_list_.empty() ||
978 if (!filter.size() || 1022 (app_id && *app_id != container->app_id()))
979 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 1023 continue;
980 std::wstring::npos)) { 1024
981 CookieTreeOriginNode* origin_node = 1025 if (!begin_batch) {
982 root->GetOrCreateOriginNode(origin); 1026 NotifyObserverBeginBatch();
983 CookieTreeSessionStoragesNode* session_storages_node = 1027 begin_batch = true;
984 origin_node->GetOrCreateSessionStoragesNode(); 1028 }
985 session_storages_node->AddSessionStorageNode( 1029
986 new CookieTreeSessionStorageNode(session_storage_info)); 1030
987 } 1031 for (LocalStorageInfoList::iterator session_storage_info =
988 } 1032 container->session_storage_info_list_.begin();
989 NotifyObserverTreeNodeChanged(root); 1033 session_storage_info != container->session_storage_info_list_.end();
990 NotifyObserverEndBatch(); 1034 ++session_storage_info) {
991 } 1035 const GURL& origin = session_storage_info->origin_url;
992 1036
993 void CookiesTreeModel::OnIndexedDBModelInfoLoaded( 1037 if (!filter.size() ||
994 const IndexedDBInfoList& indexed_db_info) { 1038 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
995 indexed_db_info_list_ = indexed_db_info; 1039 container->app_name()).find(filter) != string16::npos)) {
996 PopulateIndexedDBInfoWithFilter(std::wstring()); 1040 CookieTreeOriginNode* origin_node =
1041 root->GetOrCreateOriginNode(origin,
1042 container->app_id(),
1043 container->app_name());
1044 CookieTreeSessionStoragesNode* session_storages_node =
1045 origin_node->GetOrCreateSessionStoragesNode();
1046 session_storages_node->AddSessionStorageNode(
1047 new CookieTreeSessionStorageNode(session_storage_info));
1048 }
1049 }
1050 }
1051 if (begin_batch) {
1052 NotifyObserverTreeNodeChanged(root);
1053 NotifyObserverEndBatch();
1054 }
997 } 1055 }
998 1056
999 void CookiesTreeModel::PopulateIndexedDBInfoWithFilter( 1057 void CookiesTreeModel::PopulateIndexedDBInfoWithFilter(
1000 const std::wstring& filter) { 1058 const std::string* app_id,
1001 if (indexed_db_info_list_.empty()) 1059 const string16& filter) {
1002 return; 1060
1003 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1061 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1004 NotifyObserverBeginBatch(); 1062 bool begin_batch = false;
1005 for (IndexedDBInfoList::iterator indexed_db_info = 1063
1006 indexed_db_info_list_.begin(); 1064 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
1007 indexed_db_info != indexed_db_info_list_.end(); 1065 app_iterator != app_data_map_.end(); ++app_iterator ) {
1008 ++indexed_db_info) { 1066 LocalDataContainer* container = app_iterator->second;
1009 const GURL& origin = indexed_db_info->origin; 1067
1010 1068 if (container->indexed_db_info_list_.empty() ||
1011 if (!filter.size() || 1069 (app_id && *app_id != container->app_id()))
1012 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 1070 continue;
1013 std::wstring::npos)) { 1071
1014 CookieTreeOriginNode* origin_node = 1072 if (!begin_batch) {
1015 root->GetOrCreateOriginNode(origin); 1073 NotifyObserverBeginBatch();
1016 CookieTreeIndexedDBsNode* indexed_dbs_node = 1074 begin_batch = true;
1017 origin_node->GetOrCreateIndexedDBsNode(); 1075 }
1018 indexed_dbs_node->AddIndexedDBNode( 1076
1019 new CookieTreeIndexedDBNode(indexed_db_info)); 1077 for (IndexedDBInfoList::iterator indexed_db_info =
1020 } 1078 container->indexed_db_info_list_.begin();
1021 } 1079 indexed_db_info != container->indexed_db_info_list_.end();
1022 NotifyObserverTreeNodeChanged(root); 1080 ++indexed_db_info) {
1023 NotifyObserverEndBatch(); 1081 const GURL& origin = indexed_db_info->origin;
1024 } 1082
1025 1083 if (!filter.size() ||
1026 void CookiesTreeModel::OnFileSystemModelInfoLoaded( 1084 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
1027 const FileSystemInfoList& file_system_info) { 1085 container->app_name()).find(filter) != string16::npos)) {
1028 file_system_info_list_ = file_system_info; 1086 CookieTreeOriginNode* origin_node =
1029 PopulateFileSystemInfoWithFilter(std::wstring()); 1087 root->GetOrCreateOriginNode(origin,
1088 container->app_id(),
1089 container->app_name());
1090 CookieTreeIndexedDBsNode* indexed_dbs_node =
1091 origin_node->GetOrCreateIndexedDBsNode();
1092 indexed_dbs_node->AddIndexedDBNode(
1093 new CookieTreeIndexedDBNode(indexed_db_info));
1094 }
1095 }
1096 }
1097 if (begin_batch) {
1098 NotifyObserverTreeNodeChanged(root);
1099 NotifyObserverEndBatch();
1100 }
1101 }
1102
1103 void CookiesTreeModel::PopulateServerBoundCertInfoWithFilter(
1104 const std::string* app_id,
1105 const string16& filter) {
1106 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1107 bool begin_batch = false;
1108
1109 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
1110 app_iterator != app_data_map_.end(); ++app_iterator ) {
1111 LocalDataContainer* container = app_iterator->second;
1112
1113 if (container->server_bound_cert_list_.empty() ||
1114 (app_id && *app_id != container->app_id()))
1115 continue;
1116
1117 if (!begin_batch) {
1118 NotifyObserverBeginBatch();
1119 begin_batch = true;
1120 }
1121
1122 for (ServerBoundCertList::iterator cert_info =
1123 container->server_bound_cert_list_.begin();
1124 cert_info != container->server_bound_cert_list_.end();
1125 ++cert_info) {
1126 GURL origin(cert_info->server_identifier());
1127 if (!origin.is_valid()) {
1128 // Domain Bound Cert. Make a valid URL to satisfy the
1129 // CookieTreeRootNode::GetOrCreateOriginNode interface.
1130 origin = GURL(std::string(chrome::kHttpsScheme) +
1131 content::kStandardSchemeSeparator +
1132 cert_info->server_identifier() + "/");
1133 }
1134 string16 title = CookieTreeOriginNode::TitleForUrl(origin,
1135 container->app_id(),
1136 container->app_name());
1137
1138 if (!filter.size() || title.find(filter) != string16::npos) {
1139 CookieTreeOriginNode* origin_node =
1140 root->GetOrCreateOriginNode(origin,
1141 container->app_id(),
1142 container->app_name());
1143 CookieTreeServerBoundCertsNode* server_bound_certs_node =
1144 origin_node->GetOrCreateServerBoundCertsNode();
1145 server_bound_certs_node->AddServerBoundCertNode(
1146 new CookieTreeServerBoundCertNode(cert_info));
1147 }
1148 }
1149 }
1150 if (begin_batch) {
1151 NotifyObserverTreeNodeChanged(root);
1152 NotifyObserverEndBatch();
1153 }
1030 } 1154 }
1031 1155
1032 void CookiesTreeModel::PopulateFileSystemInfoWithFilter( 1156 void CookiesTreeModel::PopulateFileSystemInfoWithFilter(
1033 const std::wstring& filter) { 1157 const std::string* app_id,
1034 if (file_system_info_list_.empty()) 1158 const string16& filter) {
1035 return; 1159 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1036 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1160 bool begin_batch = false;
1037 NotifyObserverBeginBatch(); 1161
1038 for (FileSystemInfoList::iterator file_system_info = 1162 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
1039 file_system_info_list_.begin(); 1163 app_iterator != app_data_map_.end(); ++app_iterator ) {
1040 file_system_info != file_system_info_list_.end(); 1164 LocalDataContainer* container = app_iterator->second;
1041 ++file_system_info) { 1165
1042 GURL origin(file_system_info->origin); 1166 if (container->file_system_info_list_.empty() ||
1043 1167 (app_id && *app_id != container->app_id()))
1044 if (!filter.size() || 1168 continue;
1045 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 1169
1046 std::wstring::npos)) { 1170 if (!begin_batch) {
1047 CookieTreeOriginNode* origin_node = 1171 NotifyObserverBeginBatch();
1048 root->GetOrCreateOriginNode(origin); 1172 begin_batch = true;
1049 CookieTreeFileSystemsNode* file_systems_node = 1173 }
1050 origin_node->GetOrCreateFileSystemsNode(); 1174
1051 file_systems_node->AddFileSystemNode( 1175 for (FileSystemInfoList::iterator file_system_info =
1052 new CookieTreeFileSystemNode(file_system_info)); 1176 container->file_system_info_list_.begin();
1053 } 1177 file_system_info != container->file_system_info_list_.end();
1054 } 1178 ++file_system_info) {
1055 NotifyObserverTreeNodeChanged(root); 1179 GURL origin(file_system_info->origin);
1056 NotifyObserverEndBatch(); 1180
1057 } 1181 if (!filter.size() ||
1058 1182 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
1059 void CookiesTreeModel::OnQuotaModelInfoLoaded( 1183 container->app_name()).find(filter) != string16::npos)) {
1060 const QuotaInfoArray& quota_info) { 1184 CookieTreeOriginNode* origin_node =
1061 quota_info_list_ = quota_info; 1185 root->GetOrCreateOriginNode(origin,
1062 PopulateQuotaInfoWithFilter(std::wstring()); 1186 container->app_id(),
1187 container->app_name());
1188 CookieTreeFileSystemsNode* file_systems_node =
1189 origin_node->GetOrCreateFileSystemsNode();
1190 file_systems_node->AddFileSystemNode(
1191 new CookieTreeFileSystemNode(file_system_info));
1192 }
1193 }
1194 }
1195 if (begin_batch) {
1196 NotifyObserverTreeNodeChanged(root);
1197 NotifyObserverEndBatch();
1198 }
1063 } 1199 }
1064 1200
1065 void CookiesTreeModel::PopulateQuotaInfoWithFilter( 1201 void CookiesTreeModel::PopulateQuotaInfoWithFilter(
1066 const std::wstring& filter) { 1202 const std::string* app_id,
1067 if (quota_info_list_.empty()) 1203 const string16& filter) {
1068 return; 1204 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1069 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1205 bool begin_batch = false;
1070 NotifyObserverBeginBatch(); 1206
1071 for (QuotaInfoArray::iterator quota_info = quota_info_list_.begin(); 1207 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
1072 quota_info != quota_info_list_.end(); 1208 app_iterator != app_data_map_.end(); ++app_iterator ) {
1073 ++quota_info) { 1209 LocalDataContainer* container = app_iterator->second;
1074 if (!filter.size() || 1210
1075 (UTF8ToWide(quota_info->host).find(filter) != std::wstring::npos)) { 1211 if (container->quota_info_list_.empty() ||
1076 CookieTreeOriginNode* origin_node = 1212 (app_id && *app_id != container->app_id()))
1077 root->GetOrCreateOriginNode(GURL("http://" + quota_info->host)); 1213 continue;
1078 origin_node->UpdateOrCreateQuotaNode(quota_info); 1214
1079 } 1215 if (!begin_batch) {
1080 } 1216 NotifyObserverBeginBatch();
1081 NotifyObserverTreeNodeChanged(root); 1217 begin_batch = true;
1082 NotifyObserverEndBatch(); 1218 }
1083 } 1219
1084 1220 for (QuotaInfoList::iterator quota_info =
1085 void CookiesTreeModel::OnServerBoundCertModelInfoLoaded( 1221 container->quota_info_list_.begin();
1086 const ServerBoundCertList& cert_list) { 1222 quota_info != container->quota_info_list_.end();
1087 server_bound_cert_list_ = cert_list; 1223 ++quota_info) {
1088 PopulateServerBoundCertInfoWithFilter(std::wstring()); 1224 if (!filter.size() ||
1089 } 1225 (UTF8ToUTF16(quota_info->host).find(filter) != string16::npos)) {
1090 1226 CookieTreeOriginNode* origin_node =
1091 void CookiesTreeModel::PopulateServerBoundCertInfoWithFilter( 1227 root->GetOrCreateOriginNode(GURL("http://" + quota_info->host),
1092 const std::wstring& filter) { 1228 container->app_id(),
1093 if (server_bound_cert_list_.empty()) 1229 container->app_name());
1094 return; 1230 origin_node->UpdateOrCreateQuotaNode(quota_info);
1095 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1231 }
1096 NotifyObserverBeginBatch(); 1232 }
1097 for (ServerBoundCertList::iterator cert_info = 1233 }
1098 server_bound_cert_list_.begin(); 1234 if (begin_batch) {
1099 cert_info != server_bound_cert_list_.end(); 1235 NotifyObserverTreeNodeChanged(root);
1100 ++cert_info) { 1236 NotifyObserverEndBatch();
1101 GURL origin(cert_info->server_identifier()); 1237 }
1102 if (!origin.is_valid()) {
1103 // Domain Bound Cert. Make a valid URL to satisfy the
1104 // CookieTreeRootNode::GetOrCreateOriginNode interface.
1105 origin = GURL(std::string(chrome::kHttpsScheme) +
1106 content::kStandardSchemeSeparator +
1107 cert_info->server_identifier() + "/");
1108 }
1109 std::wstring title = CookieTreeOriginNode::TitleForUrl(origin);
1110
1111 if (!filter.size() || title.find(filter) != std::wstring::npos) {
1112 CookieTreeOriginNode* origin_node =
1113 root->GetOrCreateOriginNode(origin);
1114 CookieTreeServerBoundCertsNode* server_bound_certs_node =
1115 origin_node->GetOrCreateServerBoundCertsNode();
1116 server_bound_certs_node->AddServerBoundCertNode(
1117 new CookieTreeServerBoundCertNode(cert_info));
1118 }
1119 }
1120 NotifyObserverTreeNodeChanged(root);
1121 NotifyObserverEndBatch();
1122 } 1238 }
1123 1239
1124 void CookiesTreeModel::NotifyObserverBeginBatch() { 1240 void CookiesTreeModel::NotifyObserverBeginBatch() {
1125 // Only notify the model once if we're batching in a nested manner. 1241 // Only notify the model once if we're batching in a nested manner.
1126 if (batch_update_++ == 0) { 1242 if (batch_update_++ == 0) {
1127 FOR_EACH_OBSERVER(Observer, 1243 FOR_EACH_OBSERVER(Observer,
1128 cookies_observer_list_, 1244 cookies_observer_list_,
1129 TreeModelBeginBatch(this)); 1245 TreeModelBeginBatch(this));
1130 } 1246 }
1131 } 1247 }
1132 1248
1133 void CookiesTreeModel::NotifyObserverEndBatch() { 1249 void CookiesTreeModel::NotifyObserverEndBatch() {
1134 // Only notify the observers if this is the outermost call to EndBatch() if 1250 // Only notify the observers if this is the outermost call to EndBatch() if
1135 // called in a nested manner. 1251 // called in a nested manner.
1136 if (--batch_update_ == 0) { 1252 if (--batch_update_ == 0) {
1137 FOR_EACH_OBSERVER(Observer, 1253 FOR_EACH_OBSERVER(Observer,
1138 cookies_observer_list_, 1254 cookies_observer_list_,
1139 TreeModelEndBatch(this)); 1255 TreeModelEndBatch(this));
1140 } 1256 }
1141 } 1257 }
1258
1259 LocalDataContainer* CookiesTreeModel::GetLocalDataContainer(
1260 const std::string& app_id) {
1261 LocalDataContainer* container = app_data_map_[app_id];
1262 return container;
1263 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698