• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_UNPACKER_H_
6 #define CHROME_COMMON_EXTENSIONS_EXTENSION_UNPACKER_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/file_path.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/tuple.h"
15 
16 class DictionaryValue;
17 class SkBitmap;
18 
19 // This class unpacks an extension.  It is designed to be used in a sandboxed
20 // child process.  We unpack and parse various bits of the extension, then
21 // report back to the browser process, who then transcodes the pre-parsed bits
22 // and writes them back out to disk for later use.
23 class ExtensionUnpacker {
24  public:
25   typedef std::vector< Tuple2<SkBitmap, FilePath> > DecodedImages;
26 
27   explicit ExtensionUnpacker(const FilePath& extension_path);
28   ~ExtensionUnpacker();
29 
30   // Install the extension file at |extension_path|.  Returns true on success.
31   // Otherwise, error_message will contain a string explaining what went wrong.
32   bool Run();
33 
34   // Write the decoded images to kDecodedImagesFilename.  We do this instead
35   // of sending them over IPC, since they are so large.  Returns true on
36   // success.
37   bool DumpImagesToFile();
38 
39   // Write the decoded messages to kDecodedMessageCatalogsFilename.  We do this
40   // instead of sending them over IPC, since they are so large.  Returns true on
41   // success.
42   bool DumpMessageCatalogsToFile();
43 
44   // Read the decoded images back from the file we saved them to.
45   // |extension_path| is the path to the extension we unpacked that wrote the
46   // data. Returns true on success.
47   static bool ReadImagesFromFile(const FilePath& extension_path,
48                                  DecodedImages* images);
49 
50   // Read the decoded message catalogs back from the file we saved them to.
51   // |extension_path| is the path to the extension we unpacked that wrote the
52   // data. Returns true on success.
53   static bool ReadMessageCatalogsFromFile(const FilePath& extension_path,
54                                           DictionaryValue* catalogs);
55 
error_message()56   const std::string& error_message() { return error_message_; }
parsed_manifest()57   DictionaryValue* parsed_manifest() {
58     return parsed_manifest_.get();
59   }
decoded_images()60   const DecodedImages& decoded_images() { return decoded_images_; }
parsed_catalogs()61   DictionaryValue* parsed_catalogs() { return parsed_catalogs_.get(); }
62 
63  private:
64   // Parse the manifest.json file inside the extension (not in the header).
65   // Caller takes ownership of return value.
66   DictionaryValue* ReadManifest();
67 
68   // Parse all _locales/*/messages.json files inside the extension.
69   bool ReadAllMessageCatalogs(const std::string& default_locale);
70 
71   // Decodes the image at the given path and puts it in our list of decoded
72   // images.
73   bool AddDecodedImage(const FilePath& path);
74 
75   // Parses the catalog at the given path and puts it in our list of parsed
76   // catalogs.
77   bool ReadMessageCatalog(const FilePath& message_path);
78 
79   // Set the error message.
80   void SetError(const std::string& error);
81 
82   // The extension to unpack.
83   FilePath extension_path_;
84 
85   // The place we unpacked the extension to.
86   FilePath temp_install_dir_;
87 
88   // The parsed version of the manifest JSON contained in the extension.
89   scoped_ptr<DictionaryValue> parsed_manifest_;
90 
91   // A list of decoded images and the paths where those images came from.  Paths
92   // are relative to the manifest file.
93   DecodedImages decoded_images_;
94 
95   // Dictionary of relative paths and catalogs per path. Paths are in the form
96   // of _locales/locale, without messages.json base part.
97   scoped_ptr<DictionaryValue> parsed_catalogs_;
98 
99   // The last error message that was set.  Empty if there were no errors.
100   std::string error_message_;
101 
102   DISALLOW_COPY_AND_ASSIGN(ExtensionUnpacker);
103 };
104 
105 #endif  // CHROME_COMMON_EXTENSIONS_EXTENSION_UNPACKER_H_
106