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

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: 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->GetUrl()) <
80 CanonicalizeHost(rhs->GetTitle())); 115 CanonicalizeHost(rtn->GetUrl()));
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)
markusheintz_ 2012/06/26 16:34:31 nit: Restore the deleted part of the comment.
nasko 2012/06/26 17:43:20 Done.
343 // children. 412 CookieTreeOriginNode* retval = new CookieTreeOriginNode(url, app_id,
344 CookieTreeOriginNode* retval = new CookieTreeOriginNode(url); 413 app_name);
345 DCHECK(model_); 414 DCHECK(model_);
346 model_->Add(this, retval, (origin_node_iterator - children().begin())); 415 model_->Add(this, retval, (origin_node_iterator - children().begin()));
347 return retval; 416 return retval;
348 } 417 }
349 418
350 CookiesTreeModel* CookieTreeRootNode::GetModel() const { 419 CookiesTreeModel* CookieTreeRootNode::GetModel() const {
351 return model_; 420 return model_;
352 } 421 }
353 422
354 CookieTreeNode::DetailedInfo CookieTreeRootNode::GetDetailedInfo() const { 423 CookieTreeNode::DetailedInfo CookieTreeRootNode::GetDetailedInfo() const {
355 return DetailedInfo(string16()).Init(DetailedInfo::TYPE_ROOT); 424 return DetailedInfo(string16()).Init(DetailedInfo::TYPE_ROOT);
356 } 425 }
357 426
358 /////////////////////////////////////////////////////////////////////////////// 427 ///////////////////////////////////////////////////////////////////////////////
359 // CookieTreeOriginNode, public: 428 // CookieTreeOriginNode, public:
360 429
361 // static 430 // static
362 std::wstring CookieTreeOriginNode::TitleForUrl( 431 string16 CookieTreeOriginNode::TitleForUrl(
363 const GURL& url) { 432 const GURL& url,
364 return UTF8ToWide(url.SchemeIsFile() ? kFileOriginNodeName : url.host()); 433 const std::string& app_id,
434 const std::string& app_name) {
435 std::string title;
436 // Only prepend the app name, if the app id is not an empty string.
437 if (app_id != std::string()) {
438 title = app_name;
439 title.append(", ");
440 }
441 title.append(url.SchemeIsFile() ? kFileOriginNodeName : url.host());
442 return UTF8ToUTF16(title);
365 } 443 }
366 444
367 CookieTreeOriginNode::CookieTreeOriginNode(const GURL& url) 445 CookieTreeOriginNode::CookieTreeOriginNode(const GURL& url,
368 : CookieTreeNode(WideToUTF16Hack(TitleForUrl(url))), 446 const std::string& app_id,
447 const std::string& name)
448 : CookieTreeNode(TitleForUrl(url, app_id, name)),
369 cookies_child_(NULL), 449 cookies_child_(NULL),
370 databases_child_(NULL), 450 databases_child_(NULL),
371 local_storages_child_(NULL), 451 local_storages_child_(NULL),
372 session_storages_child_(NULL), 452 session_storages_child_(NULL),
373 appcaches_child_(NULL), 453 appcaches_child_(NULL),
374 indexed_dbs_child_(NULL), 454 indexed_dbs_child_(NULL),
375 file_systems_child_(NULL), 455 file_systems_child_(NULL),
376 quota_child_(NULL), 456 quota_child_(NULL),
377 server_bound_certs_child_(NULL), 457 server_bound_certs_child_(NULL),
458 app_id_(app_id),
459 app_name_(name),
378 url_(url) {} 460 url_(url) {}
379 461
380 CookieTreeOriginNode::~CookieTreeOriginNode() {} 462 CookieTreeOriginNode::~CookieTreeOriginNode() {}
381 463
464 const std::string CookieTreeOriginNode::GetUrl() const {
markusheintz_ 2012/06/26 16:34:31 You don't return a URL here. It looks like this m
nasko 2012/06/26 17:43:20 Renamed to GetHost, as it is meant to retrieve the
465 return url_.SchemeIsFile() ? kFileOriginNodeName : url_.host();
466 }
467
382 CookieTreeNode::DetailedInfo CookieTreeOriginNode::GetDetailedInfo() const { 468 CookieTreeNode::DetailedInfo CookieTreeOriginNode::GetDetailedInfo() const {
383 return DetailedInfo(GetTitle()).Init(DetailedInfo::TYPE_ORIGIN); 469 return DetailedInfo(GetTitle()).InitOrigin(app_id_, app_name_);
384 } 470 }
385 471
386 CookieTreeCookiesNode* CookieTreeOriginNode::GetOrCreateCookiesNode() { 472 CookieTreeCookiesNode* CookieTreeOriginNode::GetOrCreateCookiesNode() {
387 if (cookies_child_) 473 if (cookies_child_)
388 return cookies_child_; 474 return cookies_child_;
389 cookies_child_ = new CookieTreeCookiesNode; 475 cookies_child_ = new CookieTreeCookiesNode;
390 AddChildSortedByTitle(cookies_child_); 476 AddChildSortedByTitle(cookies_child_);
391 return cookies_child_; 477 return cookies_child_;
392 } 478 }
393 479
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 std::vector<CookieTreeNode*>::iterator iter = 698 std::vector<CookieTreeNode*>::iterator iter =
613 std::lower_bound(children().begin(), 699 std::lower_bound(children().begin(),
614 children().end(), 700 children().end(),
615 new_child, 701 new_child,
616 NodeTitleComparator()); 702 NodeTitleComparator());
617 GetModel()->Add(this, new_child, iter - children().begin()); 703 GetModel()->Add(this, new_child, iter - children().begin());
618 } 704 }
619 705
620 /////////////////////////////////////////////////////////////////////////////// 706 ///////////////////////////////////////////////////////////////////////////////
621 // CookiesTreeModel, public: 707 // CookiesTreeModel, public:
622 708 CookiesTreeModel::CookiesTreeModel(const ContainerMap& apps_map,
623 CookiesTreeModel::CookiesTreeModel( 709 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>( 710 : ALLOW_THIS_IN_INITIALIZER_LIST(ui::TreeNodeModel<CookieTreeNode>(
635 new CookieTreeRootNode(this))), 711 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), 712 use_cookie_source_(use_cookie_source),
647 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { 713 batch_update_(0) {
648 DCHECK(cookie_helper_); 714 for (ContainerMap::const_iterator it = apps_map.begin();
markusheintz_ 2012/06/26 16:34:31 nit: ...::const_iterator it(apps_map.begin()); up
nasko 2012/06/26 17:43:20 All other for loops in the file use this syntax, s
649 cookie_helper_->StartFetching( 715 it != apps_map.end(); ++it) {
650 base::Bind(&CookiesTreeModel::OnCookiesModelInfoLoaded, 716 app_data_map_[it->first] = it->second;
651 weak_ptr_factory_.GetWeakPtr())); 717 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 } 718 }
697 } 719 }
698 720
699 CookiesTreeModel::~CookiesTreeModel() {} 721 CookiesTreeModel::~CookiesTreeModel() {
722 STLDeleteValues(&app_data_map_);
723 }
700 724
701 /////////////////////////////////////////////////////////////////////////////// 725 ///////////////////////////////////////////////////////////////////////////////
702 // CookiesTreeModel, TreeModel methods (public): 726 // CookiesTreeModel, TreeModel methods (public):
703 727
704 // TreeModel methods: 728 // TreeModel methods:
705 // Returns the set of icons for the nodes in the tree. You only need override 729 // 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. 730 // this if you don't want to use the default folder icons.
707 void CookiesTreeModel::GetIcons(std::vector<gfx::ImageSkia>* icons) { 731 void CookiesTreeModel::GetIcons(std::vector<gfx::ImageSkia>* icons) {
708 icons->push_back(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 732 icons->push_back(*ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
709 IDR_OMNIBOX_HTTP)); 733 IDR_OMNIBOX_HTTP));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 void CookiesTreeModel::DeleteCookieNode(CookieTreeNode* cookie_node) { 783 void CookiesTreeModel::DeleteCookieNode(CookieTreeNode* cookie_node) {
760 if (cookie_node == GetRoot()) 784 if (cookie_node == GetRoot())
761 return; 785 return;
762 cookie_node->DeleteStoredObjects(); 786 cookie_node->DeleteStoredObjects();
763 CookieTreeNode* parent_node = cookie_node->parent(); 787 CookieTreeNode* parent_node = cookie_node->parent();
764 delete Remove(parent_node, cookie_node); 788 delete Remove(parent_node, cookie_node);
765 if (parent_node->empty()) 789 if (parent_node->empty())
766 DeleteCookieNode(parent_node); 790 DeleteCookieNode(parent_node);
767 } 791 }
768 792
769 void CookiesTreeModel::UpdateSearchResults(const std::wstring& filter) { 793 void CookiesTreeModel::UpdateSearchResults(const string16& filter) {
770 CookieTreeNode* root = GetRoot(); 794 CookieTreeNode* root = GetRoot();
771 int num_children = root->child_count(); 795 int num_children = root->child_count();
772 NotifyObserverBeginBatch(); 796 NotifyObserverBeginBatch();
773 for (int i = num_children - 1; i >= 0; --i) 797 for (int i = num_children - 1; i >= 0; --i)
774 delete Remove(root, root->GetChild(i)); 798 delete Remove(root, root->GetChild(i));
775 PopulateCookieInfoWithFilter(filter); 799 PopulateCookieInfoWithFilter(NULL, filter);
776 PopulateDatabaseInfoWithFilter(filter); 800 PopulateDatabaseInfoWithFilter(NULL, filter);
777 PopulateLocalStorageInfoWithFilter(filter); 801 PopulateLocalStorageInfoWithFilter(NULL, filter);
778 PopulateSessionStorageInfoWithFilter(filter); 802 PopulateSessionStorageInfoWithFilter(NULL, filter);
779 PopulateAppCacheInfoWithFilter(filter); 803 PopulateAppCacheInfoWithFilter(NULL, filter);
780 PopulateIndexedDBInfoWithFilter(filter); 804 PopulateIndexedDBInfoWithFilter(NULL, filter);
781 PopulateFileSystemInfoWithFilter(filter); 805 PopulateFileSystemInfoWithFilter(NULL, filter);
782 PopulateQuotaInfoWithFilter(filter); 806 PopulateQuotaInfoWithFilter(NULL, filter);
783 PopulateServerBoundCertInfoWithFilter(filter); 807 PopulateServerBoundCertInfoWithFilter(NULL, filter);
784 NotifyObserverTreeNodeChanged(root); 808 NotifyObserverTreeNodeChanged(root);
785 NotifyObserverEndBatch(); 809 NotifyObserverEndBatch();
786 } 810 }
787 811
788 void CookiesTreeModel::AddCookiesTreeObserver(Observer* observer) { 812 void CookiesTreeModel::AddCookiesTreeObserver(Observer* observer) {
789 cookies_observer_list_.AddObserver(observer); 813 cookies_observer_list_.AddObserver(observer);
790 // Call super so that TreeNodeModel can notify, too. 814 // Call super so that TreeNodeModel can notify, too.
791 ui::TreeNodeModel<CookieTreeNode>::AddObserver(observer); 815 ui::TreeNodeModel<CookieTreeNode>::AddObserver(observer);
792 } 816 }
793 817
794 void CookiesTreeModel::RemoveCookiesTreeObserver(Observer* observer) { 818 void CookiesTreeModel::RemoveCookiesTreeObserver(Observer* observer) {
795 cookies_observer_list_.RemoveObserver(observer); 819 cookies_observer_list_.RemoveObserver(observer);
796 // Call super so that TreeNodeModel doesn't have dead pointers. 820 // Call super so that TreeNodeModel doesn't have dead pointers.
797 ui::TreeNodeModel<CookieTreeNode>::RemoveObserver(observer); 821 ui::TreeNodeModel<CookieTreeNode>::RemoveObserver(observer);
798 } 822 }
799 823
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( 824 void CookiesTreeModel::PopulateAppCacheInfoWithFilter(
823 const std::wstring& filter) { 825 const std::string* app_id,
826 const string16& filter) {
827
824 using appcache::AppCacheInfo; 828 using appcache::AppCacheInfo;
825 typedef std::map<GURL, std::list<AppCacheInfo> > InfoByOrigin; 829 typedef std::map<GURL, std::list<AppCacheInfo> > InfoByOrigin;
826 830 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
827 if (appcache_info_.empty()) 831 bool begin_batch = false;
828 return; 832
829 833 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
834 app_iterator != app_data_map_.end(); ++app_iterator ) {
835 LocalDataContainer* container = app_iterator->second;
836
837 if (container->appcache_info_.empty() ||
838 (app_id && *app_id != container->app_id()))
839 continue;
840
841 if (!begin_batch) {
842 NotifyObserverBeginBatch();
843 begin_batch = true;
844 }
845
846 for (InfoByOrigin::iterator origin = container->appcache_info_.begin();
847 origin != container->appcache_info_.end(); ++origin) {
848 string16 origin_node_name = UTF8ToUTF16(origin->first.host());
849 if (filter.empty() ||
850 (origin_node_name.find(filter) != string16::npos)) {
851 CookieTreeOriginNode* origin_node =
852 root->GetOrCreateOriginNode(origin->first,
853 container->app_id(),
854 container->app_name());
855 CookieTreeAppCachesNode* appcaches_node =
856 origin_node->GetOrCreateAppCachesNode();
857
858 for (std::list<AppCacheInfo>::iterator info = origin->second.begin();
859 info != origin->second.end(); ++info) {
860 appcaches_node->AddAppCacheNode(
861 new CookieTreeAppCacheNode(origin->first, info));
862 }
863 }
864 }
865 }
866
867 if (begin_batch) {
868 NotifyObserverTreeNodeChanged(root);
869 NotifyObserverEndBatch();
870 }
871 }
872
873 void CookiesTreeModel::PopulateCookieInfoWithFilter(
874 const std::string* app_id,
875 const string16& filter) {
830 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 876 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
831 NotifyObserverBeginBatch(); 877 NotifyObserverBeginBatch();
832 for (InfoByOrigin::iterator origin = appcache_info_.begin(); 878 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
833 origin != appcache_info_.end(); ++origin) { 879 app_iterator != app_data_map_.end(); ++app_iterator ) {
834 std::wstring origin_node_name = UTF8ToWide(origin->first.host()); 880 LocalDataContainer* container = app_iterator->second;
835 if (filter.empty() || 881
836 (origin_node_name.find(filter) != std::wstring::npos)) { 882 if (app_id && *app_id != container->app_id())
837 CookieTreeOriginNode* origin_node = 883 continue;
838 root->GetOrCreateOriginNode(origin->first); 884
839 CookieTreeAppCachesNode* appcaches_node = 885 for (CookieList::iterator it = container->cookie_list_.begin();
840 origin_node->GetOrCreateAppCachesNode(); 886 it != container->cookie_list_.end(); ++it) {
841 887 std::string source_string = it->Source();
842 for (std::list<AppCacheInfo>::iterator info = origin->second.begin(); 888 if (source_string.empty() || !use_cookie_source_) {
843 info != origin->second.end(); ++info) { 889 std::string domain = it->Domain();
844 appcaches_node->AddAppCacheNode( 890 if (domain.length() > 1 && domain[0] == '.')
845 new CookieTreeAppCacheNode(origin->first, info)); 891 domain = domain.substr(1);
892
893 // We treat secure cookies just the same as normal ones.
894 source_string = std::string(chrome::kHttpScheme) +
895 content::kStandardSchemeSeparator + domain + "/";
896 }
897
898 GURL source(source_string);
899 if (!filter.size() ||
900 (CookieTreeOriginNode::TitleForUrl(source, container->app_id(),
901 container->app_name()).find(filter) != string16::npos)) {
902 CookieTreeOriginNode* origin_node =
903 root->GetOrCreateOriginNode(source,
904 container->app_id(),
905 container->app_name());
906 CookieTreeCookiesNode* cookies_node =
907 origin_node->GetOrCreateCookiesNode();
908 CookieTreeCookieNode* new_cookie = new CookieTreeCookieNode(it);
909 cookies_node->AddCookieNode(new_cookie);
846 } 910 }
847 } 911 }
848 } 912 }
849 NotifyObserverTreeNodeChanged(root); 913 NotifyObserverTreeNodeChanged(root);
850 NotifyObserverEndBatch(); 914 NotifyObserverEndBatch();
851 } 915 }
852 916
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( 917 void CookiesTreeModel::PopulateDatabaseInfoWithFilter(
903 const std::wstring& filter) { 918 const std::string* app_id,
904 if (database_info_list_.empty()) 919 const string16& filter) {
905 return; 920
906 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 921 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
907 NotifyObserverBeginBatch(); 922 bool begin_batch = false;
908 for (DatabaseInfoList::iterator database_info = database_info_list_.begin(); 923
909 database_info != database_info_list_.end(); 924 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
910 ++database_info) { 925 app_iterator != app_data_map_.end(); ++app_iterator ) {
911 GURL origin(database_info->origin); 926 LocalDataContainer* container = app_iterator->second;
912 927
913 if (!filter.size() || 928 if (container->database_info_list_.empty() ||
914 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 929 (app_id && *app_id != container->app_id()))
915 std::wstring::npos)) { 930 continue;
916 CookieTreeOriginNode* origin_node = 931
917 root->GetOrCreateOriginNode(origin); 932 if (!begin_batch) {
918 CookieTreeDatabasesNode* databases_node = 933 NotifyObserverBeginBatch();
919 origin_node->GetOrCreateDatabasesNode(); 934 begin_batch = true;
920 databases_node->AddDatabaseNode( 935 }
921 new CookieTreeDatabaseNode(database_info)); 936
922 } 937 for (DatabaseInfoList::iterator database_info =
923 } 938 container->database_info_list_.begin();
924 NotifyObserverTreeNodeChanged(root); 939 database_info != container->database_info_list_.end();
925 NotifyObserverEndBatch(); 940 ++database_info) {
926 } 941 GURL origin(database_info->origin);
927 942
928 void CookiesTreeModel::OnLocalStorageModelInfoLoaded( 943 if (!filter.size() ||
929 const LocalStorageInfoList& local_storage_info) { 944 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
930 local_storage_info_list_ = local_storage_info; 945 container->app_name()).find(filter) != string16::npos)) {
931 PopulateLocalStorageInfoWithFilter(std::wstring()); 946 CookieTreeOriginNode* origin_node =
947 root->GetOrCreateOriginNode(origin,
948 container->app_id(),
949 container->app_name());
950 CookieTreeDatabasesNode* databases_node =
951 origin_node->GetOrCreateDatabasesNode();
952 databases_node->AddDatabaseNode(
953 new CookieTreeDatabaseNode(database_info));
954 }
955 }
956 }
957
958 if (begin_batch) {
959 NotifyObserverTreeNodeChanged(root);
960 NotifyObserverEndBatch();
961 }
932 } 962 }
933 963
934 void CookiesTreeModel::PopulateLocalStorageInfoWithFilter( 964 void CookiesTreeModel::PopulateLocalStorageInfoWithFilter(
935 const std::wstring& filter) { 965 const std::string* app_id,
936 if (local_storage_info_list_.empty()) 966 const string16& filter) {
937 return; 967
938 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 968 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
939 NotifyObserverBeginBatch(); 969 bool begin_batch = false;
940 for (LocalStorageInfoList::iterator local_storage_info = 970
941 local_storage_info_list_.begin(); 971 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
942 local_storage_info != local_storage_info_list_.end(); 972 app_iterator != app_data_map_.end(); ++app_iterator ) {
943 ++local_storage_info) { 973 LocalDataContainer* container = app_iterator->second;
944 const GURL& origin(local_storage_info->origin_url); 974
945 975 if (container->local_storage_info_list_.empty() ||
946 if (!filter.size() || 976 (app_id && *app_id != container->app_id()))
947 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 977 continue;
948 std::wstring::npos)) { 978
949 CookieTreeOriginNode* origin_node = 979 if (!begin_batch) {
950 root->GetOrCreateOriginNode(origin); 980 NotifyObserverBeginBatch();
951 CookieTreeLocalStoragesNode* local_storages_node = 981 begin_batch = true;
952 origin_node->GetOrCreateLocalStoragesNode(); 982 }
953 local_storages_node->AddLocalStorageNode( 983
954 new CookieTreeLocalStorageNode(local_storage_info)); 984 for (LocalStorageInfoList::iterator local_storage_info =
955 } 985 container->local_storage_info_list_.begin();
956 } 986 local_storage_info != container->local_storage_info_list_.end();
957 NotifyObserverTreeNodeChanged(root); 987 ++local_storage_info) {
958 NotifyObserverEndBatch(); 988 const GURL& origin(local_storage_info->origin_url);
959 } 989
960 990 if (!filter.size() ||
961 void CookiesTreeModel::OnSessionStorageModelInfoLoaded( 991 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
962 const LocalStorageInfoList& session_storage_info) { 992 container->app_name()).find(filter) != std::string::npos)) {
963 session_storage_info_list_ = session_storage_info; 993 CookieTreeOriginNode* origin_node =
964 PopulateSessionStorageInfoWithFilter(std::wstring()); 994 root->GetOrCreateOriginNode(origin,
995 container->app_id(),
996 container->app_name());
997 CookieTreeLocalStoragesNode* local_storages_node =
998 origin_node->GetOrCreateLocalStoragesNode();
999 local_storages_node->AddLocalStorageNode(
1000 new CookieTreeLocalStorageNode(local_storage_info));
1001 }
1002 }
1003 }
1004 if (begin_batch) {
1005 NotifyObserverTreeNodeChanged(root);
1006 NotifyObserverEndBatch();
1007 }
965 } 1008 }
966 1009
967 void CookiesTreeModel::PopulateSessionStorageInfoWithFilter( 1010 void CookiesTreeModel::PopulateSessionStorageInfoWithFilter(
968 const std::wstring& filter) { 1011 const std::string* app_id,
969 if (session_storage_info_list_.empty()) 1012 const string16& filter) {
970 return; 1013 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
971 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1014 bool begin_batch = false;
972 NotifyObserverBeginBatch(); 1015
973 for (LocalStorageInfoList::iterator session_storage_info = 1016 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
974 session_storage_info_list_.begin(); 1017 app_iterator != app_data_map_.end(); ++app_iterator ) {
975 session_storage_info != session_storage_info_list_.end(); 1018 LocalDataContainer* container = app_iterator->second;
976 ++session_storage_info) { 1019
977 const GURL& origin = session_storage_info->origin_url; 1020 if (container->session_storage_info_list_.empty() ||
978 if (!filter.size() || 1021 (app_id && *app_id != container->app_id()))
979 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 1022 continue;
980 std::wstring::npos)) { 1023
981 CookieTreeOriginNode* origin_node = 1024 if (!begin_batch) {
982 root->GetOrCreateOriginNode(origin); 1025 NotifyObserverBeginBatch();
983 CookieTreeSessionStoragesNode* session_storages_node = 1026 begin_batch = true;
984 origin_node->GetOrCreateSessionStoragesNode(); 1027 }
985 session_storages_node->AddSessionStorageNode( 1028
986 new CookieTreeSessionStorageNode(session_storage_info)); 1029
987 } 1030 for (LocalStorageInfoList::iterator session_storage_info =
988 } 1031 container->session_storage_info_list_.begin();
989 NotifyObserverTreeNodeChanged(root); 1032 session_storage_info != container->session_storage_info_list_.end();
990 NotifyObserverEndBatch(); 1033 ++session_storage_info) {
991 } 1034 const GURL& origin = session_storage_info->origin_url;
992 1035
993 void CookiesTreeModel::OnIndexedDBModelInfoLoaded( 1036 if (!filter.size() ||
994 const IndexedDBInfoList& indexed_db_info) { 1037 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
995 indexed_db_info_list_ = indexed_db_info; 1038 container->app_name()).find(filter) != string16::npos)) {
996 PopulateIndexedDBInfoWithFilter(std::wstring()); 1039 CookieTreeOriginNode* origin_node =
1040 root->GetOrCreateOriginNode(origin,
1041 container->app_id(),
1042 container->app_name());
1043 CookieTreeSessionStoragesNode* session_storages_node =
1044 origin_node->GetOrCreateSessionStoragesNode();
1045 session_storages_node->AddSessionStorageNode(
1046 new CookieTreeSessionStorageNode(session_storage_info));
1047 }
1048 }
1049 }
1050 if (begin_batch) {
1051 NotifyObserverTreeNodeChanged(root);
1052 NotifyObserverEndBatch();
1053 }
997 } 1054 }
998 1055
999 void CookiesTreeModel::PopulateIndexedDBInfoWithFilter( 1056 void CookiesTreeModel::PopulateIndexedDBInfoWithFilter(
1000 const std::wstring& filter) { 1057 const std::string* app_id,
1001 if (indexed_db_info_list_.empty()) 1058 const string16& filter) {
1002 return; 1059
1003 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1060 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1004 NotifyObserverBeginBatch(); 1061 bool begin_batch = false;
1005 for (IndexedDBInfoList::iterator indexed_db_info = 1062
1006 indexed_db_info_list_.begin(); 1063 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
1007 indexed_db_info != indexed_db_info_list_.end(); 1064 app_iterator != app_data_map_.end(); ++app_iterator ) {
1008 ++indexed_db_info) { 1065 LocalDataContainer* container = app_iterator->second;
1009 const GURL& origin = indexed_db_info->origin; 1066
1010 1067 if (container->indexed_db_info_list_.empty() ||
1011 if (!filter.size() || 1068 (app_id && *app_id != container->app_id()))
1012 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 1069 continue;
1013 std::wstring::npos)) { 1070
1014 CookieTreeOriginNode* origin_node = 1071 if (!begin_batch) {
1015 root->GetOrCreateOriginNode(origin); 1072 NotifyObserverBeginBatch();
1016 CookieTreeIndexedDBsNode* indexed_dbs_node = 1073 begin_batch = true;
1017 origin_node->GetOrCreateIndexedDBsNode(); 1074 }
1018 indexed_dbs_node->AddIndexedDBNode( 1075
1019 new CookieTreeIndexedDBNode(indexed_db_info)); 1076 for (IndexedDBInfoList::iterator indexed_db_info =
1020 } 1077 container->indexed_db_info_list_.begin();
1021 } 1078 indexed_db_info != container->indexed_db_info_list_.end();
1022 NotifyObserverTreeNodeChanged(root); 1079 ++indexed_db_info) {
1023 NotifyObserverEndBatch(); 1080 const GURL& origin = indexed_db_info->origin;
1024 } 1081
1025 1082 if (!filter.size() ||
1026 void CookiesTreeModel::OnFileSystemModelInfoLoaded( 1083 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
1027 const FileSystemInfoList& file_system_info) { 1084 container->app_name()).find(filter) != string16::npos)) {
1028 file_system_info_list_ = file_system_info; 1085 CookieTreeOriginNode* origin_node =
1029 PopulateFileSystemInfoWithFilter(std::wstring()); 1086 root->GetOrCreateOriginNode(origin,
1087 container->app_id(),
1088 container->app_name());
1089 CookieTreeIndexedDBsNode* indexed_dbs_node =
1090 origin_node->GetOrCreateIndexedDBsNode();
1091 indexed_dbs_node->AddIndexedDBNode(
1092 new CookieTreeIndexedDBNode(indexed_db_info));
1093 }
1094 }
1095 }
1096 if (begin_batch) {
1097 NotifyObserverTreeNodeChanged(root);
1098 NotifyObserverEndBatch();
1099 }
1100 }
1101
1102 void CookiesTreeModel::PopulateServerBoundCertInfoWithFilter(
1103 const std::string* app_id,
1104 const string16& filter) {
1105 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1106 bool begin_batch = false;
1107
1108 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
1109 app_iterator != app_data_map_.end(); ++app_iterator ) {
1110 LocalDataContainer* container = app_iterator->second;
1111
1112 if (container->server_bound_cert_list_.empty() ||
1113 (app_id && *app_id != container->app_id()))
1114 continue;
1115
1116 if (!begin_batch) {
1117 NotifyObserverBeginBatch();
1118 begin_batch = true;
1119 }
1120
1121 for (ServerBoundCertList::iterator cert_info =
1122 container->server_bound_cert_list_.begin();
1123 cert_info != container->server_bound_cert_list_.end();
1124 ++cert_info) {
1125 GURL origin(cert_info->server_identifier());
1126 if (!origin.is_valid()) {
1127 // Domain Bound Cert. Make a valid URL to satisfy the
1128 // CookieTreeRootNode::GetOrCreateOriginNode interface.
1129 origin = GURL(std::string(chrome::kHttpsScheme) +
1130 content::kStandardSchemeSeparator +
1131 cert_info->server_identifier() + "/");
1132 }
1133 string16 title = CookieTreeOriginNode::TitleForUrl(origin,
1134 container->app_id(),
1135 container->app_name());
1136
1137 if (!filter.size() || title.find(filter) != string16::npos) {
1138 CookieTreeOriginNode* origin_node =
1139 root->GetOrCreateOriginNode(origin,
1140 container->app_id(),
1141 container->app_name());
1142 CookieTreeServerBoundCertsNode* server_bound_certs_node =
1143 origin_node->GetOrCreateServerBoundCertsNode();
1144 server_bound_certs_node->AddServerBoundCertNode(
1145 new CookieTreeServerBoundCertNode(cert_info));
1146 }
1147 }
1148 }
1149 if (begin_batch) {
1150 NotifyObserverTreeNodeChanged(root);
1151 NotifyObserverEndBatch();
1152 }
1030 } 1153 }
1031 1154
1032 void CookiesTreeModel::PopulateFileSystemInfoWithFilter( 1155 void CookiesTreeModel::PopulateFileSystemInfoWithFilter(
1033 const std::wstring& filter) { 1156 const std::string* app_id,
1034 if (file_system_info_list_.empty()) 1157 const string16& filter) {
1035 return; 1158 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1036 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1159 bool begin_batch = false;
1037 NotifyObserverBeginBatch(); 1160
1038 for (FileSystemInfoList::iterator file_system_info = 1161 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
1039 file_system_info_list_.begin(); 1162 app_iterator != app_data_map_.end(); ++app_iterator ) {
1040 file_system_info != file_system_info_list_.end(); 1163 LocalDataContainer* container = app_iterator->second;
1041 ++file_system_info) { 1164
1042 GURL origin(file_system_info->origin); 1165 if (container->file_system_info_list_.empty() ||
1043 1166 (app_id && *app_id != container->app_id()))
1044 if (!filter.size() || 1167 continue;
1045 (CookieTreeOriginNode::TitleForUrl(origin).find(filter) != 1168
1046 std::wstring::npos)) { 1169 if (!begin_batch) {
1047 CookieTreeOriginNode* origin_node = 1170 NotifyObserverBeginBatch();
1048 root->GetOrCreateOriginNode(origin); 1171 begin_batch = true;
1049 CookieTreeFileSystemsNode* file_systems_node = 1172 }
1050 origin_node->GetOrCreateFileSystemsNode(); 1173
1051 file_systems_node->AddFileSystemNode( 1174 for (FileSystemInfoList::iterator file_system_info =
1052 new CookieTreeFileSystemNode(file_system_info)); 1175 container->file_system_info_list_.begin();
1053 } 1176 file_system_info != container->file_system_info_list_.end();
1054 } 1177 ++file_system_info) {
1055 NotifyObserverTreeNodeChanged(root); 1178 GURL origin(file_system_info->origin);
1056 NotifyObserverEndBatch(); 1179
1057 } 1180 if (!filter.size() ||
1058 1181 (CookieTreeOriginNode::TitleForUrl(origin, container->app_id(),
1059 void CookiesTreeModel::OnQuotaModelInfoLoaded( 1182 container->app_name()).find(filter) != string16::npos)) {
1060 const QuotaInfoArray& quota_info) { 1183 CookieTreeOriginNode* origin_node =
1061 quota_info_list_ = quota_info; 1184 root->GetOrCreateOriginNode(origin,
1062 PopulateQuotaInfoWithFilter(std::wstring()); 1185 container->app_id(),
1186 container->app_name());
1187 CookieTreeFileSystemsNode* file_systems_node =
1188 origin_node->GetOrCreateFileSystemsNode();
1189 file_systems_node->AddFileSystemNode(
1190 new CookieTreeFileSystemNode(file_system_info));
1191 }
1192 }
1193 }
1194 if (begin_batch) {
1195 NotifyObserverTreeNodeChanged(root);
1196 NotifyObserverEndBatch();
1197 }
1063 } 1198 }
1064 1199
1065 void CookiesTreeModel::PopulateQuotaInfoWithFilter( 1200 void CookiesTreeModel::PopulateQuotaInfoWithFilter(
1066 const std::wstring& filter) { 1201 const std::string* app_id,
1067 if (quota_info_list_.empty()) 1202 const string16& filter) {
1068 return; 1203 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot());
1069 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1204 bool begin_batch = false;
1070 NotifyObserverBeginBatch(); 1205
1071 for (QuotaInfoArray::iterator quota_info = quota_info_list_.begin(); 1206 for (ContainerMap::iterator app_iterator = app_data_map_.begin();
1072 quota_info != quota_info_list_.end(); 1207 app_iterator != app_data_map_.end(); ++app_iterator ) {
1073 ++quota_info) { 1208 LocalDataContainer* container = app_iterator->second;
1074 if (!filter.size() || 1209
1075 (UTF8ToWide(quota_info->host).find(filter) != std::wstring::npos)) { 1210 if (container->quota_info_list_.empty() ||
1076 CookieTreeOriginNode* origin_node = 1211 (app_id && *app_id != container->app_id()))
1077 root->GetOrCreateOriginNode(GURL("http://" + quota_info->host)); 1212 continue;
1078 origin_node->UpdateOrCreateQuotaNode(quota_info); 1213
1079 } 1214 if (!begin_batch) {
1080 } 1215 NotifyObserverBeginBatch();
1081 NotifyObserverTreeNodeChanged(root); 1216 begin_batch = true;
1082 NotifyObserverEndBatch(); 1217 }
1083 } 1218
1084 1219 for (QuotaInfoList::iterator quota_info =
1085 void CookiesTreeModel::OnServerBoundCertModelInfoLoaded( 1220 container->quota_info_list_.begin();
1086 const ServerBoundCertList& cert_list) { 1221 quota_info != container->quota_info_list_.end();
1087 server_bound_cert_list_ = cert_list; 1222 ++quota_info) {
1088 PopulateServerBoundCertInfoWithFilter(std::wstring()); 1223 if (!filter.size() ||
1089 } 1224 (UTF8ToUTF16(quota_info->host).find(filter) != string16::npos)) {
1090 1225 CookieTreeOriginNode* origin_node =
1091 void CookiesTreeModel::PopulateServerBoundCertInfoWithFilter( 1226 root->GetOrCreateOriginNode(GURL("http://" + quota_info->host),
1092 const std::wstring& filter) { 1227 container->app_id(),
1093 if (server_bound_cert_list_.empty()) 1228 container->app_name());
1094 return; 1229 origin_node->UpdateOrCreateQuotaNode(quota_info);
1095 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); 1230 }
1096 NotifyObserverBeginBatch(); 1231 }
1097 for (ServerBoundCertList::iterator cert_info = 1232 }
1098 server_bound_cert_list_.begin(); 1233 if (begin_batch) {
1099 cert_info != server_bound_cert_list_.end(); 1234 NotifyObserverTreeNodeChanged(root);
1100 ++cert_info) { 1235 NotifyObserverEndBatch();
1101 GURL origin(cert_info->server_identifier()); 1236 }
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 } 1237 }
1123 1238
1124 void CookiesTreeModel::NotifyObserverBeginBatch() { 1239 void CookiesTreeModel::NotifyObserverBeginBatch() {
1125 // Only notify the model once if we're batching in a nested manner. 1240 // Only notify the model once if we're batching in a nested manner.
1126 if (batch_update_++ == 0) { 1241 if (batch_update_++ == 0) {
1127 FOR_EACH_OBSERVER(Observer, 1242 FOR_EACH_OBSERVER(Observer,
1128 cookies_observer_list_, 1243 cookies_observer_list_,
1129 TreeModelBeginBatch(this)); 1244 TreeModelBeginBatch(this));
1130 } 1245 }
1131 } 1246 }
1132 1247
1133 void CookiesTreeModel::NotifyObserverEndBatch() { 1248 void CookiesTreeModel::NotifyObserverEndBatch() {
1134 // Only notify the observers if this is the outermost call to EndBatch() if 1249 // Only notify the observers if this is the outermost call to EndBatch() if
1135 // called in a nested manner. 1250 // called in a nested manner.
1136 if (--batch_update_ == 0) { 1251 if (--batch_update_ == 0) {
1137 FOR_EACH_OBSERVER(Observer, 1252 FOR_EACH_OBSERVER(Observer,
1138 cookies_observer_list_, 1253 cookies_observer_list_,
1139 TreeModelEndBatch(this)); 1254 TreeModelEndBatch(this));
1140 } 1255 }
1141 } 1256 }
1257
1258 LocalDataContainer* CookiesTreeModel::GetLocalDataContainer(
1259 const std::string& app_id) {
1260 LocalDataContainer* container = app_data_map_[app_id];
1261 return container;
1262 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698