| 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 "webkit/browser/blob/blob_storage_controller.h" | 5 #include "webkit/browser/blob/blob_storage_controller.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "googleurl/src/gurl.h" | 8 #include "googleurl/src/gurl.h" |
| 9 #include "webkit/common/blob/blob_data.h" | 9 #include "webkit/common/blob/blob_data.h" |
| 10 | 10 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 IncrementBlobDataUsage(blob_data); | 47 IncrementBlobDataUsage(blob_data); |
| 48 } | 48 } |
| 49 | 49 |
| 50 void BlobStorageController::AppendBlobDataItem( | 50 void BlobStorageController::AppendBlobDataItem( |
| 51 const GURL& url, const BlobData::Item& item) { | 51 const GURL& url, const BlobData::Item& item) { |
| 52 DCHECK(url.SchemeIs("blob")); | 52 DCHECK(url.SchemeIs("blob")); |
| 53 DCHECK(!BlobUrlHasRef(url)); | 53 DCHECK(!BlobUrlHasRef(url)); |
| 54 BlobMap::iterator found = unfinalized_blob_map_.find(url.spec()); | 54 BlobMap::iterator found = unfinalized_blob_map_.find(url.spec()); |
| 55 if (found == unfinalized_blob_map_.end()) | 55 if (found == unfinalized_blob_map_.end()) |
| 56 return; | 56 return; |
| 57 BlobData* target_blob_data = found->second; | 57 BlobData* target_blob_data = found->second.get(); |
| 58 DCHECK(target_blob_data); | 58 DCHECK(target_blob_data); |
| 59 | 59 |
| 60 memory_usage_ -= target_blob_data->GetMemoryUsage(); | 60 memory_usage_ -= target_blob_data->GetMemoryUsage(); |
| 61 | 61 |
| 62 // The blob data is stored in the "canonical" way. That is, it only contains a | 62 // The blob data is stored in the "canonical" way. That is, it only contains a |
| 63 // list of Data and File items. | 63 // list of Data and File items. |
| 64 // 1) The Data item is denoted by the raw data and the range. | 64 // 1) The Data item is denoted by the raw data and the range. |
| 65 // 2) The File item is denoted by the file path, the range and the expected | 65 // 2) The File item is denoted by the file path, the range and the expected |
| 66 // modification time. | 66 // modification time. |
| 67 // 3) The FileSystem File item is denoted by the FileSystem URL, the range | 67 // 3) The FileSystem File item is denoted by the FileSystem URL, the range |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 | 156 |
| 157 if (!RemoveFromMapHelper(&unfinalized_blob_map_, url)) | 157 if (!RemoveFromMapHelper(&unfinalized_blob_map_, url)) |
| 158 RemoveFromMapHelper(&blob_map_, url); | 158 RemoveFromMapHelper(&blob_map_, url); |
| 159 } | 159 } |
| 160 | 160 |
| 161 bool BlobStorageController::RemoveFromMapHelper( | 161 bool BlobStorageController::RemoveFromMapHelper( |
| 162 BlobMap* map, const GURL& url) { | 162 BlobMap* map, const GURL& url) { |
| 163 BlobMap::iterator found = map->find(url.spec()); | 163 BlobMap::iterator found = map->find(url.spec()); |
| 164 if (found == map->end()) | 164 if (found == map->end()) |
| 165 return false; | 165 return false; |
| 166 if (DecrementBlobDataUsage(found->second)) | 166 if (DecrementBlobDataUsage(found->second.get())) |
| 167 memory_usage_ -= found->second->GetMemoryUsage(); | 167 memory_usage_ -= found->second->GetMemoryUsage(); |
| 168 map->erase(found); | 168 map->erase(found); |
| 169 return true; | 169 return true; |
| 170 } | 170 } |
| 171 | 171 |
| 172 | 172 |
| 173 BlobData* BlobStorageController::GetBlobDataFromUrl(const GURL& url) { | 173 BlobData* BlobStorageController::GetBlobDataFromUrl(const GURL& url) { |
| 174 BlobMap::iterator found = blob_map_.find( | 174 BlobMap::iterator found = blob_map_.find( |
| 175 BlobUrlHasRef(url) ? ClearBlobUrlRef(url).spec() : url.spec()); | 175 BlobUrlHasRef(url) ? ClearBlobUrlRef(url).spec() : url.spec()); |
| 176 return (found != blob_map_.end()) ? found->second : NULL; | 176 return (found != blob_map_.end()) ? found->second : NULL; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 void BlobStorageController::AppendFileItem( | 222 void BlobStorageController::AppendFileItem( |
| 223 BlobData* target_blob_data, | 223 BlobData* target_blob_data, |
| 224 const base::FilePath& file_path, uint64 offset, uint64 length, | 224 const base::FilePath& file_path, uint64 offset, uint64 length, |
| 225 const base::Time& expected_modification_time) { | 225 const base::Time& expected_modification_time) { |
| 226 target_blob_data->AppendFile(file_path, offset, length, | 226 target_blob_data->AppendFile(file_path, offset, length, |
| 227 expected_modification_time); | 227 expected_modification_time); |
| 228 | 228 |
| 229 // It may be a temporary file that should be deleted when no longer needed. | 229 // It may be a temporary file that should be deleted when no longer needed. |
| 230 scoped_refptr<ShareableFileReference> shareable_file = | 230 scoped_refptr<ShareableFileReference> shareable_file = |
| 231 ShareableFileReference::Get(file_path); | 231 ShareableFileReference::Get(file_path); |
| 232 if (shareable_file) | 232 if (shareable_file.get()) |
| 233 target_blob_data->AttachShareableFileReference(shareable_file); | 233 target_blob_data->AttachShareableFileReference(shareable_file.get()); |
| 234 } | 234 } |
| 235 | 235 |
| 236 void BlobStorageController::AppendFileSystemFileItem( | 236 void BlobStorageController::AppendFileSystemFileItem( |
| 237 BlobData* target_blob_data, | 237 BlobData* target_blob_data, |
| 238 const GURL& url, uint64 offset, uint64 length, | 238 const GURL& url, uint64 offset, uint64 length, |
| 239 const base::Time& expected_modification_time) { | 239 const base::Time& expected_modification_time) { |
| 240 target_blob_data->AppendFileSystemFile(url, offset, length, | 240 target_blob_data->AppendFileSystemFile(url, offset, length, |
| 241 expected_modification_time); | 241 expected_modification_time); |
| 242 } | 242 } |
| 243 | 243 |
| 244 void BlobStorageController::IncrementBlobDataUsage(BlobData* blob_data) { | 244 void BlobStorageController::IncrementBlobDataUsage(BlobData* blob_data) { |
| 245 blob_data_usage_count_[blob_data] += 1; | 245 blob_data_usage_count_[blob_data] += 1; |
| 246 } | 246 } |
| 247 | 247 |
| 248 bool BlobStorageController::DecrementBlobDataUsage(BlobData* blob_data) { | 248 bool BlobStorageController::DecrementBlobDataUsage(BlobData* blob_data) { |
| 249 BlobDataUsageMap::iterator found = blob_data_usage_count_.find(blob_data); | 249 BlobDataUsageMap::iterator found = blob_data_usage_count_.find(blob_data); |
| 250 DCHECK(found != blob_data_usage_count_.end()); | 250 DCHECK(found != blob_data_usage_count_.end()); |
| 251 if (--(found->second)) | 251 if (--(found->second)) |
| 252 return false; // Still in use | 252 return false; // Still in use |
| 253 blob_data_usage_count_.erase(found); | 253 blob_data_usage_count_.erase(found); |
| 254 return true; | 254 return true; |
| 255 } | 255 } |
| 256 | 256 |
| 257 } // namespace webkit_blob | 257 } // namespace webkit_blob |
| OLD | NEW |