| Differences between
and this patch
- Source/WebCore/ChangeLog +80 lines
Lines 1-3 Source/WebCore/ChangeLog_sec1
1
2016-09-09  Dave Hyatt  <hyatt@apple.com>
2
3
        [CSS Parser] Add the main parser implementation
4
        https://bugs.webkit.org/show_bug.cgi?id=161813
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        This patch add the main CSSParserImpl that handles stylesheet and rule parsing. All parsing starts with this
9
        class (it will eventually be invoked from the CSSParser). This patch also adds @supports parsing.
10
11
        * WebCore.xcodeproj/project.pbxproj:
12
        * css/CSSKeyframeRule.cpp:
13
        (WebCore::StyleKeyframe::StyleKeyframe):
14
        * css/CSSKeyframeRule.h:
15
        * css/StyleRule.cpp:
16
        (WebCore::StyleRuleBase::destroy):
17
        (WebCore::StyleRuleBase::copy):
18
        (WebCore::StyleRuleBase::createCSSOMWrapper):
19
        (WebCore::StyleRuleCharset::StyleRuleCharset):
20
        (WebCore::StyleRuleCharset::~StyleRuleCharset):
21
        (WebCore::StyleRuleNamespace::StyleRuleNamespace):
22
        (WebCore::StyleRuleNamespace::~StyleRuleNamespace):
23
        * css/StyleRule.h:
24
        (WebCore::StyleRuleBase::isNamespaceRule):
25
        (isType):
26
        (WebCore::StyleRuleBase::isKeyframesRule): Deleted.
27
        * css/StyleSheetContents.cpp:
28
        (WebCore::traverseSubresourcesInRules):
29
        * css/parser/CSSParserImpl.cpp: Added.
30
        (WebCore::CSSParserImpl::CSSParserImpl):
31
        (WebCore::CSSParserImpl::parseValue):
32
        (WebCore::CSSParserImpl::parseVariableValue):
33
        (WebCore::filterProperties):
34
        (WebCore::createStyleProperties):
35
        (WebCore::CSSParserImpl::parseInlineStyleDeclaration):
36
        (WebCore::CSSParserImpl::parseDeclarationList):
37
        (WebCore::CSSParserImpl::parseRule):
38
        (WebCore::CSSParserImpl::parseStyleSheet):
39
        (WebCore::CSSParserImpl::parsePageSelector):
40
        (WebCore::CSSParserImpl::parseCustomPropertySet):
41
        (WebCore::CSSParserImpl::parseKeyframeKeyList):
42
        (WebCore::CSSParserImpl::supportsDeclaration):
43
        (WebCore::CSSParserImpl::parseDeclarationListForInspector):
44
        (WebCore::CSSParserImpl::parseStyleSheetForInspector):
45
        (WebCore::computeNewAllowedRules):
46
        (WebCore::CSSParserImpl::consumeRuleList):
47
        (WebCore::CSSParserImpl::consumeAtRule):
48
        (WebCore::CSSParserImpl::consumeQualifiedRule):
49
        (WebCore::consumeStringOrURI):
50
        (WebCore::CSSParserImpl::consumeCharsetRule):
51
        (WebCore::CSSParserImpl::consumeImportRule):
52
        (WebCore::CSSParserImpl::consumeNamespaceRule):
53
        (WebCore::CSSParserImpl::consumeMediaRule):
54
        (WebCore::CSSParserImpl::consumeSupportsRule):
55
        (WebCore::CSSParserImpl::consumeViewportRule):
56
        (WebCore::CSSParserImpl::consumeFontFaceRule):
57
        (WebCore::CSSParserImpl::consumeKeyframesRule):
58
        (WebCore::CSSParserImpl::consumePageRule):
59
        (WebCore::CSSParserImpl::consumeKeyframeStyleRule):
60
        (WebCore::observeSelectors):
61
        (WebCore::CSSParserImpl::consumeStyleRule):
62
        (WebCore::CSSParserImpl::consumeDeclarationList):
63
        (WebCore::CSSParserImpl::consumeDeclaration):
64
        (WebCore::CSSParserImpl::consumeVariableValue):
65
        (WebCore::CSSParserImpl::consumeDeclarationValue):
66
        (WebCore::CSSParserImpl::consumeKeyframeKeyList):
67
        * css/parser/CSSParserImpl.h: Added.
68
        * css/parser/CSSParserValues.cpp:
69
        (WebCore::CSSParserSelector::parsePagePseudoSelector):
70
        * css/parser/CSSParserValues.h:
71
        * css/parser/CSSPropertyParser.cpp:
72
        (WebCore::CSSPropertyParser::parseValue):
73
        * css/parser/CSSSupportsParser.cpp: Added.
74
        (WebCore::CSSSupportsParser::supportsCondition):
75
        (WebCore::CSSSupportsParser::consumeCondition):
76
        (WebCore::CSSSupportsParser::consumeNegation):
77
        (WebCore::CSSSupportsParser::consumeConditionInParenthesis):
78
        * css/parser/CSSSupportsParser.h: Added.
79
        (WebCore::CSSSupportsParser::CSSSupportsParser):
80
1
2016-09-09  Tim Horton  <timothy_horton@apple.com>
81
2016-09-09  Tim Horton  <timothy_horton@apple.com>
2
82
3
        Text replacement candidates don't always overwrite the entire original string
83
        Text replacement candidates don't always overwrite the entire original string
- Source/WebCore/CMakeLists.txt +2 lines
Lines 1353-1358 set(WebCore_SOURCES Source/WebCore/CMakeLists.txt_sec1
1353
    css/parser/CSSParser.cpp
1353
    css/parser/CSSParser.cpp
1354
    css/parser/CSSParserFastPaths.cpp
1354
    css/parser/CSSParserFastPaths.cpp
1355
    css/parser/CSSParserIdioms.cpp
1355
    css/parser/CSSParserIdioms.cpp
1356
    css/parser/CSSParserImpl.cpp
1356
    css/parser/CSSParserObserverWrapper.cpp
1357
    css/parser/CSSParserObserverWrapper.cpp
1357
    css/parser/CSSParserToken.cpp
1358
    css/parser/CSSParserToken.cpp
1358
    css/parser/CSSParserTokenRange.cpp
1359
    css/parser/CSSParserTokenRange.cpp
Lines 1360-1365 set(WebCore_SOURCES Source/WebCore/CMakeLists.txt_sec2
1360
    css/parser/CSSPropertyParser.cpp
1361
    css/parser/CSSPropertyParser.cpp
1361
    css/parser/CSSPropertyParserHelpers.cpp
1362
    css/parser/CSSPropertyParserHelpers.cpp
1362
    css/parser/CSSSelectorParser.cpp
1363
    css/parser/CSSSelectorParser.cpp
1364
    css/parser/CSSSupportsParser.cpp
1363
    css/parser/CSSTokenizer.cpp
1365
    css/parser/CSSTokenizer.cpp
1364
    css/parser/CSSTokenizerInputStream.cpp
1366
    css/parser/CSSTokenizerInputStream.cpp
1365
    css/parser/MediaQueryBlockWatcher.cpp
1367
    css/parser/MediaQueryBlockWatcher.cpp
- Source/WebCore/WebCore.xcodeproj/project.pbxproj +16 lines
Lines 3376-3381 Source/WebCore/WebCore.xcodeproj/project.pbxproj_sec1
3376
		94DE5C821D7F3A1400164F2A /* CSSAtRuleID.h in Headers */ = {isa = PBXBuildFile; fileRef = 94DE5C801D7F39D000164F2A /* CSSAtRuleID.h */; };
3376
		94DE5C821D7F3A1400164F2A /* CSSAtRuleID.h in Headers */ = {isa = PBXBuildFile; fileRef = 94DE5C801D7F39D000164F2A /* CSSAtRuleID.h */; };
3377
		94DE5C8D1D80802700164F2A /* CSSSelectorParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94DE5C8B1D80801500164F2A /* CSSSelectorParser.cpp */; };
3377
		94DE5C8D1D80802700164F2A /* CSSSelectorParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94DE5C8B1D80801500164F2A /* CSSSelectorParser.cpp */; };
3378
		94DE5C8E1D80802700164F2A /* CSSSelectorParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 94DE5C8C1D80801500164F2A /* CSSSelectorParser.h */; };
3378
		94DE5C8E1D80802700164F2A /* CSSSelectorParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 94DE5C8C1D80801500164F2A /* CSSSelectorParser.h */; };
3379
		94DE5C911D83011D00164F2A /* CSSSupportsParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94DE5C8F1D8300CB00164F2A /* CSSSupportsParser.cpp */; };
3380
		94DE5C921D83011D00164F2A /* CSSSupportsParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 94DE5C901D8300CB00164F2A /* CSSSupportsParser.h */; };
3381
		94DE5C951D8301BD00164F2A /* CSSParserImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94DE5C931D8301B000164F2A /* CSSParserImpl.cpp */; };
3382
		94DE5C961D8301BD00164F2A /* CSSParserImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 94DE5C941D8301B000164F2A /* CSSParserImpl.h */; };
3379
		96ABA42314BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 96ABA42214BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp */; };
3383
		96ABA42314BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 96ABA42214BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp */; };
3380
		9703E1BF15DC4E37001F24C8 /* JSVoidCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97E9EC8B15DC492F004F2E71 /* JSVoidCallback.cpp */; };
3384
		9703E1BF15DC4E37001F24C8 /* JSVoidCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97E9EC8B15DC492F004F2E71 /* JSVoidCallback.cpp */; };
3381
		97059977107D975200A50A7C /* PolicyCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97059973107D975200A50A7C /* PolicyCallback.cpp */; };
3385
		97059977107D975200A50A7C /* PolicyCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97059973107D975200A50A7C /* PolicyCallback.cpp */; };
