blob: 10699f69d81ec67a1d2a3881e05c8c4fdc3138d8 [file] [log] [blame]
/*
* Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "core/css/RuntimeCSSEnabled.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "wtf/BitArray.h"
namespace blink {
typedef BitArray<numCSSProperties> CSSPropertySwitches;
static void setCSSPropertiesEnabled(CSSPropertyID* properties, size_t length, bool featureFlag)
{
for (size_t i = 0; i < length; i++)
RuntimeCSSEnabled::setCSSPropertyEnabled(properties[i], featureFlag);
}
static void setPropertySwitchesFromRuntimeFeatures()
{
CSSPropertyID css3TextDecorationProperties[] = {
CSSPropertyTextDecorationColor,
CSSPropertyTextDecorationLine,
CSSPropertyTextDecorationStyle,
CSSPropertyTextUnderlinePosition,
};
setCSSPropertiesEnabled(css3TextDecorationProperties, WTF_ARRAY_LENGTH(css3TextDecorationProperties), RuntimeEnabledFeatures::css3TextDecorationsEnabled());
CSSPropertyID css3TextProperties[] = {
CSSPropertyTextAlignLast,
CSSPropertyTextJustify,
};
setCSSPropertiesEnabled(css3TextProperties, WTF_ARRAY_LENGTH(css3TextProperties), RuntimeEnabledFeatures::css3TextEnabled());
CSSPropertyID cssGridLayoutProperties[] = {
CSSPropertyGridAutoColumns,
CSSPropertyGridAutoRows,
CSSPropertyGridTemplateColumns,
CSSPropertyGridTemplateRows,
CSSPropertyGridColumnStart,
CSSPropertyGridColumnEnd,
CSSPropertyGridRowStart,
CSSPropertyGridRowEnd,
CSSPropertyGridColumn,
CSSPropertyGridRow,
CSSPropertyGridArea,
CSSPropertyGridAutoFlow,
CSSPropertyGridTemplateAreas,
CSSPropertyGridTemplate,
CSSPropertyGrid,
CSSPropertyJustifySelf,
CSSPropertyJustifyItems
};
setCSSPropertiesEnabled(cssGridLayoutProperties, WTF_ARRAY_LENGTH(cssGridLayoutProperties), RuntimeEnabledFeatures::cssGridLayoutEnabled());
CSSPropertyID cssObjectFitPositionProperties[] = {
CSSPropertyObjectFit,
CSSPropertyObjectPosition
};
setCSSPropertiesEnabled(cssObjectFitPositionProperties, WTF_ARRAY_LENGTH(cssObjectFitPositionProperties), RuntimeEnabledFeatures::objectFitPositionEnabled());
CSSPropertyID animationProperties[] = {
CSSPropertyAnimation,
CSSPropertyAnimationName,
CSSPropertyAnimationDuration,
CSSPropertyAnimationTimingFunction,
CSSPropertyAnimationDelay,
CSSPropertyAnimationIterationCount,
CSSPropertyAnimationDirection,
CSSPropertyAnimationFillMode,
CSSPropertyAnimationPlayState
};
setCSSPropertiesEnabled(animationProperties, WTF_ARRAY_LENGTH(animationProperties), RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyMixBlendMode, RuntimeEnabledFeatures::cssCompositingEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyIsolation, RuntimeEnabledFeatures::cssCompositingEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyTouchActionDelay, RuntimeEnabledFeatures::cssTouchActionDelayEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyMaskSourceType, RuntimeEnabledFeatures::cssMaskSourceTypeEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyColumnFill, RuntimeEnabledFeatures::regionBasedColumnsEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyScrollBehavior, RuntimeEnabledFeatures::cssomSmoothScrollEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyWillChange, RuntimeEnabledFeatures::cssWillChangeEnabled());
// InternalCallback is an implementation detail, rather than an experimental feature, and should never be exposed to the web.
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyInternalCallback, false);
}
static CSSPropertySwitches& propertySwitches()
{
static CSSPropertySwitches* switches = 0;
if (!switches) {
switches = new CSSPropertySwitches(true); // All bits sets to 1.
setPropertySwitchesFromRuntimeFeatures();
}
return *switches;
}
size_t indexForProperty(CSSPropertyID propertyId)
{
RELEASE_ASSERT(propertyId >= firstCSSProperty && propertyId <= lastCSSProperty);
// Values all start at 0. BitArray ASSERTS will catch if we're ever wrong.
return static_cast<size_t>(propertyId - firstCSSProperty);
}
bool RuntimeCSSEnabled::isCSSPropertyEnabled(CSSPropertyID propertyId)
{
// Internal properties shouldn't be exposed to the web
// so they are considered to be always disabled.
if (isInternalProperty(propertyId))
return false;
return propertySwitches().get(indexForProperty(propertyId));
}
void RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyID propertyId, bool enable)
{
size_t propertyIndex = indexForProperty(propertyId);
if (enable)
propertySwitches().set(propertyIndex);
else
propertySwitches().clear(propertyIndex);
}
void RuntimeCSSEnabled::filterEnabledCSSPropertiesIntoVector(const CSSPropertyID* properties, size_t propertyCount, Vector<CSSPropertyID>& outVector)
{
for (unsigned i = 0; i < propertyCount; i++) {
CSSPropertyID property = properties[i];
if (RuntimeCSSEnabled::isCSSPropertyEnabled(property))
outVector.append(property);
}
}
} // namespace blink