diff options
author | jackhou <jackhou@chromium.org> | 2015-04-09 20:45:19 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-10 03:45:51 +0000 |
commit | 16ca320592ce7ef6cd36500da6e670cc645781cd (patch) | |
tree | da85924211d0fd95766e24117476638643e0e923 /extensions/common/features | |
parent | e46d521900156cf4fa528147f5efa66eacb183a4 (diff) | |
download | chromium_src-16ca320592ce7ef6cd36500da6e670cc645781cd.zip chromium_src-16ca320592ce7ef6cd36500da6e670cc645781cd.tar.gz chromium_src-16ca320592ce7ef6cd36500da6e670cc645781cd.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
Review URL: https://codereview.chromium.org/1047943002
Cr-Commit-Position: refs/heads/master@{#324583}
Diffstat (limited to 'extensions/common/features')
-rw-r--r-- | extensions/common/features/simple_feature.cc | 47 | ||||
-rw-r--r-- | extensions/common/features/simple_feature.h | 12 |
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; |