Index: extensions/common/features/feature_channel.cc |
diff --git a/extensions/common/features/feature_channel.cc b/extensions/common/features/feature_channel.cc |
index 13bd6e1dcaee847aaccae4e4510fac40a71aea5f..26346f4a3418ce01892786d3ccdcddb767101a7f 100644 |
--- a/extensions/common/features/feature_channel.cc |
+++ b/extensions/common/features/feature_channel.cc |
@@ -4,37 +4,49 @@ |
#include "extensions/common/features/feature_channel.h" |
+#include "base/logging.h" |
#include "components/version_info/version_info.h" |
namespace { |
-const version_info::Channel kDefaultChannel = version_info::Channel::STABLE; |
-version_info::Channel g_current_channel = kDefaultChannel; |
+// The current channel to be reported, unless overridden by |
+// |ScopedCurrentChannel|. |
+version_info::Channel g_current_channel = version_info::Channel::STABLE; |
+ |
+// The current channel overridden by |ScopedCurrentChannel|. The value is valid |
+// only whenever |g_override_count| is non-zero. |
+version_info::Channel g_overridden_channel = version_info::Channel::STABLE; |
+ |
+// The number of currently existing instances of |ScopedCurrentChannel|. |
+int g_override_count = 0; |
} // namespace |
namespace extensions { |
version_info::Channel GetCurrentChannel() { |
- return g_current_channel; |
+ return g_override_count ? g_overridden_channel : g_current_channel; |
} |
void SetCurrentChannel(version_info::Channel channel) { |
g_current_channel = channel; |
} |
-version_info::Channel GetDefaultChannel() { |
- return kDefaultChannel; |
-} |
- |
ScopedCurrentChannel::ScopedCurrentChannel(version_info::Channel channel) |
- : original_channel_(version_info::Channel::UNKNOWN) { |
- original_channel_ = GetCurrentChannel(); |
- SetCurrentChannel(channel); |
+ : channel_(channel), |
+ original_overridden_channel_(g_overridden_channel), |
+ original_override_count_(g_override_count) { |
+ g_overridden_channel = channel; |
+ ++g_override_count; |
} |
ScopedCurrentChannel::~ScopedCurrentChannel() { |
- SetCurrentChannel(original_channel_); |
+ DCHECK_EQ(original_override_count_ + 1, g_override_count) |
+ << "Scoped channel setters are not nested properly"; |
+ DCHECK_EQ(g_overridden_channel, channel_) |
+ << "Scoped channel setters are not nested properly"; |
+ g_overridden_channel = original_overridden_channel_; |
+ --g_override_count; |
} |
} // namespace extensions |