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