OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/pending_extension_manager.h" | 5 #include "chrome/browser/extensions/pending_extension_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/version.h" | 10 #include "base/version.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 return true; | 82 return true; |
83 } | 83 } |
84 | 84 |
85 return false; | 85 return false; |
86 } | 86 } |
87 | 87 |
88 bool PendingExtensionManager::AddFromSync( | 88 bool PendingExtensionManager::AddFromSync( |
89 const std::string& id, | 89 const std::string& id, |
90 const GURL& update_url, | 90 const GURL& update_url, |
91 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install, | 91 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install, |
92 bool install_silently) { | 92 bool install_silently, |
| 93 bool remote_install) { |
93 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 94 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
94 | 95 |
95 if (service_.GetInstalledExtension(id)) { | 96 if (service_.GetInstalledExtension(id)) { |
96 LOG(ERROR) << "Trying to add pending extension " << id | 97 LOG(ERROR) << "Trying to add pending extension " << id |
97 << " which already exists"; | 98 << " which already exists"; |
98 return false; | 99 return false; |
99 } | 100 } |
100 | 101 |
101 // Make sure we don't ever try to install the CWS app, because even though | 102 // Make sure we don't ever try to install the CWS app, because even though |
102 // it is listed as a syncable app (because its values need to be synced) it | 103 // it is listed as a syncable app (because its values need to be synced) it |
103 // should already be installed on every instance. | 104 // should already be installed on every instance. |
104 if (id == extension_misc::kWebStoreAppId) { | 105 if (id == extension_misc::kWebStoreAppId) { |
105 NOTREACHED(); | 106 NOTREACHED(); |
106 return false; | 107 return false; |
107 } | 108 } |
108 | 109 |
109 const bool kIsFromSync = true; | 110 const bool kIsFromSync = true; |
110 const Manifest::Location kSyncLocation = Manifest::INTERNAL; | 111 const Manifest::Location kSyncLocation = Manifest::INTERNAL; |
111 const bool kMarkAcknowledged = false; | 112 const bool kMarkAcknowledged = false; |
112 | 113 |
113 return AddExtensionImpl(id, | 114 return AddExtensionImpl(id, |
114 std::string(), | 115 std::string(), |
115 update_url, | 116 update_url, |
116 Version(), | 117 Version(), |
117 should_allow_install, | 118 should_allow_install, |
118 kIsFromSync, | 119 kIsFromSync, |
119 install_silently, | 120 install_silently, |
120 kSyncLocation, | 121 kSyncLocation, |
121 Extension::NO_FLAGS, | 122 Extension::NO_FLAGS, |
122 kMarkAcknowledged); | 123 kMarkAcknowledged, |
| 124 remote_install); |
123 } | 125 } |
124 | 126 |
125 bool PendingExtensionManager::AddFromExtensionImport( | 127 bool PendingExtensionManager::AddFromExtensionImport( |
126 const std::string& id, | 128 const std::string& id, |
127 const GURL& update_url, | 129 const GURL& update_url, |
128 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install) { | 130 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install) { |
129 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 131 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
130 | 132 |
131 if (service_.GetInstalledExtension(id)) { | 133 if (service_.GetInstalledExtension(id)) { |
132 LOG(ERROR) << "Trying to add pending extension " << id | 134 LOG(ERROR) << "Trying to add pending extension " << id |
133 << " which already exists"; | 135 << " which already exists"; |
134 return false; | 136 return false; |
135 } | 137 } |
136 | 138 |
137 const bool kIsFromSync = false; | 139 const bool kIsFromSync = false; |
138 const bool kInstallSilently = true; | 140 const bool kInstallSilently = true; |
139 const Manifest::Location kManifestLocation = Manifest::INTERNAL; | 141 const Manifest::Location kManifestLocation = Manifest::INTERNAL; |
140 const bool kMarkAcknowledged = false; | 142 const bool kMarkAcknowledged = false; |
| 143 const bool kRemoteInstall = false; |
141 | 144 |
142 return AddExtensionImpl(id, | 145 return AddExtensionImpl(id, |
143 std::string(), | 146 std::string(), |
144 update_url, | 147 update_url, |
145 Version(), | 148 Version(), |
146 should_allow_install, | 149 should_allow_install, |
147 kIsFromSync, | 150 kIsFromSync, |
148 kInstallSilently, | 151 kInstallSilently, |
149 kManifestLocation, | 152 kManifestLocation, |
150 Extension::NO_FLAGS, | 153 Extension::NO_FLAGS, |
151 kMarkAcknowledged); | 154 kMarkAcknowledged, |
| 155 kRemoteInstall); |
152 } | 156 } |
153 | 157 |
154 bool PendingExtensionManager::AddFromExternalUpdateUrl( | 158 bool PendingExtensionManager::AddFromExternalUpdateUrl( |
155 const std::string& id, | 159 const std::string& id, |
156 const std::string& install_parameter, | 160 const std::string& install_parameter, |
157 const GURL& update_url, | 161 const GURL& update_url, |
158 Manifest::Location location, | 162 Manifest::Location location, |
159 int creation_flags, | 163 int creation_flags, |
160 bool mark_acknowledged) { | 164 bool mark_acknowledged) { |
161 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 165 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
162 | 166 |
163 const bool kIsFromSync = false; | 167 const bool kIsFromSync = false; |
164 const bool kInstallSilently = true; | 168 const bool kInstallSilently = true; |
| 169 const bool kRemoteInstall = false; |
165 | 170 |
166 const Extension* extension = service_.GetInstalledExtension(id); | 171 const Extension* extension = service_.GetInstalledExtension(id); |
167 if (extension && location == Manifest::GetHigherPriorityLocation( | 172 if (extension && location == Manifest::GetHigherPriorityLocation( |
168 location, extension->location())) { | 173 location, extension->location())) { |
169 // If the new location has higher priority than the location of an existing | 174 // If the new location has higher priority than the location of an existing |
170 // extension, let the update process overwrite the existing extension. | 175 // extension, let the update process overwrite the existing extension. |
171 } else { | 176 } else { |
172 if (ExtensionPrefs::Get(context_)->IsExternalExtensionUninstalled(id)) | 177 if (ExtensionPrefs::Get(context_)->IsExternalExtensionUninstalled(id)) |
173 return false; | 178 return false; |
174 | 179 |
175 if (extension) { | 180 if (extension) { |
176 LOG(DFATAL) << "Trying to add extension " << id | 181 LOG(DFATAL) << "Trying to add extension " << id |
177 << " by external update, but it is already installed."; | 182 << " by external update, but it is already installed."; |
178 return false; | 183 return false; |
179 } | 184 } |
180 } | 185 } |
181 | 186 |
182 return AddExtensionImpl(id, | 187 return AddExtensionImpl(id, |
183 install_parameter, | 188 install_parameter, |
184 update_url, | 189 update_url, |
185 Version(), | 190 Version(), |
186 &AlwaysInstall, | 191 &AlwaysInstall, |
187 kIsFromSync, | 192 kIsFromSync, |
188 kInstallSilently, | 193 kInstallSilently, |
189 location, | 194 location, |
190 creation_flags, | 195 creation_flags, |
191 mark_acknowledged); | 196 mark_acknowledged, |
| 197 kRemoteInstall); |
192 } | 198 } |
193 | 199 |
194 | 200 |
195 bool PendingExtensionManager::AddFromExternalFile( | 201 bool PendingExtensionManager::AddFromExternalFile( |
196 const std::string& id, | 202 const std::string& id, |
197 Manifest::Location install_source, | 203 Manifest::Location install_source, |
198 const Version& version, | 204 const Version& version, |
199 int creation_flags, | 205 int creation_flags, |
200 bool mark_acknowledged) { | 206 bool mark_acknowledged) { |
201 // TODO(skerner): AddFromSync() checks to see if the extension is | 207 // TODO(skerner): AddFromSync() checks to see if the extension is |
202 // installed, but this method assumes that the caller already | 208 // installed, but this method assumes that the caller already |
203 // made sure it is not installed. Make all AddFrom*() methods | 209 // made sure it is not installed. Make all AddFrom*() methods |
204 // consistent. | 210 // consistent. |
205 GURL kUpdateUrl = GURL(); | 211 GURL kUpdateUrl = GURL(); |
206 bool kIsFromSync = false; | 212 const bool kIsFromSync = false; |
207 bool kInstallSilently = true; | 213 const bool kInstallSilently = true; |
| 214 const bool kRemoteInstall = false; |
208 | 215 |
209 return AddExtensionImpl(id, | 216 return AddExtensionImpl(id, |
210 std::string(), | 217 std::string(), |
211 kUpdateUrl, | 218 kUpdateUrl, |
212 version, | 219 version, |
213 &AlwaysInstall, | 220 &AlwaysInstall, |
214 kIsFromSync, | 221 kIsFromSync, |
215 kInstallSilently, | 222 kInstallSilently, |
216 install_source, | 223 install_source, |
217 creation_flags, | 224 creation_flags, |
218 mark_acknowledged); | 225 mark_acknowledged, |
| 226 kRemoteInstall); |
219 } | 227 } |
220 | 228 |
221 void PendingExtensionManager::GetPendingIdsForUpdateCheck( | 229 void PendingExtensionManager::GetPendingIdsForUpdateCheck( |
222 std::list<std::string>* out_ids_for_update_check) const { | 230 std::list<std::string>* out_ids_for_update_check) const { |
223 PendingExtensionList::const_iterator iter; | 231 PendingExtensionList::const_iterator iter; |
224 for (iter = pending_extension_list_.begin(); | 232 for (iter = pending_extension_list_.begin(); |
225 iter != pending_extension_list_.end(); | 233 iter != pending_extension_list_.end(); |
226 ++iter) { | 234 ++iter) { |
227 Manifest::Location install_source = iter->install_source(); | 235 Manifest::Location install_source = iter->install_source(); |
228 | 236 |
(...skipping 11 matching lines...) Expand all Loading... |
240 bool PendingExtensionManager::AddExtensionImpl( | 248 bool PendingExtensionManager::AddExtensionImpl( |
241 const std::string& id, | 249 const std::string& id, |
242 const std::string& install_parameter, | 250 const std::string& install_parameter, |
243 const GURL& update_url, | 251 const GURL& update_url, |
244 const Version& version, | 252 const Version& version, |
245 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install, | 253 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install, |
246 bool is_from_sync, | 254 bool is_from_sync, |
247 bool install_silently, | 255 bool install_silently, |
248 Manifest::Location install_source, | 256 Manifest::Location install_source, |
249 int creation_flags, | 257 int creation_flags, |
250 bool mark_acknowledged) { | 258 bool mark_acknowledged, |
| 259 bool remote_install) { |
251 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 260 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
252 | 261 |
253 PendingExtensionInfo info(id, | 262 PendingExtensionInfo info(id, |
254 install_parameter, | 263 install_parameter, |
255 update_url, | 264 update_url, |
256 version, | 265 version, |
257 should_allow_install, | 266 should_allow_install, |
258 is_from_sync, | 267 is_from_sync, |
259 install_silently, | 268 install_silently, |
260 install_source, | 269 install_source, |
261 creation_flags, | 270 creation_flags, |
262 mark_acknowledged); | 271 mark_acknowledged, |
| 272 remote_install); |
263 | 273 |
264 if (const PendingExtensionInfo* pending = GetById(id)) { | 274 if (const PendingExtensionInfo* pending = GetById(id)) { |
265 // Bugs in this code will manifest as sporadic incorrect extension | 275 // Bugs in this code will manifest as sporadic incorrect extension |
266 // locations in situations where multiple install sources run at the | 276 // locations in situations where multiple install sources run at the |
267 // same time. For example, on first login to a chrome os machine, an | 277 // same time. For example, on first login to a chrome os machine, an |
268 // extension may be requested by sync and the default extension set. | 278 // extension may be requested by sync and the default extension set. |
269 // The following logging will help diagnose such issues. | 279 // The following logging will help diagnose such issues. |
270 VLOG(1) << "Extension id " << id | 280 VLOG(1) << "Extension id " << id |
271 << " was entered for update more than once." | 281 << " was entered for update more than once." |
272 << " old location: " << pending->install_source() | 282 << " old location: " << pending->install_source() |
(...skipping 22 matching lines...) Expand all Loading... |
295 | 305 |
296 return true; | 306 return true; |
297 } | 307 } |
298 | 308 |
299 void PendingExtensionManager::AddForTesting( | 309 void PendingExtensionManager::AddForTesting( |
300 const PendingExtensionInfo& pending_extension_info) { | 310 const PendingExtensionInfo& pending_extension_info) { |
301 pending_extension_list_.push_back(pending_extension_info); | 311 pending_extension_list_.push_back(pending_extension_info); |
302 } | 312 } |
303 | 313 |
304 } // namespace extensions | 314 } // namespace extensions |
OLD | NEW |