Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "apps/saved_files_service.h" | 5 #include "apps/saved_files_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | |
| 8 | 9 |
| 9 #include "apps/saved_files_service_factory.h" | 10 #include "apps/saved_files_service_factory.h" |
| 10 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 11 #include "base/containers/hash_tables.h" | 12 #include "base/containers/scoped_ptr_hash_map.h" |
| 12 #include "base/value_conversions.h" | 13 #include "base/value_conversions.h" |
| 13 #include "chrome/browser/chrome_notification_types.h" | 14 #include "chrome/browser/chrome_notification_types.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
| 15 #include "content/public/browser/notification_service.h" | 16 #include "content/public/browser/notification_service.h" |
| 16 #include "extensions/browser/extension_host.h" | 17 #include "extensions/browser/extension_host.h" |
| 17 #include "extensions/browser/extension_prefs.h" | 18 #include "extensions/browser/extension_prefs.h" |
| 18 #include "extensions/browser/extension_system.h" | 19 #include "extensions/browser/extension_system.h" |
| 19 #include "extensions/browser/extension_util.h" | 20 #include "extensions/browser/extension_util.h" |
| 20 #include "extensions/browser/notification_types.h" | 21 #include "extensions/browser/notification_types.h" |
| 21 #include "extensions/common/permissions/api_permission.h" | 22 #include "extensions/common/permissions/api_permission.h" |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 170 // will almost never do any real work. | 171 // will almost never do any real work. |
| 171 void MaybeCompactSequenceNumbers(); | 172 void MaybeCompactSequenceNumbers(); |
| 172 | 173 |
| 173 void LoadSavedFileEntriesFromPreferences(); | 174 void LoadSavedFileEntriesFromPreferences(); |
| 174 | 175 |
| 175 Profile* profile_; | 176 Profile* profile_; |
| 176 const std::string extension_id_; | 177 const std::string extension_id_; |
| 177 | 178 |
| 178 // Contains all file entries that have been registered, keyed by ID. Owns | 179 // Contains all file entries that have been registered, keyed by ID. Owns |
| 179 // values. | 180 // values. |
| 180 base::hash_map<std::string, SavedFileEntry*> registered_file_entries_; | 181 base::ScopedPtrHashMap<std::string, scoped_ptr<SavedFileEntry>> |
| 181 STLValueDeleter<base::hash_map<std::string, SavedFileEntry*> > | 182 registered_file_entries_; |
| 182 registered_file_entries_deleter_; | |
| 183 | 183 |
| 184 // The queue of file entries that have been retained, keyed by | 184 // The queue of file entries that have been retained, keyed by |
| 185 // sequence_number. Values are a subset of values in registered_file_entries_. | 185 // sequence_number. Values are a subset of values in registered_file_entries_. |
| 186 // This should be kept in sync with file entries stored in extension prefs. | 186 // This should be kept in sync with file entries stored in extension prefs. |
| 187 std::map<int, SavedFileEntry*> saved_file_lru_; | 187 std::map<int, SavedFileEntry*> saved_file_lru_; |
| 188 | 188 |
| 189 DISALLOW_COPY_AND_ASSIGN(SavedFiles); | 189 DISALLOW_COPY_AND_ASSIGN(SavedFiles); |
| 190 }; | 190 }; |
| 191 | 191 |
| 192 // static | 192 // static |
| 193 SavedFilesService* SavedFilesService::Get(Profile* profile) { | 193 SavedFilesService* SavedFilesService::Get(Profile* profile) { |
| 194 return SavedFilesServiceFactory::GetForProfile(profile); | 194 return SavedFilesServiceFactory::GetForProfile(profile); |
| 195 } | 195 } |
| 196 | 196 |
| 197 SavedFilesService::SavedFilesService(Profile* profile) | 197 SavedFilesService::SavedFilesService(Profile* profile) : profile_(profile) { |
| 198 : extension_id_to_saved_files_deleter_(&extension_id_to_saved_files_), | |
| 199 profile_(profile) { | |
| 200 registrar_.Add(this, | 198 registrar_.Add(this, |
| 201 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, | 199 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, |
| 202 content::NotificationService::AllSources()); | 200 content::NotificationService::AllSources()); |
| 203 registrar_.Add(this, | 201 registrar_.Add(this, |
| 204 chrome::NOTIFICATION_APP_TERMINATING, | 202 chrome::NOTIFICATION_APP_TERMINATING, |
| 205 content::NotificationService::AllSources()); | 203 content::NotificationService::AllSources()); |
| 206 } | 204 } |
| 207 | 205 |
| 208 SavedFilesService::~SavedFilesService() {} | 206 SavedFilesService::~SavedFilesService() {} |
| 209 | 207 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 270 } | 268 } |
| 271 } | 269 } |
| 272 | 270 |
| 273 void SavedFilesService::ClearQueue(const extensions::Extension* extension) { | 271 void SavedFilesService::ClearQueue(const extensions::Extension* extension) { |
| 274 ClearSavedFileEntries(ExtensionPrefs::Get(profile_), extension->id()); | 272 ClearSavedFileEntries(ExtensionPrefs::Get(profile_), extension->id()); |
| 275 Clear(extension->id()); | 273 Clear(extension->id()); |
| 276 } | 274 } |
| 277 | 275 |
| 278 SavedFilesService::SavedFiles* SavedFilesService::Get( | 276 SavedFilesService::SavedFiles* SavedFilesService::Get( |
| 279 const std::string& extension_id) const { | 277 const std::string& extension_id) const { |
| 280 std::map<std::string, SavedFiles*>::const_iterator it = | 278 ScopedPtrMap<std::string, scoped_ptr<SavedFiles>>::const_iterator it = |
| 281 extension_id_to_saved_files_.find(extension_id); | 279 extension_id_to_saved_files_.find(extension_id); |
| 282 if (it != extension_id_to_saved_files_.end()) | 280 if (it != extension_id_to_saved_files_.end()) |
| 283 return it->second; | 281 return it->second; |
| 284 | 282 |
| 285 return NULL; | 283 return NULL; |
| 286 } | 284 } |
| 287 | 285 |
| 288 SavedFilesService::SavedFiles* SavedFilesService::GetOrInsert( | 286 SavedFilesService::SavedFiles* SavedFilesService::GetOrInsert( |
| 289 const std::string& extension_id) { | 287 const std::string& extension_id) { |
| 290 SavedFiles* saved_files = Get(extension_id); | 288 SavedFiles* saved_files = Get(extension_id); |
| 291 if (saved_files) | 289 if (saved_files) |
| 292 return saved_files; | 290 return saved_files; |
| 293 | 291 |
| 294 saved_files = new SavedFiles(profile_, extension_id); | 292 scoped_ptr<SavedFiles> scoped_saved_files( |
| 295 extension_id_to_saved_files_.insert( | 293 new SavedFiles(profile_, extension_id)); |
| 296 std::make_pair(extension_id, saved_files)); | 294 saved_files = scoped_saved_files.get(); |
| 295 extension_id_to_saved_files_.insert(extension_id, scoped_saved_files.Pass()); | |
| 297 return saved_files; | 296 return saved_files; |
| 298 } | 297 } |
| 299 | 298 |
| 300 void SavedFilesService::Clear(const std::string& extension_id) { | 299 void SavedFilesService::Clear(const std::string& extension_id) { |
| 301 std::map<std::string, SavedFiles*>::iterator it = | 300 extension_id_to_saved_files_.erase(extension_id); |
| 302 extension_id_to_saved_files_.find(extension_id); | |
| 303 if (it != extension_id_to_saved_files_.end()) { | |
| 304 delete it->second; | |
| 305 extension_id_to_saved_files_.erase(it); | |
| 306 } | |
| 307 } | 301 } |
| 308 | 302 |
| 309 SavedFilesService::SavedFiles::SavedFiles(Profile* profile, | 303 SavedFilesService::SavedFiles::SavedFiles(Profile* profile, |
| 310 const std::string& extension_id) | 304 const std::string& extension_id) |
| 311 : profile_(profile), | 305 : profile_(profile), extension_id_(extension_id) { |
| 312 extension_id_(extension_id), | |
| 313 registered_file_entries_deleter_(®istered_file_entries_) { | |
| 314 LoadSavedFileEntriesFromPreferences(); | 306 LoadSavedFileEntriesFromPreferences(); |
| 315 } | 307 } |
| 316 | 308 |
| 317 SavedFilesService::SavedFiles::~SavedFiles() {} | 309 SavedFilesService::SavedFiles::~SavedFiles() {} |
| 318 | 310 |
| 319 void SavedFilesService::SavedFiles::RegisterFileEntry( | 311 void SavedFilesService::SavedFiles::RegisterFileEntry( |
| 320 const std::string& id, | 312 const std::string& id, |
| 321 const base::FilePath& file_path, | 313 const base::FilePath& file_path, |
| 322 bool is_directory) { | 314 bool is_directory) { |
| 323 if (ContainsKey(registered_file_entries_, id)) | 315 if (ContainsKey(registered_file_entries_, id)) |
| 324 return; | 316 return; |
| 325 | 317 |
| 326 registered_file_entries_.insert( | 318 registered_file_entries_.add( |
| 327 std::make_pair(id, new SavedFileEntry(id, file_path, is_directory, 0))); | 319 id, make_scoped_ptr(new SavedFileEntry(id, file_path, is_directory, 0))); |
| 328 } | 320 } |
| 329 | 321 |
| 330 void SavedFilesService::SavedFiles::EnqueueFileEntry(const std::string& id) { | 322 void SavedFilesService::SavedFiles::EnqueueFileEntry(const std::string& id) { |
| 331 base::hash_map<std::string, SavedFileEntry*>::iterator it = | 323 auto it = registered_file_entries_.find(id); |
|
tapted
2015/06/19 00:12:01
`it` becomes a shadowed variable just below, which
Matt Giuca
2015/06/19 04:03:25
I'm hesitant to use get() because there's no get()
| |
| 332 registered_file_entries_.find(id); | |
| 333 DCHECK(it != registered_file_entries_.end()); | 324 DCHECK(it != registered_file_entries_.end()); |
| 334 | 325 |
| 335 SavedFileEntry* file_entry = it->second; | 326 SavedFileEntry* file_entry = it->second; |
| 336 int old_sequence_number = file_entry->sequence_number; | 327 int old_sequence_number = file_entry->sequence_number; |
| 337 if (!saved_file_lru_.empty()) { | 328 if (!saved_file_lru_.empty()) { |
| 338 // Get the sequence number after the last file entry in the LRU. | 329 // Get the sequence number after the last file entry in the LRU. |
| 339 std::map<int, SavedFileEntry*>::reverse_iterator it = | 330 std::map<int, SavedFileEntry*>::reverse_iterator it = |
| 340 saved_file_lru_.rbegin(); | 331 saved_file_lru_.rbegin(); |
| 341 if (it->second == file_entry) | 332 if (it->second == file_entry) |
| 342 return; | 333 return; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 363 } | 354 } |
| 364 MaybeCompactSequenceNumbers(); | 355 MaybeCompactSequenceNumbers(); |
| 365 } | 356 } |
| 366 | 357 |
| 367 bool SavedFilesService::SavedFiles::IsRegistered(const std::string& id) const { | 358 bool SavedFilesService::SavedFiles::IsRegistered(const std::string& id) const { |
| 368 return ContainsKey(registered_file_entries_, id); | 359 return ContainsKey(registered_file_entries_, id); |
| 369 } | 360 } |
| 370 | 361 |
| 371 const SavedFileEntry* SavedFilesService::SavedFiles::GetFileEntry( | 362 const SavedFileEntry* SavedFilesService::SavedFiles::GetFileEntry( |
| 372 const std::string& id) const { | 363 const std::string& id) const { |
| 373 base::hash_map<std::string, SavedFileEntry*>::const_iterator it = | 364 auto it = registered_file_entries_.find(id); |
|
tapted
2015/06/19 00:12:01
nit: just `return registered_file_entries_.get(id)
Matt Giuca
2015/06/19 04:03:25
As above, I think we should consider get() to be d
| |
| 374 registered_file_entries_.find(id); | |
| 375 if (it == registered_file_entries_.end()) | 365 if (it == registered_file_entries_.end()) |
| 376 return NULL; | 366 return NULL; |
| 377 | 367 |
| 378 return it->second; | 368 return it->second; |
| 379 } | 369 } |
| 380 | 370 |
| 381 std::vector<SavedFileEntry> SavedFilesService::SavedFiles::GetAllFileEntries() | 371 std::vector<SavedFileEntry> SavedFilesService::SavedFiles::GetAllFileEntries() |
| 382 const { | 372 const { |
| 383 std::vector<SavedFileEntry> result; | 373 std::vector<SavedFileEntry> result; |
| 384 for (base::hash_map<std::string, SavedFileEntry*>::const_iterator it = | 374 for (auto it = registered_file_entries_.begin(); |
| 385 registered_file_entries_.begin(); | 375 it != registered_file_entries_.end(); ++it) { |
| 386 it != registered_file_entries_.end(); | |
| 387 ++it) { | |
| 388 result.push_back(*it->second); | 376 result.push_back(*it->second); |
| 389 } | 377 } |
| 390 return result; | 378 return result; |
| 391 } | 379 } |
| 392 | 380 |
| 393 void SavedFilesService::SavedFiles::MaybeCompactSequenceNumbers() { | 381 void SavedFilesService::SavedFiles::MaybeCompactSequenceNumbers() { |
| 394 DCHECK_GE(g_max_sequence_number, 0); | 382 DCHECK_GE(g_max_sequence_number, 0); |
| 395 DCHECK_GE(static_cast<size_t>(g_max_sequence_number), | 383 DCHECK_GE(static_cast<size_t>(g_max_sequence_number), |
| 396 g_max_saved_file_entries); | 384 g_max_saved_file_entries); |
| 397 std::map<int, SavedFileEntry*>::reverse_iterator it = | 385 std::map<int, SavedFileEntry*>::reverse_iterator it = |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 425 } | 413 } |
| 426 } | 414 } |
| 427 | 415 |
| 428 void SavedFilesService::SavedFiles::LoadSavedFileEntriesFromPreferences() { | 416 void SavedFilesService::SavedFiles::LoadSavedFileEntriesFromPreferences() { |
| 429 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); | 417 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); |
| 430 std::vector<SavedFileEntry> saved_entries = | 418 std::vector<SavedFileEntry> saved_entries = |
| 431 GetSavedFileEntries(prefs, extension_id_); | 419 GetSavedFileEntries(prefs, extension_id_); |
| 432 for (std::vector<SavedFileEntry>::iterator it = saved_entries.begin(); | 420 for (std::vector<SavedFileEntry>::iterator it = saved_entries.begin(); |
| 433 it != saved_entries.end(); | 421 it != saved_entries.end(); |
| 434 ++it) { | 422 ++it) { |
| 435 SavedFileEntry* file_entry = new SavedFileEntry(*it); | 423 scoped_ptr<SavedFileEntry> file_entry(new SavedFileEntry(*it)); |
| 436 registered_file_entries_.insert(std::make_pair(file_entry->id, file_entry)); | 424 const std::string& id = file_entry->id; |
| 437 saved_file_lru_.insert( | 425 saved_file_lru_.insert( |
| 438 std::make_pair(file_entry->sequence_number, file_entry)); | 426 std::make_pair(file_entry->sequence_number, file_entry.get())); |
| 427 registered_file_entries_.add(id, file_entry.Pass()); | |
| 439 } | 428 } |
| 440 } | 429 } |
| 441 | 430 |
| 442 // static | 431 // static |
| 443 void SavedFilesService::SetMaxSequenceNumberForTest(int max_value) { | 432 void SavedFilesService::SetMaxSequenceNumberForTest(int max_value) { |
| 444 g_max_sequence_number = max_value; | 433 g_max_sequence_number = max_value; |
| 445 } | 434 } |
| 446 | 435 |
| 447 // static | 436 // static |
| 448 void SavedFilesService::ClearMaxSequenceNumberForTest() { | 437 void SavedFilesService::ClearMaxSequenceNumberForTest() { |
| 449 g_max_sequence_number = kMaxSequenceNumber; | 438 g_max_sequence_number = kMaxSequenceNumber; |
| 450 } | 439 } |
| 451 | 440 |
| 452 // static | 441 // static |
| 453 void SavedFilesService::SetLruSizeForTest(int size) { | 442 void SavedFilesService::SetLruSizeForTest(int size) { |
| 454 g_max_saved_file_entries = size; | 443 g_max_saved_file_entries = size; |
| 455 } | 444 } |
| 456 | 445 |
| 457 // static | 446 // static |
| 458 void SavedFilesService::ClearLruSizeForTest() { | 447 void SavedFilesService::ClearLruSizeForTest() { |
| 459 g_max_saved_file_entries = kMaxSavedFileEntries; | 448 g_max_saved_file_entries = kMaxSavedFileEntries; |
| 460 } | 449 } |
| 461 | 450 |
| 462 } // namespace apps | 451 } // namespace apps |
| OLD | NEW |