1 // Copyright 2013 The Chromium Authors
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 "base/memory/raw_ptr.h"
17 #include "base/scoped_observation.h"
18 #include "components/keyed_service/core/keyed_service.h"
19 #include "extensions/browser/api/file_system/saved_files_service_interface.h"
20 #include "extensions/browser/extension_host_registry.h"
26 class SavedFilesServiceUnitTest;
27 FORWARD_DECLARE_TEST(SavedFilesServiceUnitTest, RetainTwoFilesTest);
28 FORWARD_DECLARE_TEST(SavedFilesServiceUnitTest, EvictionTest);
29 FORWARD_DECLARE_TEST(SavedFilesServiceUnitTest, SequenceNumberCompactionTest);
31 namespace extensions {
33 struct SavedFileEntry;
38 // Tracks the files that apps have retained access to both while running and
40 class SavedFilesService : public extensions::SavedFilesServiceInterface,
42 public extensions::ExtensionHostRegistry::Observer {
44 explicit SavedFilesService(content::BrowserContext* context);
45 SavedFilesService(const SavedFilesService&) = delete;
46 SavedFilesService& operator=(const SavedFilesService&) = delete;
47 ~SavedFilesService() override;
49 static SavedFilesService* Get(content::BrowserContext* context);
51 // extensions::SavedFilesServiceInterface:
52 void RegisterFileEntry(const std::string& extension_id,
53 const std::string& id,
54 const base::FilePath& file_path,
55 bool is_directory) override;
56 void EnqueueFileEntry(const std::string& extension_id,
57 const std::string& id) override;
58 bool IsRegistered(const std::string& extension_id,
59 const std::string& id) override;
60 const extensions::SavedFileEntry* GetFileEntry(
61 const std::string& extension_id,
62 const std::string& id) override;
64 // Returns all registered file entries.
65 std::vector<extensions::SavedFileEntry> GetAllFileEntries(
66 const std::string& extension_id);
68 // Clears all retained files if the app does not have the
69 // fileSystem.retainEntries permission.
70 void ClearQueueIfNoRetainPermission(const extensions::Extension* extension);
72 // Clears all retained files.
73 void ClearQueue(const extensions::Extension* extension);
75 // Called to notify that the application has begun to exit.
76 void OnApplicationTerminating();
79 FRIEND_TEST_ALL_PREFIXES(::SavedFilesServiceUnitTest, RetainTwoFilesTest);
80 FRIEND_TEST_ALL_PREFIXES(::SavedFilesServiceUnitTest, EvictionTest);
81 FRIEND_TEST_ALL_PREFIXES(::SavedFilesServiceUnitTest,
82 SequenceNumberCompactionTest);
83 friend class ::SavedFilesServiceUnitTest;
85 // A container for the registered files for an app.
88 // extensions::ExtensionHostRegistry::Observer:
89 void OnExtensionHostDestroyed(content::BrowserContext* browser_context,
90 extensions::ExtensionHost* host) override;
92 // Returns the SavedFiles for |extension_id| or NULL if one does not exist.
93 SavedFiles* Get(const std::string& extension_id) const;
95 // Returns the SavedFiles for |extension_id|, creating it if necessary.
96 SavedFiles* GetOrInsert(const std::string& extension_id);
98 // Clears the SavedFiles for |extension_id|.
99 void Clear(const std::string& extension_id);
101 static void SetMaxSequenceNumberForTest(int max_value);
102 static void ClearMaxSequenceNumberForTest();
103 static void SetLruSizeForTest(int size);
104 static void ClearLruSizeForTest();
106 std::map<std::string, std::unique_ptr<SavedFiles>>
107 extension_id_to_saved_files_;
108 raw_ptr<content::BrowserContext> context_;
110 base::ScopedObservation<extensions::ExtensionHostRegistry,
111 extensions::ExtensionHostRegistry::Observer>
112 extension_host_registry_observation_{this};
117 #endif // APPS_SAVED_FILES_SERVICE_H_