16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_manager.h" 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/extension_builder.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/manifest_handlers/icons_handler.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/value_builder.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace extensions { 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace { 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kBrowserAction[] = "browser_action"; 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kPageAction[] = "page_action"; 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class ExtensionActionManagerTest : public testing::Test { 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public: 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ExtensionActionManagerTest(); 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected: 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Build an extension, populating |action_type| key with |action|, and 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // "icons" key with |extension_icons|. 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<Extension> BuildExtension(DictionaryBuilder& extension_icons, 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder& action, 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const char* action_type); 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Returns true if |action|'s title matches |extension|'s name. 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool TitlesMatch(const Extension& extension, const ExtensionAction& action); 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Returns true if |action|'s icon for size |action_key| matches 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // |extension|'s icon for size |extension_key|; 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool IconsMatch(const Extension& extension, 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int extension_key, 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const ExtensionAction& action, 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int action_key); 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Returns the appropriate action for |extension| according to |action_type|. 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ExtensionAction* GetAction(const char* action_type, 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const Extension& extension); 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Tests that values that are missing from the |action_type| key are properly 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // populated with values from the other keys in the manifest (e.g. 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // "default_icon" key of |action_type| is populated with "icons" key). 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void TestPopulateMissingValues(const char* action_type); 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ExtensionActionManager* manager() { return manager_; } 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private: 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ExtensionRegistry* registry_; 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int curr_id_; 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ExtensionActionManager* manager_; 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ExtensionActionManagerTest::ExtensionActionManagerTest() 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : curr_id_(0), 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) profile_(new TestingProfile) { 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registry_ = ExtensionRegistry::Get(profile_.get()); 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) manager_ = ExtensionActionManager::Get(profile_.get()); 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)scoped_refptr<Extension> ExtensionActionManagerTest::BuildExtension( 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder& extension_icons, 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder& action, 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const char* action_type) { 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string id = base::IntToString(curr_id_++); 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<Extension> extension = ExtensionBuilder() 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .SetManifest(DictionaryBuilder().Set("version", "1") 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("manifest_version", 2) 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("icons", extension_icons) 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set(action_type, action) 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("name", 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string("Test Extension").append(id))) 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .SetID(id) 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Build(); 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registry_->AddEnabled(extension); 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return extension; 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool ExtensionActionManagerTest::TitlesMatch(const Extension& extension, 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const ExtensionAction& action) { 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return action.GetTitle(ExtensionAction::kDefaultTabId) == extension.name(); 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool ExtensionActionManagerTest::IconsMatch(const Extension& extension, 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int extension_key, 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const ExtensionAction& action, 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int action_key) { 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return action.default_icon()->Get(action_key, 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ExtensionIconSet::MATCH_EXACTLY) == 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) IconsInfo::GetIcons(&extension).Get(extension_key, 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ExtensionIconSet::MATCH_EXACTLY); 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ExtensionAction* ExtensionActionManagerTest::GetAction( 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const char* action_type, 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const Extension& extension) { 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return (action_type == kBrowserAction) ? 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) manager_->GetBrowserAction(extension) : 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) manager_->GetPageAction(extension); 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ExtensionActionManagerTest::TestPopulateMissingValues( 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const char* action_type) { 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Test that the largest icon from the extension's "icons" key is chosen as a 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // replacement for missing action default_icons keys. "19" should not be 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // replaced because "38" can always be used in its place. 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<Extension> extension = BuildExtension( 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("48", "icon48.png") 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("128", "icon128.png"), 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Pass(), 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) action_type); 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(extension.get()); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ExtensionAction* action = GetAction(action_type, *extension.get()); 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(action); 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(TitlesMatch(*extension.get(), *action)); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(IconsMatch(*extension.get(), 128, *action, 38)); 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Test that the action's missing default_icons are not replaced with smaller 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // icons. 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) extension = BuildExtension( 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("24", "icon24.png"), 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Pass(), 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) action_type); 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(extension.get()); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci action = GetAction(action_type, *extension.get()); 1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(action); 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(IconsMatch(*extension.get(), 24, *action, 19)); 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(IconsMatch(*extension.get(), 24, *action, 38)); 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Test that an action's 19px icon is not replaced if a 38px action icon 1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // exists. 1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) extension = BuildExtension( 1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("128", "icon128.png"), 1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("default_icon", DictionaryBuilder() 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("38", "action38.png")), 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) action_type); 1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(extension.get()); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci action = GetAction(action_type, *extension.get()); 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(action); 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(IconsMatch(*extension.get(), 128, *action, 19)); 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Test that existing default_icons and default_title are not replaced. 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) extension = BuildExtension( 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("128", "icon128.png"), 1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("default_title", "Action!") 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("default_icon", DictionaryBuilder() 1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("19", "action19.png") 1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("38", "action38.png")), 1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) action_type); 1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(extension.get()); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci action = GetAction(action_type, *extension.get()); 1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(action); 1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(TitlesMatch(*extension.get(), *action)); 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(IconsMatch(*extension.get(), 128, *action, 19)); 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_FALSE(IconsMatch(*extension.get(), 128, *action, 38)); 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace { 1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ExtensionActionManagerTest, PopulateBrowserAction) { 1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestPopulateMissingValues(kBrowserAction); 1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ExtensionActionManagerTest, PopulatePageAction) { 1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TestPopulateMissingValues(kPageAction); 1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ExtensionActionManagerTest, GetBestFitActionTest) { 1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Create an extension with page action defaults. 1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<Extension> extension = BuildExtension( 1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("48", "icon48.png"), 1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("default_title", "Action!") 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("default_icon", DictionaryBuilder() 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) .Set("38", "action38.png")), 1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kPageAction); 1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(extension.get()); 1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Get a "best fit" browser action for |extension|. 1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ExtensionAction> action = 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manager()->GetBestFitAction(*extension.get(), ActionInfo::TYPE_BROWSER); 1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(action.get()); 2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(action->action_type(), ActionInfo::TYPE_BROWSER); 2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // |action|'s title and default icon should match |extension|'s page action's. 2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(action->GetTitle(ExtensionAction::kDefaultTabId), "Action!"); 2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(action->default_icon()->Get(38, ExtensionIconSet::MATCH_EXACTLY), 2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "action38.png"); 2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Create a new extension without page action defaults. 2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) extension = BuildExtension( 2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Set("48", "icon48.png"), 2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DictionaryBuilder().Pass(), 2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kPageAction); 2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(extension.get()); 2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci action = 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manager()->GetBestFitAction(*extension.get(), ActionInfo::TYPE_BROWSER); 2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Now these values match because |extension| does not have page action 2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // defaults. 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(TitlesMatch(*extension.get(), *action)); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(IconsMatch(*extension.get(), 48, *action, 38)); 2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace 2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace extensions 225