| 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 int loc2_rank = GetLocationRank(loc2); | 93 int loc2_rank = GetLocationRank(loc2); |
| 94 | 94 |
| 95 // If two different locations have the same rank, then we can not | 95 // If two different locations have the same rank, then we can not |
| 96 // deterministicly choose a location. | 96 // deterministicly choose a location. |
| 97 CHECK(loc1_rank != loc2_rank); | 97 CHECK(loc1_rank != loc2_rank); |
| 98 | 98 |
| 99 // Highest rank has highest priority. | 99 // Highest rank has highest priority. |
| 100 return (loc1_rank > loc2_rank ? loc1 : loc2 ); | 100 return (loc1_rank > loc2_rank ? loc1 : loc2 ); |
| 101 } | 101 } |
| 102 | 102 |
| 103 Manifest::Manifest(Location location, scoped_ptr<DictionaryValue> value) | 103 Manifest::Manifest(Location location, scoped_ptr<base::DictionaryValue> value) |
| 104 : location_(location), | 104 : location_(location), |
| 105 value_(value.Pass()), | 105 value_(value.Pass()), |
| 106 type_(TYPE_UNKNOWN) { | 106 type_(TYPE_UNKNOWN) { |
| 107 if (value_->HasKey(keys::kTheme)) { | 107 if (value_->HasKey(keys::kTheme)) { |
| 108 type_ = TYPE_THEME; | 108 type_ = TYPE_THEME; |
| 109 } else if (value_->HasKey(keys::kApp)) { | 109 } else if (value_->HasKey(keys::kApp)) { |
| 110 if (value_->Get(keys::kWebURLs, NULL) || | 110 if (value_->Get(keys::kWebURLs, NULL) || |
| 111 value_->Get(keys::kLaunchWebURL, NULL)) { | 111 value_->Get(keys::kLaunchWebURL, NULL)) { |
| 112 type_ = TYPE_HOSTED_APP; | 112 type_ = TYPE_HOSTED_APP; |
| 113 } else if (value_->Get(keys::kPlatformAppBackground, NULL)) { | 113 } else if (value_->Get(keys::kPlatformAppBackground, NULL)) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 BaseFeatureProvider::GetManifestFeatures()->GetFeature(*feature_name); | 151 BaseFeatureProvider::GetManifestFeatures()->GetFeature(*feature_name); |
| 152 Feature::Availability result = feature->IsAvailableToManifest( | 152 Feature::Availability result = feature->IsAvailableToManifest( |
| 153 extension_id_, type_, Feature::ConvertLocation(location_), | 153 extension_id_, type_, Feature::ConvertLocation(location_), |
| 154 GetManifestVersion()); | 154 GetManifestVersion()); |
| 155 if (!result.is_available()) | 155 if (!result.is_available()) |
| 156 warnings->push_back(InstallWarning( | 156 warnings->push_back(InstallWarning( |
| 157 InstallWarning::FORMAT_TEXT, result.message())); | 157 InstallWarning::FORMAT_TEXT, result.message())); |
| 158 } | 158 } |
| 159 | 159 |
| 160 // Also generate warnings for keys that are not features. | 160 // Also generate warnings for keys that are not features. |
| 161 for (DictionaryValue::key_iterator key = value_->begin_keys(); | 161 for (base::DictionaryValue::key_iterator key = value_->begin_keys(); |
| 162 key != value_->end_keys(); ++key) { | 162 key != value_->end_keys(); ++key) { |
| 163 if (!BaseFeatureProvider::GetManifestFeatures()->GetFeature(*key)) { | 163 if (!BaseFeatureProvider::GetManifestFeatures()->GetFeature(*key)) { |
| 164 warnings->push_back(InstallWarning( | 164 warnings->push_back(InstallWarning( |
| 165 InstallWarning::FORMAT_TEXT, | 165 InstallWarning::FORMAT_TEXT, |
| 166 base::StringPrintf("Unrecognized manifest key '%s'.", | 166 base::StringPrintf("Unrecognized manifest key '%s'.", |
| 167 (*key).c_str()))); | 167 (*key).c_str()))); |
| 168 } | 168 } |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 | 171 |
| 172 bool Manifest::HasKey(const std::string& key) const { | 172 bool Manifest::HasKey(const std::string& key) const { |
| 173 return CanAccessKey(key) && value_->HasKey(key); | 173 return CanAccessKey(key) && value_->HasKey(key); |
| 174 } | 174 } |
| 175 | 175 |
| 176 bool Manifest::HasPath(const std::string& path) const { | 176 bool Manifest::HasPath(const std::string& path) const { |
| 177 Value* ignored = NULL; | 177 base::Value* ignored = NULL; |
| 178 return CanAccessPath(path) && value_->Get(path, &ignored); | 178 return CanAccessPath(path) && value_->Get(path, &ignored); |
| 179 } | 179 } |
| 180 | 180 |
| 181 bool Manifest::Get( | 181 bool Manifest::Get( |
| 182 const std::string& path, Value** out_value) const { | 182 const std::string& path, const base::Value** out_value) const { |
| 183 return CanAccessPath(path) && value_->Get(path, out_value); | 183 return CanAccessPath(path) && value_->Get(path, out_value); |
| 184 } | 184 } |
| 185 | 185 |
| 186 bool Manifest::GetBoolean( | 186 bool Manifest::GetBoolean( |
| 187 const std::string& path, bool* out_value) const { | 187 const std::string& path, bool* out_value) const { |
| 188 return CanAccessPath(path) && value_->GetBoolean(path, out_value); | 188 return CanAccessPath(path) && value_->GetBoolean(path, out_value); |
| 189 } | 189 } |
| 190 | 190 |
| 191 bool Manifest::GetInteger( | 191 bool Manifest::GetInteger( |
| 192 const std::string& path, int* out_value) const { | 192 const std::string& path, int* out_value) const { |
| 193 return CanAccessPath(path) && value_->GetInteger(path, out_value); | 193 return CanAccessPath(path) && value_->GetInteger(path, out_value); |
| 194 } | 194 } |
| 195 | 195 |
| 196 bool Manifest::GetString( | 196 bool Manifest::GetString( |
| 197 const std::string& path, std::string* out_value) const { | 197 const std::string& path, std::string* 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::GetString( | 201 bool Manifest::GetString( |
| 202 const std::string& path, string16* out_value) const { | 202 const std::string& path, string16* out_value) const { |
| 203 return CanAccessPath(path) && value_->GetString(path, out_value); | 203 return CanAccessPath(path) && value_->GetString(path, out_value); |
| 204 } | 204 } |
| 205 | 205 |
| 206 bool Manifest::GetDictionary( | 206 bool Manifest::GetDictionary( |
| 207 const std::string& path, const DictionaryValue** out_value) const { | 207 const std::string& path, const base::DictionaryValue** out_value) const { |
| 208 return GetDictionary(path, const_cast<DictionaryValue**>(out_value)); | |
| 209 } | |
| 210 | |
| 211 bool Manifest::GetDictionary( | |
| 212 const std::string& path, DictionaryValue** out_value) const { | |
| 213 return CanAccessPath(path) && value_->GetDictionary(path, out_value); | 208 return CanAccessPath(path) && value_->GetDictionary(path, out_value); |
| 214 } | 209 } |
| 215 | 210 |
| 216 bool Manifest::GetList( | 211 bool Manifest::GetList( |
| 217 const std::string& path, const ListValue** out_value) const { | 212 const std::string& path, const base::ListValue** out_value) const { |
| 218 return GetList(path, const_cast<ListValue**>(out_value)); | |
| 219 } | |
| 220 | |
| 221 bool Manifest::GetList( | |
| 222 const std::string& path, ListValue** out_value) const { | |
| 223 return CanAccessPath(path) && value_->GetList(path, out_value); | 213 return CanAccessPath(path) && value_->GetList(path, out_value); |
| 224 } | 214 } |
| 225 | 215 |
| 226 Manifest* Manifest::DeepCopy() const { | 216 Manifest* Manifest::DeepCopy() const { |
| 227 Manifest* manifest = new Manifest( | 217 Manifest* manifest = new Manifest( |
| 228 location_, scoped_ptr<DictionaryValue>(value_->DeepCopy())); | 218 location_, scoped_ptr<base::DictionaryValue>(value_->DeepCopy())); |
| 229 manifest->set_extension_id(extension_id_); | 219 manifest->set_extension_id(extension_id_); |
| 230 return manifest; | 220 return manifest; |
| 231 } | 221 } |
| 232 | 222 |
| 233 bool Manifest::Equals(const Manifest* other) const { | 223 bool Manifest::Equals(const Manifest* other) const { |
| 234 return other && value_->Equals(other->value()); | 224 return other && value_->Equals(other->value()); |
| 235 } | 225 } |
| 236 | 226 |
| 237 int Manifest::GetManifestVersion() const { | 227 int Manifest::GetManifestVersion() const { |
| 238 // Platform apps were launched after manifest version 2 was the preferred | 228 // Platform apps were launched after manifest version 2 was the preferred |
| (...skipping 21 matching lines...) Expand all Loading... |
| 260 BaseFeatureProvider::GetManifestFeatures()->GetFeature(key); | 250 BaseFeatureProvider::GetManifestFeatures()->GetFeature(key); |
| 261 if (!feature) | 251 if (!feature) |
| 262 return true; | 252 return true; |
| 263 | 253 |
| 264 return feature->IsAvailableToManifest( | 254 return feature->IsAvailableToManifest( |
| 265 extension_id_, type_, Feature::ConvertLocation(location_), | 255 extension_id_, type_, Feature::ConvertLocation(location_), |
| 266 GetManifestVersion()).is_available(); | 256 GetManifestVersion()).is_available(); |
| 267 } | 257 } |
| 268 | 258 |
| 269 } // namespace extensions | 259 } // namespace extensions |
| OLD | NEW |