{% from 'templates/macros.tmpl' import license, source_files_for_generated_file, platform_define %}
{{license()}}

{{source_files_for_generated_file(template_file, input_files)}}

#include "build/build_config.h"
#include "build/chromeos_buildflags.h"

#include "third_party/blink/renderer/platform/runtime_enabled_features.h"

#include "third_party/blink/renderer/platform/wtf/assertions.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"

namespace blink {

RuntimeEnabledFeatures::Backup::Backup()
  : {% for feature in features -%}
    {{feature.data_member_name}}(RuntimeEnabledFeatures::{{feature.data_member_name}})
    {%- if not loop.last %},
    {%+ endif -%}
    {% endfor %} {}

void RuntimeEnabledFeatures::Backup::Restore() {
  {% for feature in features %}
  RuntimeEnabledFeatures::{{feature.data_member_name}} = {{feature.data_member_name}};
  {% endfor %}
}

{% for feature_set in feature_sets %}
void RuntimeEnabledFeatures::Set{{feature_set|capitalize}}FeaturesEnabled(bool enable) {
  {% for feature in features if feature.status_type == 'str' and feature.status == feature_set %}
  Set{{feature.name}}Enabled(enable);
  {% endfor %}

  // Platform-dependent features
  {% for platform in platforms %}
#if {{platform_define(platform)}}
  {% for feature in features if feature.status_type == 'dict' and feature.status[platform] == feature_set %}
  Set{{feature.name}}Enabled(enable);
  {% endfor %}
#endif

  {% endfor %}
  // Default values for platforms not specifically handled above
#if
  {%- for platform in platforms %}
  {%- if not loop.first %} &&{% endif %}
 !{{platform_define(platform)}}
  {%- endfor %}

  {% for feature in features if feature.status_type == 'dict' and feature.status['default'] == feature_set %}
  Set{{feature.name}}Enabled(enable);
  {% endfor %}
#endif
}

{% endfor %}

void RuntimeEnabledFeatures::SetOriginTrialControlledFeaturesEnabled(bool enable) {
  {% for feature in origin_trial_controlled_features %}
  Set{{feature.name}}Enabled(enable);
  {% endfor %}
}

void RuntimeEnabledFeatures::SetFeatureEnabledFromString(
    const std::string& name, bool enable) {
  static const struct {
    const char* name;
    bool* setting;
  } kFeatures[] = {
  {% for feature in features %}
    {"{{feature.name}}", &{{feature.data_member_name}}},
  {% endfor %}
  };
  for (const auto& feature : kFeatures) {
    if (name == feature.name) {
      *feature.setting = enable;
      return;
    }
  }
  DLOG(ERROR) << "RuntimeEnabledFeature not recognized: " << name;
}

{% for feature in origin_trial_controlled_features %}

bool RuntimeEnabledFeatures::{{feature.name}}Enabled(const FeatureContext* context) {
  {% for depends_on in feature.depends_on %}
  if (!RuntimeEnabledFeatures::{{depends_on}}Enabled(context))
    return false;
  {% endfor %}
  {% for implied_by in feature.implied_by %}
  if (RuntimeEnabledFeatures::{{implied_by}}Enabled(context))
    return true;
  {% endfor %}
  if ({{feature.data_member_name}})
    return true;
  {% if not feature.origin_trial_feature_name %}
  // The feature does not have an origin trial name and its runtime flag
  // is not enabled.
  return false;
  {% else %}
  return context && context->FeatureEnabled(OriginTrialFeature::k{{feature.name}});
  {% endif %}
}

{% endfor %}

{% for feature in features %}
{% if feature.status_type == 'str' %}
bool RuntimeEnabledFeatures::{{feature.data_member_name}} = {{'true' if feature.status == 'stable' else 'false'}};
{% endif %}
{% endfor %}

// Platform-dependent features
{% for platform in platforms %}
#if {{platform_define(platform)}}
{% for feature in features %}
{% if feature.status_type == 'dict' %}
bool RuntimeEnabledFeatures::{{feature.data_member_name}} = {{'true' if feature.status[platform] == 'stable' else 'false'}};
{% endif %}
{% endfor %}
#endif

{% endfor %}
// Default values for platforms not specifically handled above
#if
{%- for platform in platforms %}
{%- if not loop.first %} &&{% endif %}
 !{{platform_define(platform)}}
{%- endfor %}

{% for feature in features %}
{% if feature.status_type == 'dict' %}
bool RuntimeEnabledFeatures::{{feature.data_member_name}} = {{'true' if feature.status['default'] == 'stable' else 'false'}};
{% endif %}
{% endfor %}
#endif

} // namespace blink
