OLD | NEW |
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/CSSParserImpl.h" | 5 #include "core/css/parser/CSSParserImpl.h" |
6 | 6 |
7 #include <bitset> | 7 #include <bitset> |
8 #include <memory> | 8 #include <memory> |
9 #include "core/css/CSSCustomIdentValue.h" | 9 #include "core/css/CSSCustomIdentValue.h" |
10 #include "core/css/CSSCustomPropertyDeclaration.h" | 10 #include "core/css/CSSCustomPropertyDeclaration.h" |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 if (parser.lazy_state_) | 247 if (parser.lazy_state_) |
248 parser.lazy_state_->FinishInitialParsing(); | 248 parser.lazy_state_->FinishInitialParsing(); |
249 TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse"); | 249 TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse"); |
250 | 250 |
251 TRACE_EVENT_END2("blink,blink_style", "CSSParserImpl::parseStyleSheet", | 251 TRACE_EVENT_END2("blink,blink_style", "CSSParserImpl::parseStyleSheet", |
252 "tokenCount", tokenizer.TokenCount(), "length", | 252 "tokenCount", tokenizer.TokenCount(), "length", |
253 string.length()); | 253 string.length()); |
254 } | 254 } |
255 | 255 |
256 CSSSelectorList CSSParserImpl::ParsePageSelector( | 256 CSSSelectorList CSSParserImpl::ParsePageSelector( |
257 const CSSParserContext& context, | |
258 CSSParserTokenRange range, | 257 CSSParserTokenRange range, |
259 StyleSheetContents* style_sheet) { | 258 StyleSheetContents* style_sheet) { |
260 // We only support a small subset of the css-page spec. | 259 // We only support a small subset of the css-page spec. |
261 range.ConsumeWhitespace(); | 260 range.ConsumeWhitespace(); |
262 AtomicString type_selector; | 261 AtomicString type_selector; |
263 if (range.Peek().GetType() == kIdentToken) | 262 if (range.Peek().GetType() == kIdentToken) |
264 type_selector = range.Consume().Value().ToAtomicString(); | 263 type_selector = range.Consume().Value().ToAtomicString(); |
265 | 264 |
266 AtomicString pseudo; | 265 AtomicString pseudo; |
267 if (range.Peek().GetType() == kColonToken) { | 266 if (range.Peek().GetType() == kColonToken) { |
268 range.Consume(); | 267 range.Consume(); |
269 if (range.Peek().GetType() != kIdentToken) | 268 if (range.Peek().GetType() != kIdentToken) |
270 return CSSSelectorList(); | 269 return CSSSelectorList(); |
271 pseudo = range.Consume().Value().ToAtomicString(); | 270 pseudo = range.Consume().Value().ToAtomicString(); |
272 } | 271 } |
273 | 272 |
274 range.ConsumeWhitespace(); | 273 range.ConsumeWhitespace(); |
275 if (!range.AtEnd()) | 274 if (!range.AtEnd()) |
276 return CSSSelectorList(); // Parse error; extra tokens in @page selector | 275 return CSSSelectorList(); // Parse error; extra tokens in @page selector |
277 | 276 |
278 std::unique_ptr<CSSParserSelector> selector; | 277 std::unique_ptr<CSSParserSelector> selector; |
279 if (!type_selector.IsNull() && pseudo.IsNull()) { | 278 if (!type_selector.IsNull() && pseudo.IsNull()) { |
280 selector = CSSParserSelector::Create(QualifiedName( | 279 selector = CSSParserSelector::Create(QualifiedName( |
281 g_null_atom, type_selector, style_sheet->DefaultNamespace())); | 280 g_null_atom, type_selector, style_sheet->DefaultNamespace())); |
282 } else { | 281 } else { |
283 selector = CSSParserSelector::Create(); | 282 selector = CSSParserSelector::Create(); |
284 if (!pseudo.IsNull()) { | 283 if (!pseudo.IsNull()) { |
285 selector->SetMatch(CSSSelector::kPagePseudoClass); | 284 selector->SetMatch(CSSSelector::kPagePseudoClass); |
286 selector->UpdatePseudoType(pseudo.DeprecatedLower(), context); | 285 selector->UpdatePseudoType(pseudo.DeprecatedLower()); |
287 if (selector->GetPseudoType() == CSSSelector::kPseudoUnknown) | 286 if (selector->GetPseudoType() == CSSSelector::kPseudoUnknown) |
288 return CSSSelectorList(); | 287 return CSSSelectorList(); |
289 } | 288 } |
290 if (!type_selector.IsNull()) { | 289 if (!type_selector.IsNull()) { |
291 selector->PrependTagSelector(QualifiedName( | 290 selector->PrependTagSelector(QualifiedName( |
292 g_null_atom, type_selector, style_sheet->DefaultNamespace())); | 291 g_null_atom, type_selector, style_sheet->DefaultNamespace())); |
293 } | 292 } |
294 } | 293 } |
295 | 294 |
296 selector->SetForPage(); | 295 selector->SetForPage(); |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
727 block, kKeyframesRuleList, [keyframe_rule](StyleRuleBase* keyframe) { | 726 block, kKeyframesRuleList, [keyframe_rule](StyleRuleBase* keyframe) { |
728 keyframe_rule->ParserAppendKeyframe(ToStyleRuleKeyframe(keyframe)); | 727 keyframe_rule->ParserAppendKeyframe(ToStyleRuleKeyframe(keyframe)); |
729 }); | 728 }); |
730 keyframe_rule->SetName(name); | 729 keyframe_rule->SetName(name); |
731 keyframe_rule->SetVendorPrefixed(webkit_prefixed); | 730 keyframe_rule->SetVendorPrefixed(webkit_prefixed); |
732 return keyframe_rule; | 731 return keyframe_rule; |
733 } | 732 } |
734 | 733 |
735 StyleRulePage* CSSParserImpl::ConsumePageRule(CSSParserTokenRange prelude, | 734 StyleRulePage* CSSParserImpl::ConsumePageRule(CSSParserTokenRange prelude, |
736 CSSParserTokenRange block) { | 735 CSSParserTokenRange block) { |
737 CSSSelectorList selector_list = | 736 CSSSelectorList selector_list = ParsePageSelector(prelude, style_sheet_); |
738 ParsePageSelector(*context_, prelude, style_sheet_); | |
739 if (!selector_list.IsValid()) | 737 if (!selector_list.IsValid()) |
740 return nullptr; // Parse error, invalid @page selector | 738 return nullptr; // Parse error, invalid @page selector |
741 | 739 |
742 if (observer_wrapper_) { | 740 if (observer_wrapper_) { |
743 unsigned end_offset = observer_wrapper_->EndOffset(prelude); | 741 unsigned end_offset = observer_wrapper_->EndOffset(prelude); |
744 observer_wrapper_->Observer().StartRuleHeader( | 742 observer_wrapper_->Observer().StartRuleHeader( |
745 StyleRule::kPage, observer_wrapper_->StartOffset(prelude)); | 743 StyleRule::kPage, observer_wrapper_->StartOffset(prelude)); |
746 observer_wrapper_->Observer().EndRuleHeader(end_offset); | 744 observer_wrapper_->Observer().EndRuleHeader(end_offset); |
747 } | 745 } |
748 | 746 |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 else | 984 else |
987 return nullptr; // Parser error, invalid value in keyframe selector | 985 return nullptr; // Parser error, invalid value in keyframe selector |
988 if (range.AtEnd()) | 986 if (range.AtEnd()) |
989 return result; | 987 return result; |
990 if (range.Consume().GetType() != kCommaToken) | 988 if (range.Consume().GetType() != kCommaToken) |
991 return nullptr; // Parser error | 989 return nullptr; // Parser error |
992 } | 990 } |
993 } | 991 } |
994 | 992 |
995 } // namespace blink | 993 } // namespace blink |
OLD | NEW |