Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(914)

Side by Side Diff: chrome/common/extensions/manifest.h

Issue 23257005: Move Feature and Manifest to top-level extensions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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_MANIFEST_H_
6 #define CHROME_COMMON_EXTENSIONS_MANIFEST_H_
7
8 #include <map>
9 #include <set>
10 #include <string>
11
12 #include "base/memory/scoped_ptr.h"
13 #include "base/strings/string16.h"
14 #include "base/values.h"
15
16 namespace extensions {
17 struct InstallWarning;
18
19 // Wraps the DictionaryValue form of extension's manifest. Enforces access to
20 // properties of the manifest using ManifestFeatureProvider.
21 class Manifest {
22 public:
23 // What an extension was loaded from.
24 // NOTE: These values are stored as integers in the preferences and used
25 // in histograms so don't remove or reorder existing items. Just append
26 // to the end.
27 enum Location {
28 INVALID_LOCATION,
29 INTERNAL, // A crx file from the internal Extensions directory.
30 EXTERNAL_PREF, // A crx file from an external directory (via prefs).
31 EXTERNAL_REGISTRY, // A crx file from an external directory (via eg the
32 // registry on Windows).
33 UNPACKED, // From loading an unpacked extension from the
34 // extensions settings page.
35 COMPONENT, // An integral component of Chrome itself, which
36 // happens to be implemented as an extension. We don't
37 // show these in the management UI.
38 EXTERNAL_PREF_DOWNLOAD, // A crx file from an external directory (via
39 // prefs), installed from an update URL.
40 EXTERNAL_POLICY_DOWNLOAD, // A crx file from an external directory (via
41 // admin policies), installed from an update URL.
42 COMMAND_LINE, // --load-extension.
43
44 NUM_LOCATIONS
45 };
46
47 // Do not change the order of entries or remove entries in this list
48 // as this is used in UMA_HISTOGRAM_ENUMERATIONs about extensions.
49 enum Type {
50 TYPE_UNKNOWN = 0,
51 TYPE_EXTENSION,
52 TYPE_THEME,
53 TYPE_USER_SCRIPT,
54 TYPE_HOSTED_APP,
55 // This is marked legacy because platform apps are preferred. For
56 // backwards compatibility, we can't remove support for packaged apps
57 TYPE_LEGACY_PACKAGED_APP,
58 TYPE_PLATFORM_APP,
59 TYPE_SHARED_MODULE
60 };
61
62 // Given two install sources, return the one which should take priority
63 // over the other. If an extension is installed from two sources A and B,
64 // its install source should be set to GetHigherPriorityLocation(A, B).
65 static Location GetHigherPriorityLocation(Location loc1, Location loc2);
66
67 // Whether the |location| is external or not.
68 static inline bool IsExternalLocation(Location location) {
69 return location == EXTERNAL_PREF ||
70 location == EXTERNAL_REGISTRY ||
71 location == EXTERNAL_PREF_DOWNLOAD ||
72 location == EXTERNAL_POLICY_DOWNLOAD;
73 }
74
75 // Whether the |location| is unpacked (no CRX) or not.
76 static inline bool IsUnpackedLocation(Location location) {
77 return location == UNPACKED || location == COMMAND_LINE;
78 }
79
80 // Whether extensions with |location| are auto-updatable or not.
81 static inline bool IsAutoUpdateableLocation(Location location) {
82 // Only internal and external extensions can be autoupdated.
83 return location == INTERNAL ||
84 IsExternalLocation(location);
85 }
86
87 // Unpacked extensions start off with file access since they are a developer
88 // feature.
89 static inline bool ShouldAlwaysAllowFileAccess(Location location) {
90 return IsUnpackedLocation(location);
91 }
92
93 Manifest(Location location, scoped_ptr<base::DictionaryValue> value);
94 virtual ~Manifest();
95
96 const std::string& extension_id() const { return extension_id_; }
97 void set_extension_id(const std::string& id) { extension_id_ = id; }
98
99 Location location() const { return location_; }
100
101 // Returns false and |error| will be non-empty if the manifest is malformed.
102 // |warnings| will be populated if there are keys in the manifest that cannot
103 // be specified by the extension type.
104 bool ValidateManifest(std::string* error,
105 std::vector<InstallWarning>* warnings) const;
106
107 // The version of this extension's manifest. We increase the manifest
108 // version when making breaking changes to the extension system. If the
109 // manifest contains no explicit manifest version, this returns the current
110 // system default.
111 int GetManifestVersion() const;
112
113 // Returns the manifest type.
114 Type type() const { return type_; }
115
116 bool is_theme() const { return type_ == TYPE_THEME; }
117 bool is_app() const {
118 return is_legacy_packaged_app() || is_hosted_app() || is_platform_app();
119 }
120 bool is_platform_app() const { return type_ == TYPE_PLATFORM_APP; }
121 bool is_hosted_app() const { return type_ == TYPE_HOSTED_APP; }
122 bool is_legacy_packaged_app() const {
123 return type_ == TYPE_LEGACY_PACKAGED_APP;
124 }
125 bool is_extension() const { return type_ == TYPE_EXTENSION; }
126 bool is_shared_module() const { return type_ == TYPE_SHARED_MODULE; }
127
128 // These access the wrapped manifest value, returning false when the property
129 // does not exist or if the manifest type can't access it.
130 bool HasKey(const std::string& key) const;
131 bool HasPath(const std::string& path) const;
132 bool Get(const std::string& path, const base::Value** out_value) const;
133 bool GetBoolean(const std::string& path, bool* out_value) const;
134 bool GetInteger(const std::string& path, int* out_value) const;
135 bool GetString(const std::string& path, std::string* out_value) const;
136 bool GetString(const std::string& path, string16* out_value) const;
137 bool GetDictionary(const std::string& path,
138 const base::DictionaryValue** out_value) const;
139 bool GetList(const std::string& path,
140 const base::ListValue** out_value) const;
141
142 // Returns a new Manifest equal to this one, passing ownership to
143 // the caller.
144 Manifest* DeepCopy() const;
145
146 // Returns true if this equals the |other| manifest.
147 bool Equals(const Manifest* other) const;
148
149 // Gets the underlying DictionaryValue representing the manifest.
150 // Note: only use this when you KNOW you don't need the validation.
151 const base::DictionaryValue* value() const { return value_.get(); }
152
153 private:
154 // Returns true if the extension can specify the given |path|.
155 bool CanAccessPath(const std::string& path) const;
156 bool CanAccessKey(const std::string& key) const;
157
158 // A persistent, globally unique ID. An extension's ID is used in things
159 // like directory structures and URLs, and is expected to not change across
160 // versions. It is generated as a SHA-256 hash of the extension's public
161 // key, or as a hash of the path in the case of unpacked extensions.
162 std::string extension_id_;
163
164 // The location the extension was loaded from.
165 Location location_;
166
167 // The underlying dictionary representation of the manifest.
168 scoped_ptr<base::DictionaryValue> value_;
169
170 Type type_;
171
172 DISALLOW_COPY_AND_ASSIGN(Manifest);
173 };
174
175 } // namespace extensions
176
177 #endif // CHROME_COMMON_EXTENSIONS_MANIFEST_H_
OLDNEW
« no previous file with comments | « chrome/common/extensions/features/simple_feature.h ('k') | chrome/common/extensions/manifest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698