manifest_handler.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_COMMON_EXTENSIONS_MANIFEST_HANDLER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_COMMON_EXTENSIONS_MANIFEST_HANDLER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/string16.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Extension;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ManifestHandler {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ManifestHandler();
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ManifestHandler();
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Attempts to parse the extension's manifest.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true on success or false on failure; if false, |error| will
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be set to a failure message.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool Parse(Extension* extension, string16* error) = 0;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Validate that files associated with this manifest key exist.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Validation takes place after parsing. May also append a series of
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // warning messages to |warnings|.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Otherwise, returns false, and a description of the error is
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // returned in |error|.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(yoz): Change error to string16. See crbug.com/71980.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool Validate(const Extension* extension,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        std::string* error,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        std::vector<InstallWarning>* warnings) const;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If false (the default), only parse the manifest if a registered
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // key is present in the manifest. If true, always attempt to parse
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the manifest for this extension type, even if no registered keys
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are present. This allows specifying a default parsed value for
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extensions that don't declare our key in the manifest.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(yoz): Use Feature availability instead.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool AlwaysParseForType(Manifest::Type type) const;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same as AlwaysParseForType, but for Validate instead of Parse.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool AlwaysValidateForType(Manifest::Type type) const;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The list of keys that, if present, should be parsed before calling our
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parse (typically, because our Parse needs to read those keys).
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Defaults to empty.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const std::vector<std::string> PrerequisiteKeys() const;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Associate us with our keys() in the manifest. A handler can register
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for multiple keys. The global registry takes ownership of this;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if it has an existing handler for |key|, it replaces it with this.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Typical usage:
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (new MyManifestHandler)->Register();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WARNING: Manifest handlers registered only in the browser process
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are not available to renderers or utility processes.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Register();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Call Parse on all registered manifest handlers that should parse
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this extension.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool ParseExtension(Extension* extension, string16* error);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Call Validate on all registered manifest handlers for this extension.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool ValidateExtension(const Extension* extension,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                std::string* error,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                std::vector<InstallWarning>* warnings);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reset the manifest handler registry to an empty state. Useful for
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // unit tests.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void ClearRegistryForTesting();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A convenience method for handlers that only register for 1 key,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // so that they can define keys() { return SingleKey(kKey); }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const std::vector<std::string> SingleKey(const std::string& key);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The keys to register us for (in Register).
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const std::vector<std::string> Keys() const = 0;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_COMMON_EXTENSIONS_MANIFEST_HANDLER_H_
91