1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/themes/browser_theme_pack.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_util.h" 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/json/json_reader.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/message_loop.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/path_service.h" 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/values.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/chrome_paths.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/json_value_serializer.h" 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/theme_resources.h" 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/color_utils.h" 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass BrowserThemePackTest : public ::testing::Test { 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemePackTest() 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : message_loop(), 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_ui_thread(BrowserThread::UI, &message_loop), 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_file_thread(BrowserThread::FILE, &message_loop), 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen theme_pack_(new BrowserThemePack) { 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Transformation for link underline colors. 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor BuildThirdOpacity(SkColor color_link) { 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return SkColorSetA(color_link, SkColorGetA(color_link) / 3); 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void GenerateDefaultFrameColor(std::map<int, SkColor>* colors, 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int color, int tint) { 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[color] = HSLShift( 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::GetDefaultColor( 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::COLOR_FRAME), 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::GetDefaultTint(tint)); 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Returns a mapping from each COLOR_* constant to the default value for this 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // constant. Callers get this map, and then modify expected values and then 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // run the resulting thing through VerifyColorMap(). 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor> GetDefaultColorMap() { 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor> colors; 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (int i = ThemeService::COLOR_FRAME; 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen i <= ThemeService::COLOR_BUTTON_BACKGROUND; ++i) { 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[i] = ThemeService::GetDefaultColor(i); 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GenerateDefaultFrameColor(&colors, ThemeService::COLOR_FRAME, 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::TINT_FRAME); 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GenerateDefaultFrameColor(&colors, 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::COLOR_FRAME_INACTIVE, 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::TINT_FRAME_INACTIVE); 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GenerateDefaultFrameColor(&colors, 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::COLOR_FRAME_INCOGNITO, 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::TINT_FRAME_INCOGNITO); 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GenerateDefaultFrameColor( 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &colors, 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::COLOR_FRAME_INCOGNITO_INACTIVE, 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::TINT_FRAME_INCOGNITO_INACTIVE); 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return colors; 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void VerifyColorMap(const std::map<int, SkColor>& color_map) { 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (std::map<int, SkColor>::const_iterator it = color_map.begin(); 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != color_map.end(); ++it) { 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SkColor color = ThemeService::GetDefaultColor(it->first); 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen theme_pack_->GetColor(it->first, &color); 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(it->second, color) << "Color id = " << it->first; 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void LoadColorJSON(const std::string& json) { 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<Value> value(base::JSONReader::Read(json, false)); 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY)); 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadColorDictionary(static_cast<DictionaryValue*>(value.get())); 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void LoadColorDictionary(DictionaryValue* value) { 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen theme_pack_->BuildColorsFromJSON(value); 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void LoadTintJSON(const std::string& json) { 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<Value> value(base::JSONReader::Read(json, false)); 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY)); 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadTintDictionary(static_cast<DictionaryValue*>(value.get())); 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void LoadTintDictionary(DictionaryValue* value) { 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen theme_pack_->BuildTintsFromJSON(value); 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void LoadDisplayPropertiesJSON(const std::string& json) { 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<Value> value(base::JSONReader::Read(json, false)); 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY)); 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadDisplayPropertiesDictionary(static_cast<DictionaryValue*>(value.get())); 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void LoadDisplayPropertiesDictionary(DictionaryValue* value) { 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen theme_pack_->BuildDisplayPropertiesFromJSON(value); 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void ParseImageNamesJSON(const std::string& json, 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, FilePath>* out_file_paths) { 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<Value> value(base::JSONReader::Read(json, false)); 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY)); 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ParseImageNamesDictionary(static_cast<DictionaryValue*>(value.get()), 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen out_file_paths); 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void ParseImageNamesDictionary(DictionaryValue* value, 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, FilePath>* out_file_paths) { 118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen theme_pack_->ParseImageNamesFromJSON(value, FilePath(), out_file_paths); 119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Build the source image list for HasCustomImage(). 121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen theme_pack_->BuildSourceImagesArray(*out_file_paths); 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool LoadRawBitmapsTo(const std::map<int, FilePath>& out_file_paths) { 125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return theme_pack_->LoadRawBitmapsTo(out_file_paths, 126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &theme_pack_->prepared_images_); 127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath GetStarGazingPath() { 130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath test_path; 131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!PathService::Get(chrome::DIR_TEST_DATA, &test_path)) { 132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED(); 133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return test_path; 134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen test_path = test_path.AppendASCII("profiles"); 137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen test_path = test_path.AppendASCII("complex_theme"); 138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen test_path = test_path.AppendASCII("Default"); 139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen test_path = test_path.AppendASCII("Extensions"); 140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen test_path = test_path.AppendASCII("mblmlcbknbnfebdfjnolmcapmdofhmme"); 141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen test_path = test_path.AppendASCII("1.1"); 142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return FilePath(test_path); 143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Verifies the data in star gazing. We do this multiple times for different 146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // BrowserThemePack objects to make sure it works in generated and mmapped 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // mode correctly. 148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void VerifyStarGazing(BrowserThemePack* pack) { 149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // First check that values we know exist, exist. 150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor color; 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(pack->GetColor(ThemeService::COLOR_BOOKMARK_TEXT, 152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &color)); 153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(SK_ColorBLACK, color); 154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(pack->GetColor(ThemeService::COLOR_NTP_BACKGROUND, 156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &color)); 157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(SkColorSetRGB(57, 137, 194), color); 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_utils::HSL expected = { 0.6, 0.553, 0.5 }; 160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_utils::HSL actual; 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(pack->GetTint(ThemeService::TINT_BUTTONS, &actual)); 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_DOUBLE_EQ(expected.h, actual.h); 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_DOUBLE_EQ(expected.s, actual.s); 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_DOUBLE_EQ(expected.l, actual.l); 165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int val; 167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(pack->GetDisplayProperty( 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::NTP_BACKGROUND_ALIGNMENT, &val)); 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ThemeService::ALIGN_TOP, val); 170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The stargazing theme defines the following images: 172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(pack->HasCustomImage(IDR_THEME_BUTTON_BACKGROUND)); 173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(pack->HasCustomImage(IDR_THEME_FRAME)); 174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(pack->HasCustomImage(IDR_THEME_NTP_BACKGROUND)); 175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(pack->HasCustomImage(IDR_THEME_TAB_BACKGROUND)); 176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(pack->HasCustomImage(IDR_THEME_TOOLBAR)); 177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(pack->HasCustomImage(IDR_THEME_WINDOW_CONTROL_BACKGROUND)); 178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Here are a few images that we shouldn't expect because even though 180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // they're included in the theme pack, they were autogenerated and 181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // therefore shouldn't show up when calling HasCustomImage(). 182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(pack->HasCustomImage(IDR_THEME_FRAME_INACTIVE)); 183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(pack->HasCustomImage(IDR_THEME_FRAME_INCOGNITO)); 184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(pack->HasCustomImage(IDR_THEME_FRAME_INCOGNITO_INACTIVE)); 185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(pack->HasCustomImage(IDR_THEME_TAB_BACKGROUND_INCOGNITO)); 186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Make sure we don't have phantom data. 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(pack->GetColor(ThemeService::COLOR_CONTROL_BACKGROUND, 189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &color)); 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(pack->GetTint(ThemeService::TINT_FRAME, &actual)); 191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen MessageLoop message_loop; 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread fake_ui_thread; 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread fake_file_thread; 196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_refptr<BrowserThemePack> theme_pack_; 198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, DeriveUnderlineLinkColor) { 202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If we specify a link color, but don't specify the underline color, the 203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // theme provider should create one. 204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string color_json = "{ \"ntp_link\": [128, 128, 128]," 205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"ntp_section_link\": [128, 128, 128] }"; 206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadColorJSON(color_json); 207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor> colors = GetDefaultColorMap(); 209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor link_color = SkColorSetRGB(128, 128, 128); 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_LINK] = link_color; 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_LINK_UNDERLINE] = 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BuildThirdOpacity(link_color); 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_SECTION_LINK] = link_color; 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_SECTION_LINK_UNDERLINE] = 215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BuildThirdOpacity(link_color); 216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen VerifyColorMap(colors); 218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, ProvideUnderlineLinkColor) { 221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If we specify the underline color, it shouldn't try to generate one. 222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string color_json = "{ \"ntp_link\": [128, 128, 128]," 223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"ntp_link_underline\": [255, 255, 255]," 224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"ntp_section_link\": [128, 128, 128]," 225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"ntp_section_link_underline\": [255, 255, 255]" 226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "}"; 227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadColorJSON(color_json); 228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor> colors = GetDefaultColorMap(); 230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor link_color = SkColorSetRGB(128, 128, 128); 231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor underline_color = SkColorSetRGB(255, 255, 255); 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_LINK] = link_color; 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_LINK_UNDERLINE] = underline_color; 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_SECTION_LINK] = link_color; 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_SECTION_LINK_UNDERLINE] = 236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen underline_color; 237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen VerifyColorMap(colors); 239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, UseSectionColorAsNTPHeader) { 242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string color_json = "{ \"ntp_section\": [190, 190, 190] }"; 243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadColorJSON(color_json); 244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor> colors = GetDefaultColorMap(); 246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor ntp_color = SkColorSetRGB(190, 190, 190); 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_HEADER] = ntp_color; 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_SECTION] = ntp_color; 249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen VerifyColorMap(colors); 250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, ProvideNtpHeaderColor) { 253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string color_json = "{ \"ntp_header\": [120, 120, 120], " 254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"ntp_section\": [190, 190, 190] }"; 255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadColorJSON(color_json); 256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor> colors = GetDefaultColorMap(); 258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor ntp_header = SkColorSetRGB(120, 120, 120); 259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor ntp_section = SkColorSetRGB(190, 190, 190); 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_HEADER] = ntp_header; 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen colors[ThemeService::COLOR_NTP_SECTION] = ntp_section; 262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen VerifyColorMap(colors); 263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, CanReadTints) { 266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string tint_json = "{ \"buttons\": [ 0.5, 0.5, 0.5 ] }"; 267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadTintJSON(tint_json); 268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_utils::HSL expected = { 0.5, 0.5, 0.5 }; 270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_utils::HSL actual = { -1, -1, -1 }; 271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(theme_pack_->GetTint( 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::TINT_BUTTONS, &actual)); 273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_DOUBLE_EQ(expected.h, actual.h); 274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_DOUBLE_EQ(expected.s, actual.s); 275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_DOUBLE_EQ(expected.l, actual.l); 276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, CanReadDisplayProperties) { 279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string json = "{ \"ntp_background_alignment\": \"bottom\", " 280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"ntp_background_repeat\": \"repeat-x\", " 281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"ntp_logo_alternate\": 0 }"; 282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadDisplayPropertiesJSON(json); 283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int out_val; 285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(theme_pack_->GetDisplayProperty( 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::NTP_BACKGROUND_ALIGNMENT, &out_val)); 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ThemeService::ALIGN_BOTTOM, out_val); 288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(theme_pack_->GetDisplayProperty( 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::NTP_BACKGROUND_TILING, &out_val)); 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ThemeService::REPEAT_X, out_val); 292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(theme_pack_->GetDisplayProperty( 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::NTP_LOGO_ALTERNATE, &out_val)); 295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0, out_val); 296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, CanParsePaths) { 299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string path_json = "{ \"theme_button_background\": \"one\", " 300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"theme_toolbar\": \"two\" }"; 301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, FilePath> out_file_paths; 302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ParseImageNamesJSON(path_json, &out_file_paths); 303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(2u, out_file_paths.size()); 305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // "12" and "5" are internal constants to BrowserThemePack and are 306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // PRS_THEME_BUTTON_BACKGROUND and PRS_THEME_TOOLBAR, but they are 307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // implementation details that shouldn't be exported. 308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(FilePath(FILE_PATH_LITERAL("one")) == out_file_paths[12]); 309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(FilePath(FILE_PATH_LITERAL("two")) == out_file_paths[5]); 310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, InvalidPathNames) { 313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string path_json = "{ \"wrong\": [1], " 314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"theme_button_background\": \"one\", " 315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"not_a_thing\": \"blah\" }"; 316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, FilePath> out_file_paths; 317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ParseImageNamesJSON(path_json, &out_file_paths); 318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We should have only parsed one valid path out of that mess above. 320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(1u, out_file_paths.size()); 321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, InvalidColors) { 324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string invalid_color = "{ \"toolbar\": [\"dog\", \"cat\", [12]], " 325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"sound\": \"woof\" }"; 326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadColorJSON(invalid_color); 327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor> colors = GetDefaultColorMap(); 328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen VerifyColorMap(colors); 329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, InvalidTints) { 332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string invalid_tints = "{ \"buttons\": [ \"dog\", \"cat\", [\"x\"]], " 333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"invalid\": \"entry\" }"; 334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadTintJSON(invalid_tints); 335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We shouldn't have a buttons tint, as it was invalid. 337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_utils::HSL actual = { -1, -1, -1 }; 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(theme_pack_->GetTint(ThemeService::TINT_BUTTONS, 339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &actual)); 340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, InvalidDisplayProperties) { 343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string invalid_properties = "{ \"ntp_background_alignment\": [15], " 344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen " \"junk\": [15.3] }"; 345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadDisplayPropertiesJSON(invalid_properties); 346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int out_val; 348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(theme_pack_->GetDisplayProperty( 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThemeService::NTP_BACKGROUND_ALIGNMENT, &out_val)); 350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// These three tests should just not cause a segmentation fault. 353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, NullPaths) { 354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, FilePath> out_file_paths; 355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ParseImageNamesDictionary(NULL, &out_file_paths); 356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, NullTints) { 359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadTintDictionary(NULL); 360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, NullColors) { 363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadColorDictionary(NULL); 364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, NullDisplayProperties) { 367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LoadDisplayPropertiesDictionary(NULL); 368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, TestHasCustomImage) { 371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // HasCustomImage should only return true for images that exist in the 372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // extension and not for autogenerated images. 373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string images = "{ \"theme_frame\": \"one\" }"; 374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, FilePath> out_file_paths; 375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ParseImageNamesJSON(images, &out_file_paths); 376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(theme_pack_->HasCustomImage(IDR_THEME_FRAME)); 378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(theme_pack_->HasCustomImage(IDR_THEME_FRAME_INCOGNITO)); 379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, TestNonExistantImages) { 382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string images = "{ \"theme_frame\": \"does_not_exist\" }"; 383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, FilePath> out_file_paths; 384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ParseImageNamesJSON(images, &out_file_paths); 385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(LoadRawBitmapsTo(out_file_paths)); 387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TODO(erg): This test should actually test more of the built resources from 390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// the extension data, but for now, exists so valgrind can test some of the 391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// tricky memory stuff that BrowserThemePack does. 392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(BrowserThemePackTest, CanBuildAndReadPack) { 393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ScopedTempDir dir; 394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(dir.CreateUniqueTempDir()); 395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath file = dir.path().Append(FILE_PATH_LITERAL("data.pak")); 396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Part 1: Build the pack from an extension. 398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath star_gazing_path = GetStarGazingPath(); 400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath manifest_path = 401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen star_gazing_path.AppendASCII("manifest.json"); 402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string error; 403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen JSONFileValueSerializer serializer(manifest_path); 404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<DictionaryValue> valid_value( 405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen static_cast<DictionaryValue*>(serializer.Deserialize(NULL, &error))); 406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ("", error); 407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(valid_value.get()); 408513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<Extension> extension(Extension::Create( 409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen star_gazing_path, Extension::INVALID, *valid_value, 410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Extension::REQUIRE_KEY | Extension::STRICT_ERROR_CHECKS, &error)); 411513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_TRUE(extension.get()); 412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_EQ("", error); 413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 414513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_refptr<BrowserThemePack> pack( 415513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch BrowserThemePack::BuildFromExtension(extension.get())); 416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(pack.get()); 417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(pack->WriteToDisk(file)); 418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen VerifyStarGazing(pack.get()); 419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Part 2: Try to read back the data pack that we just wrote to disk. 422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_refptr<BrowserThemePack> pack = 424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemePack::BuildFromDataPack( 425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen file, "mblmlcbknbnfebdfjnolmcapmdofhmme"); 426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ASSERT_TRUE(pack.get()); 427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen VerifyStarGazing(pack.get()); 428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 430