{% from 'macros.tmpl' import license %}
{{license()}}

#include "config.h"
#include "core/css/CSSPropertyMetadata.h"

#include "gen/sky/platform/RuntimeEnabledFeatures.h"
#include "wtf/BitArray.h"

namespace blink {
{% for flag, function_name in switches %}

bool CSSPropertyMetadata::{{function_name}}(CSSPropertyID property)
{
    switch(property) {
    case CSSPropertyInvalid:
        ASSERT_NOT_REACHED();
        return false;
    {% for property_id, property in properties.items() if property[flag] %}
    case {{property_id}}:
    {% endfor %}
        return true;
    default:
        return false;
    }
}
{% endfor %}

bool CSSPropertyMetadata::isEnabledProperty(CSSPropertyID property)
{
    static BitArray<numCSSProperties>* enabledProperties = 0;
    if (!enabledProperties) {
        enabledProperties = new BitArray<numCSSProperties>(true); // All bits sets to 1.
        {% for property_id, property in properties.items() if property.runtime_flag %}
        if (!RuntimeEnabledFeatures::{{property.runtime_flag|lower_first}}Enabled())
            enabledProperties->clear({{property_id}} - {{first_enum_value}});
        {% endfor %}
        {% for property_id, property in properties.items() if property.is_internal %}
        enabledProperties->clear({{property_id}} - {{first_enum_value}});
        {% endfor %}
    }
    return enabledProperties->get(property - {{first_enum_value}});
}

void CSSPropertyMetadata::filterEnabledCSSPropertiesIntoVector(const CSSPropertyID* properties, size_t propertyCount, Vector<CSSPropertyID>& outVector)
{
    for (unsigned i = 0; i < propertyCount; i++) {
        CSSPropertyID property = properties[i];
        if (isEnabledProperty(property))
            outVector.append(property);
    }
}

} // namespace blink
