OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/scoped_temp_dir.h" | 9 #include "base/scoped_temp_dir.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
11 #include "base/task.h" | 11 #include "base/task.h" |
12 #include "chrome/browser/browser_process.h" | 12 #include "chrome/browser/browser_process.h" |
13 #include "chrome/browser/chrome_thread.h" | 13 #include "chrome/browser/chrome_thread.h" |
| 14 #include "chrome/browser/extensions/convert_user_script.h" |
14 #include "chrome/browser/extensions/extension_file_util.h" | 15 #include "chrome/browser/extensions/extension_file_util.h" |
15 #include "chrome/common/extensions/extension_error_reporter.h" | 16 #include "chrome/common/extensions/extension_error_reporter.h" |
16 #include "chrome/common/notification_service.h" | 17 #include "chrome/common/notification_service.h" |
17 #include "chrome/common/notification_type.h" | 18 #include "chrome/common/notification_type.h" |
18 #include "grit/chromium_strings.h" | 19 #include "grit/chromium_strings.h" |
19 #include "third_party/skia/include/core/SkBitmap.h" | 20 #include "third_party/skia/include/core/SkBitmap.h" |
20 #include "webkit/glue/image_decoder.h" | 21 #include "webkit/glue/image_decoder.h" |
21 | 22 |
22 namespace { | 23 namespace { |
23 // Helper function to delete files. This is used to avoid ugly casts which | 24 // Helper function to delete files. This is used to avoid ugly casts which |
24 // would be necessary with PostMessage since file_util::Delete is overloaded. | 25 // would be necessary with PostMessage since file_util::Delete is overloaded. |
25 static void DeleteFileHelper(const FilePath& path, bool recursive) { | 26 static void DeleteFileHelper(const FilePath& path, bool recursive) { |
26 file_util::Delete(path, recursive); | 27 file_util::Delete(path, recursive); |
27 } | 28 } |
28 } | 29 } |
29 | 30 |
30 void CrxInstaller::Start(const FilePath& crx_path, | 31 void CrxInstaller::Start(const FilePath& crx_path, |
31 const FilePath& install_directory, | 32 const FilePath& install_directory, |
32 Extension::Location install_source, | 33 Extension::Location install_source, |
33 const std::string& expected_id, | 34 const std::string& expected_id, |
34 bool delete_crx, | 35 bool delete_source, |
35 bool allow_privilege_increase, | 36 bool allow_privilege_increase, |
36 ExtensionsService* frontend, | 37 ExtensionsService* frontend, |
37 ExtensionInstallUI* client) { | 38 ExtensionInstallUI* client) { |
38 // Note: We don't keep a reference because this object manages its own | 39 // Note: We don't keep a reference because this object manages its own |
39 // lifetime. | 40 // lifetime. |
40 new CrxInstaller(crx_path, install_directory, install_source, expected_id, | 41 CrxInstaller* installer = new CrxInstaller(crx_path, install_directory, |
41 delete_crx, allow_privilege_increase, frontend, client); | 42 delete_source, frontend, |
42 } | 43 client); |
| 44 installer->install_source_ = install_source; |
| 45 installer->expected_id_ = expected_id; |
| 46 installer->allow_privilege_increase_ = allow_privilege_increase; |
43 | 47 |
44 CrxInstaller::CrxInstaller(const FilePath& crx_path, | 48 installer->unpacker_ = new SandboxedExtensionUnpacker( |
45 const FilePath& install_directory, | 49 installer->source_file_, g_browser_process->resource_dispatcher_host(), |
46 Extension::Location install_source, | 50 installer); |
47 const std::string& expected_id, | |
48 bool delete_crx, | |
49 bool allow_privilege_increase, | |
50 ExtensionsService* frontend, | |
51 ExtensionInstallUI* client) | |
52 : crx_path_(crx_path), | |
53 install_directory_(install_directory), | |
54 install_source_(install_source), | |
55 expected_id_(expected_id), | |
56 delete_crx_(delete_crx), | |
57 allow_privilege_increase_(allow_privilege_increase), | |
58 frontend_(frontend), | |
59 client_(client) { | |
60 | |
61 extensions_enabled_ = frontend_->extensions_enabled(); | |
62 | |
63 unpacker_ = new SandboxedExtensionUnpacker( | |
64 crx_path, g_browser_process->resource_dispatcher_host(), this); | |
65 | 51 |
66 ChromeThread::PostTask( | 52 ChromeThread::PostTask( |
67 ChromeThread::FILE, FROM_HERE, | 53 ChromeThread::FILE, FROM_HERE, |
68 NewRunnableMethod(unpacker_, &SandboxedExtensionUnpacker::Start)); | 54 NewRunnableMethod(installer->unpacker_, &SandboxedExtensionUnpacker::Start
)); |
| 55 } |
| 56 |
| 57 void CrxInstaller::InstallUserScript(const FilePath& source_file, |
| 58 const GURL& original_url, |
| 59 const FilePath& install_directory, |
| 60 bool delete_source, |
| 61 ExtensionsService* frontend, |
| 62 ExtensionInstallUI* client) { |
| 63 CrxInstaller* installer = new CrxInstaller(source_file, install_directory, |
| 64 delete_source, frontend, client); |
| 65 installer->original_url_ = original_url; |
| 66 |
| 67 ChromeThread::PostTask( |
| 68 ChromeThread::FILE, FROM_HERE, |
| 69 NewRunnableMethod(installer, &CrxInstaller::ConvertUserScriptOnFileThread)
); |
| 70 } |
| 71 |
| 72 CrxInstaller::CrxInstaller(const FilePath& source_file, |
| 73 const FilePath& install_directory, |
| 74 bool delete_source, |
| 75 ExtensionsService* frontend, |
| 76 ExtensionInstallUI* client) |
| 77 : source_file_(source_file), |
| 78 install_directory_(install_directory), |
| 79 install_source_(Extension::INTERNAL), |
| 80 delete_source_(delete_source), |
| 81 allow_privilege_increase_(false), |
| 82 frontend_(frontend), |
| 83 client_(client) { |
| 84 extensions_enabled_ = frontend_->extensions_enabled(); |
69 } | 85 } |
70 | 86 |
71 CrxInstaller::~CrxInstaller() { | 87 CrxInstaller::~CrxInstaller() { |
72 // Delete the temp directory and crx file as necessary. Note that the | 88 // Delete the temp directory and crx file as necessary. Note that the |
73 // destructor might be called on any thread, so we post a task to the file | 89 // destructor might be called on any thread, so we post a task to the file |
74 // thread to make sure the delete happens there. | 90 // thread to make sure the delete happens there. |
75 if (!temp_dir_.value().empty()) { | 91 if (!temp_dir_.value().empty()) { |
76 ChromeThread::PostTask( | 92 ChromeThread::PostTask( |
77 ChromeThread::FILE, FROM_HERE, | 93 ChromeThread::FILE, FROM_HERE, |
78 NewRunnableFunction(&DeleteFileHelper, temp_dir_, true)); | 94 NewRunnableFunction(&DeleteFileHelper, temp_dir_, true)); |
79 } | 95 } |
80 | 96 |
81 if (delete_crx_) { | 97 if (delete_source_) { |
82 ChromeThread::PostTask( | 98 ChromeThread::PostTask( |
83 ChromeThread::FILE, FROM_HERE, | 99 ChromeThread::FILE, FROM_HERE, |
84 NewRunnableFunction(&DeleteFileHelper, crx_path_, false)); | 100 NewRunnableFunction(&DeleteFileHelper, source_file_, false)); |
85 } | 101 } |
86 } | 102 } |
87 | 103 |
| 104 void CrxInstaller::ConvertUserScriptOnFileThread() { |
| 105 std::string error; |
| 106 Extension* extension = ConvertUserScriptToExtension(source_file_, |
| 107 original_url_, &error); |
| 108 if (!extension) { |
| 109 ReportFailureFromFileThread(error); |
| 110 return; |
| 111 } |
| 112 |
| 113 OnUnpackSuccess(extension->path(), extension->path(), extension); |
| 114 } |
| 115 |
88 void CrxInstaller::OnUnpackFailure(const std::string& error_message) { | 116 void CrxInstaller::OnUnpackFailure(const std::string& error_message) { |
89 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | 117 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
90 ReportFailureFromFileThread(error_message); | 118 ReportFailureFromFileThread(error_message); |
91 } | 119 } |
92 | 120 |
93 void CrxInstaller::OnUnpackSuccess(const FilePath& temp_dir, | 121 void CrxInstaller::OnUnpackSuccess(const FilePath& temp_dir, |
94 const FilePath& extension_dir, | 122 const FilePath& extension_dir, |
95 Extension* extension) { | 123 Extension* extension) { |
96 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); | 124 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
97 | 125 |
98 // Note: We take ownership of |extension| and |temp_dir|. | 126 // Note: We take ownership of |extension| and |temp_dir|. |
99 extension_.reset(extension); | 127 extension_.reset(extension); |
100 temp_dir_ = temp_dir; | 128 temp_dir_ = temp_dir; |
101 | 129 |
102 // The unpack dir we don't have to delete explicity since it is a child of | 130 // The unpack dir we don't have to delete explicity since it is a child of |
103 // the temp dir. | 131 // the temp dir. |
104 unpacked_extension_root_ = extension_dir; | 132 unpacked_extension_root_ = extension_dir; |
105 DCHECK(file_util::ContainsPath(temp_dir_, unpacked_extension_root_)); | |
106 | 133 |
107 // Determine whether to allow installation. We always allow themes and | 134 // Determine whether to allow installation. We always allow themes and |
108 // external installs. | 135 // external installs. |
109 if (!extensions_enabled_ && !extension->IsTheme() && | 136 if (!extensions_enabled_ && !extension->IsTheme() && |
110 !Extension::IsExternalLocation(install_source_)) { | 137 !Extension::IsExternalLocation(install_source_)) { |
111 ReportFailureFromFileThread("Extensions are not enabled."); | 138 ReportFailureFromFileThread("Extensions are not enabled."); |
112 return; | 139 return; |
113 } | 140 } |
114 | 141 |
115 // Make sure the expected id matches. | 142 // Make sure the expected id matches. |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 client_->OnInstallSuccess(extension_.get()); | 342 client_->OnInstallSuccess(extension_.get()); |
316 | 343 |
317 // Tell the frontend about the installation and hand off ownership of | 344 // Tell the frontend about the installation and hand off ownership of |
318 // extension_ to it. | 345 // extension_ to it. |
319 frontend_->OnExtensionInstalled(extension_.release(), | 346 frontend_->OnExtensionInstalled(extension_.release(), |
320 allow_privilege_increase_); | 347 allow_privilege_increase_); |
321 | 348 |
322 // We're done. We don't post any more tasks to ourselves so we are deleted | 349 // We're done. We don't post any more tasks to ourselves so we are deleted |
323 // soon. | 350 // soon. |
324 } | 351 } |
OLD | NEW |