summaryrefslogtreecommitdiff
path: root/chromium/extensions/common/features/feature_flags.cc
blob: 7efa308dbecd46fff0b87de24840037e1cbf55a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "extensions/common/features/feature_flags.h"

#include <algorithm>

#include "base/check.h"
#include "base/feature_list.h"

namespace extensions {

namespace {

// Feature flags for extension features. These can be used to implement remote
// kill switches for extension features. Note any such feature flags must
// generally be removed once the API has been stable for a few releases.
constexpr base::Feature kFeatureFlags[] = {
    {"DeclarativeNetRequest", base::FEATURE_ENABLED_BY_DEFAULT}};

const std::vector<base::Feature>* g_feature_flags_test_override = nullptr;

template <typename T>
const base::Feature* GetFeature(T begin,
                                T end,
                                const std::string& feature_flag) {
  T it =
      std::find_if(begin, end, [&feature_flag](const base::Feature& feature) {
        return feature.name == feature_flag;
      });

  return it == end ? nullptr : &(*it);
}

const base::Feature* GetFeature(const std::string& feature_flag) {
  if (g_feature_flags_test_override) {
    return GetFeature(g_feature_flags_test_override->begin(),
                      g_feature_flags_test_override->end(), feature_flag);
  }

  return GetFeature(std::begin(kFeatureFlags), std::end(kFeatureFlags),
                    feature_flag);
}

}  // namespace

bool IsFeatureFlagEnabled(const std::string& feature_flag) {
  const base::Feature* feature = GetFeature(feature_flag);
  CHECK(feature) << feature_flag;
  return base::FeatureList::IsEnabled(*feature);
}

ScopedFeatureFlagsOverride CreateScopedFeatureFlagsOverrideForTesting(
    const std::vector<base::Feature>* features) {
  return base::AutoReset<const std::vector<base::Feature>*>(
      &g_feature_flags_test_override, features);
}

}  // namespace extensions