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 "base/macros.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "chrome/browser/extensions/browser_action_test_util.h"
8 #include "chrome/browser/ui/browser.h"
9 #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
10 #include "chrome/browser/ui/toolbar/test_toolbar_action_view_controller.h"
11 #include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h"
12 #include "chrome/test/base/in_process_browser_test.h"
13 #include "extensions/common/feature_switch.h"
17 const char kMockId
[] = "mock_action";
19 class MockComponentToolbarActionsFactory
20 : public ComponentToolbarActionsFactory
{
22 MockComponentToolbarActionsFactory();
23 virtual ~MockComponentToolbarActionsFactory();
25 // ComponentToolbarActionsFactory:
26 ScopedVector
<ToolbarActionViewController
> GetComponentToolbarActions()
29 const std::vector
<TestToolbarActionViewController
*>& weak_actions() const {
34 // A (weak) set of all created actions.
35 std::vector
<TestToolbarActionViewController
*> weak_actions_
;
37 DISALLOW_COPY_AND_ASSIGN(MockComponentToolbarActionsFactory
);
40 MockComponentToolbarActionsFactory::MockComponentToolbarActionsFactory() {
41 ComponentToolbarActionsFactory::SetTestingFactory(this);
44 MockComponentToolbarActionsFactory::~MockComponentToolbarActionsFactory() {
45 ComponentToolbarActionsFactory::SetTestingFactory(nullptr);
48 ScopedVector
<ToolbarActionViewController
>
49 MockComponentToolbarActionsFactory::GetComponentToolbarActions() {
50 ScopedVector
<ToolbarActionViewController
> component_actions
;
51 TestToolbarActionViewController
* action
=
52 new TestToolbarActionViewController(kMockId
);
53 component_actions
.push_back(action
);
54 weak_actions_
.push_back(action
);
55 return component_actions
.Pass();
60 class ComponentToolbarActionsBrowserTest
: public InProcessBrowserTest
{
62 ComponentToolbarActionsBrowserTest() {}
63 ~ComponentToolbarActionsBrowserTest() override
{}
65 void SetUpCommandLine(base::CommandLine
* command_line
) override
{
66 InProcessBrowserTest::SetUpCommandLine(command_line
);
67 enable_redesign_
.reset(new extensions::FeatureSwitch::ScopedOverride(
68 extensions::FeatureSwitch::extension_action_redesign(), true));
69 mock_actions_factory_
.reset(new MockComponentToolbarActionsFactory());
72 MockComponentToolbarActionsFactory
* mock_factory() {
73 return mock_actions_factory_
.get();
77 scoped_ptr
<extensions::FeatureSwitch::ScopedOverride
> enable_redesign_
;
78 scoped_ptr
<MockComponentToolbarActionsFactory
> mock_actions_factory_
;
80 DISALLOW_COPY_AND_ASSIGN(ComponentToolbarActionsBrowserTest
);
83 // Test that Component Toolbar Actions appear in the browser actions container
84 // and can receive click events properly.
85 IN_PROC_BROWSER_TEST_F(ComponentToolbarActionsBrowserTest
,
86 ComponentToolbarActionsShowUpAndRespondToClicks
) {
87 BrowserActionTestUtil
browser_actions_bar(browser());
89 // There should be only one component action view.
90 ASSERT_EQ(1, browser_actions_bar
.NumberOfBrowserActions());
92 // Even though the method says "ExtensionId", this actually refers to any id
94 EXPECT_EQ(kMockId
, browser_actions_bar
.GetExtensionId(0));
96 // There should only have been one created component action.
97 const std::vector
<TestToolbarActionViewController
*>& weak_actions
=
98 mock_factory()->weak_actions();
99 ASSERT_EQ(1u, weak_actions
.size());
100 TestToolbarActionViewController
* mock_component_action
= weak_actions
[0];
101 ASSERT_TRUE(mock_component_action
);
103 // Test that clicking on the component action works.
104 EXPECT_EQ(0, mock_component_action
->execute_action_count());
105 browser_actions_bar
.Press(0);
106 EXPECT_EQ(1, mock_component_action
->execute_action_count());