Lines 10529-10534 Source/WebCore/WebCore.xcodeproj/project.pbxproj_sec2
10529
		94DE5C801D7F39D000164F2A /* CSSAtRuleID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSAtRuleID.h; path = parser/CSSAtRuleID.h; sourceTree = "<group>"; };
10533
		94DE5C801D7F39D000164F2A /* CSSAtRuleID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSAtRuleID.h; path = parser/CSSAtRuleID.h; sourceTree = "<group>"; };
10530
		94DE5C8B1D80801500164F2A /* CSSSelectorParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CSSSelectorParser.cpp; path = parser/CSSSelectorParser.cpp; sourceTree = "<group>"; };
10534
		94DE5C8B1D80801500164F2A /* CSSSelectorParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CSSSelectorParser.cpp; path = parser/CSSSelectorParser.cpp; sourceTree = "<group>"; };
10531
		94DE5C8C1D80801500164F2A /* CSSSelectorParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSSelectorParser.h; path = parser/CSSSelectorParser.h; sourceTree = "<group>"; };
10535
		94DE5C8C1D80801500164F2A /* CSSSelectorParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSSelectorParser.h; path = parser/CSSSelectorParser.h; sourceTree = "<group>"; };
10536
		94DE5C8F1D8300CB00164F2A /* CSSSupportsParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CSSSupportsParser.cpp; path = parser/CSSSupportsParser.cpp; sourceTree = "<group>"; };
10537
		94DE5C901D8300CB00164F2A /* CSSSupportsParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSSupportsParser.h; path = parser/CSSSupportsParser.h; sourceTree = "<group>"; };
10538
		94DE5C931D8301B000164F2A /* CSSParserImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CSSParserImpl.cpp; path = parser/CSSParserImpl.cpp; sourceTree = "<group>"; };
10539
		94DE5C941D8301B000164F2A /* CSSParserImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSParserImpl.h; path = parser/CSSParserImpl.h; sourceTree = "<group>"; };
10532
		950C4C02BED8936F818E2F99 /* JSSVGGraphicsElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSSVGGraphicsElement.h; sourceTree = "<group>"; };
10540
		950C4C02BED8936F818E2F99 /* JSSVGGraphicsElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSSVGGraphicsElement.h; sourceTree = "<group>"; };
10533
		96ABA42214BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsContext3DOpenGLCommon.cpp; sourceTree = "<group>"; };
10541
		96ABA42214BCB80E00D56204 /* GraphicsContext3DOpenGLCommon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsContext3DOpenGLCommon.cpp; sourceTree = "<group>"; };
10534
		97059973107D975200A50A7C /* PolicyCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolicyCallback.cpp; sourceTree = "<group>"; };
10542
		97059973107D975200A50A7C /* PolicyCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolicyCallback.cpp; sourceTree = "<group>"; };
Lines 18174-18179 Source/WebCore/WebCore.xcodeproj/project.pbxproj_sec3
18174
				949C76FF1D6E1D8C00C0DE4F /* CSSParserFastPaths.h */,
18182
				949C76FF1D6E1D8C00C0DE4F /* CSSParserFastPaths.h */,
18175
				94DE5C7D1D78CB2500164F2A /* CSSParserIdioms.cpp */,
18183
				94DE5C7D1D78CB2500164F2A /* CSSParserIdioms.cpp */,
18176
				946D37431D6CF7880077084F /* CSSParserIdioms.h */,
18184
				946D37431D6CF7880077084F /* CSSParserIdioms.h */,
18185
				94DE5C931D8301B000164F2A /* CSSParserImpl.cpp */,
18186
				94DE5C941D8301B000164F2A /* CSSParserImpl.h */,
18177
				946D372A1D6CB28B0077084F /* CSSParserMode.h */,
18187
				946D372A1D6CB28B0077084F /* CSSParserMode.h */,
18178
				949C770A1D6E49C300C0DE4F /* CSSParserObserver.h */,
18188
				949C770A1D6E49C300C0DE4F /* CSSParserObserver.h */,
18179
				949C77061D6E48ED00C0DE4F /* CSSParserObserverWrapper.cpp */,
18189
				949C77061D6E48ED00C0DE4F /* CSSParserObserverWrapper.cpp */,
Lines 18190-18195 Source/WebCore/WebCore.xcodeproj/project.pbxproj_sec4
18190
				949C77031D6E393500C0DE4F /* CSSPropertyParserHelpers.h */,
18200
				949C77031D6E393500C0DE4F /* CSSPropertyParserHelpers.h */,
18191
				94DE5C8B1D80801500164F2A /* CSSSelectorParser.cpp */,
18201
				94DE5C8B1D80801500164F2A /* CSSSelectorParser.cpp */,
18192
				94DE5C8C1D80801500164F2A /* CSSSelectorParser.h */,
18202
				94DE5C8C1D80801500164F2A /* CSSSelectorParser.h */,
18203
				94DE5C8F1D8300CB00164F2A /* CSSSupportsParser.cpp */,
18204
				94DE5C901D8300CB00164F2A /* CSSSupportsParser.h */,
18193
				946D37341D6CDF980077084F /* CSSTokenizer.cpp */,
18205
				946D37341D6CDF980077084F /* CSSTokenizer.cpp */,
18194
				946D37371D6CDF980077084F /* CSSTokenizer.h */,
18206
				946D37371D6CDF980077084F /* CSSTokenizer.h */,
18195
				946D37351D6CDF980077084F /* CSSTokenizerInputStream.cpp */,
18207
				946D37351D6CDF980077084F /* CSSTokenizerInputStream.cpp */,
Lines 24990-24995 Source/WebCore/WebCore.xcodeproj/project.pbxproj_sec5
24990
				7D4C96DD1AD4483500365A50 /* JSFetchHeaders.h in Headers */,
25002
				7D4C96DD1AD4483500365A50 /* JSFetchHeaders.h in Headers */,
24991
				7E4C96DD1AD4483500365A50 /* JSFetchRequest.h in Headers */,
25003
				7E4C96DD1AD4483500365A50 /* JSFetchRequest.h in Headers */,
24992
				8E4C96DD1AD4483500365A50 /* JSFetchResponse.h in Headers */,
25004
				8E4C96DD1AD4483500365A50 /* JSFetchResponse.h in Headers */,
25005
				94DE5C961D8301BD00164F2A /* CSSParserImpl.h in Headers */,
24993
				BC00F0150E0A189500FD04E3 /* JSFile.h in Headers */,
25006
				BC00F0150E0A189500FD04E3 /* JSFile.h in Headers */,
24994
				2E3BC0CB117D3E0800B9409A /* JSFileError.h in Headers */,
25007
				2E3BC0CB117D3E0800B9409A /* JSFileError.h in Headers */,
24995
				898785F1122E1E87003AABDA /* JSFileException.h in Headers */,
25008
				898785F1122E1E87003AABDA /* JSFileException.h in Headers */,
Lines 26050-26055 Source/WebCore/WebCore.xcodeproj/project.pbxproj_sec6
26050
				1A3586E015264C450022A659 /* RenderMultiColumnFlowThread.h in Headers */,
26063
				1A3586E015264C450022A659 /* RenderMultiColumnFlowThread.h in Headers */,
26051
				9493B6C11D74B4120088E780 /* MediaQueryParser.h in Headers */,
26064
				9493B6C11D74B4120088E780 /* MediaQueryParser.h in Headers */,
26052
				BCE32B9C1517C0B200F542EC /* RenderMultiColumnSet.h in Headers */,
26065
				BCE32B9C1517C0B200F542EC /* RenderMultiColumnSet.h in Headers */,
26066
				94DE5C921D83011D00164F2A /* CSSSupportsParser.h in Headers */,
26053
				BC1A7D9818FCB5B000421879 /* RenderMultiColumnSpannerPlaceholder.h in Headers */,
26067
				BC1A7D9818FCB5B000421879 /* RenderMultiColumnSpannerPlaceholder.h in Headers */,
26054
				8AC822FD180FC03300FB64D5 /* RenderNamedFlowFragment.h in Headers */,
26068
				8AC822FD180FC03300FB64D5 /* RenderNamedFlowFragment.h in Headers */,
26055
				BC85F23D151915E000BC17BE /* RenderNamedFlowThread.h in Headers */,
26069
				BC85F23D151915E000BC17BE /* RenderNamedFlowThread.h in Headers */,
Lines 27918-27923 Source/WebCore/WebCore.xcodeproj/project.pbxproj_sec7
27918
				59A85EA2119D68D900DEF1EF /* DeviceOrientationEvent.cpp in Sources */,
27932
				59A85EA2119D68D900DEF1EF /* DeviceOrientationEvent.cpp in Sources */,
27919
				267725FC1A5B3AD9003C24DD /* DFA.cpp in Sources */,
27933
				267725FC1A5B3AD9003C24DD /* DFA.cpp in Sources */,
27920
				5C9A7A751AA0F6EA00958ACF /* DFABytecodeCompiler.cpp in Sources */,
27934
				5C9A7A751AA0F6EA00958ACF /* DFABytecodeCompiler.cpp in Sources */,
27935
				94DE5C911D83011D00164F2A /* CSSSupportsParser.cpp in Sources */,
27921
				5C9A7A761AA0F6ED00958ACF /* DFABytecodeInterpreter.cpp in Sources */,
27936
				5C9A7A761AA0F6ED00958ACF /* DFABytecodeInterpreter.cpp in Sources */,
27922
				26A807841B18F97700E219BE /* DFACombiner.cpp in Sources */,
27937
				26A807841B18F97700E219BE /* DFACombiner.cpp in Sources */,
27923
				26A517FD1AB92238006335DF /* DFAMinimizer.cpp in Sources */,
27938
				26A517FD1AB92238006335DF /* DFAMinimizer.cpp in Sources */,
Lines 28463-28468 Source/WebCore/WebCore.xcodeproj/project.pbxproj_sec8
28463
				418F88040FF957AE0080F045 /* JSAbstractWorker.cpp in Sources */,
28478
				418F88040FF957AE0080F045 /* JSAbstractWorker.cpp in Sources */,
28464
				FDA15EC912B03F50003A583A /* JSAnalyserNode.cpp in Sources */,
28479
				FDA15EC912B03F50003A583A /* JSAnalyserNode.cpp in Sources */,
28465
				31A795C61888BADC00382F90 /* JSANGLEInstancedArrays.cpp in Sources */,
28480
				31A795C61888BADC00382F90 /* JSANGLEInstancedArrays.cpp in Sources */,
28481
				94DE5C951D8301BD00164F2A /* CSSParserImpl.cpp in Sources */,
28466
				12A253E21C8FFF6600C22295 /* JSAnimatable.cpp in Sources */,
28482
				12A253E21C8FFF6600C22295 /* JSAnimatable.cpp in Sources */,
28467
				120DE3FE1C87E18800B6D4DD /* JSAnimationEffect.cpp in Sources */,
28483
				120DE3FE1C87E18800B6D4DD /* JSAnimationEffect.cpp in Sources */,
28468
				3198480B1A1E6CE400A13318 /* JSAnimationEvent.cpp in Sources */,
28484
				3198480B1A1E6CE400A13318 /* JSAnimationEvent.cpp in Sources */,
