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