Home | History | Annotate | Download | only in css
      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 "RuntimeEnabledFeatures.h"
     34 
     35 namespace WebCore {
     36 
     37 // FIXME: We should use a real BitVector class instead!
     38 typedef Vector<bool> BoolVector;
     39 
     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 
     46 static void setPropertySwitchesFromRuntimeFeatures()
     47 {
     48     CSSPropertyID regionProperites[] = {
     49         CSSPropertyWebkitFlowInto,
     50         CSSPropertyWebkitFlowFrom,
     51         CSSPropertyWebkitRegionFragment,
     52         CSSPropertyWebkitRegionBreakAfter,
     53         CSSPropertyWebkitRegionBreakBefore,
     54         CSSPropertyWebkitRegionBreakInside
     55     };
     56     setCSSPropertiesEnabled(regionProperites, WTF_ARRAY_LENGTH(regionProperites), RuntimeEnabledFeatures::cssRegionsEnabled());
     57     CSSPropertyID exclusionProperties[] = {
     58         CSSPropertyWebkitWrapFlow,
     59         CSSPropertyWebkitWrapThrough,
     60     };
     61     setCSSPropertiesEnabled(exclusionProperties, WTF_ARRAY_LENGTH(exclusionProperties), RuntimeEnabledFeatures::cssExclusionsEnabled());
     62     CSSPropertyID shapeProperties[] = {
     63         CSSPropertyShapeMargin,
     64         CSSPropertyShapePadding,
     65         CSSPropertyShapeImageThreshold,
     66         CSSPropertyShapeInside,
     67         CSSPropertyShapeOutside,
     68     };
     69     setCSSPropertiesEnabled(shapeProperties, WTF_ARRAY_LENGTH(shapeProperties), RuntimeEnabledFeatures::cssShapesEnabled());
     70     CSSPropertyID css3TextDecorationProperties[] = {
     71         CSSPropertyTextDecorationColor,
     72         CSSPropertyTextDecorationLine,
     73         CSSPropertyTextDecorationStyle,
     74         CSSPropertyTextUnderlinePosition,
     75     };
     76     setCSSPropertiesEnabled(css3TextDecorationProperties, WTF_ARRAY_LENGTH(css3TextDecorationProperties), RuntimeEnabledFeatures::css3TextDecorationsEnabled());
     77     CSSPropertyID css3TextProperties[] = {
     78         CSSPropertyTextAlignLast,
     79         CSSPropertyTextJustify,
     80     };
     81     setCSSPropertiesEnabled(css3TextProperties, WTF_ARRAY_LENGTH(css3TextProperties), RuntimeEnabledFeatures::css3TextEnabled());
     82     CSSPropertyID cssGridLayoutProperties[] = {
     83         CSSPropertyGridAutoColumns,
     84         CSSPropertyGridAutoRows,
     85         CSSPropertyGridDefinitionColumns,
     86         CSSPropertyGridDefinitionRows,
     87         CSSPropertyGridColumnStart,
     88         CSSPropertyGridColumnEnd,
     89         CSSPropertyGridRowStart,
     90         CSSPropertyGridRowEnd,
     91         CSSPropertyGridColumn,
     92         CSSPropertyGridRow,
     93         CSSPropertyGridArea,
     94         CSSPropertyGridAutoFlow,
     95         CSSPropertyGridTemplate
     96     };
     97     setCSSPropertiesEnabled(cssGridLayoutProperties, WTF_ARRAY_LENGTH(cssGridLayoutProperties), RuntimeEnabledFeatures::cssGridLayoutEnabled());
     98     CSSPropertyID cssObjectFitPositionProperties[] = {
     99         CSSPropertyObjectFit,
    100         CSSPropertyObjectPosition
    101     };
    102     setCSSPropertiesEnabled(cssObjectFitPositionProperties, WTF_ARRAY_LENGTH(cssObjectFitPositionProperties), RuntimeEnabledFeatures::objectFitPositionEnabled());
    103 
    104     CSSPropertyID animationProperties[] = {
    105         CSSPropertyAnimation,
    106         CSSPropertyAnimationName,
    107         CSSPropertyAnimationDuration,
    108         CSSPropertyAnimationTimingFunction,
    109         CSSPropertyAnimationDelay,
    110         CSSPropertyAnimationIterationCount,
    111         CSSPropertyAnimationDirection,
    112         CSSPropertyAnimationFillMode,
    113         CSSPropertyAnimationPlayState
    114     };
    115     setCSSPropertiesEnabled(animationProperties, WTF_ARRAY_LENGTH(animationProperties), RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled());
    116 
    117     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyBackgroundBlendMode, RuntimeEnabledFeatures::cssCompositingEnabled());
    118     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyMixBlendMode, RuntimeEnabledFeatures::cssCompositingEnabled());
    119     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyIsolation, RuntimeEnabledFeatures::cssCompositingEnabled());
    120     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyTouchAction, RuntimeEnabledFeatures::cssTouchActionEnabled());
    121     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyPaintOrder, RuntimeEnabledFeatures::svgPaintOrderEnabled());
    122     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyVariable, RuntimeEnabledFeatures::cssVariablesEnabled());
    123     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyMaskSourceType, RuntimeEnabledFeatures::cssMaskSourceTypeEnabled());
    124     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyColumnFill, RuntimeEnabledFeatures::regionBasedColumnsEnabled());
    125 
    126     // InternalCallback is an implementation detail, rather than an experimental feature, and should never be exposed to the web.
    127     RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyInternalCallback, false);
    128 }
    129 
    130 static BoolVector& propertySwitches()
    131 {
    132     static BoolVector* switches = 0;
    133     if (!switches) {
    134         switches = new BoolVector;
    135         // Accomodate CSSPropertyIDs that fall outside the firstCSSProperty, lastCSSProperty range (eg. CSSPropertyVariable).
    136         switches->fill(true, lastCSSProperty + 1);
    137         setPropertySwitchesFromRuntimeFeatures();
    138     }
    139     return *switches;
    140 }
    141 
    142 size_t indexForProperty(CSSPropertyID propertyId)
    143 {
    144     RELEASE_ASSERT(propertyId >= 0 && propertyId <= lastCSSProperty);
    145     ASSERT(propertyId != CSSPropertyInvalid);
    146     return static_cast<size_t>(propertyId);
    147 }
    148 
    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()[indexForProperty(propertyId)];
    157 }
    158 
    159 void RuntimeCSSEnabled::setCSSPropertyEnabled(CSSPropertyID propertyId, bool enable)
    160 {
    161     propertySwitches()[indexForProperty(propertyId)] = enable;
    162 }
    163 
    164 void RuntimeCSSEnabled::filterEnabledCSSPropertiesIntoVector(const CSSPropertyID* properties, size_t propertyCount, Vector<CSSPropertyID>& outVector)
    165 {
    166     for (unsigned i = 0; i < propertyCount; i++) {
    167         CSSPropertyID property = properties[i];
    168         if (RuntimeCSSEnabled::isCSSPropertyEnabled(property))
    169             outVector.append(property);
    170     }
    171 }
    172 
    173 } // namespace WebCore
    174