extension_assets_manager_chromeos.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_ASSETS_MANAGER_CHROMEOS_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_ASSETS_MANAGER_CHROMEOS_H_ 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <map> 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/extension_assets_manager.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)template <typename T> struct DefaultSingletonTraits; 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PrefRegistrySimple; 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace base { 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class DictionaryValue; 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class SequencedTaskRunner; 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace extensions { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Chrome OS specific implementation of assets manager that shares default apps 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// between all users on the machine. 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionAssetsManagerChromeOS : public ExtensionAssetsManager { 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static ExtensionAssetsManagerChromeOS* GetInstance(); 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // A dictionary that maps shared extension IDs to version/paths/users. 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static const char kSharedExtensions[]; 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Name of path attribute in shared extensions map. 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static const char kSharedExtensionPath[]; 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Name of users attribute (list of user emails) in shared extensions map. 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static const char kSharedExtensionUsers[]; 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Register shared assets related preferences. 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void RegisterPrefs(PrefRegistrySimple* registry); 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Override from ExtensionAssetsManager. 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void InstallExtension(const Extension* extension, 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& unpacked_extension_root, 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& local_install_dir, 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile, 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InstallExtensionCallback callback) OVERRIDE; 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void UninstallExtension( 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile, 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& local_install_dir, 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& extension_root) OVERRIDE; 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Return shared install dir. 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static base::FilePath GetSharedInstallDir(); 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Cleans up shared extensions list in preferences and returns list of 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // extension IDs and version paths that are in use in |live_extension_paths|. 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Files on disk are not removed. Must be called on UI thread. 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Returns |false| in case of errors. 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static bool CleanUpSharedExtensions( 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::multimap<std::string, base::FilePath>* live_extension_paths); 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void SetSharedInstallDirForTesting(const base::FilePath& install_dir); 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) friend struct DefaultSingletonTraits<ExtensionAssetsManagerChromeOS>; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtensionAssetsManagerChromeOS(); 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~ExtensionAssetsManagerChromeOS(); 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Should be called on UI thread to get associated file task runner for 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the profile. 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static base::SequencedTaskRunner* GetFileTaskRunner(Profile* profile); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Return |true| if |extension| can be installed in a shared place for all 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // users on the device. 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool CanShareAssets(const Extension* extension); 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on the UI thread to check if a given version of the |extension| 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // already exists at the shared location. 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void CheckSharedExtension( 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& unpacked_extension_root, 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& local_install_dir, 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile, 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InstallExtensionCallback callback); 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on task runner thread to install extension to shared location. 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void InstallSharedExtension( 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& unpacked_extension_root); 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on UI thread to process shared install result. 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void InstallSharedExtensionDone( 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& shared_version_dir); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on task runner thread to install the extension to local dir call 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // callback with the result. 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void InstallLocalExtension( 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& unpacked_extension_root, 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& local_install_dir, 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InstallExtensionCallback callback); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on UI thread to mark that shared version is not used. 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void MarkSharedExtensionUnused(const std::string& id, 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile); 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on task runner thread to remove shared version. 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void DeleteSharedVersion(const base::FilePath& shared_version_dir); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Clean shared extension with given |id|. 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static bool CleanUpExtension( 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& id, 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::DictionaryValue* extension_info, 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::multimap<std::string, base::FilePath>* live_extension_paths); 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionAssetsManagerChromeOS); 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace extensions 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_ASSETS_MANAGER_CHROMEOS_H_ 128