- Source/WebCore/css/CSSKeyframeRule.cpp -1 / +9 lines
Lines 34-43 Source/WebCore/css/CSSKeyframeRule.cpp_sec1
34
namespace WebCore {
34
namespace WebCore {
35
35
36
StyleKeyframe::StyleKeyframe(Ref<StyleProperties>&& properties)
36
StyleKeyframe::StyleKeyframe(Ref<StyleProperties>&& properties)
37
    : m_properties(WTFMove(properties))
37
    : StyleRuleBase(Keyframe, 0)
38
    , m_properties(WTFMove(properties))
38
{
39
{
39
}
40
}
40
41
42
StyleKeyframe::StyleKeyframe(std::unique_ptr<Vector<double>> keys, Ref<StyleProperties>&& properties)
43
    : StyleRuleBase(Keyframe, 0)
44
    , m_properties(WTFMove(properties))
45
    , m_keys(*keys)
46
{
47
}
48
    
41
StyleKeyframe::~StyleKeyframe()
49
StyleKeyframe::~StyleKeyframe()
42
{
50
{
43
}
51
}
- Source/WebCore/css/CSSKeyframeRule.h -2 / +9 lines
Lines 36-48 class CSSStyleDeclaration; Source/WebCore/css/CSSKeyframeRule.h_sec1
36
class StyleRuleCSSStyleDeclaration;
36
class StyleRuleCSSStyleDeclaration;
37
class CSSKeyframesRule;
37
class CSSKeyframesRule;
38
38
39
class StyleKeyframe final : public RefCounted<StyleKeyframe> {
39
// FIXME-NEWPARSER: Rename this to StyleRuleKeyframe
40
    WTF_MAKE_FAST_ALLOCATED;
40
class StyleKeyframe final : public StyleRuleBase {
41
public:
41
public:
42
    // FIXME-NEWPARSER: Remove this create function once we get rid of the old parser.
42
    static Ref<StyleKeyframe> create(Ref<StyleProperties>&& properties)
43
    static Ref<StyleKeyframe> create(Ref<StyleProperties>&& properties)
43
    {
44
    {
44
        return adoptRef(*new StyleKeyframe(WTFMove(properties)));
45
        return adoptRef(*new StyleKeyframe(WTFMove(properties)));
45
    }
46
    }
47
48
    static Ref<StyleKeyframe> create(std::unique_ptr<Vector<double>> keys, Ref<StyleProperties>&& properties)
49
    {
50
        return adoptRef(*new StyleKeyframe(WTFMove(keys), WTFMove(properties)));
51
    }
46
    ~StyleKeyframe();
52
    ~StyleKeyframe();
47
53
48
    String keyText() const;
54
    String keyText() const;
Lines 63-68 public: Source/WebCore/css/CSSKeyframeRule.h_sec2
63
69
64
private:
70
private:
65
    explicit StyleKeyframe(Ref<StyleProperties>&&);
71
    explicit StyleKeyframe(Ref<StyleProperties>&&);
72
    StyleKeyframe(std::unique_ptr<Vector<double>>, Ref<StyleProperties>&&);
66
73
67
    Ref<StyleProperties> m_properties;
74
    Ref<StyleProperties> m_properties;
68
    Vector<double> m_keys;
75
    Vector<double> m_keys;
- Source/WebCore/css/StyleRule.cpp -1 / +38 lines
Lines 90-95 void StyleRuleBase::destroy() Source/WebCore/css/StyleRule.cpp_sec1
90
        delete downcast<StyleRuleViewport>(this);
90
        delete downcast<StyleRuleViewport>(this);
91
        return;
91
        return;
92
#endif
92
#endif
93
    case Namespace:
94
        delete downcast<StyleRuleNamespace>(this);
95
        return;
93
    case Unknown:
96
    case Unknown:
94
    case Charset:
97
    case Charset:
95
    case Keyframe:
98
    case Keyframe:
Lines 126-132 Ref<StyleRuleBase> StyleRuleBase::copy() Source/WebCore/css/StyleRule.cpp_sec2
126
        return downcast<StyleRuleViewport>(*this).copy();
129
        return downcast<StyleRuleViewport>(*this).copy();
127
#endif
130
#endif
128
    case Import:
131
    case Import:
129
        // FIXME: Copy import rules.
132
    case Namespace:
133
        // FIXME: Copy import and namespace rules.
130
        break;
134
        break;
131
    case Unknown:
135
    case Unknown:
132
    case Charset:
136
    case Charset:
Lines 179-184 RefPtr<CSSRule> StyleRuleBase::createCSS Source/WebCore/css/StyleRule.cpp_sec3
179
#endif
183
#endif
180
    case Unknown:
184
    case Unknown:
181
    case Charset:
185
    case Charset:
186
    case Namespace: // FIXME: Add support for CSSNamespaceRule.
182
    case Keyframe:
187
    case Keyframe:
183
#if !ENABLE(CSS_REGIONS)
188
#if !ENABLE(CSS_REGIONS)
184
    case Region:
189
    case Region:
Lines 396-399 MutableStyleProperties& StyleRuleViewpor Source/WebCore/css/StyleRule.cpp_sec4
396
}
401
}
397
#endif // ENABLE(CSS_DEVICE_ADAPTATION)
402
#endif // ENABLE(CSS_DEVICE_ADAPTATION)
398
403
404
StyleRuleCharset::StyleRuleCharset()
405
    : StyleRuleBase(Charset, 0)
406
{
407
}
408
409
StyleRuleCharset::StyleRuleCharset(const StyleRuleCharset& o)
410
: StyleRuleBase(o)
411
{
412
}
413
414
StyleRuleCharset::~StyleRuleCharset()
415
{
416
}
417
418
StyleRuleNamespace::StyleRuleNamespace(AtomicString prefix, AtomicString uri)
419
    : StyleRuleBase(Namespace, 0)
420
    , m_prefix(prefix)
421
    , m_uri(uri)
422
{
423
}
424
425
StyleRuleNamespace::StyleRuleNamespace(const StyleRuleNamespace& o)
426
    : StyleRuleBase(o)
427
    , m_prefix(o.m_prefix)
428
    , m_uri(o.m_uri)
429
{
430
}
431
432
StyleRuleNamespace::~StyleRuleNamespace()
433
{
434
}
435
399
} // namespace WebCore
436
} // namespace WebCore
- Source/WebCore/css/StyleRule.h -1 / +42 lines
Lines 48-53 public: Source/WebCore/css/StyleRule.h_sec1
48
        Page,
48
        Page,
49
        Keyframes,
49
        Keyframes,
50
        Keyframe, // Not used. These are internally non-rule StyleKeyframe objects.
50
        Keyframe, // Not used. These are internally non-rule StyleKeyframe objects.
51
        Namespace,
51
        Supports = 12,
52
        Supports = 12,
52
#if ENABLE(CSS_DEVICE_ADAPTATION)
53
#if ENABLE(CSS_DEVICE_ADAPTATION)
53
        Viewport = 15,
54
        Viewport = 15,
Lines 60-65 public: Source/WebCore/css/StyleRule.h_sec2
60
    bool isCharsetRule() const { return type() == Charset; }
61
    bool isCharsetRule() const { return type() == Charset; }
61
    bool isFontFaceRule() const { return type() == FontFace; }
62
    bool isFontFaceRule() const { return type() == FontFace; }
62
    bool isKeyframesRule() const { return type() == Keyframes; }
63
    bool isKeyframesRule() const { return type() == Keyframes; }
64
    bool isNamespaceRule() const { return type() == Namespace; }
63
    bool isMediaRule() const { return type() == Media; }
65
    bool isMediaRule() const { return type() == Media; }
64
    bool isPageRule() const { return type() == Page; }
66
    bool isPageRule() const { return type() == Page; }
65
    bool isStyleRule() const { return type() == Style; }
67
    bool isStyleRule() const { return type() == Style; }
Lines 144-150 public: Source/WebCore/css/StyleRule.h_sec3
144
146
145
    Ref<StyleRuleFontFace> copy() const { return adoptRef(*new StyleRuleFontFace(*this)); }
147
    Ref<StyleRuleFontFace> copy() const { return adoptRef(*new StyleRuleFontFace(*this)); }
146
148
147
148
private:
149
private:
149
    explicit StyleRuleFontFace(Ref<StyleProperties>&&);
150
    explicit StyleRuleFontFace(Ref<StyleProperties>&&);
150
    StyleRuleFontFace(const StyleRuleFontFace&);
151
    StyleRuleFontFace(const StyleRuleFontFace&);
Lines 265-270 private: Source/WebCore/css/StyleRule.h_sec4
265
};
266
};
266
#endif // ENABLE(CSS_DEVICE_ADAPTATION)
267
#endif // ENABLE(CSS_DEVICE_ADAPTATION)
267
268
269
// This is only used by the CSS parser.
270
class StyleRuleCharset final : public StyleRuleBase {
271
public:
272
    static Ref<StyleRuleCharset> create() { return adoptRef(*new StyleRuleCharset()); }
273
    
274
    ~StyleRuleCharset();
275
    
276
    Ref<StyleRuleCharset> copy() const { return adoptRef(*new StyleRuleCharset(*this)); }
277
278
private:
279
    explicit StyleRuleCharset();
280
    StyleRuleCharset(const StyleRuleCharset&);
281
};
282
283
class StyleRuleNamespace final : public StyleRuleBase {
284
public:
285
    static Ref<StyleRuleNamespace> create(AtomicString prefix, AtomicString uri)
286
    {
287
        return adoptRef(*new StyleRuleNamespace(prefix, uri));
288
    }
289
    
290
    ~StyleRuleNamespace();
291
292
    Ref<StyleRuleNamespace> copy() const { return adoptRef(*new StyleRuleNamespace(*this)); }
293
    
294
    AtomicString prefix() const { return m_prefix; }
295
    AtomicString uri() const { return m_uri; }
296
297
private:
298
    StyleRuleNamespace(AtomicString prefix, AtomicString uri);
299
    StyleRuleNamespace(const StyleRuleNamespace&);
300
    
301
    AtomicString m_prefix;
302
    AtomicString m_uri;
303
};
304
    
268
} // namespace WebCore
305
} // namespace WebCore
269
306
270
SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::StyleRule)
307
SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::StyleRule)
Lines 296-298 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::St Source/WebCore/css/StyleRule.h_sec5
296
    static bool isType(const WebCore::StyleRuleBase& rule) { return rule.isViewportRule(); }
333
    static bool isType(const WebCore::StyleRuleBase& rule) { return rule.isViewportRule(); }
297
SPECIALIZE_TYPE_TRAITS_END()
334
SPECIALIZE_TYPE_TRAITS_END()
298
#endif // ENABLE(CSS_DEVICE_ADAPTATION)
335
#endif // ENABLE(CSS_DEVICE_ADAPTATION)
336
337
SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::StyleRuleNamespace)
338
    static bool isType(const WebCore::StyleRuleBase& rule) { return rule.isNamespaceRule(); }
