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