Chromium Code Reviews| Index: extensions/common/features/simple_feature.cc |
| diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc |
| index 048fcfb892a81b4015d02173644ccc4551e92e95..81671e48dc75263173eee1ef0b684bfd1aef7793 100644 |
| --- a/extensions/common/features/simple_feature.cc |
| +++ b/extensions/common/features/simple_feature.cc |
| @@ -126,6 +126,21 @@ std::string GetDisplayName(version_info::Channel channel) { |
| return ""; |
| } |
| +std::string GetSessionTypeDisplayName(FeatureSessionType session_type) { |
| + switch (session_type) { |
| + case FeatureSessionType::INITIAL: |
| + return "user-less"; |
| + case FeatureSessionType::UNKNOWN: |
| + return "unknown"; |
| + case FeatureSessionType::KIOSK: |
| + return "kiosk app"; |
| + case FeatureSessionType::REGULAR: |
| + return "regular user"; |
| + default: |
|
Devlin
2016/09/12 22:33:08
Prefer not using default so that future additions
tbarzic
2016/09/12 23:05:10
Done.
|
| + 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> |
| @@ -245,6 +260,12 @@ Feature::Availability SimpleFeature::IsAvailableToManifest( |
| if (channel_ && *channel_ < GetCurrentChannel()) |
| return CreateAvailability(UNSUPPORTED_CHANNEL, *channel_); |
| + FeatureSessionType session = GetCurrentFeatureSessionType(); |
| + if (!session_types_.empty() && |
| + !base::ContainsValue(session_types_, session)) { |
| + return CreateAvailability(INVALID_SESSION_TYPE, session); |
| + } |
| + |
| return CheckDependencies(base::Bind(&IsAvailableToManifestForBind, |
| extension_id, |
| type, |
| @@ -255,7 +276,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) { |
| @@ -283,10 +304,16 @@ Feature::Availability SimpleFeature::IsAvailableToContext( |
| return CreateAvailability(INVALID_URL, url); |
| } |
| + FeatureSessionType session = GetCurrentFeatureSessionType(); |
| + if (!session_types_.empty() && |
| + !base::ContainsValue(session_types_, session)) { |
| + return CreateAvailability(INVALID_SESSION_TYPE, session); |
| + } |
| + |
| // 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( |
| @@ -294,7 +321,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(); |
| @@ -338,6 +366,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.", |
| @@ -360,25 +392,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( |
| @@ -386,7 +419,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( |
| @@ -394,7 +428,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 { |
| @@ -498,6 +542,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(); |