| OLD | NEW |
| 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/browsing_data_file_system_helper.h" | 5 #include "chrome/browser/browsing_data_file_system_helper.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 void FetchFileSystemInfoInFileThread(); | 43 void FetchFileSystemInfoInFileThread(); |
| 44 | 44 |
| 45 // Triggers the success callback as the end of a StartFetching workflow. This | 45 // Triggers the success callback as the end of a StartFetching workflow. This |
| 46 // must be called on the UI thread. | 46 // must be called on the UI thread. |
| 47 void NotifyOnUIThread(); | 47 void NotifyOnUIThread(); |
| 48 | 48 |
| 49 // Deletes all file systems associated with |origin|. This must be called on | 49 // Deletes all file systems associated with |origin|. This must be called on |
| 50 // the FILE thread. | 50 // the FILE thread. |
| 51 void DeleteFileSystemOriginInFileThread(const GURL& origin); | 51 void DeleteFileSystemOriginInFileThread(const GURL& origin); |
| 52 | 52 |
| 53 // We don't own the Profile object. Clients are responsible for destroying the | 53 // Keep a reference to the FileSystemContext object for the current profile |
| 54 // object when it's no longer used. | 54 // for use on the FILE thread. |
| 55 Profile* profile_; | 55 scoped_refptr<fileapi::FileSystemContext> filesystem_context_; |
| 56 | 56 |
| 57 // Holds the current list of file systems returned to the client after | 57 // Holds the current list of file systems returned to the client after |
| 58 // StartFetching is called. Access to |file_system_info_| is triggered | 58 // StartFetching is called. Access to |file_system_info_| is triggered |
| 59 // indirectly via the UI thread and guarded by |is_fetching_|. This means | 59 // indirectly via the UI thread and guarded by |is_fetching_|. This means |
| 60 // |file_system_info_| is only accessed while |is_fetching_| is true. The | 60 // |file_system_info_| is only accessed while |is_fetching_| is true. The |
| 61 // flag |is_fetching_| is only accessed on the UI thread. In the context of | 61 // flag |is_fetching_| is only accessed on the UI thread. In the context of |
| 62 // this class |file_system_info_| only mutates on the FILE thread. | 62 // this class |file_system_info_| only mutates on the FILE thread. |
| 63 std::list<FileSystemInfo> file_system_info_; | 63 std::list<FileSystemInfo> file_system_info_; |
| 64 | 64 |
| 65 // Holds the callback passed in at the beginning of the StartFetching workflow | 65 // Holds the callback passed in at the beginning of the StartFetching workflow |
| 66 // so that it can be triggered via NotifyOnUIThread. This only mutates on the | 66 // so that it can be triggered via NotifyOnUIThread. This only mutates on the |
| 67 // UI thread. | 67 // UI thread. |
| 68 base::Callback<void(const std::list<FileSystemInfo>&)> completion_callback_; | 68 base::Callback<void(const std::list<FileSystemInfo>&)> completion_callback_; |
| 69 | 69 |
| 70 // Indicates whether or not we're currently fetching information: set to true | 70 // Indicates whether or not we're currently fetching information: set to true |
| 71 // when StartFetching is called on the UI thread, and reset to false when | 71 // when StartFetching is called on the UI thread, and reset to false when |
| 72 // NotifyOnUIThread triggers the success callback. | 72 // NotifyOnUIThread triggers the success callback. |
| 73 // This property only mutates on the UI thread. | 73 // This property only mutates on the UI thread. |
| 74 bool is_fetching_; | 74 bool is_fetching_; |
| 75 | 75 |
| 76 DISALLOW_COPY_AND_ASSIGN(BrowsingDataFileSystemHelperImpl); | 76 DISALLOW_COPY_AND_ASSIGN(BrowsingDataFileSystemHelperImpl); |
| 77 }; | 77 }; |
| 78 | 78 |
| 79 BrowsingDataFileSystemHelperImpl::BrowsingDataFileSystemHelperImpl( | 79 BrowsingDataFileSystemHelperImpl::BrowsingDataFileSystemHelperImpl( |
| 80 Profile* profile) | 80 Profile* profile) |
| 81 : profile_(profile), | 81 : filesystem_context_(BrowserContext::GetFileSystemContext(profile)), |
| 82 is_fetching_(false) { | 82 is_fetching_(false) { |
| 83 DCHECK(profile_); | 83 DCHECK(filesystem_context_); |
| 84 } | 84 } |
| 85 | 85 |
| 86 BrowsingDataFileSystemHelperImpl::~BrowsingDataFileSystemHelperImpl() { | 86 BrowsingDataFileSystemHelperImpl::~BrowsingDataFileSystemHelperImpl() { |
| 87 } | 87 } |
| 88 | 88 |
| 89 void BrowsingDataFileSystemHelperImpl::StartFetching( | 89 void BrowsingDataFileSystemHelperImpl::StartFetching( |
| 90 const base::Callback<void(const std::list<FileSystemInfo>&)>& callback) { | 90 const base::Callback<void(const std::list<FileSystemInfo>&)>& callback) { |
| 91 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 91 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 92 DCHECK(!is_fetching_); | 92 DCHECK(!is_fetching_); |
| 93 DCHECK_EQ(false, callback.is_null()); | 93 DCHECK_EQ(false, callback.is_null()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 106 BrowserThread::PostTask( | 106 BrowserThread::PostTask( |
| 107 BrowserThread::FILE, FROM_HERE, | 107 BrowserThread::FILE, FROM_HERE, |
| 108 base::Bind( | 108 base::Bind( |
| 109 &BrowsingDataFileSystemHelperImpl::DeleteFileSystemOriginInFileThread, | 109 &BrowsingDataFileSystemHelperImpl::DeleteFileSystemOriginInFileThread, |
| 110 this, origin)); | 110 this, origin)); |
| 111 } | 111 } |
| 112 | 112 |
| 113 void BrowsingDataFileSystemHelperImpl::FetchFileSystemInfoInFileThread() { | 113 void BrowsingDataFileSystemHelperImpl::FetchFileSystemInfoInFileThread() { |
| 114 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 114 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 115 scoped_ptr<fileapi::SandboxMountPointProvider::OriginEnumerator> | 115 scoped_ptr<fileapi::SandboxMountPointProvider::OriginEnumerator> |
| 116 origin_enumerator(BrowserContext::GetFileSystemContext(profile_)-> | 116 origin_enumerator(filesystem_context_-> |
| 117 sandbox_provider()->CreateOriginEnumerator()); | 117 sandbox_provider()->CreateOriginEnumerator()); |
| 118 | 118 |
| 119 scoped_refptr<fileapi::FileSystemContext> context = | |
| 120 BrowserContext::GetFileSystemContext(profile_); | |
| 121 | |
| 122 // We don't own this pointer; it's a magic singleton generated by the | 119 // We don't own this pointer; it's a magic singleton generated by the |
| 123 // profile's FileSystemContext. Deleting it would be a bad idea. | 120 // profile's FileSystemContext. Deleting it would be a bad idea. |
| 124 fileapi::FileSystemQuotaUtil* quota_util = | 121 fileapi::FileSystemQuotaUtil* quota_util = |
| 125 context->GetQuotaUtil(fileapi::kFileSystemTypeTemporary); | 122 filesystem_context_->GetQuotaUtil(fileapi::kFileSystemTypeTemporary); |
| 126 | 123 |
| 127 GURL current; | 124 GURL current; |
| 128 | 125 |
| 129 while (!(current = origin_enumerator->Next()).is_empty()) { | 126 while (!(current = origin_enumerator->Next()).is_empty()) { |
| 130 if (!BrowsingDataHelper::HasWebScheme(current)) | 127 if (!BrowsingDataHelper::HasWebScheme(current)) |
| 131 continue; // Non-websafe state is not considered browsing data. | 128 continue; // Non-websafe state is not considered browsing data. |
| 132 | 129 |
| 133 // We can call these synchronous methods as we've already verified that | 130 // We can call these synchronous methods as we've already verified that |
| 134 // we're running on the FILE thread. | 131 // we're running on the FILE thread. |
| 135 int64 persistent_usage = quota_util->GetOriginUsageOnFileThread( | 132 int64 persistent_usage = quota_util->GetOriginUsageOnFileThread( |
| 136 context, current, | 133 filesystem_context_, current, |
| 137 fileapi::kFileSystemTypePersistent); | 134 fileapi::kFileSystemTypePersistent); |
| 138 int64 temporary_usage = quota_util->GetOriginUsageOnFileThread( | 135 int64 temporary_usage = quota_util->GetOriginUsageOnFileThread( |
| 139 context, current, | 136 filesystem_context_, current, |
| 140 fileapi::kFileSystemTypeTemporary); | 137 fileapi::kFileSystemTypeTemporary); |
| 141 file_system_info_.push_back( | 138 file_system_info_.push_back( |
| 142 FileSystemInfo( | 139 FileSystemInfo( |
| 143 current, | 140 current, |
| 144 origin_enumerator->HasFileSystemType( | 141 origin_enumerator->HasFileSystemType( |
| 145 fileapi::kFileSystemTypePersistent), | 142 fileapi::kFileSystemTypePersistent), |
| 146 origin_enumerator->HasFileSystemType( | 143 origin_enumerator->HasFileSystemType( |
| 147 fileapi::kFileSystemTypeTemporary), | 144 fileapi::kFileSystemTypeTemporary), |
| 148 persistent_usage, | 145 persistent_usage, |
| 149 temporary_usage)); | 146 temporary_usage)); |
| 150 } | 147 } |
| 151 | 148 |
| 152 BrowserThread::PostTask( | 149 BrowserThread::PostTask( |
| 153 BrowserThread::UI, FROM_HERE, | 150 BrowserThread::UI, FROM_HERE, |
| 154 base::Bind(&BrowsingDataFileSystemHelperImpl::NotifyOnUIThread, this)); | 151 base::Bind(&BrowsingDataFileSystemHelperImpl::NotifyOnUIThread, this)); |
| 155 } | 152 } |
| 156 | 153 |
| 157 void BrowsingDataFileSystemHelperImpl::NotifyOnUIThread() { | 154 void BrowsingDataFileSystemHelperImpl::NotifyOnUIThread() { |
| 158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 155 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 159 DCHECK(is_fetching_); | 156 DCHECK(is_fetching_); |
| 160 completion_callback_.Run(file_system_info_); | 157 completion_callback_.Run(file_system_info_); |
| 161 completion_callback_.Reset(); | 158 completion_callback_.Reset(); |
| 162 is_fetching_ = false; | 159 is_fetching_ = false; |
| 163 } | 160 } |
| 164 | 161 |
| 165 void BrowsingDataFileSystemHelperImpl::DeleteFileSystemOriginInFileThread( | 162 void BrowsingDataFileSystemHelperImpl::DeleteFileSystemOriginInFileThread( |
| 166 const GURL& origin) { | 163 const GURL& origin) { |
| 167 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 164 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 168 BrowserContext::GetFileSystemContext(profile_)-> | 165 filesystem_context_->DeleteDataForOriginOnFileThread(origin); |
| 169 DeleteDataForOriginOnFileThread(origin); | |
| 170 } | 166 } |
| 171 | 167 |
| 172 } // namespace | 168 } // namespace |
| 173 | 169 |
| 174 BrowsingDataFileSystemHelper::FileSystemInfo::FileSystemInfo( | 170 BrowsingDataFileSystemHelper::FileSystemInfo::FileSystemInfo( |
| 175 const GURL& origin, | 171 const GURL& origin, |
| 176 bool has_persistent, | 172 bool has_persistent, |
| 177 bool has_temporary, | 173 bool has_temporary, |
| 178 int64 usage_persistent, | 174 int64 usage_persistent, |
| 179 int64 usage_temporary) | 175 int64 usage_temporary) |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 base::Bind(&CannedBrowsingDataFileSystemHelper::NotifyOnUIThread, this)); | 274 base::Bind(&CannedBrowsingDataFileSystemHelper::NotifyOnUIThread, this)); |
| 279 } | 275 } |
| 280 | 276 |
| 281 void CannedBrowsingDataFileSystemHelper::NotifyOnUIThread() { | 277 void CannedBrowsingDataFileSystemHelper::NotifyOnUIThread() { |
| 282 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 278 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 283 DCHECK(is_fetching_); | 279 DCHECK(is_fetching_); |
| 284 completion_callback_.Run(file_system_info_); | 280 completion_callback_.Run(file_system_info_); |
| 285 completion_callback_.Reset(); | 281 completion_callback_.Reset(); |
| 286 is_fetching_ = false; | 282 is_fetching_ = false; |
| 287 } | 283 } |
| OLD | NEW |