| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_UNPACKER_H_ |
| #define CHROME_COMMON_EXTENSIONS_EXTENSION_UNPACKER_H_ |
| #pragma once |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/file_path.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/tuple.h" |
| |
| class DictionaryValue; |
| class SkBitmap; |
| |
| // This class unpacks an extension. It is designed to be used in a sandboxed |
| // child process. We unpack and parse various bits of the extension, then |
| // report back to the browser process, who then transcodes the pre-parsed bits |
| // and writes them back out to disk for later use. |
| class ExtensionUnpacker { |
| public: |
| typedef std::vector< Tuple2<SkBitmap, FilePath> > DecodedImages; |
| |
| explicit ExtensionUnpacker(const FilePath& extension_path); |
| ~ExtensionUnpacker(); |
| |
| // Install the extension file at |extension_path|. Returns true on success. |
| // Otherwise, error_message will contain a string explaining what went wrong. |
| bool Run(); |
| |
| // Write the decoded images to kDecodedImagesFilename. We do this instead |
| // of sending them over IPC, since they are so large. Returns true on |
| // success. |
| bool DumpImagesToFile(); |
| |
| // Write the decoded messages to kDecodedMessageCatalogsFilename. We do this |
| // instead of sending them over IPC, since they are so large. Returns true on |
| // success. |
| bool DumpMessageCatalogsToFile(); |
| |
| // Read the decoded images back from the file we saved them to. |
| // |extension_path| is the path to the extension we unpacked that wrote the |
| // data. Returns true on success. |
| static bool ReadImagesFromFile(const FilePath& extension_path, |
| DecodedImages* images); |
| |
| // Read the decoded message catalogs back from the file we saved them to. |
| // |extension_path| is the path to the extension we unpacked that wrote the |
| // data. Returns true on success. |
| static bool ReadMessageCatalogsFromFile(const FilePath& extension_path, |
| DictionaryValue* catalogs); |
| |
| const std::string& error_message() { return error_message_; } |
| DictionaryValue* parsed_manifest() { |
| return parsed_manifest_.get(); |
| } |
| const DecodedImages& decoded_images() { return decoded_images_; } |
| DictionaryValue* parsed_catalogs() { return parsed_catalogs_.get(); } |
| |
| private: |
| // Parse the manifest.json file inside the extension (not in the header). |
| // Caller takes ownership of return value. |
| DictionaryValue* ReadManifest(); |
| |
| // Parse all _locales/*/messages.json files inside the extension. |
| bool ReadAllMessageCatalogs(const std::string& default_locale); |
| |
| // Decodes the image at the given path and puts it in our list of decoded |
| // images. |
| bool AddDecodedImage(const FilePath& path); |
| |
| // Parses the catalog at the given path and puts it in our list of parsed |
| // catalogs. |
| bool ReadMessageCatalog(const FilePath& message_path); |
| |
| // Set the error message. |
| void SetError(const std::string& error); |
| |
| // The extension to unpack. |
| FilePath extension_path_; |
| |
| // The place we unpacked the extension to. |
| FilePath temp_install_dir_; |
| |
| // The parsed version of the manifest JSON contained in the extension. |
| scoped_ptr<DictionaryValue> parsed_manifest_; |
| |
| // A list of decoded images and the paths where those images came from. Paths |
| // are relative to the manifest file. |
| DecodedImages decoded_images_; |
| |
| // Dictionary of relative paths and catalogs per path. Paths are in the form |
| // of _locales/locale, without messages.json base part. |
| scoped_ptr<DictionaryValue> parsed_catalogs_; |
| |
| // The last error message that was set. Empty if there were no errors. |
| std::string error_message_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ExtensionUnpacker); |
| }; |
| |
| #endif // CHROME_COMMON_EXTENSIONS_EXTENSION_UNPACKER_H_ |