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
3 // found in the LICENSE file.
4
5 #include "third_party/blink/renderer/core/css/resolver/font_builder.h"
6
7 #include <memory>
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "third_party/blink/renderer/core/css/css_font_selector.h"
10 #include "third_party/blink/renderer/core/css/style_engine.h"
11 #include "third_party/blink/renderer/core/dom/document.h"
12 #include "third_party/blink/renderer/core/frame/settings.h"
13 #include "third_party/blink/renderer/core/style/computed_style.h"
14 #include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
15
16 namespace blink {
17
18 class FontBuilderTest {
19 public:
FontBuilderTest()20 FontBuilderTest()
21 : dummy_(std::make_unique<DummyPageHolder>(IntSize(800, 600))) {
22 GetSettings().SetDefaultFontSize(16.0f);
23 }
24
GetDocument()25 Document& GetDocument() { return dummy_->GetDocument(); }
GetSettings()26 Settings& GetSettings() { return *GetDocument().GetSettings(); }
27
28 private:
29 std::unique_ptr<DummyPageHolder> dummy_;
30 };
31
32 using BuilderFunc = void (*)(FontBuilder&);
33 using DescriptionFunc = void (*)(FontDescription&);
34
35 struct FunctionPair {
FunctionPairblink::FunctionPair36 FunctionPair(DescriptionFunc base, BuilderFunc value)
37 : set_base_value(base), set_value(value) {}
38
39 DescriptionFunc set_base_value;
40 BuilderFunc set_value;
41 };
42
43 class FontBuilderInitTest : public FontBuilderTest, public testing::Test {};
44 class FontBuilderAdditiveTest : public FontBuilderTest,
45 public testing::TestWithParam<FunctionPair> {};
46
TEST_F(FontBuilderInitTest,InitialFontSizeNotScaled)47 TEST_F(FontBuilderInitTest, InitialFontSizeNotScaled) {
48 scoped_refptr<ComputedStyle> initial = ComputedStyle::Create();
49
50 FontBuilder builder(&GetDocument());
51 builder.SetInitial(1.0f); // FIXME: Remove unused param.
52 builder.CreateFont(*initial, initial.get());
53
54 EXPECT_EQ(16.0f, initial->GetFontDescription().ComputedSize());
55 }
56
TEST_F(FontBuilderInitTest,NotDirty)57 TEST_F(FontBuilderInitTest, NotDirty) {
58 FontBuilder builder(&GetDocument());
59 ASSERT_FALSE(builder.FontDirty());
60 }
61
62 // This test verifies that when you are setting some field F via FontBuilder,
63 // only F is actually modified on the incoming
64 // ComputedStyle::GetFontDescription.
TEST_P(FontBuilderAdditiveTest,OnlySetValueIsModified)65 TEST_P(FontBuilderAdditiveTest, OnlySetValueIsModified) {
66 FunctionPair funcs = GetParam();
67
68 FontDescription parent_description;
69 funcs.set_base_value(parent_description);
70
71 scoped_refptr<ComputedStyle> parent_style = ComputedStyle::Create();
72 parent_style->SetFontDescription(parent_description);
73
74 scoped_refptr<ComputedStyle> style = ComputedStyle::Create();
75 style->InheritFrom(*parent_style);
76
77 FontBuilder font_builder(&GetDocument());
78 funcs.set_value(font_builder);
79 font_builder.CreateFont(*style, parent_style.get());
80
81 FontDescription output_description = style->GetFontDescription();
82
83 // FontBuilder should have overwritten our base value set in the parent,
84 // hence the descriptions should not be equal.
85 ASSERT_NE(parent_description, output_description);
86
87 // Overwrite the value set by FontBuilder with the base value, directly
88 // on outputDescription.
89 funcs.set_base_value(output_description);
90
91 // Now the descriptions should be equal again. If they are, we know that
92 // FontBuilder did not change something it wasn't supposed to.
93 ASSERT_EQ(parent_description, output_description);
94 }
95
FontWeightBase(FontDescription & d)96 static void FontWeightBase(FontDescription& d) {
97 d.SetWeight(FontSelectionValue(900));
98 }
FontWeightValue(FontBuilder & b)99 static void FontWeightValue(FontBuilder& b) {
100 b.SetWeight(NormalWeightValue());
101 }
102
FontStretchBase(FontDescription & d)103 static void FontStretchBase(FontDescription& d) {
104 d.SetStretch(UltraExpandedWidthValue());
105 }
FontStretchValue(FontBuilder & b)106 static void FontStretchValue(FontBuilder& b) {
107 b.SetStretch(ExtraCondensedWidthValue());
108 }
109
FontFamilyBase(FontDescription & d)110 static void FontFamilyBase(FontDescription& d) {
111 d.SetGenericFamily(FontDescription::kFantasyFamily);
112 }
FontFamilyValue(FontBuilder & b)113 static void FontFamilyValue(FontBuilder& b) {
114 b.SetFamilyDescription(
115 FontDescription::FamilyDescription(FontDescription::kCursiveFamily));
116 }
117
FontFeatureSettingsBase(FontDescription & d)118 static void FontFeatureSettingsBase(FontDescription& d) {
119 d.SetFeatureSettings(nullptr);
120 }
FontFeatureSettingsValue(FontBuilder & b)121 static void FontFeatureSettingsValue(FontBuilder& b) {
122 b.SetFeatureSettings(FontFeatureSettings::Create());
123 }
124
FontStyleBase(FontDescription & d)125 static void FontStyleBase(FontDescription& d) {
126 d.SetStyle(ItalicSlopeValue());
127 }
FontStyleValue(FontBuilder & b)128 static void FontStyleValue(FontBuilder& b) {
129 b.SetStyle(NormalSlopeValue());
130 }
131
FontVariantCapsBase(FontDescription & d)132 static void FontVariantCapsBase(FontDescription& d) {
133 d.SetVariantCaps(FontDescription::kSmallCaps);
134 }
FontVariantCapsValue(FontBuilder & b)135 static void FontVariantCapsValue(FontBuilder& b) {
136 b.SetVariantCaps(FontDescription::kCapsNormal);
137 }
138
FontVariantLigaturesBase(FontDescription & d)139 static void FontVariantLigaturesBase(FontDescription& d) {
140 d.SetVariantLigatures(FontDescription::VariantLigatures(
141 FontDescription::kEnabledLigaturesState));
142 }
FontVariantLigaturesValue(FontBuilder & b)143 static void FontVariantLigaturesValue(FontBuilder& b) {
144 b.SetVariantLigatures(FontDescription::VariantLigatures(
145 FontDescription::kDisabledLigaturesState));
146 }
147
FontVariantNumericBase(FontDescription & d)148 static void FontVariantNumericBase(FontDescription& d) {
149 d.SetVariantNumeric(FontVariantNumeric());
150 }
FontVariantNumericValue(FontBuilder & b)151 static void FontVariantNumericValue(FontBuilder& b) {
152 FontVariantNumeric variant_numeric;
153 variant_numeric.SetNumericFraction(FontVariantNumeric::kStackedFractions);
154 b.SetVariantNumeric(variant_numeric);
155 }
156
FontTextRenderingBase(FontDescription & d)157 static void FontTextRenderingBase(FontDescription& d) {
158 d.SetTextRendering(kGeometricPrecision);
159 }
FontTextRenderingValue(FontBuilder & b)160 static void FontTextRenderingValue(FontBuilder& b) {
161 b.SetTextRendering(kOptimizeLegibility);
162 }
163
FontKerningBase(FontDescription & d)164 static void FontKerningBase(FontDescription& d) {
165 d.SetKerning(FontDescription::kNormalKerning);
166 }
FontKerningValue(FontBuilder & b)167 static void FontKerningValue(FontBuilder& b) {
168 b.SetKerning(FontDescription::kNoneKerning);
169 }
170
FontOpticalSizingBase(FontDescription & d)171 static void FontOpticalSizingBase(FontDescription& d) {
172 d.SetFontOpticalSizing(kAutoOpticalSizing);
173 }
FontOpticalSizingValue(FontBuilder & b)174 static void FontOpticalSizingValue(FontBuilder& b) {
175 b.SetFontOpticalSizing(kNoneOpticalSizing);
176 }
177
FontFontSmoothingBase(FontDescription & d)178 static void FontFontSmoothingBase(FontDescription& d) {
179 d.SetFontSmoothing(kAntialiased);
180 }
FontFontSmoothingValue(FontBuilder & b)181 static void FontFontSmoothingValue(FontBuilder& b) {
182 b.SetFontSmoothing(kSubpixelAntialiased);
183 }
184
FontSizeBase(FontDescription & d)185 static void FontSizeBase(FontDescription& d) {
186 d.SetSpecifiedSize(37.0f);
187 d.SetComputedSize(37.0f);
188 d.SetIsAbsoluteSize(true);
189 d.SetKeywordSize(7);
190 }
FontSizeValue(FontBuilder & b)191 static void FontSizeValue(FontBuilder& b) {
192 b.SetSize(FontDescription::Size(20.0f, 0, false));
193 }
194
FontScriptBase(FontDescription & d)195 static void FontScriptBase(FontDescription& d) {
196 d.SetLocale(LayoutLocale::Get("no"));
197 }
FontScriptValue(FontBuilder & b)198 static void FontScriptValue(FontBuilder& b) {
199 b.SetLocale(LayoutLocale::Get("se"));
200 }
201
202 INSTANTIATE_TEST_SUITE_P(
203 AllFields,
204 FontBuilderAdditiveTest,
205 testing::Values(
206 FunctionPair(FontWeightBase, FontWeightValue),
207 FunctionPair(FontStretchBase, FontStretchValue),
208 FunctionPair(FontFamilyBase, FontFamilyValue),
209 FunctionPair(FontFeatureSettingsBase, FontFeatureSettingsValue),
210 FunctionPair(FontStyleBase, FontStyleValue),
211 FunctionPair(FontVariantCapsBase, FontVariantCapsValue),
212 FunctionPair(FontVariantLigaturesBase, FontVariantLigaturesValue),
213 FunctionPair(FontVariantNumericBase, FontVariantNumericValue),
214 FunctionPair(FontTextRenderingBase, FontTextRenderingValue),
215 FunctionPair(FontKerningBase, FontKerningValue),
216 FunctionPair(FontFontSmoothingBase, FontFontSmoothingValue),
217 FunctionPair(FontSizeBase, FontSizeValue),
218 FunctionPair(FontScriptBase, FontScriptValue),
219 FunctionPair(FontOpticalSizingBase, FontOpticalSizingValue)));
220
221 } // namespace blink
222