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

Unified Diff: extensions/common/features/simple_feature.cc

Issue 2137463003: [Extensions] Move Feature channel code into //extensions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: extensions/common/features/simple_feature.cc
diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc
index 9abc1b4f39224eed5f27a682b50d65fa06c18f43..1c381c0af68e3759a0afa0d8d502cd03b562358d 100644
--- a/extensions/common/features/simple_feature.cc
+++ b/extensions/common/features/simple_feature.cc
@@ -19,6 +19,7 @@
#include "base/strings/stringprintf.h"
#include "components/crx_file/id_util.h"
#include "extensions/common/extension_api.h"
+#include "extensions/common/features/feature_channel.h"
#include "extensions/common/features/feature_provider.h"
#include "extensions/common/features/feature_util.h"
#include "extensions/common/switches.h"
@@ -81,13 +82,12 @@ void ParseEnum(const std::string& string_value,
*enum_value = iter->second;
}
-template<typename T>
-void ParseEnum(const base::DictionaryValue* value,
- const std::string& property,
+template <typename T>
+void ParseEnum(const base::Value* value,
T* enum_value,
const std::map<std::string, T>& mapping) {
std::string string_value;
- if (!value->GetString(property, &string_value))
+ if (!value->GetAsString(&string_value))
return;
ParseEnum(string_value, enum_value, mapping);
@@ -190,6 +190,23 @@ std::string GetDisplayName(Feature::Context context) {
return "";
}
+std::string GetDisplayName(version_info::Channel channel) {
+ switch (channel) {
+ case version_info::Channel::UNKNOWN:
+ return "trunk";
+ case version_info::Channel::CANARY:
+ return "canary";
+ case version_info::Channel::DEV:
+ return "dev";
+ case version_info::Channel::BETA:
+ return "beta";
+ case version_info::Channel::STABLE:
+ return "stable";
+ }
+ NOTREACHED();
+ return "";
+}
+
// Gets a human-readable list of the display names (pluralized, comma separated
// with the "and" in the correct place) for each of |enum_types|.
template <typename EnumType>
@@ -274,9 +291,16 @@ struct SimpleFeature::Mappings {
platforms["linux"] = Feature::LINUX_PLATFORM;
platforms["mac"] = Feature::MACOSX_PLATFORM;
platforms["win"] = Feature::WIN_PLATFORM;
+
+ channels["trunk"] = version_info::Channel::UNKNOWN;
+ channels["canary"] = version_info::Channel::CANARY;
+ channels["dev"] = version_info::Channel::DEV;
+ channels["beta"] = version_info::Channel::BETA;
+ channels["stable"] = version_info::Channel::STABLE;
}
std::map<std::string, Manifest::Type> extension_types;
+ std::map<std::string, version_info::Channel> channels;
lazyboy 2016/07/12 00:35:13 nit: any reason this is here and not after |platfo
Devlin 2016/07/12 19:10:00 Nope, moved.
std::map<std::string, Feature::Context> contexts;
std::map<std::string, SimpleFeature::Location> locations;
std::map<std::string, Feature::Platform> platforms;
@@ -290,14 +314,6 @@ SimpleFeature::SimpleFeature()
SimpleFeature::~SimpleFeature() {}
-bool SimpleFeature::HasDependencies() const {
- return !dependencies_.empty();
-}
-
-void SimpleFeature::AddFilter(std::unique_ptr<SimpleFeatureFilter> filter) {
lazyboy 2016/07/12 00:35:12 As we're not using SimpleFeatureFilter anymore, we
Devlin 2016/07/12 19:10:00 Whoops! Meant to do that, but looks like I only g
- filters_.push_back(std::move(filter));
-}
-
std::string SimpleFeature::Parse(const base::DictionaryValue* dictionary) {
static base::LazyInstance<SimpleFeature::Mappings> mappings =
LAZY_INSTANCE_INITIALIZER;
@@ -323,8 +339,7 @@ std::string SimpleFeature::Parse(const base::DictionaryValue* dictionary) {
ParseEnumVector<Context>(value, &contexts_,
mappings.Get().contexts);
} else if (key == "location") {
- ParseEnum<Location>(dictionary, "location", &location_,
- mappings.Get().locations);
+ ParseEnum<Location>(value, &location_, mappings.Get().locations);
} else if (key == "platforms") {
ParseEnumVector<Platform>(value, &platforms_,
mappings.Get().platforms);
@@ -339,6 +354,10 @@ std::string SimpleFeature::Parse(const base::DictionaryValue* dictionary) {
&component_extensions_auto_granted_);
} else if (key == "command_line_switch") {
dictionary->GetString("command_line_switch", &command_line_switch_);
+ } else if (key == "channel") {
+ channel_.reset(new version_info::Channel(version_info::Channel::UNKNOWN));
+ ParseEnum<version_info::Channel>(value, channel_.get(),
+ mappings.Get().channels);
}
}
@@ -351,14 +370,12 @@ std::string SimpleFeature::Parse(const base::DictionaryValue* dictionary) {
// "matches" to be chromium.org/*. That sub-feature doesn't need to specify
// "web_page" context because it's inherited, but we don't know that here.
- std::string result;
- for (const auto& filter : filters_) {
- result = filter->Parse(dictionary);
- if (!result.empty())
- break;
- }
+ // All features must be channel-restricted, either directly or through
+ // dependents.
+ if (!channel_ && dependencies_.empty())
+ return name() + ": Must supply a value for channel or dependencies.";
- return result;
+ return std::string();
}
Feature::Availability SimpleFeature::IsAvailableToManifest(
@@ -410,11 +427,8 @@ Feature::Availability SimpleFeature::IsAvailableToManifest(
return CreateAvailability(MISSING_COMMAND_LINE_SWITCH, type);
}
- for (const auto& filter : filters_) {
- Availability availability = filter->IsAvailableToManifest(
- extension_id, type, location, manifest_version, platform);
- if (!availability.is_available())
- return availability;
+ if (channel_ && *channel_ < GetCurrentChannel()) {
lazyboy 2016/07/12 00:35:13 nit: drop {}
Devlin 2016/07/12 19:10:00 Done.
+ return CreateAvailability(UNSUPPORTED_CHANNEL, *channel_);
}
return CheckDependencies(base::Bind(&IsAvailableToManifestForBind,
@@ -455,13 +469,6 @@ Feature::Availability SimpleFeature::IsAvailableToContext(
return CreateAvailability(INVALID_URL, url);
}
- for (const auto& filter : filters_) {
- Availability availability =
- filter->IsAvailableToContext(extension, context, url, platform);
- if (!availability.is_available())
- return availability;
- }
-
// TODO(kalman): Assert that if the context was a webpage or WebUI context
// then at some point a "matches" restriction was checked.
return CheckDependencies(base::Bind(
@@ -472,7 +479,8 @@ std::string SimpleFeature::GetAvailabilityMessage(
AvailabilityResult result,
Manifest::Type type,
const GURL& url,
- Context context) const {
+ Context context,
+ version_info::Channel channel) const {
switch (result) {
case IS_AVAILABLE:
return std::string();
@@ -522,8 +530,9 @@ std::string SimpleFeature::GetAvailabilityMessage(
name().c_str());
case UNSUPPORTED_CHANNEL:
return base::StringPrintf(
- "'%s' is unsupported in this version of the platform.",
- name().c_str());
+ "'%s' requires %s channel or newer, but this is the %s channel.",
+ name().c_str(), GetDisplayName(channel).c_str(),
+ GetDisplayName(GetCurrentChannel()).c_str());
case MISSING_COMMAND_LINE_SWITCH:
return base::StringPrintf(
"'%s' requires the '%s' command line switch to be enabled.",
@@ -538,13 +547,15 @@ Feature::Availability SimpleFeature::CreateAvailability(
AvailabilityResult result) const {
return Availability(
result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, GURL(),
- UNSPECIFIED_CONTEXT));
+ UNSPECIFIED_CONTEXT,
+ version_info::Channel::UNKNOWN));
}
Feature::Availability SimpleFeature::CreateAvailability(
AvailabilityResult result, Manifest::Type type) const {
- return Availability(result, GetAvailabilityMessage(result, type, GURL(),
- UNSPECIFIED_CONTEXT));
+ return Availability(
+ result, GetAvailabilityMessage(result, type, GURL(), UNSPECIFIED_CONTEXT,
+ version_info::Channel::UNKNOWN));
}
Feature::Availability SimpleFeature::CreateAvailability(
@@ -552,7 +563,8 @@ Feature::Availability SimpleFeature::CreateAvailability(
const GURL& url) const {
return Availability(
result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, url,
- UNSPECIFIED_CONTEXT));
+ UNSPECIFIED_CONTEXT,
+ version_info::Channel::UNKNOWN));
}
Feature::Availability SimpleFeature::CreateAvailability(
@@ -560,7 +572,15 @@ Feature::Availability SimpleFeature::CreateAvailability(
Context context) const {
return Availability(
result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, GURL(),
- context));
+ context, version_info::Channel::UNKNOWN));
+}
+
+Feature::Availability SimpleFeature::CreateAvailability(
+ AvailabilityResult result,
+ version_info::Channel channel) const {
+ return Availability(
+ result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, GURL(),
+ UNSPECIFIED_CONTEXT, channel));
}
bool SimpleFeature::IsInternal() const {

Powered by Google App Engine
This is Rietveld 408576698