Chromium Code Reviews| Index: extensions/common/features/simple_feature.cc |
| diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc |
| index 6a5bece485df46b7ccc9db8ef21c5d62a521ba93..609891a70cbb88fc0952c258eafc48c177130d3d 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" |
| @@ -24,6 +25,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* whitelisted_extension_id = NULL; |
|
not at google - send to devlin
2015/04/08 17:59:22
should be g_whitelisted_extension_id;
jackhou1
2015/04/09 07:23:28
Done.
|
| + |
| Feature::Availability IsAvailableToManifestForBind( |
| const std::string& extension_id, |
| Manifest::Type type, |
| @@ -222,6 +227,15 @@ bool IsCommandLineSwitchEnabled(const std::string& switch_name) { |
| return false; |
| } |
| +bool IsWhitelistedByCommandLine(const std::string& extension_id) { |
| + if (!whitelisted_extension_id) |
| + SimpleFeature::SetWhitelistedExtensionId( |
| + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| + switches::kWhitelistedExtensionID)); |
| + return !whitelisted_extension_id->empty() && |
| + *whitelisted_extension_id == extension_id; |
| +} |
| + |
| } // namespace |
| struct SimpleFeature::Mappings { |
| @@ -363,20 +377,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) && |
| + !IsWhitelistedByCommandLine(extension_id)) { |
|
not at google - send to devlin
2015/04/08 17:59:22
"IsWhitelistedByCommandLine" isn't accurate anymor
jackhou1
2015/04/09 07:23:28
Done.
|
| + return CreateAvailability(NOT_FOUND_IN_WHITELIST, type); |
| } |
| if (!MatchesManifestLocation(location)) |
| @@ -572,6 +575,13 @@ bool SimpleFeature::IsIdInArray(const std::string& extension_id, |
| } |
| // static |
| +void SimpleFeature::SetWhitelistedExtensionId(const std::string& id) { |
| + if (whitelisted_extension_id) |
| + delete whitelisted_extension_id; |
| + whitelisted_extension_id = new std::string(id); |
|
not at google - send to devlin
2015/04/08 17:59:22
This will leak in the final unit test that calls S
jackhou1
2015/04/09 07:23:28
Done.
|
| +} |
| + |
| +// static |
| bool SimpleFeature::IsIdInList(const std::string& extension_id, |
| const std::vector<std::string>& list) { |
| if (!IsValidExtensionId(extension_id)) |