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