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 "base/strings/utf_string_conversions.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/toolbar_action_view_controller.h"
11 #include "chrome/browser/ui/views/frame/browser_view.h"
12 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
13 #include "chrome/browser/ui/views/toolbar/toolbar_action_view.h"
14 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
15 #include "chrome/test/base/in_process_browser_test.h"
16 #include "extensions/common/feature_switch.h"
17 #include "grit/theme_resources.h"
18 #include "ui/base/resource/resource_bundle.h"
22 const char kMockId
[] = "mock_action";
24 class MockComponentAction
: public ToolbarActionViewController
{
26 MockComponentAction() : click_count_(0u), id_(kMockId
) {}
27 ~MockComponentAction() override
{}
29 // ToolbarActionButtonController:
30 const std::string
& GetId() const override
{ return id_
; }
31 void SetDelegate(ToolbarActionViewDelegate
* delegate
) override
{}
32 gfx::Image
GetIcon(content::WebContents
* web_contents
) override
{
33 return ui::ResourceBundle::GetSharedInstance().GetImageNamed(
36 gfx::ImageSkia
GetIconWithBadge() override
{
37 return *GetIcon(nullptr).ToImageSkia();
39 base::string16
GetActionName() const override
{
40 return base::ASCIIToUTF16("Component Action");
42 base::string16
GetAccessibleName(content::WebContents
* web_contents
)
44 return GetActionName();
46 base::string16
GetTooltip(content::WebContents
* web_contents
)
48 return GetActionName();
50 bool IsEnabled(content::WebContents
* web_contents
) const override
{
53 bool HasPopup(content::WebContents
* web_contents
) const override
{
56 void HidePopup() override
{}
57 gfx::NativeView
GetPopupNativeView() override
{ return nullptr; }
58 bool CanDrag() const override
{ return false; }
59 bool IsMenuRunning() const override
{ return false; }
60 bool ExecuteAction(bool by_user
) override
{
65 size_t click_count() const { return click_count_
; }
71 DISALLOW_COPY_AND_ASSIGN(MockComponentAction
);
74 class MockComponentToolbarActionsFactory
75 : public ComponentToolbarActionsFactory
{
77 MockComponentToolbarActionsFactory();
78 virtual ~MockComponentToolbarActionsFactory();
80 // ComponentToolbarActionsFactory:
81 ScopedVector
<ToolbarActionViewController
> GetComponentToolbarActions()
85 DISALLOW_COPY_AND_ASSIGN(MockComponentToolbarActionsFactory
);
88 MockComponentToolbarActionsFactory::MockComponentToolbarActionsFactory() {
89 ComponentToolbarActionsFactory::SetTestingFactory(this);
92 MockComponentToolbarActionsFactory::~MockComponentToolbarActionsFactory() {
93 ComponentToolbarActionsFactory::SetTestingFactory(nullptr);
96 ScopedVector
<ToolbarActionViewController
>
97 MockComponentToolbarActionsFactory::GetComponentToolbarActions() {
98 ScopedVector
<ToolbarActionViewController
> component_actions
;
99 component_actions
.push_back(new MockComponentAction());
100 return component_actions
.Pass();
105 class ComponentToolbarActionsBrowserTest
: public InProcessBrowserTest
{
107 ComponentToolbarActionsBrowserTest() {}
108 ~ComponentToolbarActionsBrowserTest() override
{}
110 void SetUpCommandLine(base::CommandLine
* command_line
) override
{
111 InProcessBrowserTest::SetUpCommandLine(command_line
);
112 enable_redesign_
.reset(new extensions::FeatureSwitch::ScopedOverride(
113 extensions::FeatureSwitch::extension_action_redesign(), true));
114 mock_actions_factory_
.reset(new MockComponentToolbarActionsFactory());
118 scoped_ptr
<extensions::FeatureSwitch::ScopedOverride
> enable_redesign_
;
119 scoped_ptr
<MockComponentToolbarActionsFactory
> mock_actions_factory_
;
121 DISALLOW_COPY_AND_ASSIGN(ComponentToolbarActionsBrowserTest
);
124 // Test that Component Toolbar Actions appear in the browser actions container
125 // and can receive click events properly.
126 IN_PROC_BROWSER_TEST_F(ComponentToolbarActionsBrowserTest
,
127 ComponentToolbarActionsShowUpAndRespondToClicks
) {
128 BrowserActionsContainer
* browser_actions_container
=
129 BrowserView::GetBrowserViewForBrowser(browser())
130 ->toolbar()->browser_actions();
132 // There should be only one component action view.
133 ASSERT_EQ(1u, browser_actions_container
->num_toolbar_actions());
135 ToolbarActionView
* view
=
136 browser_actions_container
->GetToolbarActionViewAt(0u);
137 ASSERT_EQ(kMockId
, view
->view_controller()->GetId());
138 MockComponentAction
* mock_component_action
=
139 static_cast<MockComponentAction
*>(view
->view_controller());
141 // Test that clicking on the component action works.
142 EXPECT_EQ(0u, mock_component_action
->click_count());
144 EXPECT_EQ(1u, mock_component_action
->click_count());