blob: d36e5315484c9f37aaf92f08ebef143b3701a53c [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/extensions/extensions_menu_item_view.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/metrics/user_action_tester.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/ui/toolbar/test_toolbar_action_view_controller.h"
#include "chrome/browser/ui/views/extensions/extensions_menu_button.h"
#include "chrome/browser/ui/views/hover_button_controller.h"
#include "chrome/browser/ui/views/native_widget_factory.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "ui/events/event.h"
#include "ui/views/controls/styled_label.h"
class ExtensionsMenuItemViewTest : public BrowserWithTestWindowTest {
protected:
ExtensionsMenuItemViewTest()
: initial_extension_name_(u"Initial Extension Name"),
initial_tooltip_(u"Initial tooltip") {}
void SetUp() override {
BrowserWithTestWindowTest::SetUp();
widget_ = std::make_unique<views::Widget>();
views::Widget::InitParams init_params(
views::Widget::InitParams::TYPE_POPUP);
init_params.ownership =
views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
#if !BUILDFLAG(IS_CHROMEOS_ASH) && !defined(OS_MAC)
// This was copied from BookmarkBarViewTest:
// On Chrome OS, this always creates a NativeWidgetAura, but it should
// create a DesktopNativeWidgetAura for Mash. We can get by without manually
// creating it because AshTestViewsDelegate and MusClient will do the right
// thing automatically.
init_params.native_widget =
CreateNativeWidget(NativeWidgetType::DESKTOP_NATIVE_WIDGET_AURA,
&init_params, widget_.get());
#endif
widget_->Init(std::move(init_params));
auto controller =
std::make_unique<TestToolbarActionViewController>("hello");
controller_ = controller.get();
controller_->SetActionName(initial_extension_name_);
controller_->SetTooltip(initial_tooltip_);
auto menu_item = std::make_unique<ExtensionsMenuItemView>(
browser(), std::move(controller), true);
primary_button_on_menu_ = menu_item->primary_action_button_for_testing();
widget_->SetContentsView(std::move(menu_item));
}
void TearDown() override {
// All windows need to be closed before tear down.
widget_.reset();
BrowserWithTestWindowTest::TearDown();
}
ExtensionsMenuButton* primary_button() { return primary_button_on_menu_; }
const std::u16string initial_extension_name_;
const std::u16string initial_tooltip_;
std::unique_ptr<views::Widget> widget_;
ExtensionsMenuButton* primary_button_on_menu_ = nullptr;
TestToolbarActionViewController* controller_ = nullptr;
};
TEST_F(ExtensionsMenuItemViewTest, UpdatesToDisplayCorrectActionTitle) {
EXPECT_EQ(primary_button()->label_text_for_testing(),
initial_extension_name_);
std::u16string extension_name = u"Extension Name";
controller_->SetActionName(extension_name);
EXPECT_EQ(primary_button()->label_text_for_testing(), extension_name);
}
TEST_F(ExtensionsMenuItemViewTest, NotifyClickExecutesAction) {
base::UserActionTester user_action_tester;
constexpr char kActivatedUserAction[] =
"Extensions.Toolbar.ExtensionActivatedFromMenu";
EXPECT_EQ(0, controller_->execute_action_count());
EXPECT_EQ(0, user_action_tester.GetActionCount(kActivatedUserAction));
primary_button()->SetBounds(0, 0, 100, 100);
ui::MouseEvent click_event(ui::ET_MOUSE_RELEASED,
primary_button()->GetLocalBounds().CenterPoint(),
primary_button()->GetLocalBounds().CenterPoint(),
base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON, 0);
primary_button()->button_controller()->OnMouseReleased(click_event);
EXPECT_EQ(1, controller_->execute_action_count());
EXPECT_EQ(1, user_action_tester.GetActionCount(kActivatedUserAction));
}
TEST_F(ExtensionsMenuItemViewTest, UpdatesToDisplayTooltip) {
EXPECT_EQ(primary_button()->GetTooltipText(gfx::Point()), initial_tooltip_);
std::u16string tooltip = u"New Tooltip";
controller_->SetTooltip(tooltip);
EXPECT_EQ(primary_button()->GetTooltipText(gfx::Point()), tooltip);
}
TEST_F(ExtensionsMenuItemViewTest, ButtonMatchesEnabledStateOfExtension) {
EXPECT_TRUE(primary_button()->GetEnabled());
controller_->SetEnabled(false);
EXPECT_FALSE(primary_button()->GetEnabled());
controller_->SetEnabled(true);
EXPECT_TRUE(primary_button()->GetEnabled());
}