blob: d7b2f90f49d213ab4438ec91c6a6ee7c2821136f [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// 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/side_panel/lens/lens_side_panel_coordinator.h"
#include "base/feature_list.h"
#include "base/memory/raw_ptr.h"
#include "base/test/metrics/user_action_tester.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/frame/test_with_browser_view.h"
#include "chrome/browser/ui/views/side_panel/side_panel.h"
#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
#include "chrome/browser/ui/views/side_panel/side_panel_entry.h"
#include "chrome/browser/ui/views/side_panel/side_panel_registry.h"
#include "chrome/browser/ui/views/side_panel/side_panel_util.h"
#include "components/lens/lens_features.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
constexpr char kNewLensQueryAction[] = "LensUnifiedSidePanel.LensQuery_New";
constexpr char kLensQueryAction[] = "LensUnifiedSidePanel.LensQuery";
constexpr char kLensEntryHiddenAction[] =
"LensUnifiedSidePanel.LensEntryHidden";
constexpr char kLensEntryShownAction[] = "LensUnifiedSidePanel.LensEntryShown";
constexpr char kLensQueryFollowupAction[] =
"LensUnifiedSidePanel.LensQuery_Followup";
constexpr char kLensQuerySidePanelClosedAction[] =
"LensUnifiedSidePanel.LensQuery_SidePanelClosed";
constexpr char kLensQuerySidePanelOpenNonLensAction[] =
"LensUnifiedSidePanel.LensQuery_SidePanelOpenNonLens";
constexpr char kLensQuerySidePanelOpenLensAction[] =
"LensUnifiedSidePanel.LensQuery_SidePanelOpenLens";
constexpr char kLensHomepageURL[] = "http://foo.com";
constexpr char kLensAlternateHomepageURL[] = "http://foo.com/alternate1";
class LensSidePanelCoordinatorTest : public TestWithBrowserView {
public:
void SetUp() override {
features.InitWithFeaturesAndParameters(
{{lens::features::kLensStandalone,
{{lens::features::kEnableSidePanelForLens.name, "true"},
{lens::features::kHomepageURLForLens.name, kLensHomepageURL}}}},
{});
TestWithBrowserView::SetUp();
GetSidePanelCoordinator()->SetNoDelaysForTesting();
auto* browser = browser_view()->browser();
auto* global_registry =
GetSidePanelCoordinator()->GetGlobalSidePanelRegistry();
SidePanelUtil::PopulateGlobalEntries(browser, global_registry);
EXPECT_EQ(global_registry->entries().size(), 2u);
// Create the lens coordinator in Browser.
lens_side_panel_coordinator_ =
LensSidePanelCoordinator::GetOrCreateForBrowser(browser);
// Create an active web contents.
AddTab(browser, GURL("about:blank"));
}
SidePanelCoordinator* GetSidePanelCoordinator() {
return browser_view()->side_panel_coordinator();
}
SidePanel* GetUnifiedSidePanel() {
return browser_view()->unified_side_panel();
}
protected:
// If ScopedFeatureList goes out of scope, the features are reset.
base::test::ScopedFeatureList features;
raw_ptr<LensSidePanelCoordinator> lens_side_panel_coordinator_;
};
TEST_F(LensSidePanelCoordinatorTest,
OpenWithUrlShowsUnifiedSidePanelWithLensSelected) {
base::UserActionTester user_action_tester;
EXPECT_EQ(0, user_action_tester.GetActionCount(kNewLensQueryAction));
lens_side_panel_coordinator_->RegisterEntryAndShow(
content::OpenURLParams(GURL(kLensHomepageURL), content::Referrer(),
WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui::PAGE_TRANSITION_LINK, false));
EXPECT_TRUE(GetUnifiedSidePanel()->GetVisible());
EXPECT_EQ(GetSidePanelCoordinator()
->GetCurrentSidePanelEntryForTesting()
->key()
.id(),
SidePanelEntry::Id::kLens);
EXPECT_EQ(1, user_action_tester.GetActionCount(kLensQueryAction));
EXPECT_EQ(1, user_action_tester.GetActionCount(kNewLensQueryAction));
EXPECT_EQ(1,
user_action_tester.GetActionCount(kLensQuerySidePanelClosedAction));
}
TEST_F(LensSidePanelCoordinatorTest, OpenWithUrlWhenSidePanelOpenShowsLens) {
base::UserActionTester user_action_tester;
GetSidePanelCoordinator()->Show(SidePanelEntry::Id::kBookmarks);
EXPECT_EQ(0, user_action_tester.GetActionCount(kNewLensQueryAction));
lens_side_panel_coordinator_->RegisterEntryAndShow(
content::OpenURLParams(GURL(kLensHomepageURL), content::Referrer(),
WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui::PAGE_TRANSITION_LINK, false));
EXPECT_TRUE(GetUnifiedSidePanel()->GetVisible());
EXPECT_EQ(GetSidePanelCoordinator()
->GetCurrentSidePanelEntryForTesting()
->key()
.id(),
SidePanelEntry::Id::kLens);
EXPECT_EQ(1, user_action_tester.GetActionCount(kNewLensQueryAction));
EXPECT_EQ(1, user_action_tester.GetActionCount(
kLensQuerySidePanelOpenNonLensAction));
}
TEST_F(LensSidePanelCoordinatorTest,
CallingRegisterTwiceOpensNewUrlAndLogsAction) {
base::UserActionTester user_action_tester;
lens_side_panel_coordinator_->RegisterEntryAndShow(
content::OpenURLParams(GURL(kLensHomepageURL), content::Referrer(),
WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui::PAGE_TRANSITION_LINK, false));
lens_side_panel_coordinator_->RegisterEntryAndShow(content::OpenURLParams(
GURL(kLensAlternateHomepageURL), content::Referrer(),
WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
false));
EXPECT_TRUE(GetUnifiedSidePanel()->GetVisible());
EXPECT_EQ(GetSidePanelCoordinator()
->GetCurrentSidePanelEntryForTesting()
->key()
.id(),
SidePanelEntry::Id::kLens);
EXPECT_EQ(2, user_action_tester.GetActionCount(kLensQueryAction));
EXPECT_EQ(1,
user_action_tester.GetActionCount(kLensQuerySidePanelClosedAction));
EXPECT_EQ(
1, user_action_tester.GetActionCount(kLensQuerySidePanelOpenLensAction));
EXPECT_EQ(1, user_action_tester.GetActionCount(kLensQueryFollowupAction));
}
TEST_F(LensSidePanelCoordinatorTest, SwitchToDifferentItemTriggersHideEvent) {
base::UserActionTester user_action_tester;
lens_side_panel_coordinator_->RegisterEntryAndShow(
content::OpenURLParams(GURL(kLensHomepageURL), content::Referrer(),
WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui::PAGE_TRANSITION_LINK, false));
GetSidePanelCoordinator()->Show(SidePanelEntry::Id::kBookmarks);
EXPECT_TRUE(GetUnifiedSidePanel()->GetVisible());
EXPECT_EQ(GetSidePanelCoordinator()
->GetCurrentSidePanelEntryForTesting()
->key()
.id(),
SidePanelEntry::Id::kBookmarks);
EXPECT_EQ(1,
user_action_tester.GetActionCount(kLensQuerySidePanelClosedAction));
EXPECT_EQ(1, user_action_tester.GetActionCount(kLensEntryHiddenAction));
EXPECT_EQ(1, user_action_tester.GetActionCount(kLensEntryShownAction));
}
TEST_F(LensSidePanelCoordinatorTest, SwitchBackToLensTriggersShowEvent) {
base::UserActionTester user_action_tester;
lens_side_panel_coordinator_->RegisterEntryAndShow(
content::OpenURLParams(GURL(kLensHomepageURL), content::Referrer(),
WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui::PAGE_TRANSITION_LINK, false));
GetSidePanelCoordinator()->Show(SidePanelEntry::Id::kBookmarks);
GetSidePanelCoordinator()->Show(SidePanelEntry::Id::kLens);
EXPECT_TRUE(GetUnifiedSidePanel()->GetVisible());
EXPECT_EQ(GetSidePanelCoordinator()
->GetCurrentSidePanelEntryForTesting()
->key()
.id(),
SidePanelEntry::Id::kLens);
EXPECT_EQ(1, user_action_tester.GetActionCount(kLensQueryAction));
EXPECT_EQ(1, user_action_tester.GetActionCount(kNewLensQueryAction));
EXPECT_EQ(1,
user_action_tester.GetActionCount(kLensQuerySidePanelClosedAction));
EXPECT_EQ(1, user_action_tester.GetActionCount(kLensEntryHiddenAction));
EXPECT_EQ(2, user_action_tester.GetActionCount(kLensEntryShownAction));
}
} // namespace