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