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