summaryrefslogtreecommitdiffstats
path: root/chrome/common/extensions/features
diff options
context:
space:
mode:
authormihaip@chromium.org <mihaip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-30 17:02:15 +0000
committermihaip@chromium.org <mihaip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-30 17:02:15 +0000
commit022a9850ad8b9e20f99c09a32eeda4a3e6a260c5 (patch)
tree2724878ae4585bca030dbb02ddd911d8d8a4d017 /chrome/common/extensions/features
parent3e3bdc930c46fc4d50c1a8ae4403c28ba56b0b76 (diff)
downloadchromium_src-022a9850ad8b9e20f99c09a32eeda4a3e6a260c5.zip
chromium_src-022a9850ad8b9e20f99c09a32eeda4a3e6a260c5.tar.gz
chromium_src-022a9850ad8b9e20f99c09a32eeda4a3e6a260c5.tar.bz2
Include the allowed and current extension types when displaying INVALID_TYPE warnings.
Instead of: 'app.launch' is not allowed for specified package type (theme, app, etc.). We now have: 'app.launch' is only allowed for hosted apps and legacy packaged apps, and this is a packaged app. BUG=145256 R=kalman@chromium.org Review URL: https://chromiumcodereview.appspot.com/10900012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@154178 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/extensions/features')
-rw-r--r--chrome/common/extensions/features/feature.cc186
-rw-r--r--chrome/common/extensions/features/feature.h30
-rw-r--r--chrome/common/extensions/features/feature_unittest.cc64
-rw-r--r--chrome/common/extensions/features/manifest_feature.cc6
-rw-r--r--chrome/common/extensions/features/permission_feature.cc6
-rw-r--r--chrome/common/extensions/features/simple_feature_provider_unittest.cc12
6 files changed, 192 insertions, 112 deletions
diff --git a/chrome/common/extensions/features/feature.cc b/chrome/common/extensions/features/feature.cc
index b7485f1..1d2e0c3 100644
--- a/chrome/common/extensions/features/feature.cc
+++ b/chrome/common/extensions/features/feature.cc
@@ -9,6 +9,7 @@
#include "base/command_line.h"
#include "base/lazy_instance.h"
#include "base/stringprintf.h"
+#include "base/string_util.h"
#include "chrome/common/chrome_switches.h"
using chrome::VersionInfo;
@@ -135,6 +136,29 @@ void ParseEnumSet(const DictionaryValue* value,
}
}
+// Gets a human-readable name for the given extension type.
+std::string GetDisplayTypeName(Extension::Type type) {
+ switch (type) {
+ case Extension::TYPE_UNKNOWN:
+ return "unknown";
+ case Extension::TYPE_EXTENSION:
+ return "extension";
+ case Extension::TYPE_HOSTED_APP:
+ return "hosted app";
+ case Extension::TYPE_PACKAGED_APP:
+ return "legacy packaged app";
+ case Extension::TYPE_PLATFORM_APP:
+ return "packaged app";
+ case Extension::TYPE_THEME:
+ return "theme";
+ case Extension::TYPE_USER_SCRIPT:
+ return "user script";
+ }
+
+ NOTREACHED();
+ return "";
+}
+
} // namespace
namespace extensions {
@@ -206,57 +230,6 @@ void Feature::Parse(const DictionaryValue* value) {
g_mappings.Get().channels);
}
-std::string Feature::GetErrorMessage(Feature::Availability result) {
- switch (result) {
- case IS_AVAILABLE:
- return "";
- case NOT_FOUND_IN_WHITELIST:
- return base::StringPrintf(
- "'%s' is not allowed for specified extension ID.",
- name().c_str());
- case INVALID_TYPE:
- return base::StringPrintf(
- "'%s' is not allowed for specified package type (theme, app, etc.).",
- name().c_str());
- case INVALID_CONTEXT:
- return base::StringPrintf(
- "'%s' is not allowed for specified context type content script, "
- " extension page, web page, etc.).",
- name().c_str());
- case INVALID_LOCATION:
- return base::StringPrintf(
- "'%s' is not allowed for specified install location.",
- name().c_str());
- case INVALID_PLATFORM:
- return base::StringPrintf(
- "'%s' is not allowed for specified platform.",
- name().c_str());
- case INVALID_MIN_MANIFEST_VERSION:
- return base::StringPrintf(
- "'%s' requires manifest version of at least %d.",
- name().c_str(),
- min_manifest_version_);
- case INVALID_MAX_MANIFEST_VERSION:
- return base::StringPrintf(
- "'%s' requires manifest version of %d or lower.",
- name().c_str(),
- max_manifest_version_);
- case NOT_PRESENT:
- return base::StringPrintf(
- "'%s' requires a different Feature that is not present.",
- name().c_str());
- case UNSUPPORTED_CHANNEL:
- return base::StringPrintf(
- "'%s' requires Google Chrome %s channel or newer, and we're running "
- "on the %s channel.",
- name().c_str(),
- GetChannelName(channel_).c_str(),
- GetChannelName(GetCurrentChannel()).c_str());
- }
-
- return "";
-}
-
Feature::Availability Feature::IsAvailableToManifest(
const std::string& extension_id,
Extension::Type type,
@@ -265,7 +238,7 @@ Feature::Availability Feature::IsAvailableToManifest(
Platform platform) const {
// Component extensions can access any feature.
if (location == COMPONENT_LOCATION)
- return IS_AVAILABLE;
+ return CreateAvailability(IS_AVAILABLE, type);
if (!whitelist_.empty()) {
if (whitelist_.find(extension_id) == whitelist_.end()) {
@@ -273,37 +246,37 @@ Feature::Availability Feature::IsAvailableToManifest(
// whitelist.
CommandLine* command_line = CommandLine::ForCurrentProcess();
if (!command_line->HasSwitch(switches::kWhitelistedExtensionID))
- return NOT_FOUND_IN_WHITELIST;
+ return CreateAvailability(NOT_FOUND_IN_WHITELIST, type);
std::string whitelist_switch_value =
CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kWhitelistedExtensionID);
if (extension_id != whitelist_switch_value)
- return NOT_FOUND_IN_WHITELIST;
+ return CreateAvailability(NOT_FOUND_IN_WHITELIST, type);
}
}
if (!extension_types_.empty() &&
extension_types_.find(type) == extension_types_.end()) {
- return INVALID_TYPE;
+ return CreateAvailability(INVALID_TYPE, type);
}
if (location_ != UNSPECIFIED_LOCATION && location_ != location)
- return INVALID_LOCATION;
+ return CreateAvailability(INVALID_LOCATION, type);
if (platform_ != UNSPECIFIED_PLATFORM && platform_ != platform)
- return INVALID_PLATFORM;
+ return CreateAvailability(INVALID_PLATFORM, type);
if (min_manifest_version_ != 0 && manifest_version < min_manifest_version_)
- return INVALID_MIN_MANIFEST_VERSION;
+ return CreateAvailability(INVALID_MIN_MANIFEST_VERSION, type);
if (max_manifest_version_ != 0 && manifest_version > max_manifest_version_)
- return INVALID_MAX_MANIFEST_VERSION;
+ return CreateAvailability(INVALID_MAX_MANIFEST_VERSION, type);
if (channel_ < g_current_channel)
- return UNSUPPORTED_CHANNEL;
+ return CreateAvailability(UNSUPPORTED_CHANNEL, type);
- return IS_AVAILABLE;
+ return CreateAvailability(IS_AVAILABLE, type);
}
Feature::Availability Feature::IsAvailableToContext(
@@ -316,15 +289,15 @@ Feature::Availability Feature::IsAvailableToContext(
ConvertLocation(extension->location()),
extension->manifest_version(),
platform);
- if (result != IS_AVAILABLE)
+ if (!result.is_available())
return result;
if (!contexts_.empty() &&
contexts_.find(context) == contexts_.end()) {
- return INVALID_CONTEXT;
+ return CreateAvailability(INVALID_CONTEXT, extension->GetType());
}
- return IS_AVAILABLE;
+ return CreateAvailability(IS_AVAILABLE);
}
// static
@@ -342,4 +315,87 @@ chrome::VersionInfo::Channel Feature::GetDefaultChannel() {
return kDefaultChannel;
}
-} // namespace
+Feature::Availability Feature::CreateAvailability(
+ AvailabilityResult result) const {
+ return Availability(
+ result, GetAvailabilityMessage(result, Extension::TYPE_UNKNOWN));
+}
+
+Feature::Availability Feature::CreateAvailability(
+ AvailabilityResult result, Extension::Type type) const {
+ return Availability(result, GetAvailabilityMessage(result, type));
+}
+
+std::string Feature::GetAvailabilityMessage(
+ AvailabilityResult result, Extension::Type type) const {
+ switch (result) {
+ case IS_AVAILABLE:
+ return "";
+ case NOT_FOUND_IN_WHITELIST:
+ return base::StringPrintf(
+ "'%s' is not allowed for specified extension ID.",
+ name().c_str());
+ case INVALID_TYPE: {
+ std::string allowed_type_names;
+ // Turn the set of allowed types into a vector so that it's easier to
+ // inject the appropriate separator into the display string.
+ std::vector<Extension::Type> extension_types(
+ extension_types_.begin(), extension_types_.end());
+ for (size_t i = 0; i < extension_types.size(); i++) {
+ // Pluralize type name.
+ allowed_type_names += GetDisplayTypeName(extension_types[i]) + "s";
+ if (i == extension_types_.size() - 2) {
+ allowed_type_names += " and ";
+ } else if (i != extension_types_.size() - 1) {
+ allowed_type_names += ", ";
+ }
+ }
+
+ return base::StringPrintf(
+ "'%s' is only allowed for %s, and this is a %s.",
+ name().c_str(),
+ allowed_type_names.c_str(),
+ GetDisplayTypeName(type).c_str());
+ }
+ case INVALID_CONTEXT:
+ return base::StringPrintf(
+ "'%s' is not allowed for specified context type content script, "
+ " extension page, web page, etc.).",
+ name().c_str());
+ case INVALID_LOCATION:
+ return base::StringPrintf(
+ "'%s' is not allowed for specified install location.",
+ name().c_str());
+ case INVALID_PLATFORM:
+ return base::StringPrintf(
+ "'%s' is not allowed for specified platform.",
+ name().c_str());
+ case INVALID_MIN_MANIFEST_VERSION:
+ return base::StringPrintf(
+ "'%s' requires manifest version of at least %d.",
+ name().c_str(),
+ min_manifest_version_);
+ case INVALID_MAX_MANIFEST_VERSION:
+ return base::StringPrintf(
+ "'%s' requires manifest version of %d or lower.",
+ name().c_str(),
+ max_manifest_version_);
+ case NOT_PRESENT:
+ return base::StringPrintf(
+ "'%s' requires a different Feature that is not present.",
+ name().c_str());
+ case UNSUPPORTED_CHANNEL:
+ return base::StringPrintf(
+ "'%s' requires Google Chrome %s channel or newer, and this is the "
+ "%s channel.",
+ name().c_str(),
+ GetChannelName(channel_).c_str(),
+ GetChannelName(GetCurrentChannel()).c_str());
+ }
+
+ NOTREACHED();
+ return "";
+}
+
+
+} // namespace extensions
diff --git a/chrome/common/extensions/features/feature.h b/chrome/common/extensions/features/feature.h
index f0324ab..4171183 100644
--- a/chrome/common/extensions/features/feature.h
+++ b/chrome/common/extensions/features/feature.h
@@ -51,7 +51,7 @@ class Feature {
// Whether a feature is available in a given situation or not, and if not,
// why not.
- enum Availability {
+ enum AvailabilityResult {
IS_AVAILABLE,
NOT_FOUND_IN_WHITELIST,
INVALID_TYPE,
@@ -64,6 +64,25 @@ class Feature {
UNSUPPORTED_CHANNEL,
};
+ // Container for AvailabiltyResult that also exposes a user-visible error
+ // message in cases where the feature is not available.
+ class Availability {
+ public:
+ AvailabilityResult result() const { return result_; }
+ bool is_available() const { return result_ == IS_AVAILABLE; }
+ const std::string& message() const { return message_; }
+
+ private:
+ friend class Feature;
+
+ // Instances should be created via Feature::CreateAvailability.
+ Availability(AvailabilityResult result, const std::string& message)
+ : result_(result), message_(message) { }
+
+ const AvailabilityResult result_;
+ const std::string message_;
+ };
+
Feature();
Feature(const Feature& other);
virtual ~Feature();
@@ -158,10 +177,15 @@ class Feature {
Context context,
Platform platform) const;
- // Returns an error message for an Availability code.
- std::string GetErrorMessage(Availability result);
+ protected:
+ Availability CreateAvailability(AvailabilityResult result) const;
+ Availability CreateAvailability(AvailabilityResult result,
+ Extension::Type type) const;
private:
+ std::string GetAvailabilityMessage(
+ AvailabilityResult result, Extension::Type type) const;
+
std::string name_;
// For clarify and consistency, we handle the default value of each of these
diff --git a/chrome/common/extensions/features/feature_unittest.cc b/chrome/common/extensions/features/feature_unittest.cc
index a9dcb69..1d4a4aa 100644
--- a/chrome/common/extensions/features/feature_unittest.cc
+++ b/chrome/common/extensions/features/feature_unittest.cc
@@ -18,7 +18,7 @@ struct IsAvailableTestData {
Feature::Location location;
Feature::Platform platform;
int manifest_version;
- Feature::Availability expected_result;
+ Feature::AvailabilityResult expected_result;
};
class ExtensionFeatureTest : public testing::Test {
@@ -64,7 +64,7 @@ TEST_F(ExtensionFeatureTest, IsAvailableNullCase) {
test.extension_type,
test.location,
test.manifest_version,
- test.platform));
+ test.platform).result());
}
}
@@ -75,22 +75,22 @@ TEST_F(ExtensionFeatureTest, Whitelist) {
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"foo", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"bar", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest(
"baz", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP);
EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest(
"baz", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
}
TEST_F(ExtensionFeatureTest, PackageType) {
@@ -100,17 +100,17 @@ TEST_F(ExtensionFeatureTest, PackageType) {
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"", Extension::TYPE_EXTENSION, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToManifest(
"", Extension::TYPE_THEME, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
}
TEST_F(ExtensionFeatureTest, Context) {
@@ -136,14 +136,14 @@ TEST_F(ExtensionFeatureTest, Context) {
feature.whitelist()->insert("monkey");
EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToContext(
extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
- Feature::CHROMEOS_PLATFORM));
+ Feature::CHROMEOS_PLATFORM).result());
feature.whitelist()->clear();
feature.extension_types()->clear();
feature.extension_types()->insert(Extension::TYPE_THEME);
EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToContext(
extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
- Feature::CHROMEOS_PLATFORM));
+ Feature::CHROMEOS_PLATFORM).result());
feature.extension_types()->clear();
feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP);
@@ -151,30 +151,30 @@ TEST_F(ExtensionFeatureTest, Context) {
feature.contexts()->insert(Feature::UNBLESSED_EXTENSION_CONTEXT);
EXPECT_EQ(Feature::INVALID_CONTEXT, feature.IsAvailableToContext(
extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
- Feature::CHROMEOS_PLATFORM));
+ Feature::CHROMEOS_PLATFORM).result());
feature.contexts()->clear();
feature.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT);
feature.set_location(Feature::COMPONENT_LOCATION);
EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailableToContext(
extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
- Feature::CHROMEOS_PLATFORM));
+ Feature::CHROMEOS_PLATFORM).result());
feature.set_location(Feature::UNSPECIFIED_LOCATION);
EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailableToContext(
extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
feature.set_min_manifest_version(22);
EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, feature.IsAvailableToContext(
extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
- Feature::CHROMEOS_PLATFORM));
+ Feature::CHROMEOS_PLATFORM).result());
feature.set_min_manifest_version(21);
feature.set_max_manifest_version(18);
EXPECT_EQ(Feature::INVALID_MAX_MANIFEST_VERSION, feature.IsAvailableToContext(
extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
- Feature::CHROMEOS_PLATFORM));
+ Feature::CHROMEOS_PLATFORM).result());
feature.set_max_manifest_version(25);
}
@@ -186,16 +186,16 @@ TEST_F(ExtensionFeatureTest, Location) {
feature.set_location(Feature::COMPONENT_LOCATION);
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
// But component extensions can access anything else, whatever their location.
feature.set_location(Feature::UNSPECIFIED_LOCATION);
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
}
TEST_F(ExtensionFeatureTest, Platform) {
@@ -203,10 +203,10 @@ TEST_F(ExtensionFeatureTest, Platform) {
feature.set_platform(Feature::CHROMEOS_PLATFORM);
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::CHROMEOS_PLATFORM));
+ Feature::CHROMEOS_PLATFORM).result());
EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
- Feature::UNSPECIFIED_PLATFORM));
+ Feature::UNSPECIFIED_PLATFORM).result());
}
TEST_F(ExtensionFeatureTest, Version) {
@@ -216,32 +216,32 @@ TEST_F(ExtensionFeatureTest, Version) {
EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION,
feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
- 0, Feature::UNSPECIFIED_PLATFORM));
+ 0, Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION,
feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
- 4, Feature::UNSPECIFIED_PLATFORM));
+ 4, Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
- 5, Feature::UNSPECIFIED_PLATFORM));
+ 5, Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
- 10, Feature::UNSPECIFIED_PLATFORM));
+ 10, Feature::UNSPECIFIED_PLATFORM).result());
feature.set_max_manifest_version(8);
EXPECT_EQ(Feature::INVALID_MAX_MANIFEST_VERSION,
feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
- 10, Feature::UNSPECIFIED_PLATFORM));
+ 10, Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::IS_AVAILABLE,
feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
- 8, Feature::UNSPECIFIED_PLATFORM));
+ 8, Feature::UNSPECIFIED_PLATFORM).result());
EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
"", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
- 7, Feature::UNSPECIFIED_PLATFORM));
+ 7, Feature::UNSPECIFIED_PLATFORM).result());
}
TEST_F(ExtensionFeatureTest, ParseNull) {
@@ -426,7 +426,7 @@ TEST_F(ExtensionFeatureTest, Equals) {
EXPECT_FALSE(feature2.Equals(feature));
}
-Feature::Availability IsAvailableInChannel(
+Feature::AvailabilityResult IsAvailableInChannel(
const std::string& channel, VersionInfo::Channel channel_for_testing) {
Feature::ScopedCurrentChannel current_channel(channel_for_testing);
@@ -441,7 +441,7 @@ Feature::Availability IsAvailableInChannel(
"random-extension",
Extension::TYPE_UNKNOWN,
Feature::UNSPECIFIED_LOCATION,
- -1);
+ -1).result();
}
TEST_F(ExtensionFeatureTest, SupportedChannel) {
diff --git a/chrome/common/extensions/features/manifest_feature.cc b/chrome/common/extensions/features/manifest_feature.cc
index d55e5e5..5d7c5a4 100644
--- a/chrome/common/extensions/features/manifest_feature.cc
+++ b/chrome/common/extensions/features/manifest_feature.cc
@@ -21,15 +21,15 @@ Feature::Availability ManifestFeature::IsAvailableToContext(
Availability availability = Feature::IsAvailableToContext(extension,
context,
platform);
- if (availability != IS_AVAILABLE)
+ if (!availability.is_available())
return availability;
// We know we can skip manifest()->GetKey() here because we just did the same
// validation it would do above.
if (!extension->manifest()->value()->HasKey(name()))
- return NOT_PRESENT;
+ return CreateAvailability(NOT_PRESENT, extension->GetType());
- return IS_AVAILABLE;
+ return CreateAvailability(IS_AVAILABLE);
}
} // namespace
diff --git a/chrome/common/extensions/features/permission_feature.cc b/chrome/common/extensions/features/permission_feature.cc
index 907fd0a..ea02083 100644
--- a/chrome/common/extensions/features/permission_feature.cc
+++ b/chrome/common/extensions/features/permission_feature.cc
@@ -19,13 +19,13 @@ Feature::Availability PermissionFeature::IsAvailableToContext(
Availability availability = Feature::IsAvailableToContext(extension,
context,
platform);
- if (availability != IS_AVAILABLE)
+ if (!availability.is_available())
return availability;
if (!extension->HasAPIPermission(name()))
- return NOT_PRESENT;
+ return CreateAvailability(NOT_PRESENT, extension->GetType());
- return IS_AVAILABLE;
+ return CreateAvailability(IS_AVAILABLE);
}
} // namespace
diff --git a/chrome/common/extensions/features/simple_feature_provider_unittest.cc b/chrome/common/extensions/features/simple_feature_provider_unittest.cc
index bbb5d71..64d95bb 100644
--- a/chrome/common/extensions/features/simple_feature_provider_unittest.cc
+++ b/chrome/common/extensions/features/simple_feature_provider_unittest.cc
@@ -36,17 +36,17 @@ TEST(SimpleFeatureProvider, ManifestFeatures) {
ASSERT_TRUE(extension.get());
EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext(
- extension.get(), Feature::UNSPECIFIED_CONTEXT));
+ extension.get(), Feature::UNSPECIFIED_CONTEXT).result());
feature = provider->GetFeature("theme");
ASSERT_TRUE(feature);
EXPECT_EQ(Feature::INVALID_TYPE, feature->IsAvailableToContext(
- extension.get(), Feature::UNSPECIFIED_CONTEXT));
+ extension.get(), Feature::UNSPECIFIED_CONTEXT).result());
feature = provider->GetFeature("devtools_page");
ASSERT_TRUE(feature);
EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext(
- extension.get(), Feature::UNSPECIFIED_CONTEXT));
+ extension.get(), Feature::UNSPECIFIED_CONTEXT).result());
}
TEST(SimpleFeatureProvider, PermissionFeatures) {
@@ -75,17 +75,17 @@ TEST(SimpleFeatureProvider, PermissionFeatures) {
ASSERT_TRUE(extension.get());
EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext(
- extension.get(), Feature::UNSPECIFIED_CONTEXT));
+ extension.get(), Feature::UNSPECIFIED_CONTEXT).result());
feature = provider->GetFeature("chromePrivate");
ASSERT_TRUE(feature);
EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature->IsAvailableToContext(
- extension.get(), Feature::UNSPECIFIED_CONTEXT));
+ extension.get(), Feature::UNSPECIFIED_CONTEXT).result());
feature = provider->GetFeature("clipboardWrite");
ASSERT_TRUE(feature);
EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext(
- extension.get(), Feature::UNSPECIFIED_CONTEXT));
+ extension.get(), Feature::UNSPECIFIED_CONTEXT).result());
}
TEST(SimpleFeatureProvider, Validation) {