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 |