| 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 |