| Index: webkit/fileapi/sandbox_quota_observer.cc
|
| diff --git a/webkit/fileapi/sandbox_quota_observer.cc b/webkit/fileapi/sandbox_quota_observer.cc
|
| index 29e11022a79b6433011eb32bd1afc275695445a1..ec24d37a3a568f78c4fc36c1789cd4ccd39cef14 100644
|
| --- a/webkit/fileapi/sandbox_quota_observer.cc
|
| +++ b/webkit/fileapi/sandbox_quota_observer.cc
|
| @@ -20,7 +20,9 @@ SandboxQuotaObserver::SandboxQuotaObserver(
|
| ObfuscatedFileUtil* sandbox_file_util)
|
| : quota_manager_proxy_(quota_manager_proxy),
|
| update_notify_runner_(update_notify_runner),
|
| - sandbox_file_util_(sandbox_file_util) {}
|
| + sandbox_file_util_(sandbox_file_util),
|
| + running_delayed_cache_update_(false),
|
| + weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {}
|
|
|
| SandboxQuotaObserver::~SandboxQuotaObserver() {}
|
|
|
| @@ -37,11 +39,7 @@ void SandboxQuotaObserver::OnUpdate(const FileSystemURL& url,
|
| int64 delta) {
|
| DCHECK(SandboxMountPointProvider::CanHandleType(url.type()));
|
| DCHECK(update_notify_runner_->RunsTasksOnCurrentThread());
|
| - FilePath usage_file_path = GetUsageCachePath(url);
|
| - if (usage_file_path.empty())
|
| - return;
|
| - if (delta != 0)
|
| - FileSystemUsageCache::AtomicUpdateUsageByDelta(usage_file_path, delta);
|
| +
|
| if (quota_manager_proxy_) {
|
| quota_manager_proxy_->NotifyStorageModified(
|
| quota::QuotaClient::kFileSystem,
|
| @@ -49,14 +47,35 @@ void SandboxQuotaObserver::OnUpdate(const FileSystemURL& url,
|
| FileSystemTypeToQuotaStorageType(url.type()),
|
| delta);
|
| }
|
| +
|
| + FilePath usage_file_path = GetUsageCachePath(url);
|
| + if (usage_file_path.empty())
|
| + return;
|
| +
|
| + pending_update_notification_[usage_file_path] += delta;
|
| + if (!running_delayed_cache_update_) {
|
| + update_notify_runner_->PostTask(FROM_HERE, base::Bind(
|
| + &SandboxQuotaObserver::ApplyPendingUsageUpdate,
|
| + weak_factory_.GetWeakPtr()));
|
| + running_delayed_cache_update_ = true;
|
| + }
|
| }
|
|
|
| void SandboxQuotaObserver::OnEndUpdate(const FileSystemURL& url) {
|
| DCHECK(SandboxMountPointProvider::CanHandleType(url.type()));
|
| DCHECK(update_notify_runner_->RunsTasksOnCurrentThread());
|
| +
|
| FilePath usage_file_path = GetUsageCachePath(url);
|
| if (usage_file_path.empty())
|
| return;
|
| +
|
| + PendingUpdateNotificationMap::iterator found =
|
| + pending_update_notification_.find(usage_file_path);
|
| + if (found != pending_update_notification_.end()) {
|
| + UpdateUsageCacheFile(found->first, found->second);
|
| + pending_update_notification_.erase(found);
|
| + }
|
| +
|
| FileSystemUsageCache::DecrementDirty(usage_file_path);
|
| }
|
|
|
| @@ -83,4 +102,23 @@ FilePath SandboxQuotaObserver::GetUsageCachePath(const FileSystemURL& url) {
|
| return path;
|
| }
|
|
|
| +void SandboxQuotaObserver::ApplyPendingUsageUpdate() {
|
| + for (PendingUpdateNotificationMap::iterator itr =
|
| + pending_update_notification_.begin();
|
| + itr != pending_update_notification_.end();
|
| + ++itr) {
|
| + UpdateUsageCacheFile(itr->first, itr->second);
|
| + }
|
| + pending_update_notification_.clear();
|
| + running_delayed_cache_update_ = false;
|
| +}
|
| +
|
| +void SandboxQuotaObserver::UpdateUsageCacheFile(
|
| + const FilePath& usage_file_path,
|
| + int64 delta) {
|
| + DCHECK(!usage_file_path.empty());
|
| + if (!usage_file_path.empty() && delta != 0)
|
| + FileSystemUsageCache::AtomicUpdateUsageByDelta(usage_file_path, delta);
|
| +}
|
| +
|
| } // namespace fileapi
|
|
|