| 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 <stdint.h> | 7 #include <stdint.h> |
| 8 |
| 8 #include <algorithm> | 9 #include <algorithm> |
| 9 #include <map> | 10 #include <map> |
| 11 #include <unordered_map> |
| 10 #include <utility> | 12 #include <utility> |
| 11 | 13 |
| 12 #include "apps/saved_files_service_factory.h" | 14 #include "apps/saved_files_service_factory.h" |
| 13 #include "base/containers/scoped_ptr_hash_map.h" | |
| 14 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 15 #include "base/value_conversions.h" | 16 #include "base/value_conversions.h" |
| 16 #include "chrome/browser/chrome_notification_types.h" | 17 #include "chrome/browser/chrome_notification_types.h" |
| 17 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
| 18 #include "content/public/browser/notification_service.h" | 19 #include "content/public/browser/notification_service.h" |
| 19 #include "extensions/browser/extension_host.h" | 20 #include "extensions/browser/extension_host.h" |
| 20 #include "extensions/browser/extension_prefs.h" | 21 #include "extensions/browser/extension_prefs.h" |
| 21 #include "extensions/browser/extension_system.h" | 22 #include "extensions/browser/extension_system.h" |
| 22 #include "extensions/browser/notification_types.h" | 23 #include "extensions/browser/notification_types.h" |
| 23 #include "extensions/common/permissions/api_permission.h" | 24 #include "extensions/common/permissions/api_permission.h" |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 // Compacts sequence numbers if the largest sequence number is | 173 // Compacts sequence numbers if the largest sequence number is |
| 173 // g_max_sequence_number. Outside of testing, it is set to kint32max, so this | 174 // g_max_sequence_number. Outside of testing, it is set to kint32max, so this |
| 174 // will almost never do any real work. | 175 // will almost never do any real work. |
| 175 void MaybeCompactSequenceNumbers(); | 176 void MaybeCompactSequenceNumbers(); |
| 176 | 177 |
| 177 void LoadSavedFileEntriesFromPreferences(); | 178 void LoadSavedFileEntriesFromPreferences(); |
| 178 | 179 |
| 179 Profile* profile_; | 180 Profile* profile_; |
| 180 const std::string extension_id_; | 181 const std::string extension_id_; |
| 181 | 182 |
| 182 // Contains all file entries that have been registered, keyed by ID. Owns | 183 // Contains all file entries that have been registered, keyed by ID. |
| 183 // values. | 184 std::unordered_map<std::string, std::unique_ptr<SavedFileEntry>> |
| 184 base::ScopedPtrHashMap<std::string, std::unique_ptr<SavedFileEntry>> | |
| 185 registered_file_entries_; | 185 registered_file_entries_; |
| 186 | 186 |
| 187 // The queue of file entries that have been retained, keyed by | 187 // The queue of file entries that have been retained, keyed by |
| 188 // sequence_number. Values are a subset of values in registered_file_entries_. | 188 // sequence_number. Values are a subset of values in registered_file_entries_. |
| 189 // This should be kept in sync with file entries stored in extension prefs. | 189 // This should be kept in sync with file entries stored in extension prefs. |
| 190 std::map<int, SavedFileEntry*> saved_file_lru_; | 190 std::map<int, SavedFileEntry*> saved_file_lru_; |
| 191 | 191 |
| 192 DISALLOW_COPY_AND_ASSIGN(SavedFiles); | 192 DISALLOW_COPY_AND_ASSIGN(SavedFiles); |
| 193 }; | 193 }; |
| 194 | 194 |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 : profile_(profile), extension_id_(extension_id) { | 307 : profile_(profile), extension_id_(extension_id) { |
| 308 LoadSavedFileEntriesFromPreferences(); | 308 LoadSavedFileEntriesFromPreferences(); |
| 309 } | 309 } |
| 310 | 310 |
| 311 SavedFilesService::SavedFiles::~SavedFiles() {} | 311 SavedFilesService::SavedFiles::~SavedFiles() {} |
| 312 | 312 |
| 313 void SavedFilesService::SavedFiles::RegisterFileEntry( | 313 void SavedFilesService::SavedFiles::RegisterFileEntry( |
| 314 const std::string& id, | 314 const std::string& id, |
| 315 const base::FilePath& file_path, | 315 const base::FilePath& file_path, |
| 316 bool is_directory) { | 316 bool is_directory) { |
| 317 if (ContainsKey(registered_file_entries_, id)) | 317 auto it = registered_file_entries_.find(id); |
| 318 if (it != registered_file_entries_.end()) |
| 318 return; | 319 return; |
| 319 | 320 |
| 320 registered_file_entries_.add( | 321 registered_file_entries_[id] = |
| 321 id, base::MakeUnique<SavedFileEntry>(id, file_path, is_directory, 0)); | 322 base::MakeUnique<SavedFileEntry>(id, file_path, is_directory, 0); |
| 322 } | 323 } |
| 323 | 324 |
| 324 void SavedFilesService::SavedFiles::EnqueueFileEntry(const std::string& id) { | 325 void SavedFilesService::SavedFiles::EnqueueFileEntry(const std::string& id) { |
| 325 auto it = registered_file_entries_.find(id); | 326 auto it = registered_file_entries_.find(id); |
| 326 DCHECK(it != registered_file_entries_.end()); | 327 DCHECK(it != registered_file_entries_.end()); |
| 327 | 328 |
| 328 SavedFileEntry* file_entry = it->second; | 329 SavedFileEntry* file_entry = it->second.get(); |
| 329 int old_sequence_number = file_entry->sequence_number; | 330 int old_sequence_number = file_entry->sequence_number; |
| 330 if (!saved_file_lru_.empty()) { | 331 if (!saved_file_lru_.empty()) { |
| 331 // Get the sequence number after the last file entry in the LRU. | 332 // Get the sequence number after the last file entry in the LRU. |
| 332 std::map<int, SavedFileEntry*>::reverse_iterator it = | 333 std::map<int, SavedFileEntry*>::reverse_iterator it = |
| 333 saved_file_lru_.rbegin(); | 334 saved_file_lru_.rbegin(); |
| 334 if (it->second == file_entry) | 335 if (it->second == file_entry) |
| 335 return; | 336 return; |
| 336 | 337 |
| 337 file_entry->sequence_number = it->first + 1; | 338 file_entry->sequence_number = it->first + 1; |
| 338 } else { | 339 } else { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 351 std::map<int, SavedFileEntry*>::iterator it = saved_file_lru_.begin(); | 352 std::map<int, SavedFileEntry*>::iterator it = saved_file_lru_.begin(); |
| 352 it->second->sequence_number = 0; | 353 it->second->sequence_number = 0; |
| 353 RemoveSavedFileEntry(prefs, extension_id_, it->second->id); | 354 RemoveSavedFileEntry(prefs, extension_id_, it->second->id); |
| 354 saved_file_lru_.erase(it); | 355 saved_file_lru_.erase(it); |
| 355 } | 356 } |
| 356 } | 357 } |
| 357 MaybeCompactSequenceNumbers(); | 358 MaybeCompactSequenceNumbers(); |
| 358 } | 359 } |
| 359 | 360 |
| 360 bool SavedFilesService::SavedFiles::IsRegistered(const std::string& id) const { | 361 bool SavedFilesService::SavedFiles::IsRegistered(const std::string& id) const { |
| 361 return ContainsKey(registered_file_entries_, id); | 362 auto it = registered_file_entries_.find(id); |
| 363 return it != registered_file_entries_.end(); |
| 362 } | 364 } |
| 363 | 365 |
| 364 const SavedFileEntry* SavedFilesService::SavedFiles::GetFileEntry( | 366 const SavedFileEntry* SavedFilesService::SavedFiles::GetFileEntry( |
| 365 const std::string& id) const { | 367 const std::string& id) const { |
| 366 auto it = registered_file_entries_.find(id); | 368 auto it = registered_file_entries_.find(id); |
| 367 if (it == registered_file_entries_.end()) | 369 if (it == registered_file_entries_.end()) |
| 368 return NULL; | 370 return NULL; |
| 369 | 371 |
| 370 return it->second; | 372 return it->second.get(); |
| 371 } | 373 } |
| 372 | 374 |
| 373 std::vector<SavedFileEntry> SavedFilesService::SavedFiles::GetAllFileEntries() | 375 std::vector<SavedFileEntry> SavedFilesService::SavedFiles::GetAllFileEntries() |
| 374 const { | 376 const { |
| 375 std::vector<SavedFileEntry> result; | 377 std::vector<SavedFileEntry> result; |
| 376 for (auto it = registered_file_entries_.begin(); | 378 for (auto it = registered_file_entries_.begin(); |
| 377 it != registered_file_entries_.end(); ++it) { | 379 it != registered_file_entries_.end(); ++it) { |
| 378 result.push_back(*it->second); | 380 result.push_back(*it->second.get()); |
| 379 } | 381 } |
| 380 return result; | 382 return result; |
| 381 } | 383 } |
| 382 | 384 |
| 383 void SavedFilesService::SavedFiles::MaybeCompactSequenceNumbers() { | 385 void SavedFilesService::SavedFiles::MaybeCompactSequenceNumbers() { |
| 384 DCHECK_GE(g_max_sequence_number, 0); | 386 DCHECK_GE(g_max_sequence_number, 0); |
| 385 DCHECK_GE(static_cast<size_t>(g_max_sequence_number), | 387 DCHECK_GE(static_cast<size_t>(g_max_sequence_number), |
| 386 g_max_saved_file_entries); | 388 g_max_saved_file_entries); |
| 387 std::map<int, SavedFileEntry*>::reverse_iterator it = | 389 std::map<int, SavedFileEntry*>::reverse_iterator it = |
| 388 saved_file_lru_.rbegin(); | 390 saved_file_lru_.rbegin(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 419 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); | 421 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_); |
| 420 std::vector<SavedFileEntry> saved_entries = | 422 std::vector<SavedFileEntry> saved_entries = |
| 421 GetSavedFileEntries(prefs, extension_id_); | 423 GetSavedFileEntries(prefs, extension_id_); |
| 422 for (std::vector<SavedFileEntry>::iterator it = saved_entries.begin(); | 424 for (std::vector<SavedFileEntry>::iterator it = saved_entries.begin(); |
| 423 it != saved_entries.end(); | 425 it != saved_entries.end(); |
| 424 ++it) { | 426 ++it) { |
| 425 std::unique_ptr<SavedFileEntry> file_entry(new SavedFileEntry(*it)); | 427 std::unique_ptr<SavedFileEntry> file_entry(new SavedFileEntry(*it)); |
| 426 const std::string& id = file_entry->id; | 428 const std::string& id = file_entry->id; |
| 427 saved_file_lru_.insert( | 429 saved_file_lru_.insert( |
| 428 std::make_pair(file_entry->sequence_number, file_entry.get())); | 430 std::make_pair(file_entry->sequence_number, file_entry.get())); |
| 429 registered_file_entries_.add(id, std::move(file_entry)); | 431 registered_file_entries_[id] = std::move(file_entry); |
| 430 } | 432 } |
| 431 } | 433 } |
| 432 | 434 |
| 433 // static | 435 // static |
| 434 void SavedFilesService::SetMaxSequenceNumberForTest(int max_value) { | 436 void SavedFilesService::SetMaxSequenceNumberForTest(int max_value) { |
| 435 g_max_sequence_number = max_value; | 437 g_max_sequence_number = max_value; |
| 436 } | 438 } |
| 437 | 439 |
| 438 // static | 440 // static |
| 439 void SavedFilesService::ClearMaxSequenceNumberForTest() { | 441 void SavedFilesService::ClearMaxSequenceNumberForTest() { |
| 440 g_max_sequence_number = kMaxSequenceNumber; | 442 g_max_sequence_number = kMaxSequenceNumber; |
| 441 } | 443 } |
| 442 | 444 |
| 443 // static | 445 // static |
| 444 void SavedFilesService::SetLruSizeForTest(int size) { | 446 void SavedFilesService::SetLruSizeForTest(int size) { |
| 445 g_max_saved_file_entries = size; | 447 g_max_saved_file_entries = size; |
| 446 } | 448 } |
| 447 | 449 |
| 448 // static | 450 // static |
| 449 void SavedFilesService::ClearLruSizeForTest() { | 451 void SavedFilesService::ClearLruSizeForTest() { |
| 450 g_max_saved_file_entries = kMaxSavedFileEntries; | 452 g_max_saved_file_entries = kMaxSavedFileEntries; |
| 451 } | 453 } |
| 452 | 454 |
| 453 } // namespace apps | 455 } // namespace apps |
| OLD | NEW |