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/utility/extensions/unpacker.h" | 5 #include "chrome/utility/extensions/unpacker.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/file_enumerator.h" | 10 #include "base/files/file_enumerator.h" |
11 #include "base/files/scoped_temp_dir.h" | 11 #include "base/files/scoped_temp_dir.h" |
12 #include "base/i18n/rtl.h" | 12 #include "base/i18n/rtl.h" |
13 #include "base/json/json_file_value_serializer.h" | 13 #include "base/json/json_file_value_serializer.h" |
14 #include "base/memory/scoped_handle.h" | 14 #include "base/memory/scoped_handle.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
17 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
18 #include "base/values.h" | 18 #include "base/values.h" |
19 #include "chrome/common/chrome_utility_messages.h" | 19 #include "chrome/common/chrome_utility_messages.h" |
20 #include "chrome/common/extensions/api/i18n/default_locale_handler.h" | 20 #include "chrome/common/extensions/api/i18n/default_locale_handler.h" |
21 #include "chrome/common/extensions/extension.h" | 21 #include "chrome/common/extensions/extension.h" |
22 #include "chrome/common/extensions/extension_file_util.h" | 22 #include "chrome/common/extensions/extension_file_util.h" |
23 #include "chrome/common/extensions/extension_l10n_util.h" | 23 #include "chrome/common/extensions/extension_l10n_util.h" |
24 #include "chrome/common/extensions/extension_manifest_constants.h" | 24 #include "chrome/common/extensions/extension_manifest_constants.h" |
25 #include "chrome/common/extensions/manifest.h" | 25 #include "chrome/common/extensions/manifest.h" |
26 #include "chrome/common/url_constants.h" | |
27 #include "content/public/child/image_decoder_utils.h" | 26 #include "content/public/child/image_decoder_utils.h" |
28 #include "content/public/common/common_param_traits.h" | 27 #include "content/public/common/common_param_traits.h" |
29 #include "extensions/common/constants.h" | 28 #include "extensions/common/constants.h" |
30 #include "grit/generated_resources.h" | 29 #include "grit/generated_resources.h" |
31 #include "ipc/ipc_message_utils.h" | 30 #include "ipc/ipc_message_utils.h" |
32 #include "net/base/file_stream.h" | 31 #include "net/base/file_stream.h" |
33 #include "third_party/skia/include/core/SkBitmap.h" | 32 #include "third_party/skia/include/core/SkBitmap.h" |
34 #include "third_party/zlib/google/zip.h" | 33 #include "third_party/zlib/google/zip.h" |
35 #include "ui/base/l10n/l10n_util.h" | 34 #include "ui/base/l10n/l10n_util.h" |
36 #include "ui/gfx/size.h" | 35 #include "ui/gfx/size.h" |
37 | 36 |
38 namespace errors = extension_manifest_errors; | 37 namespace errors = extension_manifest_errors; |
39 namespace keys = extension_manifest_keys; | 38 namespace keys = extension_manifest_keys; |
40 namespace filenames = extension_filenames; | |
41 | 39 |
42 namespace { | 40 namespace { |
43 | 41 |
44 // A limit to stop us passing dangerously large canvases to the browser. | 42 // A limit to stop us passing dangerously large canvases to the browser. |
45 const int kMaxImageCanvas = 4096 * 4096; | 43 const int kMaxImageCanvas = 4096 * 4096; |
46 | 44 |
47 SkBitmap DecodeImage(const base::FilePath& path) { | 45 SkBitmap DecodeImage(const base::FilePath& path) { |
48 // Read the file from disk. | 46 // Read the file from disk. |
49 std::string file_contents; | 47 std::string file_contents; |
50 if (!base::PathExists(path) || | 48 if (!base::PathExists(path) || |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 } | 153 } |
156 | 154 |
157 return true; | 155 return true; |
158 } | 156 } |
159 | 157 |
160 bool Unpacker::Run() { | 158 bool Unpacker::Run() { |
161 DVLOG(1) << "Installing extension " << extension_path_.value(); | 159 DVLOG(1) << "Installing extension " << extension_path_.value(); |
162 | 160 |
163 // <profile>/Extensions/CRX_INSTALL | 161 // <profile>/Extensions/CRX_INSTALL |
164 temp_install_dir_ = | 162 temp_install_dir_ = |
165 extension_path_.DirName().AppendASCII(filenames::kTempExtensionName); | 163 extension_path_.DirName().AppendASCII(kTempExtensionName); |
166 | 164 |
167 if (!file_util::CreateDirectory(temp_install_dir_)) { | 165 if (!file_util::CreateDirectory(temp_install_dir_)) { |
168 SetUTF16Error( | 166 SetUTF16Error( |
169 l10n_util::GetStringFUTF16( | 167 l10n_util::GetStringFUTF16( |
170 IDS_EXTENSION_PACKAGE_DIRECTORY_ERROR, | 168 IDS_EXTENSION_PACKAGE_DIRECTORY_ERROR, |
171 base::i18n::GetDisplayStringInLTRDirectionality( | 169 base::i18n::GetDisplayStringInLTRDirectionality( |
172 temp_install_dir_.LossyDisplayName()))); | 170 temp_install_dir_.LossyDisplayName()))); |
173 return false; | 171 return false; |
174 } | 172 } |
175 | 173 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 } | 220 } |
223 | 221 |
224 return true; | 222 return true; |
225 } | 223 } |
226 | 224 |
227 bool Unpacker::DumpImagesToFile() { | 225 bool Unpacker::DumpImagesToFile() { |
228 IPC::Message pickle; // We use a Message so we can use WriteParam. | 226 IPC::Message pickle; // We use a Message so we can use WriteParam. |
229 IPC::WriteParam(&pickle, internal_data_->decoded_images); | 227 IPC::WriteParam(&pickle, internal_data_->decoded_images); |
230 | 228 |
231 base::FilePath path = extension_path_.DirName().AppendASCII( | 229 base::FilePath path = extension_path_.DirName().AppendASCII( |
232 filenames::kDecodedImagesFilename); | 230 kDecodedImagesFilename); |
233 if (!file_util::WriteFile(path, static_cast<const char*>(pickle.data()), | 231 if (!file_util::WriteFile(path, static_cast<const char*>(pickle.data()), |
234 pickle.size())) { | 232 pickle.size())) { |
235 SetError("Could not write image data to disk."); | 233 SetError("Could not write image data to disk."); |
236 return false; | 234 return false; |
237 } | 235 } |
238 | 236 |
239 return true; | 237 return true; |
240 } | 238 } |
241 | 239 |
242 bool Unpacker::DumpMessageCatalogsToFile() { | 240 bool Unpacker::DumpMessageCatalogsToFile() { |
243 IPC::Message pickle; | 241 IPC::Message pickle; |
244 IPC::WriteParam(&pickle, *parsed_catalogs_.get()); | 242 IPC::WriteParam(&pickle, *parsed_catalogs_.get()); |
245 | 243 |
246 base::FilePath path = extension_path_.DirName().AppendASCII( | 244 base::FilePath path = extension_path_.DirName().AppendASCII( |
247 filenames::kDecodedMessageCatalogsFilename); | 245 kDecodedMessageCatalogsFilename); |
248 if (!file_util::WriteFile(path, static_cast<const char*>(pickle.data()), | 246 if (!file_util::WriteFile(path, static_cast<const char*>(pickle.data()), |
249 pickle.size())) { | 247 pickle.size())) { |
250 SetError("Could not write message catalogs to disk."); | 248 SetError("Could not write message catalogs to disk."); |
251 return false; | 249 return false; |
252 } | 250 } |
253 | 251 |
254 return true; | 252 return true; |
255 } | 253 } |
256 | 254 |
257 bool Unpacker::AddDecodedImage(const base::FilePath& path) { | 255 bool Unpacker::AddDecodedImage(const base::FilePath& path) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 | 315 |
318 void Unpacker::SetError(const std::string &error) { | 316 void Unpacker::SetError(const std::string &error) { |
319 SetUTF16Error(UTF8ToUTF16(error)); | 317 SetUTF16Error(UTF8ToUTF16(error)); |
320 } | 318 } |
321 | 319 |
322 void Unpacker::SetUTF16Error(const string16 &error) { | 320 void Unpacker::SetUTF16Error(const string16 &error) { |
323 error_message_ = error; | 321 error_message_ = error; |
324 } | 322 } |
325 | 323 |
326 } // namespace extensions | 324 } // namespace extensions |
OLD | NEW |