Adding instrumentation to locate the source of jankiness
[chromium-blink-merge.git] / chrome / browser / ui / toolbar / browser_actions_bar_browsertest.cc
blob90aa0945f47c30fafe7b065d01f898109e107a7e
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"
18 namespace {
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)).
33 Build();
36 } // namespace
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);
98 UnloadExtension(id);
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) {
105 LoadExtensions();
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());
112 ASSERT_TRUE(model);
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) {
141 LoadExtensions();
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()),
148 extension_a()->id(),
149 false);
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));