Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: third_party/WebKit/Source/core/css/parser/CSSParser.cpp

Issue 2616093003: Make CSSParserContext be garbage collected. (Closed)
Patch Set: fix fuzzer compile again Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/css/parser/CSSParser.h" 5 #include "core/css/parser/CSSParser.h"
6 6
7 #include "core/css/CSSColorValue.h" 7 #include "core/css/CSSColorValue.h"
8 #include "core/css/CSSKeyframeRule.h" 8 #include "core/css/CSSKeyframeRule.h"
9 #include "core/css/StyleColor.h" 9 #include "core/css/StyleColor.h"
10 #include "core/css/StyleRule.h" 10 #include "core/css/StyleRule.h"
11 #include "core/css/StyleSheetContents.h" 11 #include "core/css/StyleSheetContents.h"
12 #include "core/css/parser/CSSParserFastPaths.h" 12 #include "core/css/parser/CSSParserFastPaths.h"
13 #include "core/css/parser/CSSParserImpl.h" 13 #include "core/css/parser/CSSParserImpl.h"
14 #include "core/css/parser/CSSPropertyParser.h" 14 #include "core/css/parser/CSSPropertyParser.h"
15 #include "core/css/parser/CSSSelectorParser.h" 15 #include "core/css/parser/CSSSelectorParser.h"
16 #include "core/css/parser/CSSSupportsParser.h" 16 #include "core/css/parser/CSSSupportsParser.h"
17 #include "core/css/parser/CSSTokenizer.h" 17 #include "core/css/parser/CSSTokenizer.h"
18 #include "core/css/parser/CSSVariableParser.h" 18 #include "core/css/parser/CSSVariableParser.h"
19 #include "core/layout/LayoutTheme.h" 19 #include "core/layout/LayoutTheme.h"
20 #include <memory> 20 #include <memory>
21 21
22 namespace blink { 22 namespace blink {
23 23
24 bool CSSParser::parseDeclarationList(const CSSParserContext& context, 24 bool CSSParser::parseDeclarationList(const CSSParserContext* context,
25 MutableStylePropertySet* propertySet, 25 MutableStylePropertySet* propertySet,
26 const String& declaration) { 26 const String& declaration) {
27 return CSSParserImpl::parseDeclarationList(propertySet, declaration, context); 27 return CSSParserImpl::parseDeclarationList(propertySet, declaration, context);
28 } 28 }
29 29
30 void CSSParser::parseDeclarationListForInspector( 30 void CSSParser::parseDeclarationListForInspector(
31 const CSSParserContext& context, 31 const CSSParserContext* context,
32 const String& declaration, 32 const String& declaration,
33 CSSParserObserver& observer) { 33 CSSParserObserver& observer) {
34 CSSParserImpl::parseDeclarationListForInspector(declaration, context, 34 CSSParserImpl::parseDeclarationListForInspector(declaration, context,
35 observer); 35 observer);
36 } 36 }
37 37
38 CSSSelectorList CSSParser::parseSelector(const CSSParserContext& context, 38 CSSSelectorList CSSParser::parseSelector(const CSSParserContext* context,
39 StyleSheetContents* styleSheetContents, 39 StyleSheetContents* styleSheetContents,
40 const String& selector) { 40 const String& selector) {
41 CSSTokenizer tokenizer(selector); 41 CSSTokenizer tokenizer(selector);
42 return CSSSelectorParser::parseSelector(tokenizer.tokenRange(), context, 42 return CSSSelectorParser::parseSelector(tokenizer.tokenRange(), context,
43 styleSheetContents); 43 styleSheetContents);
44 } 44 }
45 45
46 CSSSelectorList CSSParser::parsePageSelector( 46 CSSSelectorList CSSParser::parsePageSelector(
47 const CSSParserContext& context, 47 const CSSParserContext* context,
48 StyleSheetContents* styleSheetContents, 48 StyleSheetContents* styleSheetContents,
49 const String& selector) { 49 const String& selector) {
50 CSSTokenizer tokenizer(selector); 50 CSSTokenizer tokenizer(selector);
51 return CSSParserImpl::parsePageSelector(tokenizer.tokenRange(), 51 return CSSParserImpl::parsePageSelector(tokenizer.tokenRange(),
52 styleSheetContents); 52 styleSheetContents);
53 } 53 }
54 54
55 StyleRuleBase* CSSParser::parseRule(const CSSParserContext& context, 55 StyleRuleBase* CSSParser::parseRule(const CSSParserContext* context,
56 StyleSheetContents* styleSheet, 56 StyleSheetContents* styleSheet,
57 const String& rule) { 57 const String& rule) {
58 return CSSParserImpl::parseRule(rule, context, styleSheet, 58 return CSSParserImpl::parseRule(rule, context, styleSheet,
59 CSSParserImpl::AllowImportRules); 59 CSSParserImpl::AllowImportRules);
60 } 60 }
61 61
62 void CSSParser::parseSheet(const CSSParserContext& context, 62 void CSSParser::parseSheet(const CSSParserContext* context,
63 StyleSheetContents* styleSheet, 63 StyleSheetContents* styleSheet,
64 const String& text, 64 const String& text,
65 bool deferPropertyParsing) { 65 bool deferPropertyParsing) {
66 return CSSParserImpl::parseStyleSheet(text, context, styleSheet, 66 return CSSParserImpl::parseStyleSheet(text, context, styleSheet,
67 deferPropertyParsing); 67 deferPropertyParsing);
68 } 68 }
69 69
70 void CSSParser::parseSheetForInspector(const CSSParserContext& context, 70 void CSSParser::parseSheetForInspector(const CSSParserContext* context,
71 StyleSheetContents* styleSheet, 71 StyleSheetContents* styleSheet,
72 const String& text, 72 const String& text,
73 CSSParserObserver& observer) { 73 CSSParserObserver& observer) {
74 return CSSParserImpl::parseStyleSheetForInspector(text, context, styleSheet, 74 return CSSParserImpl::parseStyleSheetForInspector(text, context, styleSheet,
75 observer); 75 observer);
76 } 76 }
77 77
78 MutableStylePropertySet::SetResult CSSParser::parseValue( 78 MutableStylePropertySet::SetResult CSSParser::parseValue(
79 MutableStylePropertySet* declaration, 79 MutableStylePropertySet* declaration,
80 CSSPropertyID unresolvedProperty, 80 CSSPropertyID unresolvedProperty,
81 const String& string, 81 const String& string,
82 bool important) {
83 return parseValue(declaration, unresolvedProperty, string, important,
84 static_cast<StyleSheetContents*>(nullptr));
85 }
86
87 MutableStylePropertySet::SetResult CSSParser::parseValue(
88 MutableStylePropertySet* declaration,
89 CSSPropertyID unresolvedProperty,
90 const String& string,
82 bool important, 91 bool important,
83 StyleSheetContents* styleSheet) { 92 StyleSheetContents* styleSheet) {
84 if (string.isEmpty()) { 93 if (string.isEmpty()) {
85 bool didParse = false; 94 bool didParse = false;
86 bool didChange = false; 95 bool didChange = false;
87 return MutableStylePropertySet::SetResult{didParse, didChange}; 96 return MutableStylePropertySet::SetResult{didParse, didChange};
88 } 97 }
89 98
90 CSSPropertyID resolvedProperty = resolveCSSPropertyID(unresolvedProperty); 99 CSSPropertyID resolvedProperty = resolveCSSPropertyID(unresolvedProperty);
91 CSSParserMode parserMode = declaration->cssParserMode(); 100 CSSParserMode parserMode = declaration->cssParserMode();
92 CSSValue* value = 101 CSSValue* value =
93 CSSParserFastPaths::maybeParseValue(resolvedProperty, string, parserMode); 102 CSSParserFastPaths::maybeParseValue(resolvedProperty, string, parserMode);
94 if (value) { 103 if (value) {
95 bool didParse = true; 104 bool didParse = true;
96 bool didChange = declaration->setProperty( 105 bool didChange = declaration->setProperty(
97 CSSProperty(resolvedProperty, *value, important)); 106 CSSProperty(resolvedProperty, *value, important));
98 return MutableStylePropertySet::SetResult{didParse, didChange}; 107 return MutableStylePropertySet::SetResult{didParse, didChange};
99 } 108 }
100 CSSParserContext context(parserMode, nullptr); 109 CSSParserContext* context;
101 if (styleSheet) { 110 if (styleSheet) {
102 context = styleSheet->parserContext(); 111 context = CSSParserContext::create(styleSheet->parserContext(), nullptr);
103 context.setMode(parserMode); 112 context->setMode(parserMode);
113 } else {
114 context = CSSParserContext::create(parserMode);
104 } 115 }
105 return parseValue(declaration, unresolvedProperty, string, important, 116 return parseValue(declaration, unresolvedProperty, string, important,
106 context); 117 context);
107 } 118 }
108 119
109 MutableStylePropertySet::SetResult CSSParser::parseValueForCustomProperty( 120 MutableStylePropertySet::SetResult CSSParser::parseValueForCustomProperty(
110 MutableStylePropertySet* declaration, 121 MutableStylePropertySet* declaration,
111 const AtomicString& propertyName, 122 const AtomicString& propertyName,
112 const PropertyRegistry* registry, 123 const PropertyRegistry* registry,
113 const String& value, 124 const String& value,
114 bool important, 125 bool important,
115 StyleSheetContents* styleSheet, 126 StyleSheetContents* styleSheet,
116 bool isAnimationTainted) { 127 bool isAnimationTainted) {
117 DCHECK(CSSVariableParser::isValidVariableName(propertyName)); 128 DCHECK(CSSVariableParser::isValidVariableName(propertyName));
118 if (value.isEmpty()) { 129 if (value.isEmpty()) {
119 bool didParse = false; 130 bool didParse = false;
120 bool didChange = false; 131 bool didChange = false;
121 return MutableStylePropertySet::SetResult{didParse, didChange}; 132 return MutableStylePropertySet::SetResult{didParse, didChange};
122 } 133 }
123 CSSParserMode parserMode = declaration->cssParserMode(); 134 CSSParserMode parserMode = declaration->cssParserMode();
124 CSSParserContext context(parserMode, nullptr); 135 CSSParserContext* context;
125 if (styleSheet) { 136 if (styleSheet) {
126 context = styleSheet->parserContext(); 137 context = CSSParserContext::create(styleSheet->parserContext(), nullptr);
127 context.setMode(parserMode); 138 context->setMode(parserMode);
139 } else {
140 context = CSSParserContext::create(parserMode);
128 } 141 }
129 return CSSParserImpl::parseVariableValue(declaration, propertyName, registry, 142 return CSSParserImpl::parseVariableValue(declaration, propertyName, registry,
130 value, important, context, 143 value, important, context,
131 isAnimationTainted); 144 isAnimationTainted);
132 } 145 }
133 146
134 ImmutableStylePropertySet* CSSParser::parseCustomPropertySet( 147 ImmutableStylePropertySet* CSSParser::parseCustomPropertySet(
135 CSSParserTokenRange range) { 148 CSSParserTokenRange range) {
136 return CSSParserImpl::parseCustomPropertySet(range); 149 return CSSParserImpl::parseCustomPropertySet(range);
137 } 150 }
138 151
139 MutableStylePropertySet::SetResult CSSParser::parseValue( 152 MutableStylePropertySet::SetResult CSSParser::parseValue(
140 MutableStylePropertySet* declaration, 153 MutableStylePropertySet* declaration,
141 CSSPropertyID unresolvedProperty, 154 CSSPropertyID unresolvedProperty,
142 const String& string, 155 const String& string,
143 bool important, 156 bool important,
144 const CSSParserContext& context) { 157 const CSSParserContext* context) {
145 return CSSParserImpl::parseValue(declaration, unresolvedProperty, string, 158 return CSSParserImpl::parseValue(declaration, unresolvedProperty, string,
146 important, context); 159 important, context);
147 } 160 }
148 161
149 const CSSValue* CSSParser::parseSingleValue(CSSPropertyID propertyID, 162 const CSSValue* CSSParser::parseSingleValue(CSSPropertyID propertyID,
150 const String& string, 163 const String& string,
151 const CSSParserContext& context) { 164 const CSSParserContext* context) {
152 if (string.isEmpty()) 165 if (string.isEmpty())
153 return nullptr; 166 return nullptr;
154 if (CSSValue* value = CSSParserFastPaths::maybeParseValue(propertyID, string, 167 if (CSSValue* value = CSSParserFastPaths::maybeParseValue(propertyID, string,
155 context.mode())) 168 context->mode()))
156 return value; 169 return value;
157 CSSTokenizer tokenizer(string); 170 CSSTokenizer tokenizer(string);
158 return CSSPropertyParser::parseSingleValue(propertyID, tokenizer.tokenRange(), 171 return CSSPropertyParser::parseSingleValue(propertyID, tokenizer.tokenRange(),
159 context); 172 context);
160 } 173 }
161 174
162 ImmutableStylePropertySet* CSSParser::parseInlineStyleDeclaration( 175 ImmutableStylePropertySet* CSSParser::parseInlineStyleDeclaration(
163 const String& styleString, 176 const String& styleString,
164 Element* element) { 177 Element* element) {
165 return CSSParserImpl::parseInlineStyleDeclaration(styleString, element); 178 return CSSParserImpl::parseInlineStyleDeclaration(styleString, element);
166 } 179 }
167 180
168 std::unique_ptr<Vector<double>> CSSParser::parseKeyframeKeyList( 181 std::unique_ptr<Vector<double>> CSSParser::parseKeyframeKeyList(
169 const String& keyList) { 182 const String& keyList) {
170 return CSSParserImpl::parseKeyframeKeyList(keyList); 183 return CSSParserImpl::parseKeyframeKeyList(keyList);
171 } 184 }
172 185
173 StyleRuleKeyframe* CSSParser::parseKeyframeRule(const CSSParserContext& context, 186 StyleRuleKeyframe* CSSParser::parseKeyframeRule(const CSSParserContext* context,
174 const String& rule) { 187 const String& rule) {
175 StyleRuleBase* keyframe = CSSParserImpl::parseRule( 188 StyleRuleBase* keyframe = CSSParserImpl::parseRule(
176 rule, context, nullptr, CSSParserImpl::KeyframeRules); 189 rule, context, nullptr, CSSParserImpl::KeyframeRules);
177 return toStyleRuleKeyframe(keyframe); 190 return toStyleRuleKeyframe(keyframe);
178 } 191 }
179 192
180 bool CSSParser::parseSupportsCondition(const String& condition) { 193 bool CSSParser::parseSupportsCondition(const String& condition) {
181 CSSTokenizer tokenizer(condition); 194 CSSTokenizer tokenizer(condition);
182 CSSParserImpl parser(strictCSSParserContext()); 195 CSSParserImpl parser(strictCSSParserContext());
183 return CSSSupportsParser::supportsCondition(tokenizer.tokenRange(), parser) == 196 return CSSSupportsParser::supportsCondition(tokenizer.tokenRange(), parser) ==
(...skipping 30 matching lines...) Expand all
214 if (!StyleColor::isSystemColor(id)) 227 if (!StyleColor::isSystemColor(id))
215 return false; 228 return false;
216 229
217 color = LayoutTheme::theme().systemColor(id); 230 color = LayoutTheme::theme().systemColor(id);
218 return true; 231 return true;
219 } 232 }
220 233
221 const CSSValue* CSSParser::parseFontFaceDescriptor( 234 const CSSValue* CSSParser::parseFontFaceDescriptor(
222 CSSPropertyID propertyID, 235 CSSPropertyID propertyID,
223 const String& propertyValue, 236 const String& propertyValue,
224 const CSSParserContext& context) { 237 const CSSParserContext* context) {
225 StringBuilder builder; 238 StringBuilder builder;
226 builder.append("@font-face { "); 239 builder.append("@font-face { ");
227 builder.append(getPropertyNameString(propertyID)); 240 builder.append(getPropertyNameString(propertyID));
228 builder.append(" : "); 241 builder.append(" : ");
229 builder.append(propertyValue); 242 builder.append(propertyValue);
230 builder.append("; }"); 243 builder.append("; }");
231 StyleRuleBase* rule = parseRule(context, nullptr, builder.toString()); 244 StyleRuleBase* rule = parseRule(context, nullptr, builder.toString());
232 if (!rule || !rule->isFontFaceRule()) 245 if (!rule || !rule->isFontFaceRule())
233 return nullptr; 246 return nullptr;
234 return toStyleRuleFontFace(rule)->properties().getPropertyCSSValue( 247 return toStyleRuleFontFace(rule)->properties().getPropertyCSSValue(
235 propertyID); 248 propertyID);
236 } 249 }
237 250
238 } // namespace blink 251 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/parser/CSSParser.h ('k') | third_party/WebKit/Source/core/css/parser/CSSParserContext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698