blob: 256ddb913ec9e14a444158e68eb8b22be8d37e0b [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/page/RuntimeCSSEnabled.h"
#include "RuntimeEnabledFeatures.h"
#include "wtf/Vector.h"
namespace WebCore {
// FIXME: We should use a real BitVector class instead!
typedef Vector<bool> BoolVector;
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 regionProperites[] = {
CSSPropertyWebkitFlowInto,
CSSPropertyWebkitFlowFrom,
CSSPropertyWebkitRegionFragment,
CSSPropertyWebkitRegionBreakAfter,
CSSPropertyWebkitRegionBreakBefore,
CSSPropertyWebkitRegionBreakInside
};
setCSSPropertiesEnabled(regionProperites, WTF_ARRAY_LENGTH(regionProperites), RuntimeEnabledFeatures::cssRegionsEnabled());
CSSPropertyID exclusionProperties[] = {
CSSPropertyWebkitWrapFlow,
CSSPropertyWebkitWrapThrough,
};
setCSSPropertiesEnabled(exclusionProperties, WTF_ARRAY_LENGTH(exclusionProperties), RuntimeEnabledFeatures::cssExclusionsEnabled());
CSSPropertyID shapeProperties[] = {
CSSPropertyShapeMargin,
CSSPropertyShapePadding,
CSSPropertyShapeImageThreshold,
CSSPropertyShapeInside,
CSSPropertyShapeOutside,
};
setCSSPropertiesEnabled(shapeProperties, WTF_ARRAY_LENGTH(shapeProperties), RuntimeEnabledFeatures::cssShapesEnabled());
CSSPropertyID css3TextDecorationProperties[] = {
CSSPropertyTextDecorationColor,
CSSPropertyTextDecorationLine,
CSSPropertyTextDecorationStyle,
};
setCSSPropertiesEnabled(css3TextDecorationProperties, WTF_ARRAY_LENGTH(css3TextDecorationProperties), RuntimeEnabledFeatures::css3TextDecorationsEnabled());
CSSPropertyID css3TextProperties[] = {
CSSPropertyTextAlignLast,
CSSPropertyTextJustify,
};
setCSSPropertiesEnabled(css3TextProperties, WTF_ARRAY_LENGTH(css3TextProperties), RuntimeEnabledFeatures::css3TextEnabled());
CSSPropertyID cssGridLayoutProperties[] = {
CSSPropertyGridAutoColumns,
CSSPropertyGridAutoRows,
CSSPropertyGridDefinitionColumns,
CSSPropertyGridDefinitionRows,
CSSPropertyGridColumnStart,
CSSPropertyGridColumnEnd,
CSSPropertyGridRowStart,
CSSPropertyGridRowEnd,
CSSPropertyGridColumn,
CSSPropertyGridRow,
CSSPropertyGridArea,
CSSPropertyGridAutoFlow,
CSSPropertyGridTemplate
};
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(CSSPropertyBackgroundBlendMode, RuntimeEnabledFeatures::cssCompositingEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyMixBlendMode, RuntimeEnabledFeatures::cssCompositingEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyIsolation, RuntimeEnabledFeatures::cssCompositingEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyTouchAction, RuntimeEnabledFeatures::cssTouchActionEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyPaintOrder, RuntimeEnabledFeatures::svgPaintOrderEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyVariable, RuntimeEnabledFeatures::cssVariablesEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyMaskSourceType, RuntimeEnabledFeatures::cssMaskSourceTypeEnabled());
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyColumnFill, RuntimeEnabledFeatures::regionBasedColumnsEnabled());
// InternalCallback is an implementation detail, rather than an experimental feature, and should never be exposed to the web.
RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyInternalCallback, false);
}
static BoolVector& propertySwitches()
{
static BoolVector* switches = 0;
if (!switches) {
switches = new BoolVector;
// Accomodate CSSPropertyIDs that fall outside the firstCSSProperty, lastCSSProperty range (eg. CSSPropertyVariable).
switches->fill(true, lastCSSProperty + 1);
setPropertySwitchesFromRuntimeFeatures();
}
return *switches;
}
size_t indexForProperty(CSSPropertyID propertyId)
{
RELEASE_ASSERT(propertyId >= 0 && propertyId <= lastCSSProperty);
ASSERT(propertyId != CSSPropertyInvalid);
return static_cast<size_t>(propertyId);
}
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()[indexForProperty(propertyId)];
}
void RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyID propertyId, bool enable)
{
propertySwitches()[indexForProperty(propertyId)] = enable;
}
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 WebCore