| Index: chrome/common/extensions/features/simple_feature.cc
|
| diff --git a/chrome/common/extensions/features/simple_feature.cc b/chrome/common/extensions/features/simple_feature.cc
|
| index 9fc02471ab886fdd02f640eaddf766607d7b3a18..b04632d20949045ab6c71327871c8940c9c5272e 100644
|
| --- a/chrome/common/extensions/features/simple_feature.cc
|
| +++ b/chrome/common/extensions/features/simple_feature.cc
|
| @@ -141,6 +141,7 @@ void ParseURLPatterns(const DictionaryValue* value,
|
| URLPatternSet* set) {
|
| const ListValue* matches = NULL;
|
| if (value->GetList(key, &matches)) {
|
| + set->ClearPatterns();
|
| for (size_t i = 0; i < matches->GetSize(); ++i) {
|
| std::string pattern;
|
| CHECK(matches->GetString(i, &pattern));
|
| @@ -187,7 +188,9 @@ SimpleFeature::SimpleFeature()
|
| platform_(UNSPECIFIED_PLATFORM),
|
| min_manifest_version_(0),
|
| max_manifest_version_(0),
|
| - channel_(VersionInfo::CHANNEL_UNKNOWN) {
|
| + channel_(VersionInfo::CHANNEL_UNKNOWN),
|
| + has_parent_(false),
|
| + channel_has_been_set_(false) {
|
| }
|
|
|
| SimpleFeature::SimpleFeature(const SimpleFeature& other)
|
| @@ -199,7 +202,9 @@ SimpleFeature::SimpleFeature(const SimpleFeature& other)
|
| platform_(other.platform_),
|
| min_manifest_version_(other.min_manifest_version_),
|
| max_manifest_version_(other.max_manifest_version_),
|
| - channel_(other.channel_) {
|
| + channel_(other.channel_),
|
| + has_parent_(other.has_parent_),
|
| + channel_has_been_set_(other.channel_has_been_set_) {
|
| }
|
|
|
| SimpleFeature::~SimpleFeature() {
|
| @@ -214,7 +219,9 @@ bool SimpleFeature::Equals(const SimpleFeature& other) const {
|
| platform_ == other.platform_ &&
|
| min_manifest_version_ == other.min_manifest_version_ &&
|
| max_manifest_version_ == other.max_manifest_version_ &&
|
| - channel_ == other.channel_;
|
| + channel_ == other.channel_ &&
|
| + has_parent_ == other.has_parent_ &&
|
| + channel_has_been_set_ == other.channel_has_been_set_;
|
| }
|
|
|
| std::string SimpleFeature::Parse(const DictionaryValue* value) {
|
| @@ -234,10 +241,21 @@ std::string SimpleFeature::Parse(const DictionaryValue* value) {
|
| ParseEnum<VersionInfo::Channel>(
|
| value, "channel", &channel_,
|
| g_mappings.Get().channels);
|
| +
|
| + no_parent_ = false;
|
| + value->GetBoolean("noparent", &no_parent_);
|
| +
|
| + // The "trunk" channel uses VersionInfo::CHANNEL_UNKNOWN, so we need to keep
|
| + // track of whether the channel has been set or not separately.
|
| + channel_has_been_set_ |= value->HasKey("channel");
|
| + if (!channel_has_been_set_ && dependencies_.empty())
|
| + return name() + ": Must supply a value for channel or dependencies.";
|
| +
|
| if (matches_.is_empty() && contexts_.count(WEB_PAGE_CONTEXT) != 0) {
|
| return name() + ": Allowing web_page contexts requires supplying a value " +
|
| "for matches.";
|
| }
|
| +
|
| return std::string();
|
| }
|
|
|
| @@ -288,7 +306,7 @@ Feature::Availability SimpleFeature::IsAvailableToManifest(
|
| if (max_manifest_version_ != 0 && manifest_version > max_manifest_version_)
|
| return CreateAvailability(INVALID_MAX_MANIFEST_VERSION, type);
|
|
|
| - if (channel_ < Feature::GetCurrentChannel())
|
| + if (channel_has_been_set_ && channel_ < Feature::GetCurrentChannel())
|
| return CreateAvailability(UNSUPPORTED_CHANNEL, type);
|
|
|
| return CreateAvailability(IS_AVAILABLE, type);
|
|
|