Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1326)

Side by Side Diff: chrome/browser/themes/browser_theme_pack_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698