OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "chrome/browser/browser_theme_provider.h" | 5 #include "chrome/browser/browser_theme_provider.h" |
6 | 6 |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 | 10 |
11 class BrowserThemeProviderTest : public ::testing::Test { | 11 TEST(BrowserThemeProviderTest, AlignmentConversion) { |
12 public: | |
13 // Transformation for link underline colors. | |
14 SkColor BuildThirdOpacity(SkColor color_link) { | |
15 return SkColorSetA(color_link, SkColorGetA(color_link) / 3); | |
16 } | |
17 | |
18 // Returns a mapping from each COLOR_* constant to the default value for this | |
19 // constant. Callers get this map, and then modify expected values and then | |
20 // run the resulting thing through VerifyColorMap(). | |
21 std::map<int, SkColor> GetDefaultColorMap() { | |
22 std::map<int, SkColor> colors; | |
23 colors[BrowserThemeProvider::COLOR_FRAME] = | |
24 BrowserThemeProvider::kDefaultColorFrame; | |
25 colors[BrowserThemeProvider::COLOR_FRAME_INACTIVE] = | |
26 BrowserThemeProvider::kDefaultColorFrameInactive; | |
27 colors[BrowserThemeProvider::COLOR_FRAME_INCOGNITO] = | |
28 BrowserThemeProvider::kDefaultColorFrameIncognito; | |
29 colors[BrowserThemeProvider::COLOR_FRAME_INCOGNITO_INACTIVE] = | |
30 BrowserThemeProvider::kDefaultColorFrameIncognitoInactive; | |
31 colors[BrowserThemeProvider::COLOR_TOOLBAR] = | |
32 BrowserThemeProvider::kDefaultColorToolbar; | |
33 colors[BrowserThemeProvider::COLOR_TAB_TEXT] = | |
34 BrowserThemeProvider::kDefaultColorTabText; | |
35 colors[BrowserThemeProvider::COLOR_BACKGROUND_TAB_TEXT] = | |
36 BrowserThemeProvider::kDefaultColorBackgroundTabText; | |
37 colors[BrowserThemeProvider::COLOR_BOOKMARK_TEXT] = | |
38 BrowserThemeProvider::kDefaultColorBookmarkText; | |
39 colors[BrowserThemeProvider::COLOR_NTP_BACKGROUND] = | |
40 BrowserThemeProvider::kDefaultColorNTPBackground; | |
41 colors[BrowserThemeProvider::COLOR_NTP_TEXT] = | |
42 BrowserThemeProvider::kDefaultColorNTPText; | |
43 colors[BrowserThemeProvider::COLOR_NTP_LINK] = | |
44 BrowserThemeProvider::kDefaultColorNTPLink; | |
45 colors[BrowserThemeProvider::COLOR_NTP_LINK_UNDERLINE] = | |
46 BuildThirdOpacity(BrowserThemeProvider::kDefaultColorNTPLink); | |
47 colors[BrowserThemeProvider::COLOR_NTP_HEADER] = | |
48 BrowserThemeProvider::kDefaultColorNTPHeader; | |
49 colors[BrowserThemeProvider::COLOR_NTP_SECTION] = | |
50 BrowserThemeProvider::kDefaultColorNTPSection; | |
51 colors[BrowserThemeProvider::COLOR_NTP_SECTION_TEXT] = | |
52 BrowserThemeProvider::kDefaultColorNTPSectionText; | |
53 colors[BrowserThemeProvider::COLOR_NTP_SECTION_LINK] = | |
54 BrowserThemeProvider::kDefaultColorNTPSectionLink; | |
55 colors[BrowserThemeProvider::COLOR_NTP_SECTION_LINK_UNDERLINE] = | |
56 BuildThirdOpacity(BrowserThemeProvider::kDefaultColorNTPSectionLink); | |
57 colors[BrowserThemeProvider::COLOR_CONTROL_BACKGROUND] = | |
58 BrowserThemeProvider::kDefaultColorControlBackground; | |
59 colors[BrowserThemeProvider::COLOR_BUTTON_BACKGROUND] = | |
60 BrowserThemeProvider::kDefaultColorButtonBackground; | |
61 | |
62 return colors; | |
63 } | |
64 | |
65 void VerifyColorMap(const std::map<int, SkColor>& color_map) { | |
66 for (std::map<int, SkColor>::const_iterator it = color_map.begin(); | |
67 it != color_map.end(); ++it) { | |
68 EXPECT_EQ(it->second, provider_.GetColor(it->first)); | |
69 } | |
70 } | |
71 | |
72 void LoadColorJSON(const std::string& json) { | |
73 scoped_ptr<Value> value(base::JSONReader::Read(json, false)); | |
74 ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY)); | |
75 provider_.SetColorData(static_cast<DictionaryValue*>(value.get())); | |
76 } | |
77 | |
78 void LoadTintJSON(const std::string& json) { | |
79 scoped_ptr<Value> value(base::JSONReader::Read(json, false)); | |
80 ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY)); | |
81 provider_.SetTintData(static_cast<DictionaryValue*>(value.get())); | |
82 } | |
83 | |
84 void GenerateFrameColors() { | |
85 provider_.GenerateFrameColors(); | |
86 } | |
87 | |
88 BrowserThemeProvider provider_; | |
89 }; | |
90 | |
91 TEST_F(BrowserThemeProviderTest, AlignmentConversion) { | |
92 // Verify that we get out what we put in. | 12 // Verify that we get out what we put in. |
93 std::string top_left = "top left"; | 13 std::string top_left = "top left"; |
94 int alignment = BrowserThemeProvider::StringToAlignment(top_left); | 14 int alignment = BrowserThemeProvider::StringToAlignment(top_left); |
95 EXPECT_EQ(BrowserThemeProvider::ALIGN_TOP | BrowserThemeProvider::ALIGN_LEFT, | 15 EXPECT_EQ(BrowserThemeProvider::ALIGN_TOP | BrowserThemeProvider::ALIGN_LEFT, |
96 alignment); | 16 alignment); |
97 EXPECT_EQ(top_left, BrowserThemeProvider::AlignmentToString(alignment)); | 17 EXPECT_EQ(top_left, BrowserThemeProvider::AlignmentToString(alignment)); |
98 | 18 |
99 alignment = BrowserThemeProvider::StringToAlignment("top"); | 19 alignment = BrowserThemeProvider::StringToAlignment("top"); |
100 EXPECT_EQ(BrowserThemeProvider::ALIGN_TOP, alignment); | 20 EXPECT_EQ(BrowserThemeProvider::ALIGN_TOP, alignment); |
101 EXPECT_EQ("top", BrowserThemeProvider::AlignmentToString(alignment)); | 21 EXPECT_EQ("top", BrowserThemeProvider::AlignmentToString(alignment)); |
102 | 22 |
103 alignment = BrowserThemeProvider::StringToAlignment("left"); | 23 alignment = BrowserThemeProvider::StringToAlignment("left"); |
104 EXPECT_EQ(BrowserThemeProvider::ALIGN_LEFT, alignment); | 24 EXPECT_EQ(BrowserThemeProvider::ALIGN_LEFT, alignment); |
105 EXPECT_EQ("left", BrowserThemeProvider::AlignmentToString(alignment)); | 25 EXPECT_EQ("left", BrowserThemeProvider::AlignmentToString(alignment)); |
106 | 26 |
107 alignment = BrowserThemeProvider::StringToAlignment("right"); | 27 alignment = BrowserThemeProvider::StringToAlignment("right"); |
108 EXPECT_EQ(BrowserThemeProvider::ALIGN_RIGHT, alignment); | 28 EXPECT_EQ(BrowserThemeProvider::ALIGN_RIGHT, alignment); |
109 EXPECT_EQ("right", BrowserThemeProvider::AlignmentToString(alignment)); | 29 EXPECT_EQ("right", BrowserThemeProvider::AlignmentToString(alignment)); |
110 | 30 |
111 alignment = BrowserThemeProvider::StringToAlignment("righttopbottom"); | 31 alignment = BrowserThemeProvider::StringToAlignment("righttopbottom"); |
112 EXPECT_EQ(BrowserThemeProvider::ALIGN_CENTER, alignment); | 32 EXPECT_EQ(BrowserThemeProvider::ALIGN_CENTER, alignment); |
113 EXPECT_EQ("", BrowserThemeProvider::AlignmentToString(alignment)); | 33 EXPECT_EQ("", BrowserThemeProvider::AlignmentToString(alignment)); |
114 } | 34 } |
115 | 35 |
116 TEST_F(BrowserThemeProviderTest, AlignmentConversionInput) { | 36 TEST(BrowserThemeProviderTest, AlignmentConversionInput) { |
117 // Verify that we output in an expected format. | 37 // Verify that we output in an expected format. |
118 int alignment = BrowserThemeProvider::StringToAlignment("right bottom"); | 38 int alignment = BrowserThemeProvider::StringToAlignment("right bottom"); |
119 EXPECT_EQ("bottom right", BrowserThemeProvider::AlignmentToString(alignment)); | 39 EXPECT_EQ("bottom right", BrowserThemeProvider::AlignmentToString(alignment)); |
120 | 40 |
121 // Verify that bad strings don't cause explosions. | 41 // Verify that bad strings don't cause explosions. |
122 alignment = BrowserThemeProvider::StringToAlignment("new zealand"); | 42 alignment = BrowserThemeProvider::StringToAlignment("new zealand"); |
123 EXPECT_EQ("", BrowserThemeProvider::AlignmentToString(alignment)); | 43 EXPECT_EQ("", BrowserThemeProvider::AlignmentToString(alignment)); |
124 | 44 |
125 // Verify that bad strings don't cause explosions. | 45 // Verify that bad strings don't cause explosions. |
126 alignment = BrowserThemeProvider::StringToAlignment("new zealand top"); | 46 alignment = BrowserThemeProvider::StringToAlignment("new zealand top"); |
127 EXPECT_EQ("top", BrowserThemeProvider::AlignmentToString(alignment)); | 47 EXPECT_EQ("top", BrowserThemeProvider::AlignmentToString(alignment)); |
128 | 48 |
129 // Verify that bad strings don't cause explosions. | 49 // Verify that bad strings don't cause explosions. |
130 alignment = BrowserThemeProvider::StringToAlignment("new zealandtop"); | 50 alignment = BrowserThemeProvider::StringToAlignment("new zealandtop"); |
131 EXPECT_EQ("", BrowserThemeProvider::AlignmentToString(alignment)); | 51 EXPECT_EQ("", BrowserThemeProvider::AlignmentToString(alignment)); |
132 } | 52 } |
133 | |
134 TEST_F(BrowserThemeProviderTest, ColorSanityCheck) { | |
135 // Make sure that BrowserThemeProvider returns all the default colors if it | |
136 // isn't provided any color overrides. | |
137 std::map<int, SkColor> colors = GetDefaultColorMap(); | |
138 VerifyColorMap(colors); | |
139 } | |
140 | |
141 TEST_F(BrowserThemeProviderTest, DeriveUnderlineLinkColor) { | |
142 // If we specify a link color, but don't specify the underline color, the | |
143 // theme provider should create one. | |
144 std::string color_json = "{ \"ntp_link\": [128, 128, 128, 1]," | |
145 " \"ntp_section_link\": [128, 128, 128, 1] }"; | |
146 LoadColorJSON(color_json); | |
147 | |
148 std::map<int, SkColor> colors = GetDefaultColorMap(); | |
149 SkColor link_color = SkColorSetARGB(255, 128, 128, 128); | |
150 colors[BrowserThemeProvider::COLOR_NTP_LINK] = link_color; | |
151 colors[BrowserThemeProvider::COLOR_NTP_LINK_UNDERLINE] = | |
152 BuildThirdOpacity(link_color); | |
153 colors[BrowserThemeProvider::COLOR_NTP_SECTION_LINK] = link_color; | |
154 colors[BrowserThemeProvider::COLOR_NTP_SECTION_LINK_UNDERLINE] = | |
155 BuildThirdOpacity(link_color); | |
156 | |
157 VerifyColorMap(colors); | |
158 } | |
159 | |
160 TEST_F(BrowserThemeProviderTest, ProvideUnderlineLinkColor) { | |
161 // If we specify the underline color, it shouldn't try to generate one.x | |
162 std::string color_json = "{ \"ntp_link\": [128, 128, 128]," | |
163 " \"ntp_link_underline\": [255, 255, 255]," | |
164 " \"ntp_section_link\": [128, 128, 128]," | |
165 " \"ntp_section_link_underline\": [255, 255, 255]" | |
166 "}"; | |
167 LoadColorJSON(color_json); | |
168 | |
169 std::map<int, SkColor> colors = GetDefaultColorMap(); | |
170 SkColor link_color = SkColorSetRGB(128, 128, 128); | |
171 SkColor underline_color = SkColorSetRGB(255, 255, 255); | |
172 colors[BrowserThemeProvider::COLOR_NTP_LINK] = link_color; | |
173 colors[BrowserThemeProvider::COLOR_NTP_LINK_UNDERLINE] = underline_color; | |
174 colors[BrowserThemeProvider::COLOR_NTP_SECTION_LINK] = link_color; | |
175 colors[BrowserThemeProvider::COLOR_NTP_SECTION_LINK_UNDERLINE] = | |
176 underline_color; | |
177 | |
178 VerifyColorMap(colors); | |
179 } | |
180 | |
181 TEST_F(BrowserThemeProviderTest, UseSectionColorAsNTPHeader) { | |
182 std::string color_json = "{ \"ntp_section\": [190, 190, 190] }"; | |
183 LoadColorJSON(color_json); | |
184 | |
185 std::map<int, SkColor> colors = GetDefaultColorMap(); | |
186 SkColor ntp_color = SkColorSetRGB(190, 190, 190); | |
187 colors[BrowserThemeProvider::COLOR_NTP_HEADER] = ntp_color; | |
188 colors[BrowserThemeProvider::COLOR_NTP_SECTION] = ntp_color; | |
189 VerifyColorMap(colors); | |
190 } | |
191 | |
192 TEST_F(BrowserThemeProviderTest, ProvideNtpHeaderColor) { | |
193 std::string color_json = "{ \"ntp_header\": [120, 120, 120], " | |
194 " \"ntp_section\": [190, 190, 190] }"; | |
195 LoadColorJSON(color_json); | |
196 | |
197 std::map<int, SkColor> colors = GetDefaultColorMap(); | |
198 SkColor ntp_header = SkColorSetRGB(120, 120, 120); | |
199 SkColor ntp_section = SkColorSetRGB(190, 190, 190); | |
200 colors[BrowserThemeProvider::COLOR_NTP_HEADER] = ntp_header; | |
201 colors[BrowserThemeProvider::COLOR_NTP_SECTION] = ntp_section; | |
202 VerifyColorMap(colors); | |
203 } | |
204 | |
205 TEST_F(BrowserThemeProviderTest, DefaultTintingDefaultColors) { | |
206 // Default tints for buttons and frames...are no tints! So make sure that | |
207 // when we try to generate frame colors, we end up with the same. | |
208 GenerateFrameColors(); | |
209 | |
210 std::map<int, SkColor> colors = GetDefaultColorMap(); | |
211 colors[BrowserThemeProvider::COLOR_FRAME] = | |
212 HSLShift(BrowserThemeProvider::kDefaultColorFrame, | |
213 BrowserThemeProvider::kDefaultTintFrame); | |
214 colors[BrowserThemeProvider::COLOR_FRAME_INACTIVE] = | |
215 HSLShift(BrowserThemeProvider::kDefaultColorFrame, | |
216 BrowserThemeProvider::kDefaultTintFrameInactive); | |
217 colors[BrowserThemeProvider::COLOR_FRAME_INCOGNITO] = | |
218 HSLShift(BrowserThemeProvider::kDefaultColorFrame, | |
219 BrowserThemeProvider::kDefaultTintFrameIncognito); | |
220 colors[BrowserThemeProvider::COLOR_FRAME_INCOGNITO_INACTIVE] = | |
221 HSLShift(BrowserThemeProvider::kDefaultColorFrame, | |
222 BrowserThemeProvider::kDefaultTintFrameIncognitoInactive); | |
223 VerifyColorMap(colors); | |
224 } | |
225 | |
226 // TODO(erg): Test more tinting combinations. For example, with non-default | |
227 // colors or when providing tints. | |
OLD | NEW |