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

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

Issue 241673002: Support a "policy" extension location in extension features files. At the same (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: different approach (yoz) Created 6 years, 8 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 ebb9cb21fd43de212945780a7b52296ac0182708..6914558c7fdb3a05992fc13957e0cebb7f1915a4 100644
--- a/extensions/common/features/simple_feature.cc
+++ b/extensions/common/features/simple_feature.cc
@@ -8,7 +8,6 @@
#include <vector>
#include "base/command_line.h"
-#include "base/lazy_instance.h"
#include "base/sha1.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -19,37 +18,6 @@ namespace extensions {
namespace {
-struct Mappings {
- Mappings() {
- extension_types["extension"] = Manifest::TYPE_EXTENSION;
- extension_types["theme"] = Manifest::TYPE_THEME;
- extension_types["legacy_packaged_app"] = Manifest::TYPE_LEGACY_PACKAGED_APP;
- extension_types["hosted_app"] = Manifest::TYPE_HOSTED_APP;
- extension_types["platform_app"] = Manifest::TYPE_PLATFORM_APP;
- extension_types["shared_module"] = Manifest::TYPE_SHARED_MODULE;
-
- contexts["blessed_extension"] = Feature::BLESSED_EXTENSION_CONTEXT;
- contexts["unblessed_extension"] = Feature::UNBLESSED_EXTENSION_CONTEXT;
- contexts["content_script"] = Feature::CONTENT_SCRIPT_CONTEXT;
- contexts["web_page"] = Feature::WEB_PAGE_CONTEXT;
- contexts["blessed_web_page"] = Feature::BLESSED_WEB_PAGE_CONTEXT;
-
- locations["component"] = Feature::COMPONENT_LOCATION;
-
- platforms["chromeos"] = Feature::CHROMEOS_PLATFORM;
- platforms["linux"] = Feature::LINUX_PLATFORM;
- platforms["mac"] = Feature::MACOSX_PLATFORM;
- platforms["win"] = Feature::WIN_PLATFORM;
- }
-
- std::map<std::string, Manifest::Type> extension_types;
- std::map<std::string, Feature::Context> contexts;
- std::map<std::string, Feature::Location> locations;
- std::map<std::string, Feature::Platform> platforms;
-};
-
-base::LazyInstance<Mappings> g_mappings = LAZY_INSTANCE_INITIALIZER;
-
// TODO(aa): Can we replace all this manual parsing with JSON schema stuff?
void ParseSet(const base::DictionaryValue* value,
@@ -214,6 +182,40 @@ std::string HashExtensionId(const std::string& extension_id) {
} // namespace
+struct SimpleFeature::Mappings {
+ Mappings() {
+ extension_types["extension"] = Manifest::TYPE_EXTENSION;
+ extension_types["theme"] = Manifest::TYPE_THEME;
+ extension_types["legacy_packaged_app"] = Manifest::TYPE_LEGACY_PACKAGED_APP;
+ extension_types["hosted_app"] = Manifest::TYPE_HOSTED_APP;
+ extension_types["platform_app"] = Manifest::TYPE_PLATFORM_APP;
+ extension_types["shared_module"] = Manifest::TYPE_SHARED_MODULE;
+
+ contexts["blessed_extension"] = Feature::BLESSED_EXTENSION_CONTEXT;
+ contexts["unblessed_extension"] = Feature::UNBLESSED_EXTENSION_CONTEXT;
+ contexts["content_script"] = Feature::CONTENT_SCRIPT_CONTEXT;
+ contexts["web_page"] = Feature::WEB_PAGE_CONTEXT;
+ contexts["blessed_web_page"] = Feature::BLESSED_WEB_PAGE_CONTEXT;
+
+ locations["component"] = SimpleFeature::COMPONENT_LOCATION;
+ locations["policy"] = SimpleFeature::POLICY_LOCATION;
+
+ platforms["chromeos"] = Feature::CHROMEOS_PLATFORM;
+ platforms["linux"] = Feature::LINUX_PLATFORM;
+ platforms["mac"] = Feature::MACOSX_PLATFORM;
+ platforms["win"] = Feature::WIN_PLATFORM;
+ }
+
+ std::map<std::string, Manifest::Type> extension_types;
+ std::map<std::string, Feature::Context> contexts;
+ std::map<std::string, SimpleFeature::Location> locations;
+ std::map<std::string, Feature::Platform> platforms;
+};
+
+// static
+base::LazyInstance<SimpleFeature::Mappings> SimpleFeature::g_mappings =
+ LAZY_INSTANCE_INITIALIZER;
+
SimpleFeature::SimpleFeature()
: location_(UNSPECIFIED_LOCATION),
min_manifest_version_(0),
@@ -264,7 +266,7 @@ std::string SimpleFeature::Parse(const base::DictionaryValue* value) {
Feature::Availability SimpleFeature::IsAvailableToManifest(
const std::string& extension_id,
Manifest::Type type,
- Location location,
+ Manifest::Location location,
int manifest_version,
Platform platform) const {
// Check extension type first to avoid granting platform app permissions
@@ -279,7 +281,8 @@ Feature::Availability SimpleFeature::IsAvailableToManifest(
}
// Component extensions can access any feature.
- if (location == COMPONENT_LOCATION)
+ // TODO(kalman/asargent): Should this match EXTERNAL_COMPONENT too?
+ if (location == Manifest::COMPONENT)
return CreateAvailability(IS_AVAILABLE, type);
if (!whitelist_.empty()) {
@@ -298,7 +301,7 @@ Feature::Availability SimpleFeature::IsAvailableToManifest(
}
}
- if (location_ != UNSPECIFIED_LOCATION && location_ != location)
+ if (!MatchesManifestLocation(location))
return CreateAvailability(INVALID_LOCATION, type);
if (!platforms_.empty() &&
@@ -329,12 +332,11 @@ Feature::Availability SimpleFeature::IsAvailableToContext(
const GURL& url,
SimpleFeature::Platform platform) const {
if (extension) {
- Availability result = IsAvailableToManifest(
- extension->id(),
- extension->GetType(),
- ConvertLocation(extension->location()),
- extension->manifest_version(),
- platform);
+ Availability result = IsAvailableToManifest(extension->id(),
+ extension->GetType(),
+ extension->location(),
+ extension->manifest_version(),
+ platform);
if (!result.is_available())
return result;
}
@@ -479,4 +481,20 @@ bool SimpleFeature::IsIdInWhitelist(const std::string& extension_id,
return false;
}
+bool SimpleFeature::MatchesManifestLocation(
+ Manifest::Location manifest_location) const {
+ switch (location_) {
+ case SimpleFeature::UNSPECIFIED_LOCATION:
+ return true;
+ case SimpleFeature::COMPONENT_LOCATION:
+ return manifest_location == Manifest::COMPONENT ||
+ manifest_location == Manifest::EXTERNAL_COMPONENT;
+ case SimpleFeature::POLICY_LOCATION:
+ return manifest_location == Manifest::EXTERNAL_POLICY ||
+ manifest_location == Manifest::EXTERNAL_POLICY_DOWNLOAD;
+ }
+ NOTREACHED();
+ return false;
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698