summaryrefslogtreecommitdiffstats
path: root/extensions/common/features
diff options
context:
space:
mode:
authorjackhou <jackhou@chromium.org>2015-04-13 01:16:39 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-13 08:17:50 +0000
commitc587f309e39c1713a00745f3f73442d93fa4687d (patch)
tree14e789f750e6e7008c9be4e7f5406e0d565e9759 /extensions/common/features
parentd9fe5343b311d2ac4ce8b538c4bc187b04c2651f (diff)
downloadchromium_src-c587f309e39c1713a00745f3f73442d93fa4687d.zip
chromium_src-c587f309e39c1713a00745f3f73442d93fa4687d.tar.gz
chromium_src-c587f309e39c1713a00745f3f73442d93fa4687d.tar.bz2
Cache --whitelisted-extension-id in SimpleFeature.
During startup, CommandLine::HasSwitch(kWhitelistedExtensionID) is called ~1000 times by SimpleFeature. It is the most common switch lookup, the second being kAppsGalleryUpdateUrl at ~300 times. Caching this avoids allocating and copying the string each time. BUG=471976,476061 Committed: https://crrev.com/16ca320592ce7ef6cd36500da6e670cc645781cd Cr-Commit-Position: refs/heads/master@{#324583} Review URL: https://codereview.chromium.org/1047943002 Cr-Commit-Position: refs/heads/master@{#324821}
Diffstat (limited to 'extensions/common/features')
-rw-r--r--extensions/common/features/simple_feature.cc47
-rw-r--r--extensions/common/features/simple_feature.h12
2 files changed, 45 insertions, 14 deletions
diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc
index 34258d4..3322fac 100644
--- a/extensions/common/features/simple_feature.cc
+++ b/extensions/common/features/simple_feature.cc
@@ -11,6 +11,7 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/debug/alias.h"
+#include "base/macros.h"
#include "base/sha1.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
@@ -27,6 +28,10 @@ namespace extensions {
namespace {
+// A singleton copy of the --whitelisted-extension-id so that we don't need to
+// copy it from the CommandLine each time.
+std::string* g_whitelisted_extension_id = NULL;
+
Feature::Availability IsAvailableToManifestForBind(
const std::string& extension_id,
Manifest::Type type,
@@ -219,8 +224,33 @@ bool IsCommandLineSwitchEnabled(const std::string& switch_name) {
return false;
}
+bool IsWhitelistedForTest(const std::string& extension_id) {
+ // TODO(jackhou): Delete the commandline whitelisting mechanism.
+ // Since it is only used it tests, ideally it should not be set via the
+ // commandline. At the moment the commandline is used as a mechanism to pass
+ // the id to the renderer process.
+ if (!g_whitelisted_extension_id) {
+ g_whitelisted_extension_id = new std::string(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kWhitelistedExtensionID));
+ }
+ return !g_whitelisted_extension_id->empty() &&
+ *g_whitelisted_extension_id == extension_id;
+}
+
} // namespace
+SimpleFeature::ScopedWhitelistForTest::ScopedWhitelistForTest(
+ const std::string& id)
+ : previous_id_(g_whitelisted_extension_id) {
+ g_whitelisted_extension_id = new std::string(id);
+}
+
+SimpleFeature::ScopedWhitelistForTest::~ScopedWhitelistForTest() {
+ delete g_whitelisted_extension_id;
+ g_whitelisted_extension_id = previous_id_;
+}
+
struct SimpleFeature::Mappings {
Mappings() {
extension_types["extension"] = Manifest::TYPE_EXTENSION;
@@ -360,20 +390,9 @@ Feature::Availability SimpleFeature::IsAvailableToManifest(
if (component_extensions_auto_granted_ && location == Manifest::COMPONENT)
return CreateAvailability(IS_AVAILABLE, type);
- if (!whitelist_.empty()) {
- if (!IsIdInWhitelist(extension_id)) {
- // TODO(aa): This is gross. There should be a better way to test the
- // whitelist.
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- if (!command_line->HasSwitch(switches::kWhitelistedExtensionID))
- return CreateAvailability(NOT_FOUND_IN_WHITELIST, type);
-
- std::string whitelist_switch_value =
- base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
- switches::kWhitelistedExtensionID);
- if (extension_id != whitelist_switch_value)
- return CreateAvailability(NOT_FOUND_IN_WHITELIST, type);
- }
+ if (!whitelist_.empty() && !IsIdInWhitelist(extension_id) &&
+ !IsWhitelistedForTest(extension_id)) {
+ return CreateAvailability(NOT_FOUND_IN_WHITELIST, type);
}
if (!MatchesManifestLocation(location))
diff --git a/extensions/common/features/simple_feature.h b/extensions/common/features/simple_feature.h
index 9d8c539..5ec95cf 100644
--- a/extensions/common/features/simple_feature.h
+++ b/extensions/common/features/simple_feature.h
@@ -29,6 +29,18 @@ class SimpleFeatureTest;
class SimpleFeature : public Feature {
public:
+ // Used by tests to override the cached --whitelisted-extension-id.
+ class ScopedWhitelistForTest {
+ public:
+ explicit ScopedWhitelistForTest(const std::string& id);
+ ~ScopedWhitelistForTest();
+
+ private:
+ std::string* previous_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedWhitelistForTest);
+ };
+
SimpleFeature();
~SimpleFeature() override;