Home | History | Annotate | Download | only in browser
      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