#include <string.h>
#include "base/functional/bind.h"
#include "base/run_loop.h"
#include "base/task/single_thread_task_runner.h"
#include "base/test/bind.h"
#include "base/test/mock_callback.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_element_identifiers.h"
#include "chrome/browser/ui/toolbar/app_menu_model.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/toolbar/app_menu.h"
#include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/test/browser_test.h"
#include "ui/base/interaction/element_tracker.h"
#include "ui/base/interaction/expect_call_in_scope.h"
#include "ui/base/interaction/interaction_sequence.h"
#include "ui/base/interaction/interaction_sequence_test_util.h"
#include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/interaction/element_tracker_views.h"
#include "ui/views/interaction/interaction_sequence_views.h"
#include "ui/views/interaction/interaction_test_util_views.h"
class InteractionSequenceUiTest : public InProcessBrowserTest {
public:
static void ClearEventQueue() {
base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, run_loop.QuitClosure());
run_loop.Run();
}
};
IN_PROC_BROWSER_TEST_F(InteractionSequenceUiTest, OpenMainMenuAndViewHelpItem) {
UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::AbortedCallback, aborted);
UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::CompletedCallback, completed);
const ui::ElementContext context =
views::ElementTrackerViews::GetContextForView(
BrowserView::GetBrowserViewForBrowser(browser()));
views::View* const button_view =
views::ElementTrackerViews::GetInstance()->GetFirstMatchingView(
kToolbarAppMenuButtonElementId, context);
BrowserAppMenuButton* const app_menu_button =
static_cast<BrowserAppMenuButton*>(button_view);
DCHECK_EQ("BrowserAppMenuButton", app_menu_button->GetClassName());
auto sequence =
ui::InteractionSequence::Builder()
.SetCompletedCallback(completed.Get())
.SetAbortedCallback(aborted.Get())
.AddStep(
views::InteractionSequenceViews::WithInitialView(app_menu_button))
.AddStep(ui::InteractionSequence::StepBuilder()
.SetElementID(kToolbarAppMenuButtonElementId)
.SetType(ui::InteractionSequence::StepType::kActivated)
.Build())
.AddStep(ui::InteractionSequence::StepBuilder()
.SetElementID(AppMenuModel::kHistoryMenuItem)
.SetType(ui::InteractionSequence::StepType::kShown)
.Build())
.Build();
sequence->Start();
ClearEventQueue();
EXPECT_ASYNC_CALL_IN_SCOPE(
completed, Run,
views::test::InteractionTestUtilSimulatorViews::PressButton(
app_menu_button));
EXPECT_TRUE(ui::ElementTracker::GetElementTracker()->IsElementVisible(
AppMenuModel::kHistoryMenuItem, context));
views::MenuItemView* const history_menu_item =
app_menu_button->app_menu()->root_menu_item()->GetMenuItemByID(
IDC_RECENT_TABS_MENU);
EXPECT_EQ(history_menu_item,
views::ElementTrackerViews::GetInstance()->GetFirstMatchingView(
AppMenuModel::kHistoryMenuItem, context));
}