C++程序  |  106行  |  3.81 KB

// 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_