- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / pending_extension_manager.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_
6 #define CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_
7
8 #include <list>
9 #include <string>
10
11 #include "chrome/browser/extensions/pending_extension_info.h"
12 #include "chrome/common/extensions/extension.h"
13 #include "extensions/common/manifest.h"
14
15 class ExtensionServiceInterface;
16 class GURL;
17 class PendingExtensionManager;
18
19 namespace base {
20 class Version;
21 }
22
23 FORWARD_DECLARE_TEST(ExtensionServiceTest,
24                      UpdatePendingExtensionAlreadyInstalled);
25
26 namespace extensions {
27 class ExtensionUpdaterTest;
28 void SetupPendingExtensionManagerForTest(
29     int count, const GURL& update_url,
30     PendingExtensionManager* pending_extension_manager);
31
32 // Class PendingExtensionManager manages the set of extensions which are
33 // being installed or updated. In general, installation and updates take
34 // time, because they involve downloading, unpacking, and installing.
35 // This class allows us to avoid race cases where multiple sources install
36 // the same extension.
37 // The extensions service creates an instance of this class, and manages
38 // its lifetime. This class should only be used from the UI thread.
39 class PendingExtensionManager {
40  public:
41   // |service| is a reference to the ExtensionService whose pending
42   // extensions we are managing. The service creates an instance of
43   // this class on construction, and destroys it on destruction.
44   // The service remains valid over the entire lifetime of this class.
45   explicit PendingExtensionManager(const ExtensionServiceInterface& service);
46   ~PendingExtensionManager();
47
48   // TODO(skerner): Many of these methods can be private once code in
49   // ExtensionService is moved into methods of this class.
50
51   // Remove extension with id |id| from the set of pending extensions. Returns
52   // true if such an extension was found and removed, false otherwise.
53   bool Remove(const std::string& id);
54
55   // Get the  information for a pending extension.  Returns a pointer to the
56   // pending extension with id |id|, or NULL if there is no such extension.
57   const PendingExtensionInfo* GetById(const std::string& id) const;
58
59   // Is |id| in the set of pending extensions?
60   bool IsIdPending(const std::string& id) const;
61
62   // Returns true if there are any extensions pending.
63   bool HasPendingExtensions() const;
64
65   // Whether there is pending extension install from sync.
66   bool HasPendingExtensionFromSync() const;
67
68   // Adds an extension in a pending state; the extension with the
69   // given info will be installed on the next auto-update cycle.
70   // Return true if the extension was added.  Will return false
71   // if the extension is pending from another source which overrides
72   // sync installs (such as a policy extension) or if the extension
73   // is already installed.
74   //
75   // TODO(akalin): Replace |install_silently| with a list of
76   // pre-enabled permissions.
77   bool AddFromSync(
78       const std::string& id,
79       const GURL& update_url,
80       PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install,
81       bool install_silently);
82
83   // Adds an extension that was depended on by another extension.
84   bool AddFromExtensionImport(
85       const std::string& id,
86       const GURL& update_url,
87       PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install);
88
89   // Given an extension id and an update URL, schedule the extension
90   // to be fetched, installed, and activated.
91   bool AddFromExternalUpdateUrl(const std::string& id,
92                                 const GURL& update_url,
93                                 Manifest::Location location,
94                                 int creation_flags,
95                                 bool mark_acknowledged);
96
97   // Add a pending extension record for an external CRX file.
98   // Return true if the CRX should be installed, false if an existing
99   // pending record overrides it.
100   bool AddFromExternalFile(
101       const std::string& id,
102       Manifest::Location location,
103       const base::Version& version,
104       int creation_flags,
105       bool mark_acknowledged);
106
107   // Get the list of pending IDs that should be installed from an update URL.
108   // Pending extensions that will be installed from local files will not be
109   // included in the set.
110   void GetPendingIdsForUpdateCheck(
111       std::list<std::string>* out_ids_for_update_check) const;
112
113  private:
114   typedef std::list<PendingExtensionInfo> PendingExtensionList;
115
116   // Assumes an extension with id |id| is not already installed.
117   // Return true if the extension was added.
118   bool AddExtensionImpl(
119       const std::string& id,
120       const GURL& update_url,
121       const base::Version& version,
122       PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install,
123       bool is_from_sync,
124       bool install_silently,
125       Manifest::Location install_source,
126       int creation_flags,
127       bool mark_acknowledged);
128
129   // Add a pending extension record directly.  Used for unit tests that need
130   // to set an inital state. Use friendship to allow the tests to call this
131   // method.
132   void AddForTesting(const PendingExtensionInfo& pending_extension_info);
133
134   // Reference to the extension service whose pending extensions this class is
135   // managing.  Because this class is a member of |service_|, it is created
136   // and destroyed with |service_|. We only use methods from the interface
137   // ExtensionServiceInterface.
138   const ExtensionServiceInterface& service_;
139
140   PendingExtensionList pending_extension_list_;
141
142   FRIEND_TEST_ALL_PREFIXES(::ExtensionServiceTest,
143                            UpdatePendingExtensionAlreadyInstalled);
144   friend class ExtensionUpdaterTest;
145   friend void SetupPendingExtensionManagerForTest(
146       int count, const GURL& update_url,
147       PendingExtensionManager* pending_extension_manager);
148
149   DISALLOW_COPY_AND_ASSIGN(PendingExtensionManager);
150 };
151
152 }  // namespace extensions
153
154 #endif  // CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_