339
SPECIALIZE_TYPE_TRAITS_END()
- Source/WebCore/css/StyleSheetContents.cpp +1 lines
Lines 460-465 static bool traverseSubresourcesInRules( Source/WebCore/css/StyleSheetContents.cpp_sec1
460
#endif
460
#endif
461
        case StyleRuleBase::Page:
461
        case StyleRuleBase::Page:
462
        case StyleRuleBase::Keyframes:
462
        case StyleRuleBase::Keyframes:
463
        case StyleRuleBase::Namespace:
463
        case StyleRuleBase::Unknown:
464
        case StyleRuleBase::Unknown:
464
        case StyleRuleBase::Charset:
465
        case StyleRuleBase::Charset:
465
        case StyleRuleBase::Keyframe:
466
        case StyleRuleBase::Keyframe:
- Source/WebCore/css/parser/CSSParserImpl.cpp +833 lines
Line 0 Source/WebCore/css/parser/CSSParserImpl.cpp_sec1
1
// Copyright 2014 The Chromium Authors. All rights reserved.
2
// Copyright (C) 2016 Apple Inc. 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 are
6
// met:
7
//
8
//    * Redistributions of source code must retain the above copyright
9
// notice, this list of conditions and the following disclaimer.
10
//    * Redistributions in binary form must reproduce the above
11
// copyright notice, this list of conditions and the following disclaimer
12
// in the documentation and/or other materials provided with the
13
// distribution.
14
//    * Neither the name of Google Inc. nor the names of its
15
// contributors may be used to endorse or promote products derived from
16
// this software without specific prior written permission.
17
//
18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30
#include "config.h"
31
#include "CSSParserImpl.h"
32
33
#include "CSSAtRuleID.h"
34
#include "CSSCustomPropertyValue.h"
35
#include "CSSKeyframeRule.h"
36
#include "CSSKeyframesRule.h"
37
#include "CSSParserObserver.h"
38
#include "CSSParserObserverWrapper.h"
39
#include "CSSParserValues.h" // FIXME-NEWPARSER We need to move CSSParserSelector to its own file.
40
#include "CSSPropertyParser.h"
41
#include "CSSSelectorParser.h"
42
#include "CSSStyleSheet.h"
43
#include "CSSSupportsParser.h"
44
#include "CSSTokenizer.h"
45
// FIXME-NEWPARSER: #include "CSSVariableParser.h"
46
#include "Document.h"
47
#include "Element.h"
48
#include "MediaQueryParser.h"
49
#include "StyleProperties.h"
50
#include "StyleRuleImport.h"
51
#include "StyleSheetContents.h"
52
53
#include <bitset>
54
#include <memory>
55
56
namespace WebCore {
57
58
CSSParserImpl::CSSParserImpl(const CSSParserContext& context, StyleSheetContents* styleSheet)
59
    : m_context(context)
60
    , m_styleSheet(styleSheet)
61
    , m_observerWrapper(nullptr)
62
{
63
}
64
65
bool CSSParserImpl::parseValue(MutableStyleProperties* declaration, CSSPropertyID unresolvedProperty, const String& string, bool important, const CSSParserContext& context)
66
{
67
    CSSParserImpl parser(context);
68
    StyleRule::Type ruleType = StyleRule::Style;
69
#if ENABLE(CSS_DEVICE_ADAPTATION)
70
    if (declaration->cssParserMode() == CSSViewportRuleMode)
71
        ruleType = StyleRule::Viewport;
72
#endif
73
    CSSTokenizer::Scope scope(string);
74
    parser.consumeDeclarationValue(scope.tokenRange(), unresolvedProperty, important, ruleType);
75
    if (parser.m_parsedProperties.isEmpty())
76
        return false;
77
    return declaration->addParsedProperties(parser.m_parsedProperties);
78
}
79
80
bool CSSParserImpl::parseVariableValue(MutableStyleProperties* declaration, const AtomicString& propertyName, const String& value, bool important, const CSSParserContext& context)
81
{
82
    CSSParserImpl parser(context);
83
    CSSTokenizer::Scope scope(value);
84
    parser.consumeVariableValue(scope.tokenRange(), propertyName, important);
85
    if (parser.m_parsedProperties.isEmpty())
86
        return false;
87
    return declaration->addParsedProperties(parser.m_parsedProperties);
88
}
89
90
static inline void filterProperties(bool important, const ParsedPropertyVector& input, ParsedPropertyVector& output, size_t& unusedEntries, std::bitset<numCSSProperties>& seenProperties, HashSet<AtomicString>& seenCustomProperties)
91
{
92
    // Add properties in reverse order so that highest priority definitions are reached first. Duplicate definitions can then be ignored when found.
93
    for (size_t i = input.size(); i--; ) {
94
        const CSSProperty& property = input[i];
95
        if (property.isImportant() != important)
96
            continue;
97
        const unsigned propertyIDIndex = property.id() - firstCSSProperty;
98
        
99
        if (property.id() == CSSPropertyCustom) {
100
            if (property.value()) {
101
                auto& name = downcast<CSSCustomPropertyValue>(*property.value()).name();
102
                if (!seenCustomProperties.add(name).isNewEntry)
103
                    continue;
104
                output[--unusedEntries] = property;
105
            }
106
            continue;
107
        } else {
108
            if (seenProperties.test(propertyIDIndex))
109
                continue;
110
            seenProperties.set(propertyIDIndex);
111
        }
112
        // FIXME-NEWPARSER: We won't support @apply yet.
113
        /*else if (property.id() == CSSPropertyApplyAtRule) {
114
         // FIXME: Do we need to do anything here?
115
         } */
116
        
117
        output[--unusedEntries] = property;
118
    }
119
}
120
121
static Ref<ImmutableStyleProperties> createStyleProperties(ParsedPropertyVector& parsedProperties, CSSParserMode mode)
122
{
123
    std::bitset<numCSSProperties> seenProperties;
124
    size_t unusedEntries = parsedProperties.size();
125
    ParsedPropertyVector results(unusedEntries);
126
    HashSet<AtomicString> seenCustomProperties;
127
128
    filterProperties(true, parsedProperties, results, unusedEntries, seenProperties, seenCustomProperties);
129
    filterProperties(false, parsedProperties, results, unusedEntries, seenProperties, seenCustomProperties);
130
131
    Ref<ImmutableStyleProperties> result = ImmutableStyleProperties::create(results.data() + unusedEntries, results.size() - unusedEntries, mode);
132
    parsedProperties.clear();
133
    return result;
134
}
135
136
Ref<ImmutableStyleProperties> CSSParserImpl::parseInlineStyleDeclaration(const String& string, Element* element)
137
{
138
    Document& document = element->document();
139
    CSSParserContext context = CSSParserContext(document.elementSheet().contents().parserContext());
140
    CSSParserMode mode = element->isHTMLElement() && !document.inQuirksMode() ? HTMLStandardMode : HTMLQuirksMode;
141
    context.mode = mode;
142
    CSSParserImpl parser(context, &document.elementSheet().contents());
143
    CSSTokenizer::Scope scope(string);
144
    parser.consumeDeclarationList(scope.tokenRange(), StyleRule::Style);
145
    return createStyleProperties(parser.m_parsedProperties, mode);
146
}
147
148
bool CSSParserImpl::parseDeclarationList(MutableStyleProperties* declaration, const String& string, const CSSParserContext& context)
149
{
150
    CSSParserImpl parser(context);
151
    StyleRule::Type ruleType = StyleRule::Style;
152
#if ENABLE(CSS_DEVICE_ADAPTATION)
153
    if (declaration->cssParserMode() == CSSViewportRuleMode)
154
        ruleType = StyleRule::Viewport;
155
#endif
156
    CSSTokenizer::Scope scope(string);
157
    parser.consumeDeclarationList(scope.tokenRange(), ruleType);
158
    if (parser.m_parsedProperties.isEmpty())
159
        return false;
160
161
    std::bitset<numCSSProperties> seenProperties;
162
    size_t unusedEntries = parser.m_parsedProperties.size();
163
    ParsedPropertyVector results(unusedEntries);
164
    HashSet<AtomicString> seenCustomProperties;
165
    filterProperties(true, parser.m_parsedProperties, results, unusedEntries, seenProperties, seenCustomProperties);
166
    filterProperties(false, parser.m_parsedProperties, results, unusedEntries, seenProperties, seenCustomProperties);
167
    if (unusedEntries)
168
        results.remove(0, unusedEntries);
169
    return declaration->addParsedProperties(results);
170
}
171
172
RefPtr<StyleRuleBase> CSSParserImpl::parseRule(const String& string, const CSSParserContext& context, StyleSheetContents* styleSheet, AllowedRulesType allowedRules)
173
{
174
    CSSParserImpl parser(context, styleSheet);
175
    CSSTokenizer::Scope scope(string);
176
    CSSParserTokenRange range = scope.tokenRange();
177
    range.consumeWhitespace();
178
    if (range.atEnd())
179
        return nullptr; // Parse error, empty rule
180
    RefPtr<StyleRuleBase> rule;
181
    if (range.peek().type() == AtKeywordToken)
182
        rule = parser.consumeAtRule(range, allowedRules);
183
    else
184
        rule = parser.consumeQualifiedRule(range, allowedRules);
185
    if (!rule)
186
        return nullptr; // Parse error, failed to consume rule
187
    range.consumeWhitespace();
188
    if (!rule || !range.atEnd())
189
        return nullptr; // Parse error, trailing garbage
190
    return rule;
191
}
192
193
void CSSParserImpl::parseStyleSheet(const String& string, const CSSParserContext& context, StyleSheetContents* styleSheet)
194
{
195
    CSSTokenizer::Scope scope(string);
196
    CSSParserImpl parser(context, styleSheet);
197
    bool firstRuleValid = parser.consumeRuleList(scope.tokenRange(), TopLevelRuleList, [&styleSheet](RefPtr<StyleRuleBase> rule) {
198
        if (rule->isCharsetRule())
199
            return;
200
        styleSheet->parserAppendRule(rule.releaseNonNull());
201
    });
202
    styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid);
203
}
204
205
CSSSelectorList CSSParserImpl::parsePageSelector(CSSParserTokenRange range, StyleSheetContents* styleSheet)
206
{
207
    // We only support a small subset of the css-page spec.
208
    range.consumeWhitespace();
209
    AtomicString typeSelector;
210
    if (range.peek().type() == IdentToken)
211
        typeSelector = range.consume().value().toAtomicString();
212
213
    AtomicString pseudo;
214
    if (range.peek().type() == ColonToken) {
215
        range.consume();
216
        if (range.peek().type() != IdentToken)
217
            return CSSSelectorList();
218
        pseudo = range.consume().value().toAtomicString();
219
    }
220
221
    range.consumeWhitespace();
222
    if (!range.atEnd())
223
        return CSSSelectorList(); // Parse error; extra tokens in @page selector
224
225
    std::unique_ptr<CSSParserSelector> selector;
226
    if (!typeSelector.isNull() && pseudo.isNull())
227
        selector = std::unique_ptr<CSSParserSelector>(new CSSParserSelector(QualifiedName(nullAtom, typeSelector, styleSheet->defaultNamespace())));
228
    else {
229
        selector = std::unique_ptr<CSSParserSelector>(new CSSParserSelector);
230
        if (!pseudo.isNull()) {
231
            selector = std::unique_ptr<CSSParserSelector>(CSSParserSelector::parsePagePseudoSelector(pseudo));
232
            if (!selector || selector->pseudoElementType() == CSSSelector::PseudoElementUnknown)
233
                return CSSSelectorList();
234
        }
235
        if (!typeSelector.isNull())
236
            selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, styleSheet->defaultNamespace()));
237
    }
238
239
    selector->setForPage();
240
    Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
241
    selectorVector.append(WTFMove(selector));
242
    CSSSelectorList selectorList;
243
    selectorList.adoptSelectorVector(selectorVector);
244
    return selectorList;
