| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/themes/browser_theme_pack.h" | 5 #include "chrome/browser/themes/browser_theme_pack.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/files/scoped_temp_dir.h" | 9 #include "base/files/scoped_temp_dir.h" |
| 10 #include "base/json/json_file_value_serializer.h" | 10 #include "base/json/json_file_value_serializer.h" |
| 11 #include "base/json/json_reader.h" | 11 #include "base/json/json_reader.h" |
| 12 #include "base/path_service.h" | 12 #include "base/path_service.h" |
| 13 #include "base/synchronization/waitable_event.h" | |
| 14 #include "base/values.h" | 13 #include "base/values.h" |
| 15 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 16 #include "chrome/browser/themes/theme_properties.h" | 15 #include "chrome/browser/themes/theme_properties.h" |
| 17 #include "chrome/common/chrome_paths.h" | 16 #include "chrome/common/chrome_paths.h" |
| 18 #include "chrome/grit/theme_resources.h" | 17 #include "chrome/grit/theme_resources.h" |
| 19 #include "content/public/test/test_browser_thread_bundle.h" | 18 #include "content/public/test/test_browser_thread_bundle.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "ui/gfx/color_utils.h" | 20 #include "ui/gfx/color_utils.h" |
| 22 #include "ui/gfx/image/image.h" | 21 #include "ui/gfx/image/image.h" |
| 23 #include "ui/gfx/image/image_skia.h" | 22 #include "ui/gfx/image/image_skia.h" |
| 24 #include "ui/gfx/image/image_skia_rep.h" | 23 #include "ui/gfx/image/image_skia_rep.h" |
| 25 | 24 |
| 26 using extensions::Extension; | 25 using extensions::Extension; |
| 27 | 26 |
| 28 // Maps scale factors (enum values) to file path. | 27 // Maps scale factors (enum values) to file path. |
| 29 // A similar typedef in BrowserThemePack is private. | 28 // A similar typedef in BrowserThemePack is private. |
| 30 typedef std::map<ui::ScaleFactor, base::FilePath> TestScaleFactorToFileMap; | 29 typedef std::map<ui::ScaleFactor, base::FilePath> TestScaleFactorToFileMap; |
| 31 | 30 |
| 32 // Maps image ids to maps of scale factors to file paths. | 31 // Maps image ids to maps of scale factors to file paths. |
| 33 // A similar typedef in BrowserThemePack is private. | 32 // A similar typedef in BrowserThemePack is private. |
| 34 typedef std::map<int, TestScaleFactorToFileMap> TestFilePathMap; | 33 typedef std::map<int, TestScaleFactorToFileMap> TestFilePathMap; |
| 35 | 34 |
| 36 class BrowserThemePackTest : public ::testing::Test { | 35 class BrowserThemePackTest : public ::testing::Test { |
| 37 public: | 36 public: |
| 38 BrowserThemePackTest() | 37 BrowserThemePackTest() { |
| 39 : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD), | |
| 40 theme_pack_(new BrowserThemePack()) { | |
| 41 std::vector<ui::ScaleFactor> scale_factors; | 38 std::vector<ui::ScaleFactor> scale_factors; |
| 42 scale_factors.push_back(ui::SCALE_FACTOR_100P); | 39 scale_factors.push_back(ui::SCALE_FACTOR_100P); |
| 43 scale_factors.push_back(ui::SCALE_FACTOR_200P); | 40 scale_factors.push_back(ui::SCALE_FACTOR_200P); |
| 44 scoped_set_supported_scale_factors_.reset( | 41 scoped_set_supported_scale_factors_.reset( |
| 45 new ui::test::ScopedSetSupportedScaleFactors(scale_factors)); | 42 new ui::test::ScopedSetSupportedScaleFactors(scale_factors)); |
| 43 theme_pack_ = new BrowserThemePack(); |
| 46 } | 44 } |
| 47 ~BrowserThemePackTest() override {} | |
| 48 | 45 |
| 49 // Transformation for link underline colors. | 46 // Transformation for link underline colors. |
| 50 SkColor BuildThirdOpacity(SkColor color_link) { | 47 SkColor BuildThirdOpacity(SkColor color_link) { |
| 51 return SkColorSetA(color_link, SkColorGetA(color_link) / 3); | 48 return SkColorSetA(color_link, SkColorGetA(color_link) / 3); |
| 52 } | 49 } |
| 53 | 50 |
| 54 void GenerateDefaultFrameColor(std::map<int, SkColor>* colors, | 51 void GenerateDefaultFrameColor(std::map<int, SkColor>* colors, |
| 55 int color, int tint, bool otr) { | 52 int color, int tint, bool otr) { |
| 56 (*colors)[color] = HSLShift( | 53 (*colors)[color] = HSLShift( |
| 57 ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_FRAME, false), | 54 ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_FRAME, false), |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 base::DictionaryValue* value, | 135 base::DictionaryValue* value, |
| 139 TestFilePathMap* out_file_paths) { | 136 TestFilePathMap* out_file_paths) { |
| 140 theme_pack_->ParseImageNamesFromJSON(value, base::FilePath(), | 137 theme_pack_->ParseImageNamesFromJSON(value, base::FilePath(), |
| 141 out_file_paths); | 138 out_file_paths); |
| 142 | 139 |
| 143 // Build the source image list for HasCustomImage(). | 140 // Build the source image list for HasCustomImage(). |
| 144 theme_pack_->BuildSourceImagesArray(*out_file_paths); | 141 theme_pack_->BuildSourceImagesArray(*out_file_paths); |
| 145 } | 142 } |
| 146 | 143 |
| 147 bool LoadRawBitmapsTo(const TestFilePathMap& out_file_paths) { | 144 bool LoadRawBitmapsTo(const TestFilePathMap& out_file_paths) { |
| 148 return theme_pack_->LoadRawBitmapsTo(out_file_paths, &theme_pack_->images_); | 145 return theme_pack_->LoadRawBitmapsTo(out_file_paths, |
| 146 &theme_pack_->images_on_ui_thread_); |
| 149 } | 147 } |
| 150 | 148 |
| 151 // This function returns void in order to be able use ASSERT_... | 149 // This function returns void in order to be able use ASSERT_... |
| 152 // The BrowserThemePack is returned in |pack|. | 150 // The BrowserThemePack is returned in |pack|. |
| 153 void BuildFromUnpackedExtension(const base::FilePath& extension_path, | 151 void BuildFromUnpackedExtension(const base::FilePath& extension_path, |
| 154 scoped_refptr<BrowserThemePack>* pack) { | 152 scoped_refptr<BrowserThemePack>& pack) { |
| 155 io_waiter_.reset(new base::WaitableEvent( | 153 base::FilePath manifest_path = |
| 156 base::WaitableEvent::ResetPolicy::AUTOMATIC, | 154 extension_path.AppendASCII("manifest.json"); |
| 157 base::WaitableEvent::InitialState::NOT_SIGNALED)); | 155 std::string error; |
| 158 content::BrowserThread::PostTask( | 156 JSONFileValueDeserializer deserializer(manifest_path); |
| 159 content::BrowserThread::IO, FROM_HERE, | 157 std::unique_ptr<base::DictionaryValue> valid_value = |
| 160 base::Bind(&BrowserThemePackTest::DoBuildFromUnpackedExtension, | 158 base::DictionaryValue::From(deserializer.Deserialize(NULL, &error)); |
| 161 base::Unretained(this), extension_path, pack)); | 159 EXPECT_EQ("", error); |
| 162 io_waiter_->Wait(); | 160 ASSERT_TRUE(valid_value.get()); |
| 163 ASSERT_TRUE((*pack)->is_valid()); | 161 scoped_refptr<Extension> extension( |
| 162 Extension::Create( |
| 163 extension_path, |
| 164 extensions::Manifest::INVALID_LOCATION, |
| 165 *valid_value, |
| 166 Extension::REQUIRE_KEY, |
| 167 &error)); |
| 168 ASSERT_TRUE(extension.get()); |
| 169 ASSERT_EQ("", error); |
| 170 pack = BrowserThemePack::BuildFromExtension(extension.get()); |
| 171 ASSERT_TRUE(pack.get()); |
| 164 } | 172 } |
| 165 | 173 |
| 166 base::FilePath GetStarGazingPath() { | 174 base::FilePath GetStarGazingPath() { |
| 167 base::FilePath test_path; | 175 base::FilePath test_path; |
| 168 if (!PathService::Get(chrome::DIR_TEST_DATA, &test_path)) { | 176 if (!PathService::Get(chrome::DIR_TEST_DATA, &test_path)) { |
| 169 NOTREACHED(); | 177 NOTREACHED(); |
| 170 return test_path; | 178 return test_path; |
| 171 } | 179 } |
| 172 | 180 |
| 173 test_path = test_path.AppendASCII("profiles"); | 181 test_path = test_path.AppendASCII("profiles"); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 EXPECT_EQ(160, rep4.sk_bitmap().height()); | 340 EXPECT_EQ(160, rep4.sk_bitmap().height()); |
| 333 // We expect the same colors and at locations scaled by 2 | 341 // We expect the same colors and at locations scaled by 2 |
| 334 // since this bitmap was scaled by 2. | 342 // since this bitmap was scaled by 2. |
| 335 for (size_t i = 0; i < normal.size(); ++i) { | 343 for (size_t i = 0; i < normal.size(); ++i) { |
| 336 int xy = 2 * normal[i].first; | 344 int xy = 2 * normal[i].first; |
| 337 SkColor color = normal[i].second; | 345 SkColor color = normal[i].second; |
| 338 EXPECT_EQ(color, rep4.sk_bitmap().getColor(xy, xy)); | 346 EXPECT_EQ(color, rep4.sk_bitmap().getColor(xy, xy)); |
| 339 } | 347 } |
| 340 } | 348 } |
| 341 | 349 |
| 342 protected: | 350 content::TestBrowserThreadBundle test_browser_thread_bundle_; |
| 351 |
| 343 typedef std::unique_ptr<ui::test::ScopedSetSupportedScaleFactors> | 352 typedef std::unique_ptr<ui::test::ScopedSetSupportedScaleFactors> |
| 344 ScopedSetSupportedScaleFactors; | 353 ScopedSetSupportedScaleFactors; |
| 345 ScopedSetSupportedScaleFactors scoped_set_supported_scale_factors_; | 354 ScopedSetSupportedScaleFactors scoped_set_supported_scale_factors_; |
| 346 | |
| 347 void DoBuildFromUnpackedExtension(const base::FilePath& extension_path, | |
| 348 scoped_refptr<BrowserThemePack>* pack) { | |
| 349 base::FilePath manifest_path = extension_path.AppendASCII("manifest.json"); | |
| 350 std::string error; | |
| 351 JSONFileValueDeserializer deserializer(manifest_path); | |
| 352 std::unique_ptr<base::DictionaryValue> valid_value = | |
| 353 base::DictionaryValue::From(deserializer.Deserialize(NULL, &error)); | |
| 354 EXPECT_EQ("", error); | |
| 355 ASSERT_TRUE(valid_value.get()); | |
| 356 scoped_refptr<Extension> extension(Extension::Create( | |
| 357 extension_path, extensions::Manifest::INVALID_LOCATION, *valid_value, | |
| 358 Extension::REQUIRE_KEY, &error)); | |
| 359 ASSERT_TRUE(extension.get()); | |
| 360 ASSERT_EQ("", error); | |
| 361 *pack = new BrowserThemePack; | |
| 362 BrowserThemePack::BuildFromExtension(extension.get(), *pack); | |
| 363 io_waiter_->Signal(); | |
| 364 } | |
| 365 | |
| 366 content::TestBrowserThreadBundle thread_bundle_; | |
| 367 scoped_refptr<BrowserThemePack> theme_pack_; | 355 scoped_refptr<BrowserThemePack> theme_pack_; |
| 368 std::unique_ptr<base::WaitableEvent> io_waiter_; | |
| 369 }; | 356 }; |
| 370 | 357 |
| 371 // 'ntp_section' used to correspond to ThemeProperties::COLOR_NTP_SECTION, | 358 // 'ntp_section' used to correspond to ThemeProperties::COLOR_NTP_SECTION, |
| 372 // but COLOR_NTP_SECTION was since removed because it was never used. | 359 // but COLOR_NTP_SECTION was since removed because it was never used. |
| 373 // While it was in use, COLOR_NTP_HEADER used 'ntp_section' as a fallback when | 360 // While it was in use, COLOR_NTP_HEADER used 'ntp_section' as a fallback when |
| 374 // 'ntp_header' was absent. We still preserve this fallback for themes that | 361 // 'ntp_header' was absent. We still preserve this fallback for themes that |
| 375 // relied on this. | 362 // relied on this. |
| 376 TEST_F(BrowserThemePackTest, UseSectionColorAsNTPHeader) { | 363 TEST_F(BrowserThemePackTest, UseSectionColorAsNTPHeader) { |
| 377 std::string color_json = "{ \"ntp_section\": [190, 190, 190] }"; | 364 std::string color_json = "{ \"ntp_section\": [190, 190, 190] }"; |
| 378 LoadColorJSON(color_json); | 365 LoadColorJSON(color_json); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 // tricky memory stuff that BrowserThemePack does. | 562 // tricky memory stuff that BrowserThemePack does. |
| 576 TEST_F(BrowserThemePackTest, CanBuildAndReadPack) { | 563 TEST_F(BrowserThemePackTest, CanBuildAndReadPack) { |
| 577 base::ScopedTempDir dir; | 564 base::ScopedTempDir dir; |
| 578 ASSERT_TRUE(dir.CreateUniqueTempDir()); | 565 ASSERT_TRUE(dir.CreateUniqueTempDir()); |
| 579 base::FilePath file = dir.GetPath().AppendASCII("data.pak"); | 566 base::FilePath file = dir.GetPath().AppendASCII("data.pak"); |
| 580 | 567 |
| 581 // Part 1: Build the pack from an extension. | 568 // Part 1: Build the pack from an extension. |
| 582 { | 569 { |
| 583 base::FilePath star_gazing_path = GetStarGazingPath(); | 570 base::FilePath star_gazing_path = GetStarGazingPath(); |
| 584 scoped_refptr<BrowserThemePack> pack; | 571 scoped_refptr<BrowserThemePack> pack; |
| 585 BuildFromUnpackedExtension(star_gazing_path, &pack); | 572 BuildFromUnpackedExtension(star_gazing_path, pack); |
| 586 ASSERT_TRUE(pack->WriteToDisk(file)); | 573 ASSERT_TRUE(pack->WriteToDisk(file)); |
| 587 VerifyStarGazing(pack.get()); | 574 VerifyStarGazing(pack.get()); |
| 588 } | 575 } |
| 589 | 576 |
| 590 // Part 2: Try to read back the data pack that we just wrote to disk. | 577 // Part 2: Try to read back the data pack that we just wrote to disk. |
| 591 { | 578 { |
| 592 scoped_refptr<BrowserThemePack> pack = | 579 scoped_refptr<BrowserThemePack> pack = |
| 593 BrowserThemePack::BuildFromDataPack( | 580 BrowserThemePack::BuildFromDataPack( |
| 594 file, "mblmlcbknbnfebdfjnolmcapmdofhmme"); | 581 file, "mblmlcbknbnfebdfjnolmcapmdofhmme"); |
| 595 ASSERT_TRUE(pack.get()); | 582 ASSERT_TRUE(pack.get()); |
| 596 VerifyStarGazing(pack.get()); | 583 VerifyStarGazing(pack.get()); |
| 597 } | 584 } |
| 598 } | 585 } |
| 599 | 586 |
| 600 TEST_F(BrowserThemePackTest, HiDpiThemeTest) { | 587 TEST_F(BrowserThemePackTest, HiDpiThemeTest) { |
| 601 base::ScopedTempDir dir; | 588 base::ScopedTempDir dir; |
| 602 ASSERT_TRUE(dir.CreateUniqueTempDir()); | 589 ASSERT_TRUE(dir.CreateUniqueTempDir()); |
| 603 base::FilePath file = dir.GetPath().AppendASCII("theme_data.pak"); | 590 base::FilePath file = dir.GetPath().AppendASCII("theme_data.pak"); |
| 604 | 591 |
| 605 // Part 1: Build the pack from an extension. | 592 // Part 1: Build the pack from an extension. |
| 606 { | 593 { |
| 607 base::FilePath hidpi_path = GetHiDpiThemePath(); | 594 base::FilePath hidpi_path = GetHiDpiThemePath(); |
| 608 scoped_refptr<BrowserThemePack> pack; | 595 scoped_refptr<BrowserThemePack> pack; |
| 609 BuildFromUnpackedExtension(hidpi_path, &pack); | 596 BuildFromUnpackedExtension(hidpi_path, pack); |
| 610 ASSERT_TRUE(pack->WriteToDisk(file)); | 597 ASSERT_TRUE(pack->WriteToDisk(file)); |
| 611 VerifyHiDpiTheme(pack.get()); | 598 VerifyHiDpiTheme(pack.get()); |
| 612 } | 599 } |
| 613 | 600 |
| 614 // Part 2: Try to read back the data pack that we just wrote to disk. | 601 // Part 2: Try to read back the data pack that we just wrote to disk. |
| 615 { | 602 { |
| 616 scoped_refptr<BrowserThemePack> pack = | 603 scoped_refptr<BrowserThemePack> pack = |
| 617 BrowserThemePack::BuildFromDataPack(file, "gllekhaobjnhgeag"); | 604 BrowserThemePack::BuildFromDataPack(file, "gllekhaobjnhgeag"); |
| 618 ASSERT_TRUE(pack.get()); | 605 ASSERT_TRUE(pack.get()); |
| 619 VerifyHiDpiTheme(pack.get()); | 606 VerifyHiDpiTheme(pack.get()); |
| 620 } | 607 } |
| 621 } | 608 } |
| OLD | NEW |