blob: 143cce1e20772edba5e30f6e5878c381d002f458 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/omnibox/browser/actions/contextual_search_action.h"
#include "base/metrics/histogram_functions.h"
#include "components/omnibox/browser/actions/omnibox_action_concepts.h"
#include "components/omnibox/common/omnibox_feature_configs.h"
#include "components/search_engines/template_url_starter_pack_data.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
#if defined(SUPPORT_PEDALS_VECTOR_ICONS)
#include "build/branding_buildflags.h" // nogncheck
#include "components/omnibox/browser/vector_icons.h" // nogncheck
#include "components/vector_icons/vector_icons.h" // nogncheck
#endif
namespace {
int GetOpenLensActionLabelId() {
switch (omnibox_feature_configs::ContextualSearch::Get()
.alternative_action_label) {
case 1:
return IDS_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_LABEL_ALT;
case 2:
return IDS_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_LABEL_ALT2;
case 0:
default:
return IDS_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_LABEL;
}
}
} // namespace
ContextualSearchFulfillmentAction::ContextualSearchFulfillmentAction(
const GURL& url,
AutocompleteMatchType::Type match_type,
bool is_zero_prefix_suggestion)
: OmniboxAction(
LabelStrings(
IDS_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_HINT,
IDS_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_SUGGESTION_CONTENTS,
IDS_ACC_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_SUFFIX,
IDS_ACC_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION),
url),
match_type_(match_type),
is_zero_prefix_suggestion_(is_zero_prefix_suggestion) {}
OmniboxActionId ContextualSearchFulfillmentAction::ActionId() const {
return OmniboxActionId::CONTEXTUAL_SEARCH_FULFILLMENT;
}
void ContextualSearchFulfillmentAction::RecordActionShown(size_t position,
bool executed) const {
base::UmaHistogramBoolean("Omnibox.ContextualSearchFulfillmentAction.Ctr",
executed);
}
void ContextualSearchFulfillmentAction::Execute(
ExecutionContext& context) const {
// Delegate fulfillment to Lens. Navigate to the action's `fulfillment_url_`
// if valid, since this url includes the associated match's updated
// `search_terms_args` which are attached to the match after this action is
// added to it.
// NOTE: `url_` should only be navigated to for the pedal fulfillment since
// there are not any searchbox stats associated with the pedal match.
context.client_->IssueContextualSearchRequest(
fulfillment_url_.is_valid() ? fulfillment_url_ : url_, match_type_,
is_zero_prefix_suggestion_);
}
ContextualSearchFulfillmentAction*
ContextualSearchFulfillmentAction::FromAction(OmniboxAction* action) {
if (action &&
action->ActionId() == OmniboxActionId::CONTEXTUAL_SEARCH_FULFILLMENT) {
return static_cast<ContextualSearchFulfillmentAction*>(action);
}
return nullptr;
}
#if defined(SUPPORT_PEDALS_VECTOR_ICONS)
const gfx::VectorIcon& ContextualSearchFulfillmentAction::GetVectorIcon()
const {
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
return vector_icons::kGoogleLensMonochromeLogoIcon;
#else
return vector_icons::kSearchChromeRefreshIcon;
#endif
}
#endif // defined(SUPPORT_PEDALS_VECTOR_ICONS)
ContextualSearchFulfillmentAction::~ContextualSearchFulfillmentAction() =
default;
////////////////////////////////////////////////////////////////////////////////
ContextualSearchOpenLensAction::ContextualSearchOpenLensAction()
: OmniboxAction(
omnibox_feature_configs::Toolbelt::Get().enabled
? OmniboxAction::LabelStrings(
IDS_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_HINT,
IDS_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_SUGGESTION_CONTENTS,
IDS_ACC_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_SUFFIX,
IDS_ACC_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION)
: OmniboxAction::LabelStrings(
GetOpenLensActionLabelId(),
GetOpenLensActionLabelId(),
IDS_ACC_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION_SUFFIX,
IDS_ACC_CONTEXTUAL_SEARCH_OPEN_LENS_ACTION),
GURL()) {}
OmniboxActionId ContextualSearchOpenLensAction::ActionId() const {
return OmniboxActionId::CONTEXTUAL_SEARCH_OPEN_LENS;
}
void ContextualSearchOpenLensAction::RecordActionShown(size_t position,
bool executed) const {
base::UmaHistogramBoolean("Omnibox.ContextualSearchOpenLensAction.Ctr",
executed);
}
void ContextualSearchOpenLensAction::Execute(ExecutionContext& context) const {
context.client_->OpenLensOverlay(/*show=*/true);
}
#if defined(SUPPORT_PEDALS_VECTOR_ICONS)
const gfx::VectorIcon& ContextualSearchOpenLensAction::GetVectorIcon() const {
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
return omnibox_feature_configs::ContextualSearch::Get()
.open_lens_action_ui_tweaks
? vector_icons::kGoogleLensLogoIcon
: vector_icons::kGoogleLensMonochromeLogoIcon;
#else
return vector_icons::kSearchChromeRefreshIcon;
#endif
}
#endif // defined(SUPPORT_PEDALS_VECTOR_ICONS)
ContextualSearchOpenLensAction::~ContextualSearchOpenLensAction() = default;
////////////////////////////////////////////////////////////////////////////////
StarterPackBookmarksAction::StarterPackBookmarksAction()
: OmniboxAction(OmniboxAction::LabelStrings(
IDS_STARTER_PACK_BOOKMARKS_ACTION_HINT,
IDS_STARTER_PACK_BOOKMARKS_ACTION_SUGGESTION_CONTENTS,
IDS_ACC_STARTER_PACK_BOOKMARKS_ACTION_SUFFIX,
IDS_ACC_STARTER_PACK_BOOKMARKS_ACTION),
GURL()) {}
OmniboxActionId StarterPackBookmarksAction::ActionId() const {
return OmniboxActionId::STARTER_PACK_BOOKMARKS;
}
void StarterPackBookmarksAction::RecordActionShown(size_t position,
bool executed) const {
base::UmaHistogramBoolean("Omnibox.StarterPackBookmarksAction.Ctr", executed);
}
void StarterPackBookmarksAction::Execute(ExecutionContext& context) const {
context.enter_starter_pack_id_ =
template_url_starter_pack_data::StarterPackId::kBookmarks;
}
#if defined(SUPPORT_PEDALS_VECTOR_ICONS)
const gfx::VectorIcon& StarterPackBookmarksAction::GetVectorIcon() const {
return omnibox::kStarActiveChromeRefreshIcon;
}
#endif // defined(SUPPORT_PEDALS_VECTOR_ICONS)
StarterPackBookmarksAction::~StarterPackBookmarksAction() = default;
////////////////////////////////////////////////////////////////////////////////
StarterPackHistoryAction::StarterPackHistoryAction()
: OmniboxAction(OmniboxAction::LabelStrings(
IDS_STARTER_PACK_HISTORY_ACTION_HINT,
IDS_STARTER_PACK_HISTORY_ACTION_SUGGESTION_CONTENTS,
IDS_ACC_STARTER_PACK_HISTORY_ACTION_SUFFIX,
IDS_ACC_STARTER_PACK_HISTORY_ACTION),
GURL()) {}
OmniboxActionId StarterPackHistoryAction::ActionId() const {
return OmniboxActionId::STARTER_PACK_HISTORY;
}
void StarterPackHistoryAction::RecordActionShown(size_t position,
bool executed) const {
base::UmaHistogramBoolean("Omnibox.StarterPackHistoryAction.Ctr", executed);
}
void StarterPackHistoryAction::Execute(ExecutionContext& context) const {
context.enter_starter_pack_id_ =
template_url_starter_pack_data::StarterPackId::kHistory;
}
#if defined(SUPPORT_PEDALS_VECTOR_ICONS)
const gfx::VectorIcon& StarterPackHistoryAction::GetVectorIcon() const {
return vector_icons::kHistoryChromeRefreshIcon;
}
#endif // defined(SUPPORT_PEDALS_VECTOR_ICONS)
StarterPackHistoryAction::~StarterPackHistoryAction() = default;
////////////////////////////////////////////////////////////////////////////////
StarterPackTabsAction::StarterPackTabsAction()
: OmniboxAction(OmniboxAction::LabelStrings(
IDS_STARTER_PACK_TABS_ACTION_HINT,
IDS_STARTER_PACK_TABS_ACTION_SUGGESTION_CONTENTS,
IDS_ACC_STARTER_PACK_TABS_ACTION_SUFFIX,
IDS_ACC_STARTER_PACK_TABS_ACTION),
GURL()) {}
OmniboxActionId StarterPackTabsAction::ActionId() const {
return OmniboxActionId::STARTER_PACK_TABS;
}
void StarterPackTabsAction::RecordActionShown(size_t position,
bool executed) const {
base::UmaHistogramBoolean("Omnibox.StarterPackTabsAction.Ctr", executed);
}
void StarterPackTabsAction::Execute(ExecutionContext& context) const {
context.enter_starter_pack_id_ =
template_url_starter_pack_data::StarterPackId::kTabs;
}
#if defined(SUPPORT_PEDALS_VECTOR_ICONS)
const gfx::VectorIcon& StarterPackTabsAction::GetVectorIcon() const {
return omnibox::kProductChromeRefreshIcon;
}
#endif // defined(SUPPORT_PEDALS_VECTOR_ICONS)
StarterPackTabsAction::~StarterPackTabsAction() = default;
////////////////////////////////////////////////////////////////////////////////
StarterPackAiModeAction::StarterPackAiModeAction()
: OmniboxAction(OmniboxAction::LabelStrings(
IDS_STARTER_PACK_AI_MODE_ACTION_HINT,
IDS_STARTER_PACK_AI_MODE_ACTION_SUGGESTION_CONTENTS,
IDS_ACC_STARTER_PACK_AI_MODE_ACTION_SUFFIX,
IDS_ACC_STARTER_PACK_AI_MODE_ACTION),
GURL()) {}
OmniboxActionId StarterPackAiModeAction::ActionId() const {
return OmniboxActionId::STARTER_PACK_AI_MODE;
}
void StarterPackAiModeAction::RecordActionShown(size_t position,
bool executed) const {
base::UmaHistogramBoolean("Omnibox.StarterPackAiModeAction.Ctr", executed);
}
void StarterPackAiModeAction::Execute(ExecutionContext& context) const {
context.enter_starter_pack_id_ =
template_url_starter_pack_data::StarterPackId::kAiMode;
}
#if defined(SUPPORT_PEDALS_VECTOR_ICONS)
const gfx::VectorIcon& StarterPackAiModeAction::GetVectorIcon() const {
return omnibox::kSearchSparkIcon;
}
#endif // defined(SUPPORT_PEDALS_VECTOR_ICONS)
StarterPackAiModeAction::~StarterPackAiModeAction() = default;