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
3 // found in the LICENSE file.
5 #ifndef APPS_SAVED_FILES_SERVICE_H_
6 #define APPS_SAVED_FILES_SERVICE_H_
14 #include "base/files/file_path.h"
15 #include "base/gtest_prod_util.h"
16 #include "components/keyed_service/core/keyed_service.h"
17 #include "content/public/browser/notification_observer.h"
18 #include "content/public/browser/notification_registrar.h"
19 #include "extensions/browser/api/file_system/saved_files_service_interface.h"
25 class SavedFilesServiceUnitTest;
26 FORWARD_DECLARE_TEST(SavedFilesServiceUnitTest, RetainTwoFilesTest);
27 FORWARD_DECLARE_TEST(SavedFilesServiceUnitTest, EvictionTest);
28 FORWARD_DECLARE_TEST(SavedFilesServiceUnitTest, SequenceNumberCompactionTest);
30 namespace extensions {
32 struct SavedFileEntry;
37 // Tracks the files that apps have retained access to both while running and
39 class SavedFilesService : public extensions::SavedFilesServiceInterface,
41 public content::NotificationObserver {
43 explicit SavedFilesService(content::BrowserContext* context);
44 ~SavedFilesService() override;
46 static SavedFilesService* Get(content::BrowserContext* context);
48 // extensions::SavedFilesServiceInterface:
49 void RegisterFileEntry(const std::string& extension_id,
50 const std::string& id,
51 const base::FilePath& file_path,
52 bool is_directory) override;
53 void EnqueueFileEntry(const std::string& extension_id,
54 const std::string& id) override;
55 bool IsRegistered(const std::string& extension_id,
56 const std::string& id) override;
57 const extensions::SavedFileEntry* GetFileEntry(
58 const std::string& extension_id,
59 const std::string& id) override;
61 // Returns all registered file entries.
62 std::vector<extensions::SavedFileEntry> GetAllFileEntries(
63 const std::string& extension_id);
65 // Clears all retained files if the app does not have the
66 // fileSystem.retainEntries permission.
67 void ClearQueueIfNoRetainPermission(const extensions::Extension* extension);
69 // Clears all retained files.
70 void ClearQueue(const extensions::Extension* extension);
72 // Called to notify that the application has begun to exit.
73 void OnApplicationTerminating();
76 FRIEND_TEST_ALL_PREFIXES(::SavedFilesServiceUnitTest, RetainTwoFilesTest);
77 FRIEND_TEST_ALL_PREFIXES(::SavedFilesServiceUnitTest, EvictionTest);
78 FRIEND_TEST_ALL_PREFIXES(::SavedFilesServiceUnitTest,
79 SequenceNumberCompactionTest);
80 friend class ::SavedFilesServiceUnitTest;
82 // A container for the registered files for an app.
85 // content::NotificationObserver.
86 void Observe(int type,
87 const content::NotificationSource& source,
88 const content::NotificationDetails& details) override;
90 // Returns the SavedFiles for |extension_id| or NULL if one does not exist.
91 SavedFiles* Get(const std::string& extension_id) const;
93 // Returns the SavedFiles for |extension_id|, creating it if necessary.
94 SavedFiles* GetOrInsert(const std::string& extension_id);
96 // Clears the SavedFiles for |extension_id|.
97 void Clear(const std::string& extension_id);
99 static void SetMaxSequenceNumberForTest(int max_value);
100 static void ClearMaxSequenceNumberForTest();
101 static void SetLruSizeForTest(int size);
102 static void ClearLruSizeForTest();
104 std::map<std::string, std::unique_ptr<SavedFiles>>
105 extension_id_to_saved_files_;
106 content::NotificationRegistrar registrar_;
107 content::BrowserContext* context_;
109 DISALLOW_COPY_AND_ASSIGN(SavedFilesService);
114 #endif // APPS_SAVED_FILES_SERVICE_H_