Changeset 205368 in webkit


Ignore:
Timestamp:
Sep 2, 2016 1:49:27 PM (8 years ago)
Author:
hyatt@apple.com
Message:

Add support for media query parsing using new CSS Parser
https://bugs.webkit.org/show_bug.cgi?id=161537

Reviewed by Dean Jackson.

  • CMakeLists.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • css/MediaQueryExp.cpp:

(WebCore::featureWithValidIdent):
(WebCore::featureWithValidDensity):
(WebCore::featureWithValidPositiveLength):
(WebCore::featureWithPositiveInteger):
(WebCore::featureWithPositiveNumber):
(WebCore::featureWithZeroOrOne):
(WebCore::isFeatureValidWithIdentifier):
(WebCore::MediaQueryExpression::MediaQueryExpression):

  • css/MediaQueryExp.h:
  • css/parser/CSSParserIdioms.cpp: Added.

(WebCore::convertToASCIILowercaseInPlace):

  • css/parser/CSSParserIdioms.h:
  • css/parser/CSSParserToken.cpp:

(WebCore::convertToASCIILowercaseInPlace):

  • css/parser/MediaQueryBlockWatcher.cpp: Added.

(WebCore::MediaQueryBlockWatcher::MediaQueryBlockWatcher):
(WebCore::MediaQueryBlockWatcher::handleToken):

  • css/parser/MediaQueryBlockWatcher.h: Added.

(WebCore::MediaQueryBlockWatcher::blockLevel):

  • css/parser/MediaQueryParser.cpp: Added.

(WebCore::MediaQueryParser::parseMediaQuerySet):
(WebCore::MediaQueryParser::parseMediaCondition):
(WebCore::MediaQueryParser::MediaQueryParser):
(WebCore::MediaQueryParser::~MediaQueryParser):
(WebCore::MediaQueryParser::setStateAndRestrict):
(WebCore::MediaQueryParser::readRestrictor):
(WebCore::MediaQueryParser::readMediaNot):
(WebCore::isRestrictorOrLogicalOperator):
(WebCore::MediaQueryParser::readMediaType):
(WebCore::MediaQueryParser::commitMediaQuery):
(WebCore::MediaQueryParser::readAnd):
(WebCore::MediaQueryParser::readFeatureStart):
(WebCore::MediaQueryParser::readFeature):
(WebCore::MediaQueryParser::readFeatureColon):
(WebCore::MediaQueryParser::readFeatureValue):
(WebCore::MediaQueryParser::readFeatureEnd):
(WebCore::MediaQueryParser::skipUntilComma):
(WebCore::MediaQueryParser::skipUntilBlockEnd):
(WebCore::MediaQueryParser::done):
(WebCore::MediaQueryParser::handleBlocks):
(WebCore::MediaQueryParser::processToken):
(WebCore::MediaQueryParser::parseInternal):
(WebCore::MediaQueryData::MediaQueryData):
(WebCore::MediaQueryData::clear):
(WebCore::MediaQueryData::addExpression):
(WebCore::MediaQueryData::tryAddParserToken):
(WebCore::MediaQueryData::setMediaType):

  • css/parser/MediaQueryParser.h: Added.

(WebCore::MediaQueryData::restrictor):
(WebCore::MediaQueryData::expressions):
(WebCore::MediaQueryData::mediaType):
(WebCore::MediaQueryData::currentMediaQueryChanged):
(WebCore::MediaQueryData::setRestrictor):
(WebCore::MediaQueryData::setMediaFeature):

