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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 | 180 |
181 NotifyCrxInstallBegin(); | 181 NotifyCrxInstallBegin(); |
182 | 182 |
183 source_file_ = source_file.path; | 183 source_file_ = source_file.path; |
184 | 184 |
185 scoped_refptr<SandboxedUnpacker> unpacker(new SandboxedUnpacker( | 185 scoped_refptr<SandboxedUnpacker> unpacker(new SandboxedUnpacker( |
186 install_source_, creation_flags_, install_directory_, | 186 install_source_, creation_flags_, install_directory_, |
187 installer_task_runner_.get(), this)); | 187 installer_task_runner_.get(), this)); |
188 | 188 |
189 if (!installer_task_runner_->PostTask( | 189 if (!installer_task_runner_->PostTask( |
190 FROM_HERE, base::Bind(&SandboxedUnpacker::StartWithCrx, | 190 FROM_HERE, base::BindOnce(&SandboxedUnpacker::StartWithCrx, unpacker, |
191 unpacker, source_file))) { | 191 source_file))) { |
192 NOTREACHED(); | 192 NOTREACHED(); |
193 } | 193 } |
194 } | 194 } |
195 | 195 |
196 void CrxInstaller::InstallUserScript(const base::FilePath& source_file, | 196 void CrxInstaller::InstallUserScript(const base::FilePath& source_file, |
197 const GURL& download_url) { | 197 const GURL& download_url) { |
198 DCHECK(!download_url.is_empty()); | 198 DCHECK(!download_url.is_empty()); |
199 | 199 |
200 NotifyCrxInstallBegin(); | 200 NotifyCrxInstallBegin(); |
201 | 201 |
202 source_file_ = source_file; | 202 source_file_ = source_file; |
203 download_url_ = download_url; | 203 download_url_ = download_url; |
204 | 204 |
205 if (!installer_task_runner_->PostTask( | 205 if (!installer_task_runner_->PostTask( |
206 FROM_HERE, | 206 FROM_HERE, |
207 base::Bind(&CrxInstaller::ConvertUserScriptOnFileThread, this))) | 207 base::BindOnce(&CrxInstaller::ConvertUserScriptOnFileThread, this))) |
208 NOTREACHED(); | 208 NOTREACHED(); |
209 } | 209 } |
210 | 210 |
211 void CrxInstaller::ConvertUserScriptOnFileThread() { | 211 void CrxInstaller::ConvertUserScriptOnFileThread() { |
212 base::string16 error; | 212 base::string16 error; |
213 scoped_refptr<Extension> extension = ConvertUserScriptToExtension( | 213 scoped_refptr<Extension> extension = ConvertUserScriptToExtension( |
214 source_file_, download_url_, install_directory_, &error); | 214 source_file_, download_url_, install_directory_, &error); |
215 if (!extension.get()) { | 215 if (!extension.get()) { |
216 ReportFailureFromFileThread(CrxInstallError(error)); | 216 ReportFailureFromFileThread(CrxInstallError(error)); |
217 return; | 217 return; |
218 } | 218 } |
219 | 219 |
220 OnUnpackSuccess(extension->path(), extension->path(), nullptr, | 220 OnUnpackSuccess(extension->path(), extension->path(), nullptr, |
221 extension.get(), SkBitmap()); | 221 extension.get(), SkBitmap()); |
222 } | 222 } |
223 | 223 |
224 void CrxInstaller::InstallWebApp(const WebApplicationInfo& web_app) { | 224 void CrxInstaller::InstallWebApp(const WebApplicationInfo& web_app) { |
225 NotifyCrxInstallBegin(); | 225 NotifyCrxInstallBegin(); |
226 | 226 |
227 if (!installer_task_runner_->PostTask( | 227 if (!installer_task_runner_->PostTask( |
228 FROM_HERE, | 228 FROM_HERE, base::BindOnce(&CrxInstaller::ConvertWebAppOnFileThread, |
229 base::Bind(&CrxInstaller::ConvertWebAppOnFileThread, this, web_app))) | 229 this, web_app))) |
230 NOTREACHED(); | 230 NOTREACHED(); |
231 } | 231 } |
232 | 232 |
233 void CrxInstaller::ConvertWebAppOnFileThread( | 233 void CrxInstaller::ConvertWebAppOnFileThread( |
234 const WebApplicationInfo& web_app) { | 234 const WebApplicationInfo& web_app) { |
235 scoped_refptr<Extension> extension(ConvertWebAppToExtension( | 235 scoped_refptr<Extension> extension(ConvertWebAppToExtension( |
236 web_app, base::Time::Now(), install_directory_)); | 236 web_app, base::Time::Now(), install_directory_)); |
237 if (!extension.get()) { | 237 if (!extension.get()) { |
238 // Validation should have stopped any potential errors before getting here. | 238 // Validation should have stopped any potential errors before getting here. |
239 NOTREACHED() << "Could not convert web app to extension."; | 239 NOTREACHED() << "Could not convert web app to extension."; |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 // We don't have to delete the unpack dir explicity since it is a child of | 446 // We don't have to delete the unpack dir explicity since it is a child of |
447 // the temp dir. | 447 // the temp dir. |
448 unpacked_extension_root_ = extension_dir; | 448 unpacked_extension_root_ = extension_dir; |
449 | 449 |
450 CrxInstallError error = AllowInstall(extension); | 450 CrxInstallError error = AllowInstall(extension); |
451 if (error.type() != CrxInstallError::ERROR_NONE) { | 451 if (error.type() != CrxInstallError::ERROR_NONE) { |
452 ReportFailureFromFileThread(error); | 452 ReportFailureFromFileThread(error); |
453 return; | 453 return; |
454 } | 454 } |
455 | 455 |
456 if (!BrowserThread::PostTask(BrowserThread::UI, | 456 if (!BrowserThread::PostTask( |
457 FROM_HERE, | 457 BrowserThread::UI, FROM_HERE, |
458 base::Bind(&CrxInstaller::CheckInstall, this))) | 458 base::BindOnce(&CrxInstaller::CheckInstall, this))) |
459 NOTREACHED(); | 459 NOTREACHED(); |
460 } | 460 } |
461 | 461 |
462 void CrxInstaller::CheckInstall() { | 462 void CrxInstaller::CheckInstall() { |
463 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 463 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
464 ExtensionService* service = service_weak_.get(); | 464 ExtensionService* service = service_weak_.get(); |
465 if (!service || service->browser_terminating()) | 465 if (!service || service->browser_terminating()) |
466 return; | 466 return; |
467 | 467 |
468 // TODO(crbug.com/420147): Move this code to a utility class to avoid | 468 // TODO(crbug.com/420147): Move this code to a utility class to avoid |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 } | 675 } |
676 | 676 |
677 void CrxInstaller::UpdateCreationFlagsAndCompleteInstall() { | 677 void CrxInstaller::UpdateCreationFlagsAndCompleteInstall() { |
678 creation_flags_ = extension()->creation_flags() | Extension::REQUIRE_KEY; | 678 creation_flags_ = extension()->creation_flags() | Extension::REQUIRE_KEY; |
679 // If the extension was already installed and had file access, also grant file | 679 // If the extension was already installed and had file access, also grant file |
680 // access to the updated extension. | 680 // access to the updated extension. |
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::Bind(&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_->RunsTasksOnCurrentThread()); |
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( |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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_->RunsTasksOnCurrentThread()); |
754 if (!BrowserThread::PostTask( | 754 if (!BrowserThread::PostTask( |
755 BrowserThread::UI, FROM_HERE, | 755 BrowserThread::UI, FROM_HERE, |
756 base::Bind(&CrxInstaller::ReportFailureFromUIThread, this, error))) { | 756 base::BindOnce(&CrxInstaller::ReportFailureFromUIThread, this, |
| 757 error))) { |
757 NOTREACHED(); | 758 NOTREACHED(); |
758 } | 759 } |
759 } | 760 } |
760 | 761 |
761 void CrxInstaller::ReportFailureFromUIThread(const CrxInstallError& error) { | 762 void CrxInstaller::ReportFailureFromUIThread(const CrxInstallError& error) { |
762 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 763 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
763 | 764 |
764 if (!service_weak_.get() || service_weak_->browser_terminating()) | 765 if (!service_weak_.get() || service_weak_->browser_terminating()) |
765 return; | 766 return; |
766 | 767 |
(...skipping 23 matching lines...) Expand all Loading... |
790 | 791 |
791 void CrxInstaller::ReportSuccessFromFileThread() { | 792 void CrxInstaller::ReportSuccessFromFileThread() { |
792 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); | 793 DCHECK(installer_task_runner_->RunsTasksOnCurrentThread()); |
793 | 794 |
794 // Tracking number of extensions installed by users | 795 // Tracking number of extensions installed by users |
795 if (install_cause() == extension_misc::INSTALL_CAUSE_USER_DOWNLOAD) | 796 if (install_cause() == extension_misc::INSTALL_CAUSE_USER_DOWNLOAD) |
796 UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionInstalled", 1, 2); | 797 UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionInstalled", 1, 2); |
797 | 798 |
798 if (!BrowserThread::PostTask( | 799 if (!BrowserThread::PostTask( |
799 BrowserThread::UI, FROM_HERE, | 800 BrowserThread::UI, FROM_HERE, |
800 base::Bind(&CrxInstaller::ReportSuccessFromUIThread, this))) | 801 base::BindOnce(&CrxInstaller::ReportSuccessFromUIThread, this))) |
801 NOTREACHED(); | 802 NOTREACHED(); |
802 | 803 |
803 // Delete temporary files. | 804 // Delete temporary files. |
804 CleanupTempFiles(); | 805 CleanupTempFiles(); |
805 } | 806 } |
806 | 807 |
807 void CrxInstaller::ReportSuccessFromUIThread() { | 808 void CrxInstaller::ReportSuccessFromUIThread() { |
808 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 809 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
809 | 810 |
810 if (!service_weak_.get() || service_weak_->browser_terminating()) | 811 if (!service_weak_.get() || service_weak_->browser_terminating()) |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
853 InstallTrackerFactory::GetForBrowserContext(profile()) | 854 InstallTrackerFactory::GetForBrowserContext(profile()) |
854 ->OnFinishCrxInstall(success ? extension()->id() : expected_id_, success); | 855 ->OnFinishCrxInstall(success ? extension()->id() : expected_id_, success); |
855 | 856 |
856 if (success) | 857 if (success) |
857 ConfirmReEnable(); | 858 ConfirmReEnable(); |
858 } | 859 } |
859 | 860 |
860 void CrxInstaller::CleanupTempFiles() { | 861 void CrxInstaller::CleanupTempFiles() { |
861 if (!installer_task_runner_->RunsTasksOnCurrentThread()) { | 862 if (!installer_task_runner_->RunsTasksOnCurrentThread()) { |
862 if (!installer_task_runner_->PostTask( | 863 if (!installer_task_runner_->PostTask( |
863 FROM_HERE, | 864 FROM_HERE, base::BindOnce(&CrxInstaller::CleanupTempFiles, this))) { |
864 base::Bind(&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); |
873 temp_dir_ = base::FilePath(); | 873 temp_dir_ = base::FilePath(); |
874 } | 874 } |
(...skipping 45 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 |