blob: 6cbd0173460271ec6f2e4db39c39b4c4acce2609 [file] [log] [blame]
{% from 'templates/macros.tmpl' import license, source_files_for_generated_file, platform_define %}
{{license()}}
{{source_files_for_generated_file(template_file, input_files)}}
#include "third_party/blink/renderer/core/origin_trials/origin_trials.h"
#include <algorithm>
#include <array>
#include <iterator>
#include "base/containers/contains.h"
#include "build/chromeos_buildflags.h"
#include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
namespace blink {
namespace {
static constexpr size_t kMaxFeaturesPerTrial = {{max_features_per_trial}};
static constexpr struct {
const char* trial_name;
unsigned feature_count;
std::array<OriginTrialFeature, kMaxFeaturesPerTrial> features;
} kTrialToFeaturesMap[] = {
{% for trial_name, features_list in trial_to_features_map.items() %}
{ "{{trial_name}}", {{features_list|length}}, { {%- for trial_feature in features_list %}OriginTrialFeature::k{{trial_feature.name}}, {%- endfor %} } },
{% endfor %}
// For testing
{ "This trial does not exist", 1, { OriginTrialFeature::kNonExisting } },
};
} // namespace
bool origin_trials::IsTrialValid(const StringView& trial_name) {
return std::any_of(
std::begin(kTrialToFeaturesMap), std::end(kTrialToFeaturesMap),
[&](const auto& entry) { return entry.trial_name == trial_name; });
}
bool origin_trials::IsTrialEnabledForInsecureContext(const StringView& trial_name) {
static const char* const kEnabledForInsecureContext[] = {
{% for trial in origin_trial_features|selectattr('origin_trial_allows_insecure')|map(attribute='origin_trial_feature_name')|unique %}
"{{trial}}",
{% endfor %}
};
return base::Contains(kEnabledForInsecureContext, trial_name);
}
bool origin_trials::IsTrialEnabledForThirdPartyOrigins(const StringView& trial_name) {
static const char* const kEnabledForThirdPartyOrigins[] = {
{% for trial in origin_trial_features|selectattr('origin_trial_allows_third_party')|map(attribute='origin_trial_feature_name')|unique %}
"{{trial}}",
{% endfor %}
};
return base::Contains(kEnabledForThirdPartyOrigins, trial_name);
}
OriginTrialType origin_trials::GetTrialType(OriginTrialFeature feature) {
switch (feature) {
{% for feature in origin_trial_features if feature.origin_trial_type %}
case OriginTrialFeature::k{{feature.name}}:
return OriginTrialType::k{{feature.origin_trial_type}};
{% endfor %}
default:
return OriginTrialType::kDefault;
}
}
base::span<const OriginTrialFeature> origin_trials::FeaturesForTrial(
const StringView& trial_name) {
auto it = std::find_if(
std::begin(kTrialToFeaturesMap), std::end(kTrialToFeaturesMap),
[&](const auto& entry) { return entry.trial_name == trial_name; });
DCHECK(it != std::end(kTrialToFeaturesMap));
return {it->features.begin(), it->feature_count};
}
base::span<const OriginTrialFeature> origin_trials::GetImpliedFeatures(
OriginTrialFeature feature) {
{% for implied_by_name, implied_list in implied_origin_trial_features.items() %}
if (feature == OriginTrialFeature::k{{implied_by_name}}) {
static constexpr OriginTrialFeature implied_features[] = {
{%- for implied_name in implied_list %}
OriginTrialFeature::k{{implied_name}},
{%- endfor %}
};
return implied_features;
}
{% endfor %}
return {};
}
bool origin_trials::FeatureEnabledForOS(OriginTrialFeature feature) {
switch (feature) {
{% for feature in features %}
{% if feature.origin_trial_feature_name %}
case OriginTrialFeature::k{{feature.name}}:
{% if feature.origin_trial_os %}
#if
{%- for os in feature.origin_trial_os %}
{%- if not loop.first %} ||{% endif %}
{{platform_define(os)}}
{%- endfor %}
return true;
#else
return false;
#endif
{% else %}
return true;
{% endif %}
{% endif %}
{% endfor %}
// For testing
case OriginTrialFeature::kNonExisting:
return true;
}
}
} // namespace blink