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