// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_GARBAGE_COLLECTOR_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_GARBAGE_COLLECTOR_H_ #include <map> #include <string> #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" namespace content { class BrowserContext; } class ExtensionService; namespace extensions { // The class responsible for cleaning up the cruft left behind on the file // system by uninstalled (or failed install) extensions. // The class is owned by ExtensionService, but is mostly independent. Tasks to // garbage collect extensions and isolated storage are posted once the // ExtensionSystem signals ready. class ExtensionGarbageCollector { public: explicit ExtensionGarbageCollector(ExtensionService* extension_service); ~ExtensionGarbageCollector(); #if defined(OS_CHROMEOS) // Enable or disable garbage collection. See |disable_garbage_collection_|. void disable_garbage_collection() { disable_garbage_collection_ = true; } void enable_garbage_collection() { disable_garbage_collection_ = false; } #endif // Manually trigger GarbageCollectExtensions() for testing. void GarbageCollectExtensionsForTest(); private: // Cleans up the extension install directory. It can end up with garbage in it // if extensions can't initially be removed when they are uninstalled (eg if a // file is in use). // Obsolete version directories are removed, as are directories that aren't // found in the ExtensionPrefs. // The "Temp" directory that is used during extension installation will get // removed iff there are no pending installations. void GarbageCollectExtensions(); // Garbage collects apps/extensions isolated storage, if it is not currently // active (i.e. is not in ExtensionRegistry::ENABLED). There is an exception // for ephemeral apps, because they can outlive their cache lifetimes. void GarbageCollectIsolatedStorageIfNeeded(); // The ExtensionService which owns this GarbageCollector. ExtensionService* extension_service_; // The BrowserContext associated with the GarbageCollector, for convenience. // (This is equivalent to extension_service_->GetBrowserContext().) content::BrowserContext* context_; // The root extensions installation directory. base::FilePath install_directory_; #if defined(OS_CHROMEOS) // TODO(rkc): HACK alert - this is only in place to allow the // kiosk_mode_screensaver to prevent its extension from getting garbage // collected. Remove this once KioskModeScreensaver is removed. // See crbug.com/280363 bool disable_garbage_collection_; #endif // Generate weak pointers for safely posting to the file thread for garbage // collection. base::WeakPtrFactory<ExtensionGarbageCollector> weak_factory_; DISALLOW_COPY_AND_ASSIGN(ExtensionGarbageCollector); }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_GARBAGE_COLLECTOR_H_