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
3// found in the LICENSE file.
4
5#include "chrome/common/extensions/api/extension_action/action_info.h"
6#include "chrome/common/extensions/manifest_tests/chrome_manifest_test.h"
7#include "extensions/common/error_utils.h"
8#include "extensions/common/extension_builder.h"
9#include "extensions/common/extension_icon_set.h"
10#include "extensions/common/manifest_constants.h"
11#include "extensions/common/value_builder.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14namespace extensions {
15
16namespace errors = manifest_errors;
17
18namespace {
19
20class BrowserActionManifestTest : public ChromeManifestTest {
21};
22
23TEST_F(BrowserActionManifestTest,
24       BrowserActionManifestIcons_NoDefaultIcons) {
25  scoped_refptr<const Extension> extension =
26      ExtensionBuilder()
27      .SetManifest(DictionaryBuilder()
28                   .Set("name", "No default properties")
29                   .Set("version", "1.0.0")
30                   .Set("manifest_version", 2)
31                   .Set("browser_action", DictionaryBuilder()
32                       .Set("default_title", "Title")))
33      .Build();
34
35  ASSERT_TRUE(extension.get());
36  const ActionInfo* browser_action_info =
37      ActionInfo::GetBrowserActionInfo(extension.get());
38  ASSERT_TRUE(browser_action_info);
39  EXPECT_TRUE(browser_action_info->default_icon.empty());
40}
41
42TEST_F(BrowserActionManifestTest,
43       BrowserActionManifestIcons_StringDefaultIcon) {
44  scoped_refptr<const Extension> extension =
45      ExtensionBuilder()
46      .SetManifest(DictionaryBuilder()
47                   .Set("name", "String default icon")
48                   .Set("version", "1.0.0")
49                   .Set("manifest_version", 2)
50                   .Set("browser_action", DictionaryBuilder()
51                       .Set("default_icon", "icon.png")))
52      .Build();
53
54  ASSERT_TRUE(extension.get());
55  const ActionInfo* browser_action_info =
56      ActionInfo::GetBrowserActionInfo(extension.get());
57  ASSERT_TRUE(browser_action_info);
58  ASSERT_FALSE(browser_action_info->default_icon.empty());
59
60  const ExtensionIconSet& icons = browser_action_info->default_icon;
61
62  EXPECT_EQ(1u, icons.map().size());
63  EXPECT_EQ("icon.png", icons.Get(38, ExtensionIconSet::MATCH_EXACTLY));
64}
65
66TEST_F(BrowserActionManifestTest,
67       BrowserActionManifestIcons_DictDefaultIcon) {
68  scoped_refptr<const Extension> extension =
69      ExtensionBuilder()
70      .SetManifest(DictionaryBuilder()
71                   .Set("name", "Dictionary default icon")
72                   .Set("version", "1.0.0")
73                   .Set("manifest_version", 2)
74                   .Set("browser_action", DictionaryBuilder()
75                       .Set("default_icon", DictionaryBuilder()
76                           .Set("19", "icon19.png")
77                           .Set("24", "icon24.png")  // Should be ignored.
78                           .Set("38", "icon38.png"))))
79      .Build();
80
81  ASSERT_TRUE(extension.get());
82  const ActionInfo* browser_action_info =
83      ActionInfo::GetBrowserActionInfo(extension.get());
84  ASSERT_TRUE(browser_action_info);
85  ASSERT_FALSE(browser_action_info->default_icon.empty());
86
87  const ExtensionIconSet& icons = browser_action_info->default_icon;
88
89  // 24px icon should be ignored.
90  EXPECT_EQ(2u, icons.map().size());
91  EXPECT_EQ("icon19.png", icons.Get(19, ExtensionIconSet::MATCH_EXACTLY));
92  EXPECT_EQ("icon38.png", icons.Get(38, ExtensionIconSet::MATCH_EXACTLY));
93}
94
95TEST_F(BrowserActionManifestTest,
96       BrowserActionManifestIcons_InvalidDefaultIcon) {
97  scoped_ptr<base::DictionaryValue> manifest_value = DictionaryBuilder()
98      .Set("name", "Invalid default icon").Set("version", "1.0.0")
99      .Set("manifest_version", 2)
100      .Set("browser_action",
101           DictionaryBuilder().Set(
102               "default_icon",
103               DictionaryBuilder().Set("19", std::string())  // Invalid value.
104                   .Set("24", "icon24.png").Set("38", "icon38.png"))).Build();
105
106  base::string16 error = ErrorUtils::FormatErrorMessageUTF16(
107      errors::kInvalidIconPath, "19");
108  LoadAndExpectError(ManifestData(manifest_value.get(), "Invalid default icon"),
109                     errors::kInvalidIconPath);
110}
111
112}  // namespace
113}  // namespace extensions
114