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