Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "storage/browser/quota/storage_monitor.h" | 5 #include "storage/browser/quota/storage_monitor.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "base/stl_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
| 13 #include "net/base/url_util.h" | 13 #include "net/base/url_util.h" |
| 14 #include "storage/browser/quota/quota_manager.h" | 14 #include "storage/browser/quota/quota_manager.h" |
| 15 #include "storage/common/quota/quota_status_code.h" | 15 #include "storage/common/quota/quota_status_code.h" |
| 16 | 16 |
| 17 namespace storage { | 17 namespace storage { |
| 18 | 18 |
| 19 // StorageObserverList: | 19 // StorageObserverList: |
| 20 | 20 |
| 21 StorageObserverList::ObserverState::ObserverState() | 21 StorageObserverList::ObserverState::ObserverState() |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 240 } | 240 } |
| 241 | 241 |
| 242 | 242 |
| 243 // StorageTypeObservers: | 243 // StorageTypeObservers: |
| 244 | 244 |
| 245 StorageTypeObservers::StorageTypeObservers(QuotaManager* quota_manager) | 245 StorageTypeObservers::StorageTypeObservers(QuotaManager* quota_manager) |
| 246 : quota_manager_(quota_manager) { | 246 : quota_manager_(quota_manager) { |
| 247 } | 247 } |
| 248 | 248 |
| 249 StorageTypeObservers::~StorageTypeObservers() { | 249 StorageTypeObservers::~StorageTypeObservers() { |
| 250 base::STLDeleteValues(&host_observers_map_); | |
| 251 } | 250 } |
| 252 | 251 |
| 253 void StorageTypeObservers::AddObserver( | 252 void StorageTypeObservers::AddObserver( |
| 254 StorageObserver* observer, const StorageObserver::MonitorParams& params) { | 253 StorageObserver* observer, const StorageObserver::MonitorParams& params) { |
| 255 std::string host = net::GetHostOrSpecFromURL(params.filter.origin); | 254 std::string host = net::GetHostOrSpecFromURL(params.filter.origin); |
| 256 if (host.empty()) | 255 if (host.empty()) |
| 257 return; | 256 return; |
| 258 | 257 |
| 259 HostStorageObservers* host_observers = NULL; | 258 auto& host_observers = host_observers_map_[host]; |
| 260 HostObserversMap::iterator it = host_observers_map_.find(host); | 259 if (!host_observers) |
|
danakj
2016/10/03 22:51:49
Ditto can you comment that there's never a null va
Avi (use Gerrit)
2016/10/04 15:56:22
Again, I don't get it. When we have a key->value m
| |
| 261 if (it == host_observers_map_.end()) { | 260 host_observers = base::MakeUnique<HostStorageObservers>(quota_manager_); |
| 262 host_observers = new HostStorageObservers(quota_manager_); | |
| 263 host_observers_map_[host] = host_observers; | |
| 264 } else { | |
| 265 host_observers = it->second; | |
| 266 } | |
| 267 | 261 |
| 268 host_observers->AddObserver(observer, params); | 262 host_observers->AddObserver(observer, params); |
| 269 } | 263 } |
| 270 | 264 |
| 271 void StorageTypeObservers::RemoveObserver(StorageObserver* observer) { | 265 void StorageTypeObservers::RemoveObserver(StorageObserver* observer) { |
| 272 for (HostObserversMap::iterator it = host_observers_map_.begin(); | 266 for (auto it = host_observers_map_.begin(); |
| 273 it != host_observers_map_.end(); ) { | 267 it != host_observers_map_.end();) { |
| 274 it->second->RemoveObserver(observer); | 268 it->second->RemoveObserver(observer); |
| 275 if (!it->second->ContainsObservers()) { | 269 if (!it->second->ContainsObservers()) { |
| 276 delete it->second; | 270 it = host_observers_map_.erase(it); |
| 277 host_observers_map_.erase(it++); | |
| 278 } else { | 271 } else { |
| 279 ++it; | 272 ++it; |
| 280 } | 273 } |
| 281 } | 274 } |
| 282 } | 275 } |
| 283 | 276 |
| 284 void StorageTypeObservers::RemoveObserverForFilter( | 277 void StorageTypeObservers::RemoveObserverForFilter( |
| 285 StorageObserver* observer, const StorageObserver::Filter& filter) { | 278 StorageObserver* observer, const StorageObserver::Filter& filter) { |
| 286 std::string host = net::GetHostOrSpecFromURL(filter.origin); | 279 std::string host = net::GetHostOrSpecFromURL(filter.origin); |
| 287 HostObserversMap::iterator it = host_observers_map_.find(host); | 280 auto it = host_observers_map_.find(host); |
| 288 if (it == host_observers_map_.end()) | 281 if (it == host_observers_map_.end()) |
| 289 return; | 282 return; |
| 290 | 283 |
| 291 it->second->RemoveObserver(observer); | 284 it->second->RemoveObserver(observer); |
| 292 if (!it->second->ContainsObservers()) { | 285 if (!it->second->ContainsObservers()) |
| 293 delete it->second; | |
| 294 host_observers_map_.erase(it); | 286 host_observers_map_.erase(it); |
| 295 } | |
| 296 } | 287 } |
| 297 | 288 |
| 298 const HostStorageObservers* StorageTypeObservers::GetHostObservers( | 289 const HostStorageObservers* StorageTypeObservers::GetHostObservers( |
| 299 const std::string& host) const { | 290 const std::string& host) const { |
| 300 HostObserversMap::const_iterator it = host_observers_map_.find(host); | 291 auto it = host_observers_map_.find(host); |
| 301 if (it != host_observers_map_.end()) | 292 if (it != host_observers_map_.end()) |
| 302 return it->second; | 293 return it->second.get(); |
| 303 | 294 |
| 304 return NULL; | 295 return NULL; |
| 305 } | 296 } |
| 306 | 297 |
| 307 void StorageTypeObservers::NotifyUsageChange( | 298 void StorageTypeObservers::NotifyUsageChange( |
| 308 const StorageObserver::Filter& filter, | 299 const StorageObserver::Filter& filter, |
| 309 int64_t delta) { | 300 int64_t delta) { |
| 310 std::string host = net::GetHostOrSpecFromURL(filter.origin); | 301 std::string host = net::GetHostOrSpecFromURL(filter.origin); |
| 311 HostObserversMap::iterator it = host_observers_map_.find(host); | 302 auto it = host_observers_map_.find(host); |
| 312 if (it == host_observers_map_.end()) | 303 if (it == host_observers_map_.end()) |
| 313 return; | 304 return; |
| 314 | 305 |
| 315 it->second->NotifyUsageChange(filter, delta); | 306 it->second->NotifyUsageChange(filter, delta); |
| 316 } | 307 } |
| 317 | 308 |
| 318 | 309 |
| 319 // StorageMonitor: | 310 // StorageMonitor: |
| 320 | 311 |
| 321 StorageMonitor::StorageMonitor(QuotaManager* quota_manager) | 312 StorageMonitor::StorageMonitor(QuotaManager* quota_manager) |
| 322 : quota_manager_(quota_manager) { | 313 : quota_manager_(quota_manager) { |
| 323 } | 314 } |
| 324 | 315 |
| 325 StorageMonitor::~StorageMonitor() { | 316 StorageMonitor::~StorageMonitor() { |
| 326 base::STLDeleteValues(&storage_type_observers_map_); | |
| 327 } | 317 } |
| 328 | 318 |
| 329 void StorageMonitor::AddObserver( | 319 void StorageMonitor::AddObserver( |
| 330 StorageObserver* observer, const StorageObserver::MonitorParams& params) { | 320 StorageObserver* observer, const StorageObserver::MonitorParams& params) { |
| 331 DCHECK(observer); | 321 DCHECK(observer); |
| 332 | 322 |
| 333 // Check preconditions. | 323 // Check preconditions. |
| 334 if (params.filter.storage_type == kStorageTypeUnknown || | 324 if (params.filter.storage_type == kStorageTypeUnknown || |
| 335 params.filter.storage_type == kStorageTypeQuotaNotManaged || | 325 params.filter.storage_type == kStorageTypeQuotaNotManaged || |
| 336 params.filter.origin.is_empty()) { | 326 params.filter.origin.is_empty()) { |
| 337 NOTREACHED(); | 327 NOTREACHED(); |
| 338 return; | 328 return; |
| 339 } | 329 } |
| 340 | 330 |
| 341 StorageTypeObservers* type_observers = NULL; | 331 auto& type_observers = |
| 342 StorageTypeObserversMap::iterator it = | 332 storage_type_observers_map_[params.filter.storage_type]; |
| 343 storage_type_observers_map_.find(params.filter.storage_type); | 333 if (!type_observers) |
|
danakj
2016/10/03 22:51:49
dittos
Avi (use Gerrit)
2016/10/04 15:56:22
dittos
| |
| 344 if (it == storage_type_observers_map_.end()) { | 334 type_observers = base::MakeUnique<StorageTypeObservers>(quota_manager_); |
| 345 type_observers = new StorageTypeObservers(quota_manager_); | |
| 346 storage_type_observers_map_[params.filter.storage_type] = type_observers; | |
| 347 } else { | |
| 348 type_observers = it->second; | |
| 349 } | |
| 350 | 335 |
| 351 type_observers->AddObserver(observer, params); | 336 type_observers->AddObserver(observer, params); |
| 352 } | 337 } |
| 353 | 338 |
| 354 void StorageMonitor::RemoveObserver(StorageObserver* observer) { | 339 void StorageMonitor::RemoveObserver(StorageObserver* observer) { |
| 355 for (StorageTypeObserversMap::iterator it = | 340 for (auto it = storage_type_observers_map_.begin(); |
| 356 storage_type_observers_map_.begin(); | |
| 357 it != storage_type_observers_map_.end(); ++it) { | 341 it != storage_type_observers_map_.end(); ++it) { |
| 358 it->second->RemoveObserver(observer); | 342 it->second->RemoveObserver(observer); |
| 359 } | 343 } |
| 360 } | 344 } |
| 361 | 345 |
| 362 void StorageMonitor::RemoveObserverForFilter( | 346 void StorageMonitor::RemoveObserverForFilter( |
| 363 StorageObserver* observer, const StorageObserver::Filter& filter) { | 347 StorageObserver* observer, const StorageObserver::Filter& filter) { |
| 364 StorageTypeObserversMap::iterator it = | 348 auto it = storage_type_observers_map_.find(filter.storage_type); |
| 365 storage_type_observers_map_.find(filter.storage_type); | |
| 366 if (it == storage_type_observers_map_.end()) | 349 if (it == storage_type_observers_map_.end()) |
| 367 return; | 350 return; |
| 368 | 351 |
| 369 it->second->RemoveObserverForFilter(observer, filter); | 352 it->second->RemoveObserverForFilter(observer, filter); |
| 370 } | 353 } |
| 371 | 354 |
| 372 const StorageTypeObservers* StorageMonitor::GetStorageTypeObservers( | 355 const StorageTypeObservers* StorageMonitor::GetStorageTypeObservers( |
| 373 StorageType storage_type) const { | 356 StorageType storage_type) const { |
| 374 StorageTypeObserversMap::const_iterator it = | 357 auto it = storage_type_observers_map_.find(storage_type); |
| 375 storage_type_observers_map_.find(storage_type); | |
| 376 if (it != storage_type_observers_map_.end()) | 358 if (it != storage_type_observers_map_.end()) |
| 377 return it->second; | 359 return it->second.get(); |
| 378 | 360 |
| 379 return NULL; | 361 return NULL; |
|
danakj
2016/10/03 22:51:49
nullptr while you're here?
Avi (use Gerrit)
2016/10/04 15:56:22
Done.
| |
| 380 } | 362 } |
| 381 | 363 |
| 382 void StorageMonitor::NotifyUsageChange(const StorageObserver::Filter& filter, | 364 void StorageMonitor::NotifyUsageChange(const StorageObserver::Filter& filter, |
| 383 int64_t delta) { | 365 int64_t delta) { |
| 384 // Check preconditions. | 366 // Check preconditions. |
| 385 if (filter.storage_type == kStorageTypeUnknown || | 367 if (filter.storage_type == kStorageTypeUnknown || |
| 386 filter.storage_type == kStorageTypeQuotaNotManaged || | 368 filter.storage_type == kStorageTypeQuotaNotManaged || |
| 387 filter.origin.is_empty()) { | 369 filter.origin.is_empty()) { |
| 388 NOTREACHED(); | 370 NOTREACHED(); |
| 389 return; | 371 return; |
| 390 } | 372 } |
| 391 | 373 |
| 392 StorageTypeObserversMap::iterator it = | 374 auto it = storage_type_observers_map_.find(filter.storage_type); |
| 393 storage_type_observers_map_.find(filter.storage_type); | |
| 394 if (it == storage_type_observers_map_.end()) | 375 if (it == storage_type_observers_map_.end()) |
| 395 return; | 376 return; |
| 396 | 377 |
| 397 it->second->NotifyUsageChange(filter, delta); | 378 it->second->NotifyUsageChange(filter, delta); |
| 398 } | 379 } |
| 399 | 380 |
| 400 } // namespace storage | 381 } // namespace storage |
| OLD | NEW |