245
}
246
247
RefPtr<ImmutableStyleProperties> CSSParserImpl::parseCustomPropertySet(CSSParserTokenRange range)
248
{
249
    range.consumeWhitespace();
250
    if (range.peek().type() != LeftBraceToken)
251
        return nullptr;
252
    CSSParserTokenRange block = range.consumeBlock();
253
    range.consumeWhitespace();
254
    if (!range.atEnd())
255
        return nullptr;
256
    CSSParserImpl parser(strictCSSParserContext());
257
    parser.consumeDeclarationList(block, StyleRule::Style);
258
259
    // FIXME-NEWPARSER: We dont support @apply yet.
260
    // Drop nested @apply rules. Seems nicer to do this here instead of making
261
    // a different StyleRule type
262
    /*for (size_t i = parser.m_parsedProperties.size(); i--; ) {
263
        if (parser.m_parsedProperties[i].id() == CSSPropertyApplyAtRule)
264
            parser.m_parsedProperties.remove(i);
265
    }*/
266
267
    return createStyleProperties(parser.m_parsedProperties, HTMLStandardMode);
268
}
269
270
std::unique_ptr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& keyList)
271
{
272
    return consumeKeyframeKeyList(CSSTokenizer::Scope(keyList).tokenRange());
273
}
274
275
bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range)
276
{
277
    ASSERT(m_parsedProperties.isEmpty());
278
    consumeDeclaration(range, StyleRule::Style);
279
    bool result = !m_parsedProperties.isEmpty();
280
    m_parsedProperties.clear();
281
    return result;
282
}
283
284
void CSSParserImpl::parseDeclarationListForInspector(const String& declaration, const CSSParserContext& context, CSSParserObserver& observer)
285
{
286
    CSSParserImpl parser(context);
287
    CSSParserObserverWrapper wrapper(observer);
288
    parser.m_observerWrapper = &wrapper;
289
    CSSTokenizer::Scope scope(declaration, wrapper);
290
    observer.startRuleHeader(StyleRule::Style, 0);
291
    observer.endRuleHeader(1);
292
    parser.consumeDeclarationList(scope.tokenRange(), StyleRule::Style);
293
}
294
295
void CSSParserImpl::parseStyleSheetForInspector(const String& string, const CSSParserContext& context, StyleSheetContents* styleSheet, CSSParserObserver& observer)
296
{
297
    CSSParserImpl parser(context, styleSheet);
298
    CSSParserObserverWrapper wrapper(observer);
299
    parser.m_observerWrapper = &wrapper;
300
    CSSTokenizer::Scope scope(string, wrapper);
301
    bool firstRuleValid = parser.consumeRuleList(scope.tokenRange(), TopLevelRuleList, [&styleSheet](RefPtr<StyleRuleBase> rule) {
302
        if (rule->isCharsetRule())
303
            return;
304
        styleSheet->parserAppendRule(rule.releaseNonNull());
305
    });
306
    styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid);
307
}
308
309
static CSSParserImpl::AllowedRulesType computeNewAllowedRules(CSSParserImpl::AllowedRulesType allowedRules, StyleRuleBase* rule)
310
{
311
    if (!rule || allowedRules == CSSParserImpl::KeyframeRules || allowedRules == CSSParserImpl::NoRules)
312
        return allowedRules;
313
    ASSERT(allowedRules <= CSSParserImpl::RegularRules);
314
    if (rule->isCharsetRule() || rule->isImportRule())
315
        return CSSParserImpl::AllowImportRules;
316
    if (rule->isNamespaceRule())
317
        return CSSParserImpl::AllowNamespaceRules;
318
    return CSSParserImpl::RegularRules;
319
}
320
321
template<typename T>
322
bool CSSParserImpl::consumeRuleList(CSSParserTokenRange range, RuleListType ruleListType, const T callback)
323
{
324
    AllowedRulesType allowedRules = RegularRules;
325
    switch (ruleListType) {
326
    case TopLevelRuleList:
327
        allowedRules = AllowCharsetRules;
328
        break;
329
    case RegularRuleList:
330
        allowedRules = RegularRules;
331
        break;
332
    case KeyframesRuleList:
333
        allowedRules = KeyframeRules;
334
        break;
335
    default:
336
        ASSERT_NOT_REACHED();
337
    }
338
339
    bool seenRule = false;
340
    bool firstRuleValid = false;
341
    while (!range.atEnd()) {
342
        RefPtr<StyleRuleBase> rule;
343
        switch (range.peek().type()) {
344
        case WhitespaceToken:
345
            range.consumeWhitespace();
346
            continue;
347
        case AtKeywordToken:
348
            rule = consumeAtRule(range, allowedRules);
349
            break;
350
        case CDOToken:
351
        case CDCToken:
352
            if (ruleListType == TopLevelRuleList) {
353
                range.consume();
354
                continue;
355
            }
356
            FALLTHROUGH;
357
        default:
358
            rule = consumeQualifiedRule(range, allowedRules);
359
            break;
360
        }
361
        if (!seenRule) {
362
            seenRule = true;
363
            firstRuleValid = rule;
364
        }
365
        if (rule) {
366
            allowedRules = computeNewAllowedRules(allowedRules, rule.get());
367
            callback(rule);
368
        }
369
    }
370
371
    return firstRuleValid;
372
}
373
374
RefPtr<StyleRuleBase> CSSParserImpl::consumeAtRule(CSSParserTokenRange& range, AllowedRulesType allowedRules)
375
{
376
    ASSERT(range.peek().type() == AtKeywordToken);
377
    const StringView name = range.consumeIncludingWhitespace().value();
378
    const CSSParserToken* preludeStart = &range.peek();
379
    while (!range.atEnd() && range.peek().type() != LeftBraceToken && range.peek().type() != SemicolonToken)
380
        range.consumeComponentValue();
381
382
    CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek());
383
    CSSAtRuleID id = cssAtRuleID(name);
384
    
385
    if (range.atEnd() || range.peek().type() == SemicolonToken) {
386
        range.consume();
387
        if (allowedRules == AllowCharsetRules && id == CSSAtRuleCharset)
388
            return consumeCharsetRule(prelude);
389
        if (allowedRules <= AllowImportRules && id == CSSAtRuleImport)
390
            return consumeImportRule(prelude);
391
        if (allowedRules <= AllowNamespaceRules && id == CSSAtRuleNamespace)
392
            return consumeNamespaceRule(prelude);
393
        // FIXME-NEWPARSER: Support "apply"
394
        /*if (allowedRules == ApplyRules && id == CSSAtRuleApply) {
395
            consumeApplyRule(prelude);
396
            return nullptr; // consumeApplyRule just updates m_parsedProperties
397
        }*/
398
        return nullptr; // Parse error, unrecognised at-rule without block
399
    }
400
401
    CSSParserTokenRange block = range.consumeBlock();
402
    if (allowedRules == KeyframeRules)
403
        return nullptr; // Parse error, no at-rules supported inside @keyframes
404
    if (allowedRules == NoRules || allowedRules == ApplyRules)
405
        return nullptr; // Parse error, no at-rules with blocks supported inside declaration lists
406
407
    ASSERT(allowedRules <= RegularRules);
408
409
    switch (id) {
410
    case CSSAtRuleMedia:
411
        return consumeMediaRule(prelude, block);
412
    case CSSAtRuleSupports:
413
        return consumeSupportsRule(prelude, block);
414
#if ENABLE(CSS_DEVICE_ADAPTATION)
415
    case CSSAtRuleViewport:
416
        return consumeViewportRule(prelude, block);
417
#endif
418
    case CSSAtRuleFontFace:
419
        return consumeFontFaceRule(prelude, block);
420
    case CSSAtRuleWebkitKeyframes:
421
        return consumeKeyframesRule(true, prelude, block);
422
    case CSSAtRuleKeyframes:
423
        return consumeKeyframesRule(false, prelude, block);
424
    case CSSAtRulePage:
425
        return consumePageRule(prelude, block);
426
    default:
427
        return nullptr; // Parse error, unrecognised at-rule with block
428
    }
429
}
430
431
RefPtr<StyleRuleBase> CSSParserImpl::consumeQualifiedRule(CSSParserTokenRange& range, AllowedRulesType allowedRules)
432
{
433
    const CSSParserToken* preludeStart = &range.peek();
434
    while (!range.atEnd() && range.peek().type() != LeftBraceToken)
435
        range.consumeComponentValue();
436
437
    if (range.atEnd())
438
        return nullptr; // Parse error, EOF instead of qualified rule block
439
440
    CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek());
441
    CSSParserTokenRange block = range.consumeBlock();
442
443
    if (allowedRules <= RegularRules)
444
        return consumeStyleRule(prelude, block);
445
    if (allowedRules == KeyframeRules)
446
        return consumeKeyframeStyleRule(prelude, block);
447
448
    ASSERT_NOT_REACHED();
449
    return nullptr;
450
}
451
452
// This may still consume tokens if it fails
453
static AtomicString consumeStringOrURI(CSSParserTokenRange& range)
454
{
455
    const CSSParserToken& token = range.peek();
456
457
    if (token.type() == StringToken || token.type() == UrlToken)
458
        return range.consumeIncludingWhitespace().value().toAtomicString();
459
460
    if (token.type() != FunctionToken || !equalIgnoringASCIICase(token.value(), "url"))
461
        return AtomicString();
462
463
    CSSParserTokenRange contents = range.consumeBlock();
464
    const CSSParserToken& uri = contents.consumeIncludingWhitespace();
465
    if (uri.type() == BadStringToken || !contents.atEnd())
466
        return AtomicString();
467
    return uri.value().toAtomicString();
468
}
469
470
RefPtr<StyleRuleCharset> CSSParserImpl::consumeCharsetRule(CSSParserTokenRange prelude)
471
{
472
    const CSSParserToken& string = prelude.consumeIncludingWhitespace();
473
    if (string.type() != StringToken || !prelude.atEnd())
474
        return nullptr; // Parse error, expected a single string
475
    return StyleRuleCharset::create();
476
}
477
478
RefPtr<StyleRuleImport> CSSParserImpl::consumeImportRule(CSSParserTokenRange prelude)
479
{
480
    AtomicString uri(consumeStringOrURI(prelude));
481
    if (uri.isNull())
482
        return nullptr; // Parse error, expected string or URI
483
484
    if (m_observerWrapper) {
485
        unsigned endOffset = m_observerWrapper->endOffset(prelude);
486
        m_observerWrapper->observer().startRuleHeader(StyleRule::Import, m_observerWrapper->startOffset(prelude));
487
        m_observerWrapper->observer().endRuleHeader(endOffset);
488
        m_observerWrapper->observer().startRuleBody(endOffset);
489
        m_observerWrapper->observer().endRuleBody(endOffset);
490
    }
491
492
    return StyleRuleImport::create(uri, MediaQueryParser::parseMediaQuerySet(prelude).releaseNonNull());
493
}
494
495
RefPtr<StyleRuleNamespace> CSSParserImpl::consumeNamespaceRule(CSSParserTokenRange prelude)
496
{
497
    AtomicString namespacePrefix;
498
    if (prelude.peek().type() == IdentToken)
499
        namespacePrefix = prelude.consumeIncludingWhitespace().value().toAtomicString();
500
501
    AtomicString uri(consumeStringOrURI(prelude));
502
    if (uri.isNull() || !prelude.atEnd())
503
        return nullptr; // Parse error, expected string or URI
504
505
    return StyleRuleNamespace::create(namespacePrefix, uri);
506
}
507
508
RefPtr<StyleRuleMedia> CSSParserImpl::consumeMediaRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
509
{
510
    Vector<RefPtr<StyleRuleBase>> rules;
511
512
    if (m_observerWrapper) {
513
        m_observerWrapper->observer().startRuleHeader(StyleRule::Media, m_observerWrapper->startOffset(prelude));
514
        m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset(prelude));
515
        m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousTokenStartOffset(block));
