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) 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Return true if |extension| was installed to shared location. 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static bool IsSharedInstall(const Extension* extension); 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Cleans up shared extensions list in preferences and returns list of 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // extension IDs and version paths that are in use in |live_extension_paths|. 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Files on disk are not removed. Must be called on UI thread. 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Returns |false| in case of errors. 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static bool CleanUpSharedExtensions( 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::multimap<std::string, base::FilePath>* live_extension_paths); 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void SetSharedInstallDirForTesting(const base::FilePath& install_dir); 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) friend struct DefaultSingletonTraits<ExtensionAssetsManagerChromeOS>; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtensionAssetsManagerChromeOS(); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~ExtensionAssetsManagerChromeOS(); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Should be called on UI thread to get associated file task runner for 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the profile. 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static base::SequencedTaskRunner* GetFileTaskRunner(Profile* profile); 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Return |true| if |extension| can be installed in a shared place for all 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // users on the device. 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static bool CanShareAssets(const Extension* extension, 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath& unpacked_extension_root); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on the UI thread to check if a given version of the |extension| 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // already exists at the shared location. 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void CheckSharedExtension( 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& unpacked_extension_root, 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& local_install_dir, 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile, 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InstallExtensionCallback callback); 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on task runner thread to install extension to shared location. 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void InstallSharedExtension( 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& unpacked_extension_root); 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on UI thread to process shared install result. 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void InstallSharedExtensionDone( 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& shared_version_dir); 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on task runner thread to install the extension to local dir call 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // callback with the result. 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void InstallLocalExtension( 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& id, 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& version, 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& unpacked_extension_root, 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& local_install_dir, 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InstallExtensionCallback callback); 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on UI thread to mark that shared version is not used. 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void MarkSharedExtensionUnused(const std::string& id, 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile); 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Called on task runner thread to remove shared version. 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static void DeleteSharedVersion(const base::FilePath& shared_version_dir); 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Clean shared extension with given |id|. 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static bool CleanUpExtension( 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& id, 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::DictionaryValue* extension_info, 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::multimap<std::string, base::FilePath>* live_extension_paths); 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionAssetsManagerChromeOS); 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace extensions 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_ASSETS_MANAGER_CHROMEOS_H_ 132