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