Commit db27dfbb authored by Kevin Babbitt's avatar Kevin Babbitt Committed by Commit Bot

[CSSParser] Add regression tests for at-rule offsets

Introduce unit tests validating the offsets generated by CSSParserImpl
for dev tools These tests will ensure that upcoming refactoring to make
further use of stream-based parsing does not change these offsets.

Bug: 661854
Change-Id: I1461bdff5782d23921041a80d6ade6018e6f0983
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2209960Reviewed-by: default avatarAnders Hartvoll Ruud <andruud@chromium.org>
Commit-Queue: Kevin Babbitt <kbabbitt@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#771878}
parent 41fe5a9d
...@@ -645,6 +645,7 @@ blink_core_tests("unit_tests") { ...@@ -645,6 +645,7 @@ blink_core_tests("unit_tests") {
"media_values_test.cc", "media_values_test.cc",
"parser/css_lazy_parsing_test.cc", "parser/css_lazy_parsing_test.cc",
"parser/css_parser_fast_paths_test.cc", "parser/css_parser_fast_paths_test.cc",
"parser/css_parser_impl_test.cc",
"parser/css_parser_local_context_test.cc", "parser/css_parser_local_context_test.cc",
"parser/css_parser_token_stream_test.cc", "parser/css_parser_token_stream_test.cc",
"parser/css_parser_token_test.cc", "parser/css_parser_token_test.cc",
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/css/parser/css_parser_impl.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/css/parser/css_parser_observer.h"
#include "third_party/blink/renderer/core/css/style_sheet_contents.h"
namespace blink {
class TestCSSParserObserver : public CSSParserObserver {
public:
void StartRuleHeader(StyleRule::RuleType rule_type,
unsigned offset) override {
rule_type_ = rule_type;
rule_header_start_ = offset;
}
void EndRuleHeader(unsigned offset) override { rule_header_end_ = offset; }
void ObserveSelector(unsigned start_offset, unsigned end_offset) override {}
void StartRuleBody(unsigned offset) override { rule_body_start_ = offset; }
void EndRuleBody(unsigned offset) override { rule_body_end_ = offset; }
void ObserveProperty(unsigned start_offset,
unsigned end_offset,
bool is_important,
bool is_parsed) override {}
void ObserveComment(unsigned start_offset, unsigned end_offset) override {}
StyleRule::RuleType rule_type_ = StyleRule::RuleType::kStyle;
unsigned rule_header_start_ = 0;
unsigned rule_header_end_ = 0;
unsigned rule_body_start_ = 0;
unsigned rule_body_end_ = 0;
};
TEST(CSSParserImplTest, AtImportOffsets) {
String sheet_text = "@import 'test.css';";
auto* context = MakeGarbageCollected<CSSParserContext>(
kHTMLStandardMode, SecureContextMode::kInsecureContext);
auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
TestCSSParserObserver test_css_parser_observer;
CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, style_sheet,
test_css_parser_observer);
EXPECT_EQ(style_sheet->ImportRules().size(), 1u);
EXPECT_EQ(test_css_parser_observer.rule_type_, StyleRule::RuleType::kImport);
EXPECT_EQ(test_css_parser_observer.rule_header_start_, 18u);
EXPECT_EQ(test_css_parser_observer.rule_header_end_, 18u);
EXPECT_EQ(test_css_parser_observer.rule_body_start_, 18u);
EXPECT_EQ(test_css_parser_observer.rule_body_end_, 18u);
}
TEST(CSSParserImplTest, AtMediaOffsets) {
String sheet_text = "@media screen { }";
auto* context = MakeGarbageCollected<CSSParserContext>(
kHTMLStandardMode, SecureContextMode::kInsecureContext);
auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
TestCSSParserObserver test_css_parser_observer;
CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, style_sheet,
test_css_parser_observer);
EXPECT_EQ(style_sheet->ChildRules().size(), 1u);
EXPECT_EQ(test_css_parser_observer.rule_type_, StyleRule::RuleType::kMedia);
EXPECT_EQ(test_css_parser_observer.rule_header_start_, 7u);
EXPECT_EQ(test_css_parser_observer.rule_header_end_, 14u);
EXPECT_EQ(test_css_parser_observer.rule_body_start_, 15u);
EXPECT_EQ(test_css_parser_observer.rule_body_end_, 16u);
}
TEST(CSSParserImplTest, AtSupportsOffsets) {
String sheet_text = "@supports (display:none) { }";
auto* context = MakeGarbageCollected<CSSParserContext>(
kHTMLStandardMode, SecureContextMode::kInsecureContext);
auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
TestCSSParserObserver test_css_parser_observer;
CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, style_sheet,
test_css_parser_observer);
EXPECT_EQ(style_sheet->ChildRules().size(), 1u);
EXPECT_EQ(test_css_parser_observer.rule_type_,
StyleRule::RuleType::kSupports);
EXPECT_EQ(test_css_parser_observer.rule_header_start_, 10u);
EXPECT_EQ(test_css_parser_observer.rule_header_end_, 25u);
EXPECT_EQ(test_css_parser_observer.rule_body_start_, 26u);
EXPECT_EQ(test_css_parser_observer.rule_body_end_, 27u);
}
TEST(CSSParserImplTest, AtViewportOffsets) {
String sheet_text = "@viewport { }";
auto* context = MakeGarbageCollected<CSSParserContext>(
kUASheetMode, SecureContextMode::kInsecureContext);
auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
TestCSSParserObserver test_css_parser_observer;
CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, style_sheet,
test_css_parser_observer);
EXPECT_EQ(style_sheet->ChildRules().size(), 1u);
EXPECT_EQ(test_css_parser_observer.rule_type_,
StyleRule::RuleType::kViewport);
EXPECT_EQ(test_css_parser_observer.rule_header_start_, 10u);
EXPECT_EQ(test_css_parser_observer.rule_header_end_, 10u);
EXPECT_EQ(test_css_parser_observer.rule_body_start_, 10u);
EXPECT_EQ(test_css_parser_observer.rule_body_end_, 10u);
}
TEST(CSSParserImplTest, AtFontFaceOffsets) {
String sheet_text = "@font-face { }";
auto* context = MakeGarbageCollected<CSSParserContext>(
kHTMLStandardMode, SecureContextMode::kInsecureContext);
auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
TestCSSParserObserver test_css_parser_observer;
CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, style_sheet,
test_css_parser_observer);
EXPECT_EQ(style_sheet->ChildRules().size(), 1u);
EXPECT_EQ(test_css_parser_observer.rule_type_,
StyleRule::RuleType::kFontFace);
EXPECT_EQ(test_css_parser_observer.rule_header_start_, 11u);
EXPECT_EQ(test_css_parser_observer.rule_header_end_, 11u);
EXPECT_EQ(test_css_parser_observer.rule_body_start_, 11u);
EXPECT_EQ(test_css_parser_observer.rule_body_end_, 11u);
}
TEST(CSSParserImplTest, AtKeyframesOffsets) {
String sheet_text = "@keyframes test { }";
auto* context = MakeGarbageCollected<CSSParserContext>(
kHTMLStandardMode, SecureContextMode::kInsecureContext);
auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
TestCSSParserObserver test_css_parser_observer;
CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, style_sheet,
test_css_parser_observer);
EXPECT_EQ(style_sheet->ChildRules().size(), 1u);
EXPECT_EQ(test_css_parser_observer.rule_type_,
StyleRule::RuleType::kKeyframes);
EXPECT_EQ(test_css_parser_observer.rule_header_start_, 11u);
EXPECT_EQ(test_css_parser_observer.rule_header_end_, 16u);
EXPECT_EQ(test_css_parser_observer.rule_body_start_, 17u);
EXPECT_EQ(test_css_parser_observer.rule_body_end_, 18u);
}
TEST(CSSParserImplTest, AtPageOffsets) {
String sheet_text = "@page :first { }";
auto* context = MakeGarbageCollected<CSSParserContext>(
kHTMLStandardMode, SecureContextMode::kInsecureContext);
auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
TestCSSParserObserver test_css_parser_observer;
CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, style_sheet,
test_css_parser_observer);
EXPECT_EQ(style_sheet->ChildRules().size(), 1u);
EXPECT_EQ(test_css_parser_observer.rule_type_, StyleRule::RuleType::kPage);
EXPECT_EQ(test_css_parser_observer.rule_header_start_, 6u);
EXPECT_EQ(test_css_parser_observer.rule_header_end_, 13u);
EXPECT_EQ(test_css_parser_observer.rule_body_start_, 14u);
EXPECT_EQ(test_css_parser_observer.rule_body_end_, 15u);
}
TEST(CSSParserImplTest, AtPropertyOffsets) {
RuntimeEnabledFeatures::SetCSSVariables2AtPropertyEnabled(true);
String sheet_text = "@property --test { }";
auto* context = MakeGarbageCollected<CSSParserContext>(
kHTMLStandardMode, SecureContextMode::kInsecureContext);
auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context);
TestCSSParserObserver test_css_parser_observer;
CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, style_sheet,
test_css_parser_observer);
EXPECT_EQ(style_sheet->ChildRules().size(), 1u);
EXPECT_EQ(test_css_parser_observer.rule_type_,
StyleRule::RuleType::kProperty);
EXPECT_EQ(test_css_parser_observer.rule_header_start_, 10u);
EXPECT_EQ(test_css_parser_observer.rule_header_end_, 17u);
EXPECT_EQ(test_css_parser_observer.rule_body_start_, 0u);
EXPECT_EQ(test_css_parser_observer.rule_body_end_, 0u);
}
} // namespace blink
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment