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