| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/webstore_standalone_installer.h" | 5 #include "chrome/browser/extensions/webstore_standalone_installer.h" |
| 6 | 6 |
| 7 #include "base/values.h" | 7 #include "base/values.h" |
| 8 #include "base/version.h" | 8 #include "base/version.h" |
| 9 #include "chrome/browser/extensions/crx_installer.h" | 9 #include "chrome/browser/extensions/crx_installer.h" |
| 10 #include "chrome/browser/extensions/extension_install_prompt.h" | 10 #include "chrome/browser/extensions/extension_install_prompt.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 webstore_data_fetcher_->Start(); | 79 webstore_data_fetcher_->Start(); |
| 80 } | 80 } |
| 81 | 81 |
| 82 // | 82 // |
| 83 // Private interface implementation. | 83 // Private interface implementation. |
| 84 // | 84 // |
| 85 | 85 |
| 86 WebstoreStandaloneInstaller::~WebstoreStandaloneInstaller() { | 86 WebstoreStandaloneInstaller::~WebstoreStandaloneInstaller() { |
| 87 } | 87 } |
| 88 | 88 |
| 89 void WebstoreStandaloneInstaller::RunCallback(bool success, |
| 90 const std::string& error, |
| 91 webstore_install::Result result) { |
| 92 callback_.Run(success, error, result); |
| 93 } |
| 94 |
| 89 void WebstoreStandaloneInstaller::AbortInstall() { | 95 void WebstoreStandaloneInstaller::AbortInstall() { |
| 90 callback_.Reset(); | 96 callback_.Reset(); |
| 91 // Abort any in-progress fetches. | 97 // Abort any in-progress fetches. |
| 92 if (webstore_data_fetcher_) { | 98 if (webstore_data_fetcher_) { |
| 93 webstore_data_fetcher_.reset(); | 99 webstore_data_fetcher_.reset(); |
| 94 scoped_active_install_.reset(); | 100 scoped_active_install_.reset(); |
| 95 Release(); // Matches the AddRef in BeginInstall. | 101 Release(); // Matches the AddRef in BeginInstall. |
| 96 } | 102 } |
| 97 } | 103 } |
| 98 | 104 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 profile_, | 187 profile_, |
| 182 id_, | 188 id_, |
| 183 scoped_ptr<base::DictionaryValue>(manifest_.get()->DeepCopy()), | 189 scoped_ptr<base::DictionaryValue>(manifest_.get()->DeepCopy()), |
| 184 true)); | 190 true)); |
| 185 approval->skip_post_install_ui = !ShouldShowPostInstallUI(); | 191 approval->skip_post_install_ui = !ShouldShowPostInstallUI(); |
| 186 approval->use_app_installed_bubble = ShouldShowAppInstalledBubble(); | 192 approval->use_app_installed_bubble = ShouldShowAppInstalledBubble(); |
| 187 approval->installing_icon = gfx::ImageSkia::CreateFrom1xBitmap(icon_); | 193 approval->installing_icon = gfx::ImageSkia::CreateFrom1xBitmap(icon_); |
| 188 return approval.Pass(); | 194 return approval.Pass(); |
| 189 } | 195 } |
| 190 | 196 |
| 197 void WebstoreStandaloneInstaller::InstallUIProceed() { |
| 198 if (!CheckRequestorAlive()) { |
| 199 CompleteInstall(webstore_install::ABORTED, std::string()); |
| 200 return; |
| 201 } |
| 202 |
| 203 scoped_ptr<WebstoreInstaller::Approval> approval = CreateApproval(); |
| 204 |
| 205 ExtensionService* extension_service = |
| 206 ExtensionSystem::Get(profile_)->extension_service(); |
| 207 const Extension* installed_extension = |
| 208 extension_service->GetExtensionById(id_, true /* include disabled */); |
| 209 if (installed_extension) { |
| 210 std::string install_message; |
| 211 webstore_install::Result install_result = webstore_install::SUCCESS; |
| 212 bool done = true; |
| 213 |
| 214 if (ExtensionPrefs::Get(profile_)->IsExtensionBlacklisted(id_)) { |
| 215 // Don't install a blacklisted extension. |
| 216 install_result = webstore_install::BLACKLISTED; |
| 217 install_message = kExtensionIsBlacklisted; |
| 218 } else if (util::IsEphemeralApp(installed_extension->id(), profile_) && |
| 219 !approval->is_ephemeral) { |
| 220 // If the target extension has already been installed ephemerally and is |
| 221 // up to date, it can be promoted to a regular installed extension and |
| 222 // downloading from the Web Store is not necessary. |
| 223 scoped_refptr<const Extension> extension_to_install = |
| 224 GetLocalizedExtensionForDisplay(); |
| 225 if (!extension_to_install.get()) { |
| 226 CompleteInstall(webstore_install::INVALID_MANIFEST, |
| 227 kInvalidManifestError); |
| 228 return; |
| 229 } |
| 230 |
| 231 if (installed_extension->version()->CompareTo( |
| 232 *extension_to_install->version()) < 0) { |
| 233 // If the existing extension is out of date, proceed with the install |
| 234 // to update the extension. |
| 235 done = false; |
| 236 } else { |
| 237 install_ui::ShowPostInstallUIForApproval( |
| 238 profile_, *approval, installed_extension); |
| 239 extension_service->PromoteEphemeralApp(installed_extension, false); |
| 240 } |
| 241 } else if (!extension_service->IsExtensionEnabled(id_)) { |
| 242 // If the extension is installed but disabled, and not blacklisted, |
| 243 // enable it. |
| 244 extension_service->EnableExtension(id_); |
| 245 } // else extension is installed and enabled; no work to be done. |
| 246 |
| 247 if (done) { |
| 248 CompleteInstall(install_result, install_message); |
| 249 return; |
| 250 } |
| 251 } |
| 252 |
| 253 scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller( |
| 254 profile_, |
| 255 this, |
| 256 GetWebContents(), |
| 257 id_, |
| 258 approval.Pass(), |
| 259 install_source_); |
| 260 installer->Start(); |
| 261 } |
| 262 |
| 263 void WebstoreStandaloneInstaller::InstallUIAbort(bool user_initiated) { |
| 264 CompleteInstall(webstore_install::USER_CANCELLED, kUserCancelledError); |
| 265 } |
| 266 |
| 191 void WebstoreStandaloneInstaller::OnWebstoreRequestFailure() { | 267 void WebstoreStandaloneInstaller::OnWebstoreRequestFailure() { |
| 192 OnWebStoreDataFetcherDone(); | 268 OnWebStoreDataFetcherDone(); |
| 193 CompleteInstall(webstore_install::WEBSTORE_REQUEST_ERROR, | 269 CompleteInstall(webstore_install::WEBSTORE_REQUEST_ERROR, |
| 194 kWebstoreRequestError); | 270 kWebstoreRequestError); |
| 195 } | 271 } |
| 196 | 272 |
| 197 void WebstoreStandaloneInstaller::OnWebstoreResponseParseSuccess( | 273 void WebstoreStandaloneInstaller::OnWebstoreResponseParseSuccess( |
| 198 scoped_ptr<base::DictionaryValue> webstore_data) { | 274 scoped_ptr<base::DictionaryValue> webstore_data) { |
| 199 OnWebStoreDataFetcherDone(); | 275 OnWebStoreDataFetcherDone(); |
| 200 | 276 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 case WebstoreInstallHelper::Delegate::ICON_ERROR: | 392 case WebstoreInstallHelper::Delegate::ICON_ERROR: |
| 317 install_result = webstore_install::ICON_ERROR; | 393 install_result = webstore_install::ICON_ERROR; |
| 318 break; | 394 break; |
| 319 default: | 395 default: |
| 320 break; | 396 break; |
| 321 } | 397 } |
| 322 | 398 |
| 323 CompleteInstall(install_result, error_message); | 399 CompleteInstall(install_result, error_message); |
| 324 } | 400 } |
| 325 | 401 |
| 326 void WebstoreStandaloneInstaller::InstallUIProceed() { | |
| 327 if (!CheckRequestorAlive()) { | |
| 328 CompleteInstall(webstore_install::ABORTED, std::string()); | |
| 329 return; | |
| 330 } | |
| 331 | |
| 332 scoped_ptr<WebstoreInstaller::Approval> approval = CreateApproval(); | |
| 333 | |
| 334 ExtensionService* extension_service = | |
| 335 ExtensionSystem::Get(profile_)->extension_service(); | |
| 336 const Extension* installed_extension = | |
| 337 extension_service->GetExtensionById(id_, true /* include disabled */); | |
| 338 if (installed_extension) { | |
| 339 std::string install_message; | |
| 340 webstore_install::Result install_result = webstore_install::SUCCESS; | |
| 341 bool done = true; | |
| 342 | |
| 343 if (ExtensionPrefs::Get(profile_)->IsExtensionBlacklisted(id_)) { | |
| 344 // Don't install a blacklisted extension. | |
| 345 install_result = webstore_install::BLACKLISTED; | |
| 346 install_message = kExtensionIsBlacklisted; | |
| 347 } else if (util::IsEphemeralApp(installed_extension->id(), profile_) && | |
| 348 !approval->is_ephemeral) { | |
| 349 // If the target extension has already been installed ephemerally and is | |
| 350 // up to date, it can be promoted to a regular installed extension and | |
| 351 // downloading from the Web Store is not necessary. | |
| 352 scoped_refptr<const Extension> extension_to_install = | |
| 353 GetLocalizedExtensionForDisplay(); | |
| 354 if (!extension_to_install.get()) { | |
| 355 CompleteInstall(webstore_install::INVALID_MANIFEST, | |
| 356 kInvalidManifestError); | |
| 357 return; | |
| 358 } | |
| 359 | |
| 360 if (installed_extension->version()->CompareTo( | |
| 361 *extension_to_install->version()) < 0) { | |
| 362 // If the existing extension is out of date, proceed with the install | |
| 363 // to update the extension. | |
| 364 done = false; | |
| 365 } else { | |
| 366 install_ui::ShowPostInstallUIForApproval( | |
| 367 profile_, *approval, installed_extension); | |
| 368 extension_service->PromoteEphemeralApp(installed_extension, false); | |
| 369 } | |
| 370 } else if (!extension_service->IsExtensionEnabled(id_)) { | |
| 371 // If the extension is installed but disabled, and not blacklisted, | |
| 372 // enable it. | |
| 373 extension_service->EnableExtension(id_); | |
| 374 } // else extension is installed and enabled; no work to be done. | |
| 375 | |
| 376 if (done) { | |
| 377 CompleteInstall(install_result, install_message); | |
| 378 return; | |
| 379 } | |
| 380 } | |
| 381 | |
| 382 scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller( | |
| 383 profile_, | |
| 384 this, | |
| 385 GetWebContents(), | |
| 386 id_, | |
| 387 approval.Pass(), | |
| 388 install_source_); | |
| 389 installer->Start(); | |
| 390 } | |
| 391 | |
| 392 void WebstoreStandaloneInstaller::InstallUIAbort(bool user_initiated) { | |
| 393 CompleteInstall(webstore_install::USER_CANCELLED, kUserCancelledError); | |
| 394 } | |
| 395 | |
| 396 void WebstoreStandaloneInstaller::OnExtensionInstallSuccess( | 402 void WebstoreStandaloneInstaller::OnExtensionInstallSuccess( |
| 397 const std::string& id) { | 403 const std::string& id) { |
| 398 CHECK_EQ(id_, id); | 404 CHECK_EQ(id_, id); |
| 399 CompleteInstall(webstore_install::SUCCESS, std::string()); | 405 CompleteInstall(webstore_install::SUCCESS, std::string()); |
| 400 } | 406 } |
| 401 | 407 |
| 402 void WebstoreStandaloneInstaller::OnExtensionInstallFailure( | 408 void WebstoreStandaloneInstaller::OnExtensionInstallFailure( |
| 403 const std::string& id, | 409 const std::string& id, |
| 404 const std::string& error, | 410 const std::string& error, |
| 405 WebstoreInstaller::FailureReason reason) { | 411 WebstoreInstaller::FailureReason reason) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 void WebstoreStandaloneInstaller::OnWebStoreDataFetcherDone() { | 443 void WebstoreStandaloneInstaller::OnWebStoreDataFetcherDone() { |
| 438 // An instance of this class is passed in as a delegate for the | 444 // An instance of this class is passed in as a delegate for the |
| 439 // WebstoreInstallHelper, ExtensionInstallPrompt and WebstoreInstaller, and | 445 // WebstoreInstallHelper, ExtensionInstallPrompt and WebstoreInstaller, and |
| 440 // therefore needs to remain alive until they are done. Clear the webstore | 446 // therefore needs to remain alive until they are done. Clear the webstore |
| 441 // data fetcher to avoid calling Release in AbortInstall while any of these | 447 // data fetcher to avoid calling Release in AbortInstall while any of these |
| 442 // operations are in progress. | 448 // operations are in progress. |
| 443 webstore_data_fetcher_.reset(); | 449 webstore_data_fetcher_.reset(); |
| 444 } | 450 } |
| 445 | 451 |
| 446 } // namespace extensions | 452 } // namespace extensions |
| OLD | NEW |