| 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 |