516
    }
517
518
    consumeRuleList(block, RegularRuleList, [&rules](RefPtr<StyleRuleBase> rule) {
519
        rules.append(rule);
520
    });
521
522
    if (m_observerWrapper)
523
        m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(block));
524
525
    return StyleRuleMedia::create(MediaQueryParser::parseMediaQuerySet(prelude).releaseNonNull(), rules);
526
}
527
528
RefPtr<StyleRuleSupports> CSSParserImpl::consumeSupportsRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
529
{
530
    CSSSupportsParser::SupportsResult supported = CSSSupportsParser::supportsCondition(prelude, *this);
531
    if (supported == CSSSupportsParser::Invalid)
532
        return nullptr; // Parse error, invalid @supports condition
533
534
    if (m_observerWrapper) {
535
        m_observerWrapper->observer().startRuleHeader(StyleRule::Supports, m_observerWrapper->startOffset(prelude));
536
        m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset(prelude));
537
        m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousTokenStartOffset(block));
538
    }
539
540
    Vector<RefPtr<StyleRuleBase>> rules;
541
    consumeRuleList(block, RegularRuleList, [&rules](RefPtr<StyleRuleBase> rule) {
542
        rules.append(rule);
543
    });
544
545
    if (m_observerWrapper)
546
        m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(block));
547
548
    return StyleRuleSupports::create(prelude.serialize().stripWhiteSpace(), supported, rules);
549
}
550
551
#if ENABLE(CSS_DEVICE_ADAPTATION)
552
RefPtr<StyleRuleViewport> CSSParserImpl::consumeViewportRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
553
{
554
    if (!prelude.atEnd())
555
        return nullptr; // Parser error; @viewport prelude should be empty
556
557
    if (m_observerWrapper) {
558
        unsigned endOffset = m_observerWrapper->endOffset(prelude);
559
        m_observerWrapper->observer().startRuleHeader(StyleRule::Viewport, m_observerWrapper->startOffset(prelude));
560
        m_observerWrapper->observer().endRuleHeader(endOffset);
561
        m_observerWrapper->observer().startRuleBody(endOffset);
562
        m_observerWrapper->observer().endRuleBody(endOffset);
563
    }
564
565
    consumeDeclarationList(block, StyleRule::Viewport);
566
    return StyleRuleViewport::create(createStyleProperties(m_parsedProperties, CSSViewportRuleMode));
567
}
568
#endif
569
570
RefPtr<StyleRuleFontFace> CSSParserImpl::consumeFontFaceRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
571
{
572
    if (!prelude.atEnd())
573
        return nullptr; // Parse error; @font-face prelude should be empty
574
575
    if (m_observerWrapper) {
576
        unsigned endOffset = m_observerWrapper->endOffset(prelude);
577
        m_observerWrapper->observer().startRuleHeader(StyleRule::FontFace, m_observerWrapper->startOffset(prelude));
578
        m_observerWrapper->observer().endRuleHeader(endOffset);
579
        m_observerWrapper->observer().startRuleBody(endOffset);
580
        m_observerWrapper->observer().endRuleBody(endOffset);
581
    }
582
583
    consumeDeclarationList(block, StyleRule::FontFace);
584
    return StyleRuleFontFace::create(createStyleProperties(m_parsedProperties, m_context.mode));
585
}
586
587
RefPtr<StyleRuleKeyframes> CSSParserImpl::consumeKeyframesRule(bool webkitPrefixed, CSSParserTokenRange prelude, CSSParserTokenRange block)
588
{
589
    CSSParserTokenRange rangeCopy = prelude; // For inspector callbacks
590
    const CSSParserToken& nameToken = prelude.consumeIncludingWhitespace();
591
    if (!prelude.atEnd())
592
        return nullptr; // Parse error; expected single non-whitespace token in @keyframes header
593
594
    String name;
595
    if (nameToken.type() == IdentToken) {
596
        name = nameToken.value().toString();
597
    } else if (nameToken.type() == StringToken && webkitPrefixed)
598
        name = nameToken.value().toString();
599
    else
600
        return nullptr; // Parse error; expected ident token in @keyframes header
601
602
    if (m_observerWrapper) {
603
        m_observerWrapper->observer().startRuleHeader(StyleRule::Keyframes, m_observerWrapper->startOffset(rangeCopy));
604
        m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset(prelude));
605
        m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousTokenStartOffset(block));
606
        m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(block));
607
    }
608
609
    RefPtr<StyleRuleKeyframes> keyframeRule = StyleRuleKeyframes::create();
610
    consumeRuleList(block, KeyframesRuleList, [keyframeRule](RefPtr<StyleRuleBase> keyframe) {
611
        RefPtr<StyleKeyframe> key = static_cast<StyleKeyframe*>(keyframe.get());
612
        keyframeRule->parserAppendKeyframe(key.releaseNonNull());
613
    });
614
    keyframeRule->setName(name);
615
    // FIXME-NEWPARSER: Find out why this is done. Behavior difference when prefixed?
616
    // keyframeRule->setVendorPrefixed(webkitPrefixed);
617
    return keyframeRule;
618
}
619
620
RefPtr<StyleRulePage> CSSParserImpl::consumePageRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
621
{
622
    CSSSelectorList selectorList = parsePageSelector(prelude, m_styleSheet.get());
623
    if (!selectorList.isValid())
624
        return nullptr; // Parse error, invalid @page selector
625
626
    if (m_observerWrapper) {
627
        unsigned endOffset = m_observerWrapper->endOffset(prelude);
628
        m_observerWrapper->observer().startRuleHeader(StyleRule::Page, m_observerWrapper->startOffset(prelude));
629
        m_observerWrapper->observer().endRuleHeader(endOffset);
630
    }
631
632
    consumeDeclarationList(block, StyleRule::Style);
633
    
634
    RefPtr<StyleRulePage> page = StyleRulePage::create(createStyleProperties(m_parsedProperties, m_context.mode));
635
    page->wrapperAdoptSelectorList(selectorList);
636
    return page;
637
}
638
639
// FIXME-NEWPARSER: Support "apply"
640
/*void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude)
641
{
642
    const CSSParserToken& ident = prelude.consumeIncludingWhitespace();
643
    if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident))
644
        return; // Parse error, expected a single custom property name
645
    m_parsedProperties.append(CSSProperty(
646
        CSSPropertyApplyAtRule,
647
        *CSSCustomIdentValue::create(ident.value().toString())));
648
}
649
*/
650
    
651
RefPtr<StyleKeyframe> CSSParserImpl::consumeKeyframeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
652
{
653
    std::unique_ptr<Vector<double>> keyList = consumeKeyframeKeyList(prelude);
654
    if (!keyList)
655
        return nullptr;
656
657
    if (m_observerWrapper) {
658
        m_observerWrapper->observer().startRuleHeader(StyleRule::Keyframe, m_observerWrapper->startOffset(prelude));
659
        m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset(prelude));
660
    }
661
662
    consumeDeclarationList(block, StyleRule::Keyframe);
663
    return StyleKeyframe::create(WTFMove(keyList), createStyleProperties(m_parsedProperties, m_context.mode));
664
}
665
666
static void observeSelectors(CSSParserObserverWrapper& wrapper, CSSParserTokenRange selectors)
667
{
668
    // This is easier than hooking into the CSSSelectorParser
669
    selectors.consumeWhitespace();
670
    CSSParserTokenRange originalRange = selectors;
671
    wrapper.observer().startRuleHeader(StyleRule::Style, wrapper.startOffset(originalRange));
672
673
    while (!selectors.atEnd()) {
674
        const CSSParserToken* selectorStart = &selectors.peek();
675
        while (!selectors.atEnd() && selectors.peek().type() != CommaToken)
676
            selectors.consumeComponentValue();
677
        CSSParserTokenRange selector = selectors.makeSubRange(selectorStart, &selectors.peek());
678
        selectors.consumeIncludingWhitespace();
679
680
        wrapper.observer().observeSelector(wrapper.startOffset(selector), wrapper.endOffset(selector));
681
    }
682
683
    wrapper.observer().endRuleHeader(wrapper.endOffset(originalRange));
684
}
685
686
RefPtr<StyleRule> CSSParserImpl::consumeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
687
{
688
    CSSSelectorList selectorList = CSSSelectorParser::parseSelector(prelude, m_context, m_styleSheet.get());
689
    if (!selectorList.isValid())
690
        return nullptr; // Parse error, invalid selector list
691
692
    if (m_observerWrapper)
693
        observeSelectors(*m_observerWrapper, prelude);
694
695
    consumeDeclarationList(block, StyleRule::Style);
696
697
    // FIXME-NEWPARSER: Line number is in the StyleRule constructor (gross), need to figure this out.
698
    RefPtr<StyleRule> rule = StyleRule::create(0, createStyleProperties(m_parsedProperties, m_context.mode));
699
    rule->wrapperAdoptSelectorList(selectorList);
700
    return rule;
701
}
702
703
void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, StyleRule::Type ruleType)
704
{
705
    ASSERT(m_parsedProperties.isEmpty());
706
707
    bool useObserver = m_observerWrapper && (ruleType == StyleRule::Style || ruleType == StyleRule::Keyframe);
708
    if (useObserver) {
709
        m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousTokenStartOffset(range));
710
        m_observerWrapper->skipCommentsBefore(range, true);
711
    }
712
713
    while (!range.atEnd()) {
714
        switch (range.peek().type()) {
715
        case WhitespaceToken:
716
        case SemicolonToken:
717
            range.consume();
718
            break;
719
        case IdentToken: {
720
            const CSSParserToken* declarationStart = &range.peek();
721
722
            if (useObserver)
723
                m_observerWrapper->yieldCommentsBefore(range);
724
725
            while (!range.atEnd() && range.peek().type() != SemicolonToken)
726
                range.consumeComponentValue();
727
728
            consumeDeclaration(range.makeSubRange(declarationStart, &range.peek()), ruleType);
729
730
            if (useObserver)
731
                m_observerWrapper->skipCommentsBefore(range, false);
732
            break;
733
        }
734
        case AtKeywordToken: {
735
            // FIXME-NEWPARSER: Support apply
736
            AllowedRulesType allowedRules = /* ruleType == StyleRule::Style && RuntimeEnabledFeatures::cssApplyAtRulesEnabled() ? ApplyRules :*/ NoRules;
737
            RefPtr<StyleRuleBase> rule = consumeAtRule(range, allowedRules);
738
            ASSERT_UNUSED(rule, !rule);
739
            break;
740
        }
741
        default: // Parse error, unexpected token in declaration list
742
            while (!range.atEnd() && range.peek().type() != SemicolonToken)
743
                range.consumeComponentValue();
744
            break;
745
        }
746
    }
747
748
    // Yield remaining comments
749
    if (useObserver) {
750
        m_observerWrapper->yieldCommentsBefore(range);
751
        m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(range));
752
    }
