1 /*
2 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer.
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following
13 * disclaimer in the documentation and/or other materials
14 * provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
21 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 * OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 #include "config.h"
31 #include "core/css/RuntimeCSSEnabled.h"
32
33 #include "platform/RuntimeEnabledFeatures.h"
34 #include "wtf/BitArray.h"
35
36 namespace WebCore {
37
38 typedef BitArray<numCSSProperties> CSSPropertySwitches;
39
setCSSPropertiesEnabled(CSSPropertyID * properties,size_t length,bool featureFlag)40 static void setCSSPropertiesEnabled(CSSPropertyID* properties, size_t length, bool featureFlag)
41 {
42 for (size_t i = 0; i < length; i++)
43 RuntimeCSSEnabled::setCSSPropertyEnabled(properties[i], featureFlag);
44 }
45
setPropertySwitchesFromRuntimeFeatures()46 static void setPropertySwitchesFromRuntimeFeatures()
47 {
48 CSSPropertyID exclusionProperties[] = {
49 CSSPropertyWebkitWrapFlow,
50 CSSPropertyWebkitWrapThrough,
51 };
52 setCSSPropertiesEnabled(exclusionProperties, WTF_ARRAY_LENGTH(exclusionProperties), RuntimeEnabledFeatures::cssExclusionsEnabled());
53 CSSPropertyID shapeProperties[] = {
54 CSSPropertyShapeMargin,
55 CSSPropertyShapeImageThreshold,
56 CSSPropertyShapeOutside,
57 };
58 setCSSPropertiesEnabled(shapeProperties, WTF_ARRAY_LENGTH(shapeProperties), RuntimeEnabledFeatures::cssShapesEnabled());
59 CSSPropertyID css3TextDecorationProperties[] = {
60 CSSPropertyTextDecorationColor,
61 CSSPropertyTextDecorationLine,
62 CSSPropertyTextDecorationStyle,
63 CSSPropertyTextUnderlinePosition,
64 };
65 setCSSPropertiesEnabled(css3TextDecorationProperties, WTF_ARRAY_LENGTH(css3TextDecorationProperties), RuntimeEnabledFeatures::css3TextDecorationsEnabled());
66 CSSPropertyID css3TextProperties[] = {
67 CSSPropertyTextAlignLast,
68 CSSPropertyTextJustify,
69 };
70 setCSSPropertiesEnabled(css3TextProperties, WTF_ARRAY_LENGTH(css3TextProperties), RuntimeEnabledFeatures::css3TextEnabled());
71 CSSPropertyID cssGridLayoutProperties[] = {
72 CSSPropertyGridAutoColumns,
73 CSSPropertyGridAutoRows,
74 CSSPropertyGridTemplateColumns,
75 CSSPropertyGridTemplateRows,
76 CSSPropertyGridColumnStart,
77 CSSPropertyGridColumnEnd,
78 CSSPropertyGridRowStart,
79 CSSPropertyGridRowEnd,
80 CSSPropertyGridColumn,
81 CSSPropertyGridRow,
82 CSSPropertyGridArea,
83 CSSPropertyGridAutoFlow,
84 CSSPropertyGridTemplateAreas,
85 CSSPropertyGridTemplate,
86 CSSPropertyGrid,
87 CSSPropertyJustifySelf
88 };
89 setCSSPropertiesEnabled(cssGridLayoutProperties, WTF_ARRAY_LENGTH(cssGridLayoutProperties), RuntimeEnabledFeatures::cssGridLayoutEnabled());
90 CSSPropertyID cssObjectFitPositionProperties[] = {
91 CSSPropertyObjectFit,
92 CSSPropertyObjectPosition
93 };
94 setCSSPropertiesEnabled(cssObjectFitPositionProperties, WTF_ARRAY_LENGTH(cssObjectFitPositionProperties), RuntimeEnabledFeatures::objectFitPositionEnabled());
95
96 CSSPropertyID animationProperties[] = {
97 CSSPropertyAnimation,
98 CSSPropertyAnimationName,
99 CSSPropertyAnimationDuration,
100 CSSPropertyAnimationTimingFunction,
101 CSSPropertyAnimationDelay,
102 CSSPropertyAnimationIterationCount,
103 CSSPropertyAnimationDirection,
104 CSSPropertyAnimationFillMode,
105 CSSPropertyAnimationPlayState
106 };
107 setCSSPropertiesEnabled(animationProperties, WTF_ARRAY_LENGTH(animationProperties), RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled());
108
109 CSSPropertyID transformProperties[] = {
110 CSSPropertyBackfaceVisibility,
111 CSSPropertyPerspective,
112 CSSPropertyPerspectiveOrigin,
113 CSSPropertyTransform,
114 CSSPropertyTransformOrigin,
115 CSSPropertyTransformStyle
116 };
117 setCSSPropertiesEnabled(transformProperties, WTF_ARRAY_LENGTH(transformProperties), RuntimeEnabledFeatures::cssTransformsUnprefixedEnabled());
118
119 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyMixBlendMode, RuntimeEnabledFeatures::cssCompositingEnabled());
120 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyIsolation, RuntimeEnabledFeatures::cssCompositingEnabled());
121 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyTouchAction, RuntimeEnabledFeatures::cssTouchActionEnabled());
122 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyTouchActionDelay, RuntimeEnabledFeatures::cssTouchActionDelayEnabled());
123 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyMaskSourceType, RuntimeEnabledFeatures::cssMaskSourceTypeEnabled());
124 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyColumnFill, RuntimeEnabledFeatures::regionBasedColumnsEnabled());
125 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyScrollBehavior, RuntimeEnabledFeatures::cssomSmoothScrollEnabled());
126 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyWillChange, RuntimeEnabledFeatures::cssWillChangeEnabled());
127
128 // InternalCallback is an implementation detail, rather than an experimental feature, and should never be exposed to the web.
129 RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyInternalCallback, false);
130 }
131
propertySwitches()132 static CSSPropertySwitches& propertySwitches()
133 {
134 static CSSPropertySwitches* switches = 0;
135 if (!switches) {
136 switches = new CSSPropertySwitches(true); // All bits sets to 1.
137 setPropertySwitchesFromRuntimeFeatures();
138 }
139 return *switches;
140 }
141
indexForProperty(CSSPropertyID propertyId)142 size_t indexForProperty(CSSPropertyID propertyId)
143 {
144 RELEASE_ASSERT(propertyId >= firstCSSProperty && propertyId <= lastCSSProperty);
145 // Values all start at 0. BitArray ASSERTS will catch if we're ever wrong.
146 return static_cast<size_t>(propertyId - firstCSSProperty);
147 }
148
isCSSPropertyEnabled(CSSPropertyID propertyId)149 bool RuntimeCSSEnabled::isCSSPropertyEnabled(CSSPropertyID propertyId)
150 {
151 // Internal properties shouldn't be exposed to the web
152 // so they are considered to be always disabled.
153 if (isInternalProperty(propertyId))
154 return false;
155
156 return propertySwitches().get(indexForProperty(propertyId));
157 }
158
setCSSPropertyEnabled(CSSPropertyID propertyId,bool enable)159 void RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyID propertyId, bool enable)
160 {
161 size_t propertyIndex = indexForProperty(propertyId);
162 if (enable)
163 propertySwitches().set(propertyIndex);
164 else
165 propertySwitches().clear(propertyIndex);
166 }
167
filterEnabledCSSPropertiesIntoVector(const CSSPropertyID * properties,size_t propertyCount,Vector<CSSPropertyID> & outVector)168 void RuntimeCSSEnabled::filterEnabledCSSPropertiesIntoVector(const CSSPropertyID* properties, size_t propertyCount, Vector<CSSPropertyID>& outVector)
169 {
170 for (unsigned i = 0; i < propertyCount; i++) {
171 CSSPropertyID property = properties[i];
172 if (RuntimeCSSEnabled::isCSSPropertyEnabled(property))
173 outVector.append(property);
174 }
175 }
176
177 } // namespace WebCore
178