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..b30ba4f8e4d7f6953fcee849cf54131fba3d545a 100644 |
--- a/extensions/common/features/simple_feature.cc |
+++ b/extensions/common/features/simple_feature.cc |
@@ -126,6 +126,20 @@ std::string GetDisplayName(version_info::Channel channel) { |
return ""; |
} |
+std::string GetDisplayName(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"; |
+ } |
+ 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 +259,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 +275,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 +303,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 +320,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 +365,14 @@ 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 only allowed to run in %s sessions, but this is %s session.", |
+ name().c_str(), |
+ ListDisplayNames(std::vector<FeatureSessionType>( |
+ session_types_.begin(), session_types_.end())) |
+ .c_str(), |
+ GetDisplayName(session_type).c_str()); |
case NOT_PRESENT: |
return base::StringPrintf( |
"'%s' requires a different Feature that is not present.", |
@@ -360,25 +395,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 +422,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 +431,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 +545,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(); |