753
}
754
755
void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, StyleRule::Type ruleType)
756
{
757
    CSSParserTokenRange rangeCopy = range; // For inspector callbacks
758
759
    ASSERT(range.peek().type() == IdentToken);
760
    const CSSParserToken& token = range.consumeIncludingWhitespace();
761
    CSSPropertyID unresolvedProperty = token.parseAsUnresolvedCSSPropertyID();
762
    if (range.consume().type() != ColonToken)
763
        return; // Parse error
764
765
    bool important = false;
766
    const CSSParserToken* declarationValueEnd = range.end();
767
    const CSSParserToken* last = range.end() - 1;
768
    while (last->type() == WhitespaceToken)
769
        --last;
770
    if (last->type() == IdentToken && equalIgnoringASCIICase(last->value(), "important")) {
771
        --last;
772
        while (last->type() == WhitespaceToken)
773
            --last;
774
        if (last->type() == DelimiterToken && last->delimiter() == '!') {
775
            important = true;
776
            declarationValueEnd = last;
777
        }
778
    }
779
780
    size_t propertiesCount = m_parsedProperties.size();
781
    // FIXME-NEWPARSER: Support variables
782
    /*if (unresolvedProperty == CSSPropertyInvalid && CSSVariableParser::isValidVariableName(token)) {
783
        AtomicString variableName = token.value().toAtomicString();
784
        consumeVariableValue(range.makeSubRange(&range.peek(), declarationValueEnd), variableName, important);
785
    }*/
786
787
    if (important && (ruleType == StyleRule::FontFace || ruleType == StyleRule::Keyframe))
788
        return;
789
790
    if (unresolvedProperty != CSSPropertyInvalid)
791
        consumeDeclarationValue(range.makeSubRange(&range.peek(), declarationValueEnd), unresolvedProperty, important, ruleType);
792
793
    if (m_observerWrapper && (ruleType == StyleRule::Style || ruleType == StyleRule::Keyframe)) {
794
        m_observerWrapper->observer().observeProperty(
795
            m_observerWrapper->startOffset(rangeCopy), m_observerWrapper->endOffset(rangeCopy),
796
            important, m_parsedProperties.size() != propertiesCount);
797
    }
798
}
799
800
void CSSParserImpl::consumeVariableValue(CSSParserTokenRange /* range */, const AtomicString& /*variableName */, bool /* important */)
801
{
802
    // FIXME-NEWPARSER: Support variables
803
    // if (CSSCustomPropertyDeclaration* value = CSSVariableParser::parseDeclarationValue(variableName, range))
804
    //     m_parsedProperties.append(CSSProperty(CSSPropertyVariable, *value, important));
805
}
806
807
void CSSParserImpl::consumeDeclarationValue(CSSParserTokenRange range, CSSPropertyID unresolvedProperty, bool important, StyleRule::Type ruleType)
808
{
809
    CSSPropertyParser::parseValue(unresolvedProperty, important, range, m_context, m_parsedProperties, ruleType);
810
}
811
812
std::unique_ptr<Vector<double>> CSSParserImpl::consumeKeyframeKeyList(CSSParserTokenRange range)
813
{
814
    std::unique_ptr<Vector<double>> result = std::unique_ptr<Vector<double>>(new Vector<double>);
815
    while (true) {
816
        range.consumeWhitespace();
817
        const CSSParserToken& token = range.consumeIncludingWhitespace();
818
        if (token.type() == PercentageToken && token.numericValue() >= 0 && token.numericValue() <= 100)
819
            result->append(token.numericValue() / 100);
820
        else if (token.type() == IdentToken && equalIgnoringASCIICase(token.value(), "from"))
821
            result->append(0);
822
        else if (token.type() == IdentToken && equalIgnoringASCIICase(token.value(), "to"))
823
            result->append(1);
824
        else
825
            return nullptr; // Parser error, invalid value in keyframe selector
826
        if (range.atEnd())
827
            return result;
828
        if (range.consume().type() != CommaToken)
829
            return nullptr; // Parser error
830
    }
831
}
832
833
} // namespace WebCore
- Source/WebCore/css/parser/CSSParserImpl.h +152 lines
Line 0 Source/WebCore/css/parser/CSSParserImpl.h_sec1
1
// Copyright 2014 The Chromium Authors. All rights reserved.
2
// Copyright (C) 2016 Apple Inc. 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 are
6
// met:
7
//
8
//    * Redistributions of source code must retain the above copyright
9
// notice, this list of conditions and the following disclaimer.
10
//    * Redistributions in binary form must reproduce the above
11
// copyright notice, this list of conditions and the following disclaimer
12
// in the documentation and/or other materials provided with the
13
// distribution.
14
//    * Neither the name of Google Inc. nor the names of its
15
// contributors may be used to endorse or promote products derived from
16
// this software without specific prior written permission.
17
//
18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30
#pragma once
31
32
#include "CSSParserMode.h"
33
#include "CSSParserTokenRange.h"
34
#include "CSSProperty.h"
35
#include "CSSPropertyNames.h"
36
#include "CSSPropertySourceData.h"
37
#include "StyleRule.h"
38
39
#include <memory>
40
#include <wtf/Vector.h>
41
#include <wtf/text/WTFString.h>
42
43
namespace WebCore {
44
45
class CSSParserObserver;
46
class CSSParserObserverWrapper;
47
class CSSSelectorList;
48
class StyleKeyframe;
49
class StyleRule;
50
class StyleRuleBase;
51
class StyleRuleCharset;
52
class StyleRuleFontFace;
53
class StyleRuleImport;
54
class StyleRuleKeyframes;
55
class StyleRuleMedia;
56
class StyleRuleNamespace;
57
class StyleRulePage;
58
class StyleRuleSupports;
59
class StyleRuleViewport;
60
class StyleSheetContents;
61
class ImmutableStyleProperties;
62
class Element;
63
class MutableStyleProperties;
64
65
class CSSParserImpl {
66
    WTF_MAKE_NONCOPYABLE(CSSParserImpl);
67
public:
68
    CSSParserImpl(const CSSParserContext&, StyleSheetContents* = nullptr);
69
70
    enum AllowedRulesType {
71
        // As per css-syntax, css-cascade and css-namespaces, @charset rules
72
        // must come first, followed by @import then @namespace.
73
        // AllowImportRules actually means we allow @import and any rules thay
74
        // may follow it, i.e. @namespace rules and regular rules.
75
        // AllowCharsetRules and AllowNamespaceRules behave similarly.
76
        AllowCharsetRules,
77
        AllowImportRules,
78
        AllowNamespaceRules,
79
        RegularRules,
80
        KeyframeRules,
81
        ApplyRules, // For @apply inside style rules
82
        NoRules, // For parsing at-rules inside declaration lists
83
    };
84
85
    static bool parseValue(MutableStyleProperties*, CSSPropertyID, const String&, bool important, const CSSParserContext&);
86
    static bool parseVariableValue(MutableStyleProperties*, const AtomicString& propertyName, const String&, bool important, const CSSParserContext&);
87
    static Ref<ImmutableStyleProperties> parseInlineStyleDeclaration(const String&, Element*);
88
    static bool parseDeclarationList(MutableStyleProperties*, const String&, const CSSParserContext&);
89
    static RefPtr<StyleRuleBase> parseRule(const String&, const CSSParserContext&, StyleSheetContents*, AllowedRulesType);
90
    static void parseStyleSheet(const String&, const CSSParserContext&, StyleSheetContents*);
91
    static CSSSelectorList parsePageSelector(CSSParserTokenRange, StyleSheetContents*);
92
93
    static RefPtr<ImmutableStyleProperties> parseCustomPropertySet(CSSParserTokenRange);
94
95
    static std::unique_ptr<Vector<double>> parseKeyframeKeyList(const String&);
96
97
    bool supportsDeclaration(CSSParserTokenRange&);
98
99
    static void parseDeclarationListForInspector(const String&, const CSSParserContext&, CSSParserObserver&);
100
    static void parseStyleSheetForInspector(const String&, const CSSParserContext&, StyleSheetContents*, CSSParserObserver&);
101
102
private:
103
    enum RuleListType {
104
        TopLevelRuleList,
105
        RegularRuleList,
106
        KeyframesRuleList
107
    };
108
109
    // Returns whether the first encountered rule was valid
110
    template<typename T>
111
    bool consumeRuleList(CSSParserTokenRange, RuleListType, T callback);
112
113
    // These two functions update the range they're given
114
    RefPtr<StyleRuleBase> consumeAtRule(CSSParserTokenRange&, AllowedRulesType);
115
    RefPtr<StyleRuleBase> consumeQualifiedRule(CSSParserTokenRange&, AllowedRulesType);
116
117
    static RefPtr<StyleRuleCharset> consumeCharsetRule(CSSParserTokenRange prelude);
118
    RefPtr<StyleRuleImport> consumeImportRule(CSSParserTokenRange prelude);
119
    RefPtr<StyleRuleNamespace> consumeNamespaceRule(CSSParserTokenRange prelude);
120
    RefPtr<StyleRuleMedia> consumeMediaRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
121
    RefPtr<StyleRuleSupports> consumeSupportsRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
122
    RefPtr<StyleRuleViewport> consumeViewportRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
123
    RefPtr<StyleRuleFontFace> consumeFontFaceRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
124
    RefPtr<StyleRuleKeyframes> consumeKeyframesRule(bool webkitPrefixed, CSSParserTokenRange prelude, CSSParserTokenRange block);
125
    RefPtr<StyleRulePage> consumePageRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
126
    // Updates m_parsedProperties
127
    
128
    // FIXME-NEWPARSER: Support "apply"
129
    // void consumeApplyRule(CSSParserTokenRange prelude);
130
131
    RefPtr<StyleKeyframe> consumeKeyframeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
132
    RefPtr<StyleRule> consumeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
133
134
    void consumeDeclarationList(CSSParserTokenRange, StyleRule::Type);
135
    void consumeDeclaration(CSSParserTokenRange, StyleRule::Type);
136
    void consumeDeclarationValue(CSSParserTokenRange, CSSPropertyID, bool important, StyleRule::Type);
137
    void consumeVariableValue(CSSParserTokenRange, const AtomicString& propertyName, bool important);
138
139
    static std::unique_ptr<Vector<double>> consumeKeyframeKeyList(CSSParserTokenRange);
140
141
    // FIXME: Can we build StylePropertySets directly?
142
    // FIXME: Investigate using a smaller inline buffer
143
    ParsedPropertyVector m_parsedProperties;
144
    const CSSParserContext& m_context;
145
146
    RefPtr<StyleSheetContents> m_styleSheet;
147
148
    // For the inspector
149
    CSSParserObserverWrapper* m_observerWrapper;
150
};
151
152
} // namespace WebCore
- Source/WebCore/css/parser/CSSParserValues.cpp +18 lines
Lines 199-204 CSSParserSelector* CSSParserSelector::pa Source/WebCore/css/parser/CSSParserValues.cpp_sec1
199
    return selector.release();
199
    return selector.release();
