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

Side by Side Diff: chrome/common/extensions/manifest_handlers/requirements_handler.cc

Issue 12494028: Move Requirements out of Extension Class (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Move Requirements from API Created 7 years, 9 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
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 #include "chrome/common/extensions/manifest_handlers/requirements_handler.h"
6
7 #include "base/lazy_instance.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/utf_string_conversions.h"
10 #include "base/values.h"
11 #include "chrome/common/extensions/extension_manifest_constants.h"
12 #include "extensions/common/error_utils.h"
13
14 namespace keys = extension_manifest_keys;
15 namespace errors = extension_manifest_errors;
16
17 namespace extensions {
18
19 RequirementsInfo::RequirementsInfo(const Manifest* manifest)
20 : webgl(false),
21 css3d(false),
22 npapi(false) {
23 // Before parsing requirements from the manifest, automatically default the
24 // NPAPI plugin requirement based on whether it includes NPAPI plugins.
25 const ListValue* list_value = NULL;
26 npapi = manifest->GetList(keys::kPlugins, &list_value) &&
27 !list_value->empty();
28 }
29
30 RequirementsInfo::~RequirementsInfo() {
31 }
32
33 // static
34 const RequirementsInfo& RequirementsInfo::GetRequirements(
35 const Extension* extension) {
36 RequirementsInfo* info = static_cast<RequirementsInfo*>(
37 extension->GetManifestData(keys::kRequirements));
38
39 // We should be guaranteed to have requirements, since they are parsed for all
40 // extension types.
41 CHECK(info);
42 return *info;
43 }
44
45 RequirementsHandler::RequirementsHandler() {
46 }
47
48 RequirementsHandler::~RequirementsHandler() {
49 }
50
51 const std::vector<std::string> RequirementsHandler::PrerequisiteKeys() const {
52 return SingleKey(keys::kPlugins);
53 }
54
55 const std::vector<std::string> RequirementsHandler::Keys() const {
56 return SingleKey(keys::kRequirements);
57 }
58
59 bool RequirementsHandler::AlwaysParseForType(Manifest::Type type) const {
60 return true;
61 }
62
63 bool RequirementsHandler::Parse(Extension* extension, string16* error) {
64 scoped_ptr<RequirementsInfo> requirements(
65 new RequirementsInfo(extension->manifest()));
66
67 if (!extension->manifest()->HasKey(keys::kRequirements)) {
68 extension->SetManifestData(keys::kRequirements, requirements.release());
69 return true;
70 }
71
72 const DictionaryValue* requirements_value = NULL;
73 if (!extension->manifest()->GetDictionary(keys::kRequirements,
74 &requirements_value)) {
75 *error = ASCIIToUTF16(errors::kInvalidRequirements);
76 return false;
77 }
78
79 for (DictionaryValue::Iterator iter(*requirements_value); !iter.IsAtEnd();
80 iter.Advance()) {
81 const DictionaryValue* requirement_value;
82 if (!iter.value().GetAsDictionary(&requirement_value)) {
83 *error = ErrorUtils::FormatErrorMessageUTF16(
84 errors::kInvalidRequirement, iter.key());
85 return false;
86 }
87
88 if (iter.key() == "plugins") {
89 for (DictionaryValue::Iterator plugin_iter(*requirement_value);
90 !plugin_iter.IsAtEnd(); plugin_iter.Advance()) {
91 bool plugin_required = false;
92 if (!plugin_iter.value().GetAsBoolean(&plugin_required)) {
93 *error = ErrorUtils::FormatErrorMessageUTF16(
94 errors::kInvalidRequirement, iter.key());
95 return false;
96 }
97 if (plugin_iter.key() == "npapi") {
98 requirements->npapi = plugin_required;
99 } else {
100 *error = ErrorUtils::FormatErrorMessageUTF16(
101 errors::kInvalidRequirement, iter.key());
102 return false;
103 }
104 }
105 } else if (iter.key() == "3D") {
106 const ListValue* features = NULL;
107 if (!requirement_value->GetListWithoutPathExpansion("features",
108 &features) ||
109 !features) {
110 *error = ErrorUtils::FormatErrorMessageUTF16(
111 errors::kInvalidRequirement, iter.key());
112 return false;
113 }
114
115 for (base::ListValue::const_iterator feature_iter = features->begin();
116 feature_iter != features->end(); ++feature_iter) {
117 std::string feature;
118 if ((*feature_iter)->GetAsString(&feature)) {
119 if (feature == "webgl") {
120 requirements->webgl = true;
121 } else if (feature == "css3d") {
122 requirements->css3d = true;
123 } else {
124 *error = ErrorUtils::FormatErrorMessageUTF16(
125 errors::kInvalidRequirement, iter.key());
126 return false;
127 }
128 }
129 }
130 } else {
131 *error = ASCIIToUTF16(errors::kInvalidRequirements);
132 return false;
133 }
134 }
135
136 extension->SetManifestData(keys::kRequirements, requirements.release());
137 return true;
138 }
139
140 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698