OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/common/extensions/manifest.h" | 5 #include "chrome/common/extensions/manifest.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/string_split.h" | 10 #include "base/string_split.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 int loc2_rank = GetLocationRank(loc2); | 88 int loc2_rank = GetLocationRank(loc2); |
89 | 89 |
90 // If two different locations have the same rank, then we can not | 90 // If two different locations have the same rank, then we can not |
91 // deterministicly choose a location. | 91 // deterministicly choose a location. |
92 CHECK(loc1_rank != loc2_rank); | 92 CHECK(loc1_rank != loc2_rank); |
93 | 93 |
94 // Highest rank has highest priority. | 94 // Highest rank has highest priority. |
95 return (loc1_rank > loc2_rank ? loc1 : loc2 ); | 95 return (loc1_rank > loc2_rank ? loc1 : loc2 ); |
96 } | 96 } |
97 | 97 |
98 Manifest::Manifest(Location location, scoped_ptr<DictionaryValue> value) | 98 Manifest::Manifest(Location location, scoped_ptr<base::DictionaryValue> value) |
99 : location_(location), | 99 : location_(location), |
100 value_(value.Pass()), | 100 value_(value.Pass()), |
101 type_(TYPE_UNKNOWN) { | 101 type_(TYPE_UNKNOWN) { |
102 if (value_->HasKey(keys::kTheme)) { | 102 if (value_->HasKey(keys::kTheme)) { |
103 type_ = TYPE_THEME; | 103 type_ = TYPE_THEME; |
104 } else if (value_->HasKey(keys::kApp)) { | 104 } else if (value_->HasKey(keys::kApp)) { |
105 if (value_->Get(keys::kWebURLs, NULL) || | 105 if (value_->Get(keys::kWebURLs, NULL) || |
106 value_->Get(keys::kLaunchWebURL, NULL)) { | 106 value_->Get(keys::kLaunchWebURL, NULL)) { |
107 type_ = TYPE_HOSTED_APP; | 107 type_ = TYPE_HOSTED_APP; |
108 } else if (value_->Get(keys::kPlatformAppBackground, NULL)) { | 108 } else if (value_->Get(keys::kPlatformAppBackground, NULL)) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 BaseFeatureProvider::GetManifestFeatures()->GetFeature(*feature_name); | 146 BaseFeatureProvider::GetManifestFeatures()->GetFeature(*feature_name); |
147 Feature::Availability result = feature->IsAvailableToManifest( | 147 Feature::Availability result = feature->IsAvailableToManifest( |
148 extension_id_, type_, Feature::ConvertLocation(location_), | 148 extension_id_, type_, Feature::ConvertLocation(location_), |
149 GetManifestVersion()); | 149 GetManifestVersion()); |
150 if (!result.is_available()) | 150 if (!result.is_available()) |
151 warnings->push_back(InstallWarning( | 151 warnings->push_back(InstallWarning( |
152 InstallWarning::FORMAT_TEXT, result.message())); | 152 InstallWarning::FORMAT_TEXT, result.message())); |
153 } | 153 } |
154 | 154 |
155 // Also generate warnings for keys that are not features. | 155 // Also generate warnings for keys that are not features. |
156 for (DictionaryValue::key_iterator key = value_->begin_keys(); | 156 for (base::DictionaryValue::key_iterator key = value_->begin_keys(); |
157 key != value_->end_keys(); ++key) { | 157 key != value_->end_keys(); ++key) { |
158 if (!BaseFeatureProvider::GetManifestFeatures()->GetFeature(*key)) { | 158 if (!BaseFeatureProvider::GetManifestFeatures()->GetFeature(*key)) { |
159 warnings->push_back(InstallWarning( | 159 warnings->push_back(InstallWarning( |
160 InstallWarning::FORMAT_TEXT, | 160 InstallWarning::FORMAT_TEXT, |
161 base::StringPrintf("Unrecognized manifest key '%s'.", | 161 base::StringPrintf("Unrecognized manifest key '%s'.", |
162 (*key).c_str()))); | 162 (*key).c_str()))); |
163 } | 163 } |
164 } | 164 } |
165 } | 165 } |
166 | 166 |
167 bool Manifest::HasKey(const std::string& key) const { | 167 bool Manifest::HasKey(const std::string& key) const { |
168 return CanAccessKey(key) && value_->HasKey(key); | 168 return CanAccessKey(key) && value_->HasKey(key); |
169 } | 169 } |
170 | 170 |
171 bool Manifest::HasPath(const std::string& path) const { | 171 bool Manifest::HasPath(const std::string& path) const { |
172 Value* ignored = NULL; | 172 base::Value* ignored = NULL; |
173 return CanAccessPath(path) && value_->Get(path, &ignored); | 173 return CanAccessPath(path) && value_->Get(path, &ignored); |
174 } | 174 } |
175 | 175 |
176 bool Manifest::Get( | 176 bool Manifest::Get( |
177 const std::string& path, Value** out_value) const { | 177 const std::string& path, const base::Value** out_value) const { |
178 return CanAccessPath(path) && value_->Get(path, out_value); | 178 return CanAccessPath(path) && value_->Get(path, out_value); |
179 } | 179 } |
180 | 180 |
181 bool Manifest::GetBoolean( | 181 bool Manifest::GetBoolean( |
182 const std::string& path, bool* out_value) const { | 182 const std::string& path, bool* out_value) const { |
183 return CanAccessPath(path) && value_->GetBoolean(path, out_value); | 183 return CanAccessPath(path) && value_->GetBoolean(path, out_value); |
184 } | 184 } |
185 | 185 |
186 bool Manifest::GetInteger( | 186 bool Manifest::GetInteger( |
187 const std::string& path, int* out_value) const { | 187 const std::string& path, int* out_value) const { |
188 return CanAccessPath(path) && value_->GetInteger(path, out_value); | 188 return CanAccessPath(path) && value_->GetInteger(path, out_value); |
189 } | 189 } |
190 | 190 |
191 bool Manifest::GetString( | 191 bool Manifest::GetString( |
192 const std::string& path, std::string* out_value) const { | 192 const std::string& path, std::string* out_value) const { |
193 return CanAccessPath(path) && value_->GetString(path, out_value); | 193 return CanAccessPath(path) && value_->GetString(path, out_value); |
194 } | 194 } |
195 | 195 |
196 bool Manifest::GetString( | 196 bool Manifest::GetString( |
197 const std::string& path, string16* out_value) const { | 197 const std::string& path, string16* out_value) const { |
198 return CanAccessPath(path) && value_->GetString(path, out_value); | 198 return CanAccessPath(path) && value_->GetString(path, out_value); |
199 } | 199 } |
200 | 200 |
201 bool Manifest::GetDictionary( | 201 bool Manifest::GetDictionary( |
202 const std::string& path, const DictionaryValue** out_value) const { | 202 const std::string& path, const base::DictionaryValue** out_value) const { |
203 return GetDictionary(path, const_cast<DictionaryValue**>(out_value)); | |
204 } | |
205 | |
206 bool Manifest::GetDictionary( | |
207 const std::string& path, DictionaryValue** out_value) const { | |
208 return CanAccessPath(path) && value_->GetDictionary(path, out_value); | 203 return CanAccessPath(path) && value_->GetDictionary(path, out_value); |
209 } | 204 } |
210 | 205 |
211 bool Manifest::GetList( | 206 bool Manifest::GetList( |
212 const std::string& path, const ListValue** out_value) const { | 207 const std::string& path, const base::ListValue** out_value) const { |
213 return GetList(path, const_cast<ListValue**>(out_value)); | |
214 } | |
215 | |
216 bool Manifest::GetList( | |
217 const std::string& path, ListValue** out_value) const { | |
218 return CanAccessPath(path) && value_->GetList(path, out_value); | 208 return CanAccessPath(path) && value_->GetList(path, out_value); |
219 } | 209 } |
220 | 210 |
221 Manifest* Manifest::DeepCopy() const { | 211 Manifest* Manifest::DeepCopy() const { |
222 Manifest* manifest = new Manifest( | 212 Manifest* manifest = new Manifest( |
223 location_, scoped_ptr<DictionaryValue>(value_->DeepCopy())); | 213 location_, scoped_ptr<base::DictionaryValue>(value_->DeepCopy())); |
224 manifest->set_extension_id(extension_id_); | 214 manifest->set_extension_id(extension_id_); |
225 return manifest; | 215 return manifest; |
226 } | 216 } |
227 | 217 |
228 bool Manifest::Equals(const Manifest* other) const { | 218 bool Manifest::Equals(const Manifest* other) const { |
229 return other && value_->Equals(other->value()); | 219 return other && value_->Equals(other->value()); |
230 } | 220 } |
231 | 221 |
232 int Manifest::GetManifestVersion() const { | 222 int Manifest::GetManifestVersion() const { |
233 // Platform apps were launched after manifest version 2 was the preferred | 223 // Platform apps were launched after manifest version 2 was the preferred |
(...skipping 21 matching lines...) Expand all Loading... |
255 BaseFeatureProvider::GetManifestFeatures()->GetFeature(key); | 245 BaseFeatureProvider::GetManifestFeatures()->GetFeature(key); |
256 if (!feature) | 246 if (!feature) |
257 return true; | 247 return true; |
258 | 248 |
259 return feature->IsAvailableToManifest( | 249 return feature->IsAvailableToManifest( |
260 extension_id_, type_, Feature::ConvertLocation(location_), | 250 extension_id_, type_, Feature::ConvertLocation(location_), |
261 GetManifestVersion()).is_available(); | 251 GetManifestVersion()).is_available(); |
262 } | 252 } |
263 | 253 |
264 } // namespace extensions | 254 } // namespace extensions |
OLD | NEW |