1 // Copyright 2014 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.
5 #include "chrome/browser/ui/toolbar/browser_actions_bar_browsertest.h"
7 #include "chrome/browser/extensions/browser_action_test_util.h"
8 #include "chrome/browser/extensions/extension_browsertest.h"
9 #include "chrome/browser/extensions/extension_service.h"
10 #include "chrome/browser/extensions/extension_toolbar_model.h"
11 #include "components/crx_file/id_util.h"
12 #include "extensions/browser/extension_prefs.h"
13 #include "extensions/browser/extension_registry.h"
14 #include "extensions/common/extension.h"
15 #include "extensions/common/extension_builder.h"
16 #include "extensions/common/value_builder.h"
20 scoped_refptr
<const extensions::Extension
> CreateExtension(
21 const std::string
& name
,
22 bool has_browser_action
) {
23 extensions::DictionaryBuilder manifest
;
24 manifest
.Set("name", name
).
25 Set("description", "an extension").
26 Set("manifest_version", 2).
27 Set("version", "1.0");
28 if (has_browser_action
)
29 manifest
.Set("browser_action", extensions::DictionaryBuilder().Pass());
30 return extensions::ExtensionBuilder().
31 SetManifest(manifest
.Pass()).
32 SetID(crx_file::id_util::GenerateId(name
)).
38 BrowserActionsBarBrowserTest::BrowserActionsBarBrowserTest() {
41 BrowserActionsBarBrowserTest::~BrowserActionsBarBrowserTest() {
44 void BrowserActionsBarBrowserTest::SetUpCommandLine(
45 base::CommandLine
* command_line
) {
46 BrowserActionTestUtil::DisableAnimations();
47 ExtensionBrowserTest::SetUpCommandLine(command_line
);
50 void BrowserActionsBarBrowserTest::SetUpOnMainThread() {
51 ExtensionBrowserTest::SetUpOnMainThread();
52 browser_actions_bar_
.reset(new BrowserActionTestUtil(browser()));
55 void BrowserActionsBarBrowserTest::TearDownOnMainThread() {
56 BrowserActionTestUtil::EnableAnimations();
57 ExtensionBrowserTest::TearDownOnMainThread();
60 void BrowserActionsBarBrowserTest::LoadExtensions() {
61 // Create three extensions with browser actions.
62 extension_a_
= CreateExtension("alpha", true);
63 extension_b_
= CreateExtension("beta", true);
64 extension_c_
= CreateExtension("gamma", true);
66 const extensions::Extension
* extensions
[] =
67 { extension_a(), extension_b(), extension_c() };
68 extensions::ExtensionRegistry
* registry
=
69 extensions::ExtensionRegistry::Get(profile());
70 // Add each, and verify that it is both correctly added to the extension
71 // registry and to the browser actions container.
72 for (size_t i
= 0; i
< arraysize(extensions
); ++i
) {
73 extension_service()->AddExtension(extensions
[i
]);
74 EXPECT_TRUE(registry
->enabled_extensions().GetByID(extensions
[i
]->id())) <<
75 extensions
[i
]->name();
76 EXPECT_EQ(static_cast<int>(i
+ 1),
77 browser_actions_bar_
->NumberOfBrowserActions());
78 EXPECT_TRUE(browser_actions_bar_
->HasIcon(i
));
79 EXPECT_EQ(static_cast<int>(i
+ 1),
80 browser_actions_bar()->VisibleBrowserActions());
84 // Test the basic functionality.
85 IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest
, Basic
) {
86 // Load an extension with no browser action.
87 extension_service()->AddExtension(CreateExtension("alpha", false).get());
88 // This extension should not be in the model (has no browser action).
89 EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions());
91 // Load an extension with a browser action.
92 extension_service()->AddExtension(CreateExtension("beta", true).get());
93 EXPECT_EQ(1, browser_actions_bar()->NumberOfBrowserActions());
94 EXPECT_TRUE(browser_actions_bar()->HasIcon(0));
96 // Unload the extension.
97 std::string id
= browser_actions_bar()->GetExtensionId(0);
99 EXPECT_EQ(0, browser_actions_bar()->NumberOfBrowserActions());
102 // Test moving various browser actions. This is not to check the logic of the
103 // move (that's in the toolbar model tests), but just to check our ui.
104 IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest
, MoveBrowserActions
) {
107 EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
108 EXPECT_EQ(3, browser_actions_bar()->NumberOfBrowserActions());
110 extensions::ExtensionToolbarModel
* model
=
111 extensions::ExtensionToolbarModel::Get(profile());
114 // Order is now A B C.
115 EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
116 EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(1));
117 EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(2));
119 // Move C to first position. Order is C A B.
120 model
->MoveExtensionIcon(extension_c(), 0);
121 EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(0));
122 EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(1));
123 EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(2));
125 // Move B to third position. Order is still C A B.
126 model
->MoveExtensionIcon(extension_b(), 2);
127 EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(0));
128 EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(1));
129 EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(2));
131 // Move B to middle position. Order is C B A.
132 model
->MoveExtensionIcon(extension_b(), 1);
133 EXPECT_EQ(extension_c()->id(), browser_actions_bar()->GetExtensionId(0));
134 EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(1));
135 EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(2));
138 // Test that explicitly hiding an extension action results in it disappearing
139 // from the browser actions bar.
140 IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest
, ForceHide
) {
143 EXPECT_EQ(3, browser_actions_bar()->VisibleBrowserActions());
144 EXPECT_EQ(extension_a()->id(), browser_actions_bar()->GetExtensionId(0));
145 // Force hide one of the extensions' browser action.
146 extensions::ExtensionActionAPI::SetBrowserActionVisibility(
147 extensions::ExtensionPrefs::Get(browser()->profile()),
150 // The browser action for Extension A should be removed.
151 EXPECT_EQ(2, browser_actions_bar()->VisibleBrowserActions());
152 EXPECT_EQ(extension_b()->id(), browser_actions_bar()->GetExtensionId(0));