Commit e441cf2a authored by Xiaocheng Hu's avatar Xiaocheng Hu Committed by Chromium LUCI CQ

Implement custom first symbol value for @counter-style 'fixed' systems

Bug: 687225
Change-Id: I475aa0fb47961e8d3d50c5721522586359b3e565
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2587701
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Reviewed-by: default avatarAnders Hartvoll Ruud <andruud@chromium.org>
Cr-Commit-Position: refs/heads/master@{#836890}
parent 84cba865
......@@ -238,6 +238,9 @@ CounterStyle::CounterStyle(const StyleRuleCounterStyle& rule)
if (system_ == CounterStyleSystem::kUnresolvedExtends) {
const auto& second = To<CSSValuePair>(system)->Second();
extends_name_ = To<CSSCustomIdentValue>(second).Value();
} else if (system_ == CounterStyleSystem::kFixed && system->IsValuePair()) {
const auto& second = To<CSSValuePair>(system)->Second();
first_symbol_value_ = To<CSSPrimitiveValue>(second).GetIntValue();
}
}
......@@ -284,7 +287,7 @@ CounterStyle::CounterStyle(const StyleRuleCounterStyle& rule)
}
}
// TODO(crbug.com/687225): Implement and populate other fields.
// TODO(crbug.com/687225): Implement 'prefix', 'suffix' and 'speak-as'.
}
void CounterStyle::ResolveExtends(const CounterStyle& extended) {
......@@ -293,6 +296,9 @@ void CounterStyle::ResolveExtends(const CounterStyle& extended) {
system_ = extended.system_;
if (system_ == CounterStyleSystem::kFixed)
first_symbol_value_ = extended.first_symbol_value_;
if (!style_rule_->GetFallback()) {
fallback_name_ = extended.fallback_name_;
fallback_style_ = nullptr;
......@@ -315,7 +321,7 @@ void CounterStyle::ResolveExtends(const CounterStyle& extended) {
if (!style_rule_->GetRange())
range_ = extended.range_;
// TODO(crbug.com/687225): Implement and populate other fields.
// TODO(crbug.com/687225): Implement 'prefix', 'suffix' and 'speak-as'.
}
void CounterStyle::ResetExtends() {
......@@ -425,8 +431,8 @@ String CounterStyle::GenerateInitialRepresentation(int value) const {
symbol_indexes = CyclicAlgorithm(value, symbols_.size());
break;
case CounterStyleSystem::kFixed:
// TODO(crbug.com/687225): Implement non-default first symbol values.
symbol_indexes = FixedAlgorithm(value - 1, symbols_.size());
symbol_indexes =
FixedAlgorithm(value - first_symbol_value_, symbols_.size());
break;
case CounterStyleSystem::kNumeric:
symbol_indexes = NumericAlgorithm(value, symbols_.size());
......
......@@ -110,6 +110,9 @@ class CORE_EXPORT CounterStyle final : public GarbageCollected<CounterStyle> {
String pad_symbol_;
wtf_size_t pad_length_ = 0;
// First symbol value, for 'fixed' system only.
wtf_size_t first_symbol_value_ = 1;
friend class CounterStyleMapTest;
};
......
......@@ -326,4 +326,34 @@ TEST_F(CounterStyleTest, AdditiveWithExtendedRange) {
EXPECT_EQ("A", extended.GenerateRepresentation(1));
}
TEST_F(CounterStyleTest, CustomFirstSymbolValue) {
InsertStyleElement(R"CSS(
@counter-style base {
system: fixed 2;
symbols: A B C;
}
@counter-style extended {
system: extends base;
}
)CSS");
UpdateAllLifecyclePhasesForTest();
// Getting custom first symbol value directly from descriptor value.
const CounterStyle& base = GetCounterStyle("base");
EXPECT_EQ("1", base.GenerateRepresentation(1));
EXPECT_EQ("A", base.GenerateRepresentation(2));
EXPECT_EQ("B", base.GenerateRepresentation(3));
EXPECT_EQ("C", base.GenerateRepresentation(4));
EXPECT_EQ("5", base.GenerateRepresentation(5));
// Getting custom first symbol value indirectly using 'extends'.
const CounterStyle& extended = GetCounterStyle("extended");
EXPECT_EQ("1", extended.GenerateRepresentation(1));
EXPECT_EQ("A", extended.GenerateRepresentation(2));
EXPECT_EQ("B", extended.GenerateRepresentation(3));
EXPECT_EQ("C", extended.GenerateRepresentation(4));
EXPECT_EQ("5", extended.GenerateRepresentation(5));
}
} // 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