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/sandboxed_extension_unpacker.h" | 5 #include "chrome/browser/extensions/sandboxed_extension_unpacker.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "app/gfx/codec/png_codec.h" | 9 #include "app/gfx/codec/png_codec.h" |
10 #include "base/crypto/signature_verifier.h" | 10 #include "base/crypto/signature_verifier.h" |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 } | 112 } |
113 | 113 |
114 FilePath manifest_path = | 114 FilePath manifest_path = |
115 extension_root_.AppendASCII(Extension::kManifestFilename); | 115 extension_root_.AppendASCII(Extension::kManifestFilename); |
116 if (!file_util::WriteFile(manifest_path, | 116 if (!file_util::WriteFile(manifest_path, |
117 manifest_json.data(), manifest_json.size())) { | 117 manifest_json.data(), manifest_json.size())) { |
118 ReportFailure("Error saving manifest.json."); | 118 ReportFailure("Error saving manifest.json."); |
119 return; | 119 return; |
120 } | 120 } |
121 | 121 |
122 // Delete any images that may be used by the browser. We're going to write | 122 // Create an extension object that refers to the temporary location the |
123 // out our own versions of the parsed images, and we want to make sure the | 123 // extension was unpacked to. We use this until the extension is finally |
124 // originals are gone for good. | 124 // installed. For example, the install UI shows images from inside the |
125 extension_.reset(new Extension); | 125 // extension. |
| 126 extension_.reset(new Extension(extension_root_)); |
| 127 |
126 std::string manifest_error; | 128 std::string manifest_error; |
127 | |
128 // Update the path to refer to the temporary location. We do this because | |
129 // clients may want to use resources inside the extension before it is | |
130 // installed and they need the correct path. For example, the install UI shows | |
131 // one of the icons from the extension. | |
132 extension_->set_path(extension_root_); | |
133 | |
134 if (!extension_->InitFromValue(*final_manifest, true, // require id | 129 if (!extension_->InitFromValue(*final_manifest, true, // require id |
135 &manifest_error)) { | 130 &manifest_error)) { |
136 ReportFailure(std::string("Manifest is invalid: ") + | 131 ReportFailure(std::string("Manifest is invalid: ") + |
137 manifest_error); | 132 manifest_error); |
138 return; | 133 return; |
139 } | 134 } |
140 | 135 |
| 136 // Delete any images that may be used by the browser. We're going to write |
| 137 // out our own versions of the parsed images, and we want to make sure the |
| 138 // originals are gone for good. |
141 std::set<FilePath> image_paths = extension_->GetBrowserImages(); | 139 std::set<FilePath> image_paths = extension_->GetBrowserImages(); |
142 if (image_paths.size() != images.size()) { | 140 if (image_paths.size() != images.size()) { |
143 ReportFailure("Decoded images don't match what's in the manifest."); | 141 ReportFailure("Decoded images don't match what's in the manifest."); |
144 return; | 142 return; |
145 } | 143 } |
146 | 144 |
147 for (std::set<FilePath>::iterator it = image_paths.begin(); | 145 for (std::set<FilePath>::iterator it = image_paths.begin(); |
148 it != image_paths.end(); ++it) { | 146 it != image_paths.end(); ++it) { |
149 FilePath path = *it; | 147 FilePath path = *it; |
150 if (path.IsAbsolute() || path.ReferencesParent()) { | 148 if (path.IsAbsolute() || path.ReferencesParent()) { |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 | 292 |
295 void SandboxedExtensionUnpacker::ReportFailure(const std::string& error) { | 293 void SandboxedExtensionUnpacker::ReportFailure(const std::string& error) { |
296 client_->OnUnpackFailure(error); | 294 client_->OnUnpackFailure(error); |
297 } | 295 } |
298 | 296 |
299 void SandboxedExtensionUnpacker::ReportSuccess() { | 297 void SandboxedExtensionUnpacker::ReportSuccess() { |
300 // Client takes ownership of temporary directory and extension. | 298 // Client takes ownership of temporary directory and extension. |
301 client_->OnUnpackSuccess(temp_dir_.Take(), extension_root_, | 299 client_->OnUnpackSuccess(temp_dir_.Take(), extension_root_, |
302 extension_.release()); | 300 extension_.release()); |
303 } | 301 } |
OLD | NEW |