| Index: extensions/common/features/simple_feature.cc
|
| diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc
|
| index 37a0c80dc2572469423bd7d6ceb31b2d15ca6067..76172cc75b0fd9f70142a7baff84dcfd8931686f 100644
|
| --- a/extensions/common/features/simple_feature.cc
|
| +++ b/extensions/common/features/simple_feature.cc
|
| @@ -207,6 +207,19 @@ std::string GetDisplayName(version_info::Channel channel) {
|
| return "";
|
| }
|
|
|
| +std::string GetSessionTypeDisplayName(FeatureSessionType session_type) {
|
| + switch (session_type) {
|
| + case FeatureSessionType::UNKNOWN:
|
| + return "unknown";
|
| + case FeatureSessionType::KIOSK:
|
| + return "kiosk app";
|
| + case FeatureSessionType::REGULAR:
|
| + return "regular user";
|
| + default:
|
| + 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>
|
| @@ -297,6 +310,9 @@ struct SimpleFeature::Mappings {
|
| channels["dev"] = version_info::Channel::DEV;
|
| channels["beta"] = version_info::Channel::BETA;
|
| channels["stable"] = version_info::Channel::STABLE;
|
| +
|
| + session_types["regular"] = FeatureSessionType::REGULAR;
|
| + session_types["kiosk"] = FeatureSessionType::KIOSK;
|
| }
|
|
|
| std::map<std::string, Manifest::Type> extension_types;
|
| @@ -304,6 +320,7 @@ struct SimpleFeature::Mappings {
|
| std::map<std::string, SimpleFeature::Location> locations;
|
| std::map<std::string, Feature::Platform> platforms;
|
| std::map<std::string, version_info::Channel> channels;
|
| + std::map<std::string, FeatureSessionType> session_types;
|
| };
|
|
|
| SimpleFeature::SimpleFeature()
|
| @@ -339,6 +356,9 @@ void SimpleFeature::Parse(const base::DictionaryValue* dictionary) {
|
| } else if (key == "contexts") {
|
| ParseEnumVector<Context>(value, &contexts_,
|
| mappings.Get().contexts);
|
| + } else if (key == "session_types") {
|
| + ParseEnumVector<FeatureSessionType>(value, &session_types_,
|
| + mappings.Get().session_types);
|
| } else if (key == "location") {
|
| ParseEnum<Location>(value, &location_, mappings.Get().locations);
|
| } else if (key == "platforms") {
|
| @@ -448,7 +468,7 @@ Feature::Availability SimpleFeature::IsAvailableToManifest(
|
|
|
| Feature::Availability SimpleFeature::IsAvailableToContext(
|
| const Extension* extension,
|
| - SimpleFeature::Context context,
|
| + Feature::Context context,
|
| const GURL& url,
|
| SimpleFeature::Platform platform) const {
|
| if (extension) {
|
| @@ -476,10 +496,16 @@ Feature::Availability SimpleFeature::IsAvailableToContext(
|
| return CreateAvailability(INVALID_URL, url);
|
| }
|
|
|
| + FeatureSessionType session_type = GetCurrentFeatureSessionType();
|
| + if (!session_types_.empty() &&
|
| + !base::ContainsValue(session_types_, session_type)) {
|
| + return CreateAvailability(INVALID_SESSION_TYPE, session_type);
|
| + }
|
| +
|
| // 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(
|
| - &IsAvailableToContextForBind, extension, context, url, platform));
|
| + return CheckDependencies(base::Bind(&IsAvailableToContextForBind, extension,
|
| + context, url, platform));
|
| }
|
|
|
| std::string SimpleFeature::GetAvailabilityMessage(
|
| @@ -487,7 +513,8 @@ std::string SimpleFeature::GetAvailabilityMessage(
|
| Manifest::Type type,
|
| const GURL& url,
|
| Context context,
|
| - version_info::Channel channel) const {
|
| + version_info::Channel channel,
|
| + FeatureSessionType session_type) const {
|
| switch (result) {
|
| case IS_AVAILABLE:
|
| return std::string();
|
| @@ -531,6 +558,10 @@ std::string SimpleFeature::GetAvailabilityMessage(
|
| "'%s' requires manifest version of %d or lower.",
|
| name().c_str(),
|
| max_manifest_version_);
|
| + case INVALID_SESSION_TYPE:
|
| + return base::StringPrintf(
|
| + "'%s' is not allowed in %s session", name().c_str(),
|
| + GetSessionTypeDisplayName(session_type).c_str());
|
| case NOT_PRESENT:
|
| return base::StringPrintf(
|
| "'%s' requires a different Feature that is not present.",
|
| @@ -553,25 +584,26 @@ std::string SimpleFeature::GetAvailabilityMessage(
|
| Feature::Availability SimpleFeature::CreateAvailability(
|
| AvailabilityResult result) const {
|
| return Availability(
|
| - result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, GURL(),
|
| - UNSPECIFIED_CONTEXT,
|
| - version_info::Channel::UNKNOWN));
|
| + result, GetAvailabilityMessage(
|
| + result, Manifest::TYPE_UNKNOWN, GURL(), UNSPECIFIED_CONTEXT,
|
| + version_info::Channel::UNKNOWN, FeatureSessionType::UNKNOWN));
|
| }
|
|
|
| Feature::Availability SimpleFeature::CreateAvailability(
|
| AvailabilityResult result, Manifest::Type type) const {
|
| return Availability(
|
| result, GetAvailabilityMessage(result, type, GURL(), UNSPECIFIED_CONTEXT,
|
| - version_info::Channel::UNKNOWN));
|
| + version_info::Channel::UNKNOWN,
|
| + FeatureSessionType::UNKNOWN));
|
| }
|
|
|
| Feature::Availability SimpleFeature::CreateAvailability(
|
| AvailabilityResult result,
|
| const GURL& url) const {
|
| return Availability(
|
| - result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, url,
|
| - UNSPECIFIED_CONTEXT,
|
| - version_info::Channel::UNKNOWN));
|
| + result, GetAvailabilityMessage(
|
| + result, Manifest::TYPE_UNKNOWN, url, UNSPECIFIED_CONTEXT,
|
| + version_info::Channel::UNKNOWN, FeatureSessionType::UNKNOWN));
|
| }
|
|
|
| Feature::Availability SimpleFeature::CreateAvailability(
|
| @@ -579,7 +611,8 @@ Feature::Availability SimpleFeature::CreateAvailability(
|
| Context context) const {
|
| return Availability(
|
| result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, GURL(),
|
| - context, version_info::Channel::UNKNOWN));
|
| + context, version_info::Channel::UNKNOWN,
|
| + FeatureSessionType::UNKNOWN));
|
| }
|
|
|
| Feature::Availability SimpleFeature::CreateAvailability(
|
| @@ -587,7 +620,17 @@ Feature::Availability SimpleFeature::CreateAvailability(
|
| version_info::Channel channel) const {
|
| return Availability(
|
| result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, GURL(),
|
| - UNSPECIFIED_CONTEXT, channel));
|
| + UNSPECIFIED_CONTEXT, channel,
|
| + FeatureSessionType::UNKNOWN));
|
| +}
|
| +
|
| +Feature::Availability SimpleFeature::CreateAvailability(
|
| + AvailabilityResult result,
|
| + FeatureSessionType session_type) const {
|
| + return Availability(
|
| + result, GetAvailabilityMessage(
|
| + result, Manifest::TYPE_UNKNOWN, GURL(), UNSPECIFIED_CONTEXT,
|
| + version_info::Channel::UNKNOWN, session_type));
|
| }
|
|
|
| bool SimpleFeature::IsInternal() const {
|
| @@ -691,6 +734,11 @@ void SimpleFeature::set_extension_types(
|
| extension_types_ = types;
|
| }
|
|
|
| +void SimpleFeature::set_session_types(
|
| + std::initializer_list<FeatureSessionType> types) {
|
| + session_types_ = types;
|
| +}
|
| +
|
| void SimpleFeature::set_matches(
|
| std::initializer_list<const char* const> matches) {
|
| matches_.ClearPatterns();
|
|
|