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