| 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/crx_installer.h" | 5 #include "chrome/browser/extensions/crx_installer.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 return; | 240 return; |
| 241 } | 241 } |
| 242 | 242 |
| 243 // TODO(aa): conversion data gets lost here :( | 243 // TODO(aa): conversion data gets lost here :( |
| 244 | 244 |
| 245 OnUnpackSuccess(extension->path(), extension->path(), nullptr, | 245 OnUnpackSuccess(extension->path(), extension->path(), nullptr, |
| 246 extension.get(), SkBitmap()); | 246 extension.get(), SkBitmap()); |
| 247 } | 247 } |
| 248 | 248 |
| 249 CrxInstallError CrxInstaller::AllowInstall(const Extension* extension) { | 249 CrxInstallError CrxInstaller::AllowInstall(const Extension* extension) { |
| 250 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); | 250 DCHECK(installer_task_runner_->RunsTasksInCurrentSequence()); |
| 251 | 251 |
| 252 // Make sure the expected ID matches if one was supplied or if we want to | 252 // Make sure the expected ID matches if one was supplied or if we want to |
| 253 // bypass the prompt. | 253 // bypass the prompt. |
| 254 if ((approved_ || !expected_id_.empty()) && | 254 if ((approved_ || !expected_id_.empty()) && |
| 255 expected_id_ != extension->id()) { | 255 expected_id_ != extension->id()) { |
| 256 return CrxInstallError(l10n_util::GetStringFUTF16( | 256 return CrxInstallError(l10n_util::GetStringFUTF16( |
| 257 IDS_EXTENSION_INSTALL_UNEXPECTED_ID, base::ASCIIToUTF16(expected_id_), | 257 IDS_EXTENSION_INSTALL_UNEXPECTED_ID, base::ASCIIToUTF16(expected_id_), |
| 258 base::ASCIIToUTF16(extension->id()))); | 258 base::ASCIIToUTF16(extension->id()))); |
| 259 } | 259 } |
| 260 | 260 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 IDS_EXTENSION_INSTALL_INCORRECT_INSTALL_HOST)); | 398 IDS_EXTENSION_INSTALL_INCORRECT_INSTALL_HOST)); |
| 399 } | 399 } |
| 400 } | 400 } |
| 401 } | 401 } |
| 402 } | 402 } |
| 403 | 403 |
| 404 return CrxInstallError(); | 404 return CrxInstallError(); |
| 405 } | 405 } |
| 406 | 406 |
| 407 void CrxInstaller::OnUnpackFailure(const CrxInstallError& error) { | 407 void CrxInstaller::OnUnpackFailure(const CrxInstallError& error) { |
| 408 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); | 408 DCHECK(installer_task_runner_->RunsTasksInCurrentSequence()); |
| 409 | 409 |
| 410 UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackFailureInstallSource", | 410 UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackFailureInstallSource", |
| 411 install_source(), Manifest::NUM_LOCATIONS); | 411 install_source(), Manifest::NUM_LOCATIONS); |
| 412 | 412 |
| 413 UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackFailureInstallCause", | 413 UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackFailureInstallCause", |
| 414 install_cause(), | 414 install_cause(), |
| 415 extension_misc::NUM_INSTALL_CAUSES); | 415 extension_misc::NUM_INSTALL_CAUSES); |
| 416 | 416 |
| 417 ReportFailureFromFileThread(error); | 417 ReportFailureFromFileThread(error); |
| 418 } | 418 } |
| 419 | 419 |
| 420 void CrxInstaller::OnUnpackSuccess( | 420 void CrxInstaller::OnUnpackSuccess( |
| 421 const base::FilePath& temp_dir, | 421 const base::FilePath& temp_dir, |
| 422 const base::FilePath& extension_dir, | 422 const base::FilePath& extension_dir, |
| 423 std::unique_ptr<base::DictionaryValue> original_manifest, | 423 std::unique_ptr<base::DictionaryValue> original_manifest, |
| 424 const Extension* extension, | 424 const Extension* extension, |
| 425 const SkBitmap& install_icon) { | 425 const SkBitmap& install_icon) { |
| 426 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); | 426 DCHECK(installer_task_runner_->RunsTasksInCurrentSequence()); |
| 427 | 427 |
| 428 UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackSuccessInstallSource", | 428 UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackSuccessInstallSource", |
| 429 install_source(), Manifest::NUM_LOCATIONS); | 429 install_source(), Manifest::NUM_LOCATIONS); |
| 430 | 430 |
| 431 | 431 |
| 432 UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackSuccessInstallCause", | 432 UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackSuccessInstallCause", |
| 433 install_cause(), | 433 install_cause(), |
| 434 extension_misc::NUM_INSTALL_CAUSES); | 434 extension_misc::NUM_INSTALL_CAUSES); |
| 435 | 435 |
| 436 extension_ = extension; | 436 extension_ = extension; |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 if (ExtensionPrefs::Get(profile())->AllowFileAccess(extension()->id())) | 681 if (ExtensionPrefs::Get(profile())->AllowFileAccess(extension()->id())) |
| 682 creation_flags_ |= Extension::ALLOW_FILE_ACCESS; | 682 creation_flags_ |= Extension::ALLOW_FILE_ACCESS; |
| 683 | 683 |
| 684 if (!installer_task_runner_->PostTask( | 684 if (!installer_task_runner_->PostTask( |
| 685 FROM_HERE, base::BindOnce(&CrxInstaller::CompleteInstall, this))) { | 685 FROM_HERE, base::BindOnce(&CrxInstaller::CompleteInstall, this))) { |
| 686 NOTREACHED(); | 686 NOTREACHED(); |
| 687 } | 687 } |
| 688 } | 688 } |
| 689 | 689 |
| 690 void CrxInstaller::CompleteInstall() { | 690 void CrxInstaller::CompleteInstall() { |
| 691 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); | 691 DCHECK(installer_task_runner_->RunsTasksInCurrentSequence()); |
| 692 | 692 |
| 693 if (current_version_.IsValid() && | 693 if (current_version_.IsValid() && |
| 694 current_version_.CompareTo(*(extension()->version())) > 0) { | 694 current_version_.CompareTo(*(extension()->version())) > 0) { |
| 695 ReportFailureFromFileThread(CrxInstallError( | 695 ReportFailureFromFileThread(CrxInstallError( |
| 696 CrxInstallError::ERROR_DECLINED, | 696 CrxInstallError::ERROR_DECLINED, |
| 697 l10n_util::GetStringUTF16( | 697 l10n_util::GetStringUTF16( |
| 698 extension()->is_app() ? IDS_APP_CANT_DOWNGRADE_VERSION | 698 extension()->is_app() ? IDS_APP_CANT_DOWNGRADE_VERSION |
| 699 : IDS_EXTENSION_CANT_DOWNGRADE_VERSION))); | 699 : IDS_EXTENSION_CANT_DOWNGRADE_VERSION))); |
| 700 return; | 700 return; |
| 701 } | 701 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 712 assets_manager->InstallExtension( | 712 assets_manager->InstallExtension( |
| 713 extension(), | 713 extension(), |
| 714 unpacked_extension_root_, | 714 unpacked_extension_root_, |
| 715 install_directory_, | 715 install_directory_, |
| 716 profile(), | 716 profile(), |
| 717 base::Bind(&CrxInstaller::ReloadExtensionAfterInstall, this)); | 717 base::Bind(&CrxInstaller::ReloadExtensionAfterInstall, this)); |
| 718 } | 718 } |
| 719 | 719 |
| 720 void CrxInstaller::ReloadExtensionAfterInstall( | 720 void CrxInstaller::ReloadExtensionAfterInstall( |
| 721 const base::FilePath& version_dir) { | 721 const base::FilePath& version_dir) { |
| 722 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); | 722 DCHECK(installer_task_runner_->RunsTasksInCurrentSequence()); |
| 723 | 723 |
| 724 if (version_dir.empty()) { | 724 if (version_dir.empty()) { |
| 725 ReportFailureFromFileThread(CrxInstallError(l10n_util::GetStringUTF16( | 725 ReportFailureFromFileThread(CrxInstallError(l10n_util::GetStringUTF16( |
| 726 IDS_EXTENSION_MOVE_DIRECTORY_TO_PROFILE_FAILED))); | 726 IDS_EXTENSION_MOVE_DIRECTORY_TO_PROFILE_FAILED))); |
| 727 return; | 727 return; |
| 728 } | 728 } |
| 729 | 729 |
| 730 // This is lame, but we must reload the extension because absolute paths | 730 // This is lame, but we must reload the extension because absolute paths |
| 731 // inside the content scripts are established inside InitFromValue() and we | 731 // inside the content scripts are established inside InitFromValue() and we |
| 732 // just moved the extension. | 732 // just moved the extension. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 743 | 743 |
| 744 if (extension()) { | 744 if (extension()) { |
| 745 ReportSuccessFromFileThread(); | 745 ReportSuccessFromFileThread(); |
| 746 } else { | 746 } else { |
| 747 LOG(ERROR) << error << " " << extension_id << " " << download_url_; | 747 LOG(ERROR) << error << " " << extension_id << " " << download_url_; |
| 748 ReportFailureFromFileThread(CrxInstallError(base::UTF8ToUTF16(error))); | 748 ReportFailureFromFileThread(CrxInstallError(base::UTF8ToUTF16(error))); |
| 749 } | 749 } |
| 750 } | 750 } |
| 751 | 751 |
| 752 void CrxInstaller::ReportFailureFromFileThread(const CrxInstallError& error) { | 752 void CrxInstaller::ReportFailureFromFileThread(const CrxInstallError& error) { |
| 753 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); | 753 DCHECK(installer_task_runner_->RunsTasksInCurrentSequence()); |
| 754 if (!BrowserThread::PostTask( | 754 if (!BrowserThread::PostTask( |
| 755 BrowserThread::UI, FROM_HERE, | 755 BrowserThread::UI, FROM_HERE, |
| 756 base::BindOnce(&CrxInstaller::ReportFailureFromUIThread, this, | 756 base::BindOnce(&CrxInstaller::ReportFailureFromUIThread, this, |
| 757 error))) { | 757 error))) { |
| 758 NOTREACHED(); | 758 NOTREACHED(); |
| 759 } | 759 } |
| 760 } | 760 } |
| 761 | 761 |
| 762 void CrxInstaller::ReportFailureFromUIThread(const CrxInstallError& error) { | 762 void CrxInstaller::ReportFailureFromUIThread(const CrxInstallError& error) { |
| 763 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 763 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 783 if (client_) | 783 if (client_) |
| 784 client_->OnInstallFailure(error); | 784 client_->OnInstallFailure(error); |
| 785 | 785 |
| 786 NotifyCrxInstallComplete(false); | 786 NotifyCrxInstallComplete(false); |
| 787 | 787 |
| 788 // Delete temporary files. | 788 // Delete temporary files. |
| 789 CleanupTempFiles(); | 789 CleanupTempFiles(); |
| 790 } | 790 } |
| 791 | 791 |
| 792 void CrxInstaller::ReportSuccessFromFileThread() { | 792 void CrxInstaller::ReportSuccessFromFileThread() { |
| 793 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); | 793 DCHECK(installer_task_runner_->RunsTasksInCurrentSequence()); |
| 794 | 794 |
| 795 // Tracking number of extensions installed by users | 795 // Tracking number of extensions installed by users |
| 796 if (install_cause() == extension_misc::INSTALL_CAUSE_USER_DOWNLOAD) | 796 if (install_cause() == extension_misc::INSTALL_CAUSE_USER_DOWNLOAD) |
| 797 UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionInstalled", 1, 2); | 797 UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionInstalled", 1, 2); |
| 798 | 798 |
| 799 if (!BrowserThread::PostTask( | 799 if (!BrowserThread::PostTask( |
| 800 BrowserThread::UI, FROM_HERE, | 800 BrowserThread::UI, FROM_HERE, |
| 801 base::BindOnce(&CrxInstaller::ReportSuccessFromUIThread, this))) | 801 base::BindOnce(&CrxInstaller::ReportSuccessFromUIThread, this))) |
| 802 NOTREACHED(); | 802 NOTREACHED(); |
| 803 | 803 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 852 content::Details<const Extension>(success ? extension() : NULL)); | 852 content::Details<const Extension>(success ? extension() : NULL)); |
| 853 | 853 |
| 854 InstallTrackerFactory::GetForBrowserContext(profile()) | 854 InstallTrackerFactory::GetForBrowserContext(profile()) |
| 855 ->OnFinishCrxInstall(success ? extension()->id() : expected_id_, success); | 855 ->OnFinishCrxInstall(success ? extension()->id() : expected_id_, success); |
| 856 | 856 |
| 857 if (success) | 857 if (success) |
| 858 ConfirmReEnable(); | 858 ConfirmReEnable(); |
| 859 } | 859 } |
| 860 | 860 |
| 861 void CrxInstaller::CleanupTempFiles() { | 861 void CrxInstaller::CleanupTempFiles() { |
| 862 if (!installer_task_runner_->RunsTasksOnCurrentThread()) { | 862 if (!installer_task_runner_->RunsTasksInCurrentSequence()) { |
| 863 if (!installer_task_runner_->PostTask( | 863 if (!installer_task_runner_->PostTask( |
| 864 FROM_HERE, base::BindOnce(&CrxInstaller::CleanupTempFiles, this))) { | 864 FROM_HERE, base::BindOnce(&CrxInstaller::CleanupTempFiles, this))) { |
| 865 NOTREACHED(); | 865 NOTREACHED(); |
| 866 } | 866 } |
| 867 return; | 867 return; |
| 868 } | 868 } |
| 869 | 869 |
| 870 // Delete the temp directory and crx file as necessary. | 870 // Delete the temp directory and crx file as necessary. |
| 871 if (!temp_dir_.value().empty()) { | 871 if (!temp_dir_.value().empty()) { |
| 872 file_util::DeleteFile(temp_dir_, true); | 872 file_util::DeleteFile(temp_dir_, true); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 920 ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( | 920 ExtensionInstallPrompt::GetReEnablePromptTypeForExtension( |
| 921 service->profile(), extension()); | 921 service->profile(), extension()); |
| 922 client_->ShowDialog(base::Bind(&CrxInstaller::OnInstallPromptDone, this), | 922 client_->ShowDialog(base::Bind(&CrxInstaller::OnInstallPromptDone, this), |
| 923 extension(), nullptr, | 923 extension(), nullptr, |
| 924 base::MakeUnique<ExtensionInstallPrompt::Prompt>(type), | 924 base::MakeUnique<ExtensionInstallPrompt::Prompt>(type), |
| 925 ExtensionInstallPrompt::GetDefaultShowDialogCallback()); | 925 ExtensionInstallPrompt::GetDefaultShowDialogCallback()); |
| 926 } | 926 } |
| 927 } | 927 } |
| 928 | 928 |
| 929 } // namespace extensions | 929 } // namespace extensions |
| OLD | NEW |