Location:
trunk/Source/WebCore
Files:
5 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r205291 r205368  
    14101410    css/parser/CSSParser.cpp
    14111411    css/parser/CSSParserFastPaths.cpp
     1412    css/parser/CSSParserIdioms.cpp
    14121413    css/parser/CSSParserObserverWrapper.cpp
    14131414    css/parser/CSSParserToken.cpp
     
    14181419    css/parser/CSSTokenizer.cpp
    14191420    css/parser/CSSTokenizerInputStream.cpp
     1421    css/parser/MediaQueryBlockWatcher.cpp
     1422    css/parser/MediaQueryParser.cpp
    14201423    css/parser/SVGCSSParser.cpp
    14211424
  • trunk/Source/WebCore/ChangeLog

    r205365 r205368  
     12016-09-02  Dave Hyatt  <hyatt@apple.com>
     2
     3        Add support for media query parsing using new CSS Parser
     4        https://bugs.webkit.org/show_bug.cgi?id=161537
     5
     6        Reviewed by Dean Jackson.
     7
     8        * CMakeLists.txt:
     9        * WebCore.xcodeproj/project.pbxproj:
     10        * css/MediaQueryExp.cpp:
     11        (WebCore::featureWithValidIdent):
     12        (WebCore::featureWithValidDensity):
     13        (WebCore::featureWithValidPositiveLength):
     14        (WebCore::featureWithPositiveInteger):
     15        (WebCore::featureWithPositiveNumber):
     16        (WebCore::featureWithZeroOrOne):
     17        (WebCore::isFeatureValidWithIdentifier):
     18        (WebCore::MediaQueryExpression::MediaQueryExpression):
     19        * css/MediaQueryExp.h:
     20        * css/parser/CSSParserIdioms.cpp: Added.
     21        (WebCore::convertToASCIILowercaseInPlace):
     22        * css/parser/CSSParserIdioms.h:
     23        * css/parser/CSSParserToken.cpp:
     24        (WebCore::convertToASCIILowercaseInPlace):
     25        * css/parser/MediaQueryBlockWatcher.cpp: Added.
     26        (WebCore::MediaQueryBlockWatcher::MediaQueryBlockWatcher):
     27        (WebCore::MediaQueryBlockWatcher::handleToken):
     28        * css/parser/MediaQueryBlockWatcher.h: Added.
     29        (WebCore::MediaQueryBlockWatcher::blockLevel):
     30        * css/parser/MediaQueryParser.cpp: Added.
     31        (WebCore::MediaQueryParser::parseMediaQuerySet):
     32        (WebCore::MediaQueryParser::parseMediaCondition):
     33        (WebCore::MediaQueryParser::MediaQueryParser):
     34        (WebCore::MediaQueryParser::~MediaQueryParser):
     35        (WebCore::MediaQueryParser::setStateAndRestrict):
     36        (WebCore::MediaQueryParser::readRestrictor):
     37        (WebCore::MediaQueryParser::readMediaNot):
     38        (WebCore::isRestrictorOrLogicalOperator):
     39        (WebCore::MediaQueryParser::readMediaType):
     40        (WebCore::MediaQueryParser::commitMediaQuery):
     41        (WebCore::MediaQueryParser::readAnd):
     42        (WebCore::MediaQueryParser::readFeatureStart):
     43        (WebCore::MediaQueryParser::readFeature):
     44        (WebCore::MediaQueryParser::readFeatureColon):
     45        (WebCore::MediaQueryParser::readFeatureValue):
     46        (WebCore::MediaQueryParser::readFeatureEnd):
     47        (WebCore::MediaQueryParser::skipUntilComma):
     48        (WebCore::MediaQueryParser::skipUntilBlockEnd):
     49        (WebCore::MediaQueryParser::done):
     50        (WebCore::MediaQueryParser::handleBlocks):
     51        (WebCore::MediaQueryParser::processToken):
     52        (WebCore::MediaQueryParser::parseInternal):
     53        (WebCore::MediaQueryData::MediaQueryData):
     54        (WebCore::MediaQueryData::clear):
     55        (WebCore::MediaQueryData::addExpression):
     56        (WebCore::MediaQueryData::tryAddParserToken):
     57        (WebCore::MediaQueryData::setMediaType):
     58        * css/parser/MediaQueryParser.h: Added.
     59        (WebCore::MediaQueryData::restrictor):
     60        (WebCore::MediaQueryData::expressions):
     61        (WebCore::MediaQueryData::mediaType):
     62        (WebCore::MediaQueryData::currentMediaQueryChanged):
     63        (WebCore::MediaQueryData::setRestrictor):
     64        (WebCore::MediaQueryData::setMediaFeature):
     65
    1662016-07-08  Jer Noble  <jer.noble@apple.com>
    267
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r205360 r205368  
    33513351                946D373C1D6CDFC00077084F /* CSSTokenizerInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 946D37381D6CDF980077084F /* CSSTokenizerInputStream.h */; };
    33523352                946D373F1D6CE3C20077084F /* CSSParserToken.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 946D373E1D6CE31A0077084F /* CSSParserToken.cpp */; };
    3353                 946D37401D6CE3C20077084F /* CSSParserToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 946D373D1D6CE31A0077084F /* CSSParserToken.h */; };
     3353                946D37401D6CE3C20077084F /* CSSParserToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 946D373D1D6CE31A0077084F /* CSSParserToken.h */; settings = {ATTRIBUTES = (Private, ); }; };
    33543354                946D37441D6CF7B20077084F /* CSSParserIdioms.h in Headers */ = {isa = PBXBuildFile; fileRef = 946D37431D6CF7880077084F /* CSSParserIdioms.h */; };
    33553355                946D37451D6D01D40077084F /* CSSPropertyParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 946D37411D6CF6320077084F /* CSSPropertyParser.cpp */; };
     
    33593359                946D374D1D6D08A60077084F /* CSSParserTokenRange.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 946D374B1D6D07F50077084F /* CSSParserTokenRange.cpp */; };
    33603360                946D374E1D6D08AA0077084F /* CSSParserTokenRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 946D374C1D6D07F50077084F /* CSSParserTokenRange.h */; };
     3361                9493B6BE1D74B4120088E780 /* MediaQueryBlockWatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9493B6B61D74B3950088E780 /* MediaQueryBlockWatcher.cpp */; };
     3362                9493B6BF1D74B4120088E780 /* MediaQueryBlockWatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 9493B6B71D74B3950088E780 /* MediaQueryBlockWatcher.h */; };
     3363                9493B6C01D74B4120088E780 /* MediaQueryParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9493B6B81D74B3950088E780 /* MediaQueryParser.cpp */; };
     3364                9493B6C11D74B4120088E780 /* MediaQueryParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 9493B6B91D74B3950088E780 /* MediaQueryParser.h */; };
    33613365                949C77001D6E1D9800C0DE4F /* CSSParserFastPaths.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 949C76FE1D6E1D8C00C0DE4F /* CSSParserFastPaths.cpp */; };
    33623366                949C77011D6E1D9800C0DE4F /* CSSParserFastPaths.h in Headers */ = {isa = PBXBuildFile; fileRef = 949C76FF1D6E1D8C00C0DE4F /* CSSParserFastPaths.h */; };
     
    33663370                949C77091D6E498700C0DE4F /* CSSParserObserverWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 949C77071D6E48ED00C0DE4F /* CSSParserObserverWrapper.h */; };
    33673371                949C770B1D6E49ED00C0DE4F /* CSSParserObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 949C770A1D6E49C300C0DE4F /* CSSParserObserver.h */; };
     3372                94DE5C7E1D78CB2E00164F2A /* CSSParserIdioms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94DE5C7D1D78CB2500164F2A /* CSSParserIdioms.cpp */; };
    33683373                96ABA42314BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 96ABA42214BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp */; };
    33693374                9703E1BF15DC4E37001F24C8 /* JSVoidCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97E9EC8B15DC492F004F2E71 /* JSVoidCallback.cpp */; };
     
    1049610501                946D374B1D6D07F50077084F /* CSSParserTokenRange.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CSSParserTokenRange.cpp; path = parser/CSSParserTokenRange.cpp; sourceTree = "<group>"; };
    1049710502                946D374C1D6D07F50077084F /* CSSParserTokenRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSParserTokenRange.h; path = parser/CSSParserTokenRange.h; sourceTree = "<group>"; };
     10503                9493B6B61D74B3950088E780 /* MediaQueryBlockWatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MediaQueryBlockWatcher.cpp; path = parser/MediaQueryBlockWatcher.cpp; sourceTree = "<group>"; };
     10504                9493B6B71D74B3950088E780 /* MediaQueryBlockWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediaQueryBlockWatcher.h; path = parser/MediaQueryBlockWatcher.h; sourceTree = "<group>"; };
     10505                9493B6B81D74B3950088E780 /* MediaQueryParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MediaQueryParser.cpp; path = parser/MediaQueryParser.cpp; sourceTree = "<group>"; };
     10506                9493B6B91D74B3950088E780 /* MediaQueryParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediaQueryParser.h; path = parser/MediaQueryParser.h; sourceTree = "<group>"; };
    1049810507                949C76FE1D6E1D8C00C0DE4F /* CSSParserFastPaths.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CSSParserFastPaths.cpp; path = parser/CSSParserFastPaths.cpp; sourceTree = "<group>"; };
    1049910508                949C76FF1D6E1D8C00C0DE4F /* CSSParserFastPaths.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSParserFastPaths.h; path = parser/CSSParserFastPaths.h; sourceTree = "<group>"; };
     
    1050310512                949C77071D6E48ED00C0DE4F /* CSSParserObserverWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSParserObserverWrapper.h; path = parser/CSSParserObserverWrapper.h; sourceTree = "<group>"; };
    1050410513                949C770A1D6E49C300C0DE4F /* CSSParserObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSParserObserver.h; path = parser/CSSParserObserver.h; sourceTree = "<group>"; };
     10514                94DE5C7D1D78CB2500164F2A /* CSSParserIdioms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CSSParserIdioms.cpp; path = parser/CSSParserIdioms.cpp; sourceTree = "<group>"; };
    1050510515                950C4C02BED8936F818E2F99 /* JSSVGGraphicsElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSSVGGraphicsElement.h; sourceTree = "<group>"; };
    1050610516                96ABA42214BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsContext3DOpenGLCommon.cpp; sourceTree = "<group>"; };
     
    1813918149                                949C76FE1D6E1D8C00C0DE4F /* CSSParserFastPaths.cpp */,
    1814018150                                949C76FF1D6E1D8C00C0DE4F /* CSSParserFastPaths.h */,
     18151                                94DE5C7D1D78CB2500164F2A /* CSSParserIdioms.cpp */,
    1814118152                                946D37431D6CF7880077084F /* CSSParserIdioms.h */,
    1814218153                                946D372A1D6CB28B0077084F /* CSSParserMode.h */,
     
    1815818169                                946D37351D6CDF980077084F /* CSSTokenizerInputStream.cpp */,
    1815918170                                946D37381D6CDF980077084F /* CSSTokenizerInputStream.h */,
     18171                                9493B6B61D74B3950088E780 /* MediaQueryBlockWatcher.cpp */,
     18172                                9493B6B71D74B3950088E780 /* MediaQueryBlockWatcher.h */,
     18173                                9493B6B81D74B3950088E780 /* MediaQueryParser.cpp */,
     18174                                9493B6B91D74B3950088E780 /* MediaQueryParser.h */,
    1816018175                                946D37321D6CC3720077084F /* SVGCSSParser.cpp */,
    1816118176                        );
     
    2599726012                                A454424F119B3687009BE912 /* RenderMeter.h in Headers */,
    2599826013                                1A3586E015264C450022A659 /* RenderMultiColumnFlowThread.h in Headers */,
     26014                                9493B6C11D74B4120088E780 /* MediaQueryParser.h in Headers */,
    2599926015                                BCE32B9C1517C0B200F542EC /* RenderMultiColumnSet.h in Headers */,
    2600026016                                BC1A7D9818FCB5B000421879 /* RenderMultiColumnSpannerPlaceholder.h in Headers */,
     
    2690626922                                A14832CD187F682E00DA63A6 /* WebCoreThreadSafe.h in Headers */,
    2690726923                                A14832CF187F684700DA63A6 /* WebCoreThreadSystemInterface.h in Headers */,
     26924                                9493B6BF1D74B4120088E780 /* MediaQueryBlockWatcher.h in Headers */,
    2690826925                                0F099D0917B968A100FF84B9 /* WebCoreTypedArrayController.h in Headers */,
    2690926926                                37F818FD0D657606005E1F05 /* WebCoreURLResponse.h in Headers */,
     
    2744827465                                1A8A645F1D19FCFC00D0E00F /* ApplePayShippingMethodSelectedEvent.cpp in Sources */,
    2744927466                                1A8A64621D19FCFC00D0E00F /* ApplePayValidateMerchantEvent.cpp in Sources */,
     27467                                9493B6BE1D74B4120088E780 /* MediaQueryBlockWatcher.cpp in Sources */,
    2745027468                                1A8F6BBC0DB55CDC001DB794 /* ApplicationCache.cpp in Sources */,
    2745127469                                1A8F6BBE0DB55CDC001DB794 /* ApplicationCacheGroup.cpp in Sources */,
     
    2813128149                                0FA24D79162DF91900A3F4C0 /* GraphicsLayerUpdater.cpp in Sources */,
    2813228150                                B2A015AA0AF6CD53006BCE0E /* GraphicsTypes.cpp in Sources */,
     28151                                9493B6C01D74B4120088E780 /* MediaQueryParser.cpp in Sources */,
    2813328152                                CDF7483E18FEBCEC0006ECC0 /* GridPositionsResolver.cpp in Sources */,
    2813428153                                F55B3DBF1251F12D003EF269 /* HiddenInputType.cpp in Sources */,
     
    2944829467                                86512EDE154A2AEF00A90426 /* PerformanceResourceTiming.cpp in Sources */,
    2944929468                                0F43C85D189E10CF00019AE2 /* PerformanceTiming.cpp in Sources */,
     29469                                94DE5C7E1D78CB2E00164F2A /* CSSParserIdioms.cpp in Sources */,
    2945029470                                FD581FB41520F93B003A7A75 /* PeriodicWave.cpp in Sources */,
    2945129471                                49D5DC2D0F423A73008F20FD /* PerspectiveTransformOperation.cpp in Sources */,
  • trunk/Source/WebCore/css/MediaQueryExp.cpp

    r201441 r205368  
    3131#include "CSSAspectRatioValue.h"
    3232#include "CSSParser.h"
     33#include "CSSParserIdioms.h"
     34#include "CSSParserToken.h"
    3335#include "CSSPrimitiveValue.h"
    3436#include "CSSValueList.h"
     
    3840namespace WebCore {
    3941
    40 static inline bool isFeatureValidWithIdentifier(const AtomicString& mediaFeature, const CSSParserValue& value)
    41 {
    42     if (!value.id)
    43         return false;
    44 
     42static inline bool featureWithValidIdent(const AtomicString& mediaFeature)
     43{
    4544    return mediaFeature == MediaFeatureNames::orientation
    4645#if ENABLE(VIEW_MODE_CSS_MEDIA)
    47         || mediaFeature == MediaFeatureNames::viewMode
     46    || mediaFeature == MediaFeatureNames::viewMode
    4847#endif
    49         || mediaFeature == MediaFeatureNames::colorGamut
    50         || mediaFeature == MediaFeatureNames::anyHover
    51         || mediaFeature == MediaFeatureNames::anyPointer
    52         || mediaFeature == MediaFeatureNames::hover
    53         || mediaFeature == MediaFeatureNames::invertedColors
    54         || mediaFeature == MediaFeatureNames::pointer;
     48    || mediaFeature == MediaFeatureNames::colorGamut
     49    || mediaFeature == MediaFeatureNames::anyHover
     50    || mediaFeature == MediaFeatureNames::anyPointer
     51    || mediaFeature == MediaFeatureNames::hover
     52    || mediaFeature == MediaFeatureNames::invertedColors
     53    || mediaFeature == MediaFeatureNames::pointer;
     54}
     55   
     56static inline bool featureWithValidDensity(const String& mediaFeature, const CSSParserToken& token)
     57{
     58    if ((token.unitType() != CSSPrimitiveValue::UnitTypes::CSS_DPPX && token.unitType() != CSSPrimitiveValue::UnitTypes::CSS_DPI && token.unitType() != CSSPrimitiveValue::UnitTypes::CSS_DPCM) || token.numericValue() <= 0)
     59        return false;
     60   
     61    return mediaFeature == MediaFeatureNames::resolution
     62    || mediaFeature == MediaFeatureNames::minResolution
     63    || mediaFeature == MediaFeatureNames::maxResolution;
     64}
     65
     66static inline bool featureWithValidPositiveLength(const String& mediaFeature, const CSSParserToken& token)
     67{
     68    if (!(CSSPrimitiveValue::isLength(token.unitType()) || (token.type() == NumberToken && !token.numericValue())) || token.numericValue() < 0)
     69        return false;
     70   
     71   
     72    return mediaFeature == MediaFeatureNames::height
     73    || mediaFeature == MediaFeatureNames::maxHeight
     74    || mediaFeature == MediaFeatureNames::minHeight
     75    || mediaFeature == MediaFeatureNames::width
     76    || mediaFeature == MediaFeatureNames::maxWidth
     77    || mediaFeature == MediaFeatureNames::minWidth
     78    || mediaFeature == MediaFeatureNames::deviceHeight
     79    || mediaFeature == MediaFeatureNames::maxDeviceHeight
     80    || mediaFeature == MediaFeatureNames::minDeviceHeight
     81    || mediaFeature == MediaFeatureNames::deviceWidth
     82    || mediaFeature == MediaFeatureNames::minDeviceWidth
     83    || mediaFeature == MediaFeatureNames::maxDeviceWidth;
     84}
     85
     86static inline bool featureWithPositiveInteger(const String& mediaFeature, const CSSParserToken& token)
     87{
     88    if (token.numericValueType() != IntegerValueType || token.numericValue() < 0)
     89        return false;
     90   
     91    return mediaFeature == MediaFeatureNames::color
     92    || mediaFeature == MediaFeatureNames:: maxColor
     93    || mediaFeature == MediaFeatureNames:: minColor
     94    || mediaFeature == MediaFeatureNames::colorIndex
     95    || mediaFeature == MediaFeatureNames::maxColorIndex
     96    || mediaFeature == MediaFeatureNames::minColorIndex
     97    || mediaFeature == MediaFeatureNames::monochrome
     98    || mediaFeature == MediaFeatureNames::maxMonochrome
     99    || mediaFeature == MediaFeatureNames::minMonochrome;
     100}
     101
     102static inline bool featureWithPositiveNumber(const String& mediaFeature, const CSSParserToken& token)
     103{
     104    if (token.type() != NumberToken || token.numericValue() < 0)
     105        return false;
     106   
     107    return mediaFeature == MediaFeatureNames::transform3d
     108    || mediaFeature == MediaFeatureNames::devicePixelRatio
     109    || mediaFeature == MediaFeatureNames::maxDevicePixelRatio
     110    || mediaFeature == MediaFeatureNames::minDevicePixelRatio;
     111}
     112
     113static inline bool featureWithZeroOrOne(const String& mediaFeature, const CSSParserToken& token)
     114{
     115    if (token.numericValueType() != IntegerValueType || !(token.numericValue() == 1 || !token.numericValue()))
     116        return false;
     117   
     118    return mediaFeature == MediaFeatureNames::grid;
     119}
     120
     121static inline bool isFeatureValidWithIdentifier(const AtomicString& mediaFeature, CSSValueID id)
     122{
     123    if (!id)
     124        return false;
     125
     126    return featureWithValidIdent(mediaFeature);
    55127}
    56128
     
    190262    } else if (valueList->size() == 1) {
    191263        auto& value = *valueList->valueAt(0);
    192         if (isFeatureValidWithIdentifier(mediaFeature, value)) {
     264        if (isFeatureValidWithIdentifier(mediaFeature, value.id)) {
    193265            m_value = CSSPrimitiveValue::createIdentifier(value.id);
    194266            m_isValid = true;
     
    209281            m_isValid = true;
    210282        }
     283    }
     284}
     285
     286MediaQueryExpression::MediaQueryExpression(const String& feature, const Vector<CSSParserToken, 4>& tokenList)
     287    : m_mediaFeature(feature)
     288    , m_isValid(false)
     289{
     290    // Create value for media query expression that must have 1 or more values.
     291    if (!tokenList.size() && isFeatureValidWithoutValue(m_mediaFeature)) {
     292        // Valid, creates a MediaQueryExp with an 'invalid' MediaQueryExpValue
     293        m_isValid = true;
     294    } else if (tokenList.size() == 1) {
     295        CSSParserToken token = tokenList.first();
     296        if (token.type() == IdentToken) {
     297            CSSValueID ident = token.id();
     298            if (!featureWithValidIdent(m_mediaFeature))
     299                return;
     300            m_value = CSSPrimitiveValue::createIdentifier(ident);
     301            m_isValid = true;
     302        } else if (token.type() == NumberToken || token.type() == PercentageToken || token.type() == DimensionToken) {
     303            // Check for numeric token types since it is only safe for these types to call numericValue.
     304            if (featureWithValidDensity(m_mediaFeature, token)
     305                || featureWithValidPositiveLength(m_mediaFeature, token)) {
     306                // Media features that must have non-negative <density>, ie. dppx, dpi or dpcm,
     307                // or Media features that must have non-negative <length> or number value.
     308                m_value = CSSPrimitiveValue::create(token.numericValue(), (CSSPrimitiveValue::UnitTypes) token.unitType());
     309                m_isValid = true;
     310            } else if (featureWithPositiveInteger(m_mediaFeature, token)
     311                || featureWithPositiveNumber(m_mediaFeature, token)
     312                || featureWithZeroOrOne(m_mediaFeature, token)) {
     313                // Media features that must have non-negative integer value,
     314                // or media features that must have non-negative number value,
     315                // or media features that must have (0|1) value.
     316                m_value = CSSPrimitiveValue::create(token.numericValue(), CSSPrimitiveValue::UnitTypes::CSS_NUMBER);
     317                m_isValid = true;
     318            }
     319        }
     320    } else if (tokenList.size() == 3 && isAspectRatioFeature(m_mediaFeature)) {
     321        // FIXME: <ratio> is supposed to allow whitespace around the '/'
     322        // Applicable to device-aspect-ratio and aspect-ratio.
     323        const CSSParserToken& numerator = tokenList[0];
     324        const CSSParserToken& delimiter = tokenList[1];
     325        const CSSParserToken& denominator = tokenList[2];
     326        if (delimiter.type() != DelimiterToken || delimiter.delimiter() != '/')
     327            return;
     328        if (numerator.type() != NumberToken || numerator.numericValue() <= 0 || numerator.numericValueType() != IntegerValueType)
     329            return;
     330        if (denominator.type() != NumberToken || denominator.numericValue() <= 0 || denominator.numericValueType() != IntegerValueType)
     331            return;
     332       
     333        m_value = CSSAspectRatioValue::create(numerator.numericValue(), denominator.numericValue());
     334        m_isValid = true;
     335
    211336    }
    212337}
  • trunk/Source/WebCore/css/MediaQueryExp.h

    r201441 r205368  
    2828#pragma once
    2929
     30#include "CSSParserToken.h"
    3031#include "CSSValue.h"
    3132#include <memory>
     
    4041public:
    4142    explicit MediaQueryExpression(const AtomicString& mediaFeature = emptyAtom, CSSParserValueList* values = nullptr);
     43    explicit MediaQueryExpression(const String& mediaFeature, const Vector<CSSParserToken, 4>& tokenList);
    4244
    4345    const AtomicString& mediaFeature() const;
  • trunk/Source/WebCore/css/parser/CSSParserIdioms.h

    r205103 r205368  
    3434
    3535#include <wtf/ASCIICType.h>
     36#include <wtf/text/StringView.h>
    3637
    3738namespace WebCore {
     
    5859}
    5960
     61void convertToASCIILowercaseInPlace(StringView&);
     62
    6063}
    6164
Note: See TracChangeset for help on using the changeset viewer.