200
}
200
}
201
201
202
CSSParserSelector* CSSParserSelector::parsePagePseudoSelector(const AtomicString& pseudoTypeString)
203
{
204
    CSSSelector::PagePseudoClassType pseudoType;
205
    if (equalLettersIgnoringASCIICase(pseudoTypeString, "first"))
206
        pseudoType = CSSSelector::PagePseudoClassFirst;
207
    else if (equalLettersIgnoringASCIICase(pseudoTypeString, "left"))
208
        pseudoType = CSSSelector::PagePseudoClassLeft;
209
    else if (equalLettersIgnoringASCIICase(pseudoTypeString, "right"))
210
        pseudoType = CSSSelector::PagePseudoClassRight;
211
    else
212
        return nullptr;
213
    
214
    auto selector = std::make_unique<CSSParserSelector>();
215
    selector->m_selector->setMatch(CSSSelector::PagePseudoClass);
216
    selector->m_selector->setPagePseudoType(pseudoType);
217
    return selector.release();
218
}
219
202
CSSParserSelector* CSSParserSelector::parsePseudoElementSelector(CSSParserString& pseudoTypeString)
220
CSSParserSelector* CSSParserSelector::parsePseudoElementSelector(CSSParserString& pseudoTypeString)
203
{
221
{
204
    pseudoTypeString.convertToASCIILowercaseInPlace();
222
    pseudoTypeString.convertToASCIILowercaseInPlace();
- Source/WebCore/css/parser/CSSParserValues.h +2 lines
Lines 202-207 enum class CSSParserSelectorCombinator { Source/WebCore/css/parser/CSSParserValues.h_sec1
202
class CSSParserSelector {
202
class CSSParserSelector {
203
    WTF_MAKE_FAST_ALLOCATED;
203
    WTF_MAKE_FAST_ALLOCATED;
204
public:
204
public:
205
    // FIXME-NEWPARSER: Remove the CSSParserString-based parsing functions once the old parser is gone.
205
    static CSSParserSelector* parsePagePseudoSelector(const CSSParserString& pseudoTypeString);
206
    static CSSParserSelector* parsePagePseudoSelector(const CSSParserString& pseudoTypeString);
206
    static CSSParserSelector* parsePseudoElementSelector(CSSParserString& pseudoTypeString);
207
    static CSSParserSelector* parsePseudoElementSelector(CSSParserString& pseudoTypeString);
207
    static CSSParserSelector* parsePseudoElementCueFunctionSelector(const CSSParserString& functionIdentifier, Vector<std::unique_ptr<CSSParserSelector>>*);
208
    static CSSParserSelector* parsePseudoElementCueFunctionSelector(const CSSParserString& functionIdentifier, Vector<std::unique_ptr<CSSParserSelector>>*);
Lines 211-216 public: Source/WebCore/css/parser/CSSParserValues.h_sec2
211
212
212
    static CSSParserSelector* parsePseudoClassSelectorFromStringView(StringView&);
213
    static CSSParserSelector* parsePseudoClassSelectorFromStringView(StringView&);
213
    static CSSParserSelector* parsePseudoElementSelectorFromStringView(StringView&);
214
    static CSSParserSelector* parsePseudoElementSelectorFromStringView(StringView&);
215
    static CSSParserSelector* parsePagePseudoSelector(const AtomicString&);
214
    
216
    
215
    CSSParserSelector();
217
    CSSParserSelector();
216
    explicit CSSParserSelector(const QualifiedName&);
218
    explicit CSSParserSelector(const QualifiedName&);
- Source/WebCore/css/parser/CSSPropertyParser.cpp -5 / +10 lines
Lines 235-245 void CSSPropertyParser::addExpandedPrope Source/WebCore/css/parser/CSSPropertyParser.cpp_sec1
235
    for (unsigned i = 0; i < shorthandLength; ++i)
235
    for (unsigned i = 0; i < shorthandLength; ++i)
236
        addProperty(longhands[i], property, value, important);
236
        addProperty(longhands[i], property, value, important);
237
}
237
}
238
238
*/
239
bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool important,
239
    
240
    const CSSParserTokenRange& range, const CSSParserContext& context,
240
bool CSSPropertyParser::parseValue(CSSPropertyID /*unresolvedProperty*/, bool /*important*/,
241
    Vector<CSSProperty, 256>& parsedProperties, StyleRule::Type ruleType)
241
    const CSSParserTokenRange& /*range*/, const CSSParserContext& /*context*/,
242
    ParsedPropertyVector& /*parsedProperties*/, StyleRule::Type /*ruleType*/)
242
{
243
{
244
    return false;
245
    
246
    /*
243
    int parsedPropertiesSize = parsedProperties.size();
247
    int parsedPropertiesSize = parsedProperties.size();
244
248
245
    CSSPropertyParser parser(range, context, &parsedProperties);
249
    CSSPropertyParser parser(range, context, &parsedProperties);
Lines 263-270 bool CSSPropertyParser::parseValue(CSSPr Source/WebCore/css/parser/CSSPropertyParser.cpp_sec2
263
        parsedProperties.shrink(parsedPropertiesSize);
267
        parsedProperties.shrink(parsedPropertiesSize);
264
268
265
    return parseSuccess;
269
    return parseSuccess;
270
     */
266
}
271
}
267
272
/*
268
const CSSValue* CSSPropertyParser::parseSingleValue(
273
const CSSValue* CSSPropertyParser::parseSingleValue(
269
    CSSPropertyID property, const CSSParserTokenRange& range, const CSSParserContext& context)
274
    CSSPropertyID property, const CSSParserTokenRange& range, const CSSParserContext& context)
270
{
275
{
- Source/WebCore/css/parser/CSSSupportsParser.cpp +119 lines
Line 0 Source/WebCore/css/parser/CSSSupportsParser.cpp_sec1
1
// Copyright 2015 The Chromium Authors. All rights reserved.
2
// Copyright (C) 2016 Apple Inc. 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 are
6
// met:
7
//
8
//    * Redistributions of source code must retain the above copyright
9
// notice, this list of conditions and the following disclaimer.
10
//    * Redistributions in binary form must reproduce the above
11
// copyright notice, this list of conditions and the following disclaimer
12
// in the documentation and/or other materials provided with the
13
// distribution.
14
//    * Neither the name of Google Inc. nor the names of its
15
// contributors may be used to endorse or promote products derived from
16
// this software without specific prior written permission.
17
//
18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30
#include "config.h"
31
#include "CSSSupportsParser.h"
32
33
#include "CSSParserImpl.h"
34
35
namespace WebCore {
36
37
CSSSupportsParser::SupportsResult CSSSupportsParser::supportsCondition(CSSParserTokenRange range, CSSParserImpl& parser)
38
{
39
    // FIXME: The spec allows leading whitespace in @supports but not CSS.supports,
40
    // but major browser vendors allow it in CSS.supports also.
41
    range.consumeWhitespace();
42
    return CSSSupportsParser(parser).consumeCondition(range);
43
}
44
45
enum ClauseType { Unresolved, Conjunction, Disjunction };
46
47
CSSSupportsParser::SupportsResult CSSSupportsParser::consumeCondition(CSSParserTokenRange range)
48
{
49
    if (range.peek().type() == IdentToken)
50
        return consumeNegation(range);
51
52
    bool result;
53
    ClauseType clauseType = Unresolved;
54
55
    while (true) {
56
        SupportsResult nextResult = consumeConditionInParenthesis(range);
57
        if (nextResult == Invalid)
58
            return Invalid;
59
        bool nextSupported = nextResult;
60
        if (clauseType == Unresolved)
61
            result = nextSupported;
62
        else if (clauseType == Conjunction)
63
            result &= nextSupported;
64
        else
65
            result |= nextSupported;
66
67
        if (range.atEnd())
68
            break;
69
        if (range.consumeIncludingWhitespace().type() != WhitespaceToken)
70
            return Invalid;
71
        if (range.atEnd())
72
            break;
73
74
        const CSSParserToken& token = range.consume();
75
        if (token.type() != IdentToken)
76
            return Invalid;
77
        if (clauseType == Unresolved)
78
            clauseType = token.value().length() == 3 ? Conjunction : Disjunction;
79
        if ((clauseType == Conjunction && !equalIgnoringASCIICase(token.value(), "and"))
80
            || (clauseType == Disjunction && !equalIgnoringASCIICase(token.value(), "or")))
81
            return Invalid;
82
83
        if (range.consumeIncludingWhitespace().type() != WhitespaceToken)
84
            return Invalid;
85
    }
86
    return result ? Supported : Unsupported;
87
}
88
89
CSSSupportsParser::SupportsResult CSSSupportsParser::consumeNegation(CSSParserTokenRange range)
90
{
91
    ASSERT(range.peek().type() == IdentToken);
92
    if (!equalIgnoringASCIICase(range.consume().value(), "not"))
93
        return Invalid;
94
    if (range.consumeIncludingWhitespace().type() != WhitespaceToken)
95
        return Invalid;
96
    SupportsResult result = consumeConditionInParenthesis(range);
97
    range.consumeWhitespace();
98
    if (!range.atEnd() || result == Invalid)
99
        return Invalid;
100
    return result ? Unsupported : Supported;
101
}
102
103
CSSSupportsParser::SupportsResult CSSSupportsParser::consumeConditionInParenthesis(CSSParserTokenRange& range)
104
{
105
    if (range.peek().type() == FunctionToken) {
106
        range.consumeComponentValue();
107
        return Unsupported;
108
    }
109
    if (range.peek().type() != LeftParenthesisToken)
110
        return Invalid;
111
    CSSParserTokenRange innerRange = range.consumeBlock();
112
    innerRange.consumeWhitespace();
113
    SupportsResult result = consumeCondition(innerRange);
114
    if (result != Invalid)
115
        return result;
116
    return innerRange.peek().type() == IdentToken && m_parser.supportsDeclaration(innerRange) ? Supported : Unsupported;
117
}
118
119
} // namespace blink
- Source/WebCore/css/parser/CSSSupportsParser.h +59 lines
Line 0 Source/WebCore/css/parser/CSSSupportsParser.h_sec1
1
// Copyright 2015 The Chromium Authors. All rights reserved.
2
// Copyright (C) 2016 Apple Inc. 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 are
6
// met:
7
//
8
//    * Redistributions of source code must retain the above copyright
9
// notice, this list of conditions and the following disclaimer.
10
//    * Redistributions in binary form must reproduce the above
11
// copyright notice, this list of conditions and the following disclaimer
12
// in the documentation and/or other materials provided with the
13
// distribution.
14
//    * Neither the name of Google Inc. nor the names of its
15
// contributors may be used to endorse or promote products derived from
16
// this software without specific prior written permission.
17
//
18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30
#pragma once
31
32
namespace WebCore {
33
34
class CSSParserImpl;
35
class CSSParserTokenRange;
36
37
class CSSSupportsParser {
38
public:
39
    enum SupportsResult {
40
        Unsupported = false,
41
        Supported = true,
42
        Invalid
43
    };
44
45
    static SupportsResult supportsCondition(CSSParserTokenRange, CSSParserImpl&);
46
47
private:
48
    CSSSupportsParser(CSSParserImpl& parser)
49
        : m_parser(parser) { }
50
51
    SupportsResult consumeCondition(CSSParserTokenRange);
52
    SupportsResult consumeNegation(CSSParserTokenRange);
53
54
    SupportsResult consumeConditionInParenthesis(CSSParserTokenRange&);
55
56
    CSSParserImpl& m_parser;
57
};
58
59
} // namespace WebCore

Return to Bug 161813