| // Copyright 2021 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/omnibox_action.h" |
| |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/trace_event/memory_usage_estimator.h" |
| #include "build/build_config.h" |
| #include "components/omnibox/browser/omnibox_client.h" |
| #include "components/omnibox/browser/omnibox_field_trial.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| #if defined(SUPPORT_PEDALS_VECTOR_ICONS) |
| #include "components/omnibox/browser/vector_icons.h" // nogncheck |
| #endif |
| #if BUILDFLAG(IS_ANDROID) |
| #include "base/android/jni_android.h" |
| #include "components/omnibox/browser/jni_headers/OmniboxAction_jni.h" |
| #endif |
| |
| OmniboxAction::LabelStrings::LabelStrings(int id_hint, |
| int id_suggestion_contents, |
| int id_accessibility_suffix, |
| int id_accessibility_hint) |
| : LabelStrings(l10n_util::GetStringUTF16(id_hint), |
| l10n_util::GetStringUTF16(id_suggestion_contents), |
| l10n_util::GetStringUTF16(id_accessibility_suffix), |
| l10n_util::GetStringUTF16(id_accessibility_hint)) {} |
| |
| OmniboxAction::LabelStrings::LabelStrings(std::u16string hint, |
| std::u16string suggestion_contents, |
| std::u16string accessibility_suffix, |
| std::u16string accessibility_hint) |
| : hint{std::move(hint)}, |
| suggestion_contents{std::move(suggestion_contents)}, |
| accessibility_suffix{std::move(accessibility_suffix)}, |
| accessibility_hint{std::move(accessibility_hint)} {} |
| |
| OmniboxAction::LabelStrings::LabelStrings() = default; |
| |
| OmniboxAction::LabelStrings::LabelStrings(const LabelStrings&) = default; |
| |
| OmniboxAction::LabelStrings::~LabelStrings() = default; |
| |
| namespace base::trace_event { |
| size_t EstimateMemoryUsage(const OmniboxAction::LabelStrings& self) { |
| size_t total = 0; |
| total += base::trace_event::EstimateMemoryUsage(self.hint); |
| total += base::trace_event::EstimateMemoryUsage(self.suggestion_contents); |
| total += base::trace_event::EstimateMemoryUsage(self.accessibility_suffix); |
| total += base::trace_event::EstimateMemoryUsage(self.accessibility_hint); |
| return total; |
| } |
| } // namespace base::trace_event |
| |
| // ============================================================================= |
| |
| bool OmniboxAction::Client::OpenJourneys(const std::string& query) { |
| return false; |
| } |
| |
| // ============================================================================= |
| |
| OmniboxAction::ExecutionContext::ExecutionContext( |
| Client& client, |
| OpenUrlCallback callback, |
| base::TimeTicks match_selection_timestamp, |
| WindowOpenDisposition disposition) |
| : client_(client), |
| open_url_callback_(std::move(callback)), |
| match_selection_timestamp_(match_selection_timestamp), |
| disposition_(disposition), |
| enter_starter_pack_id_(0) {} |
| |
| OmniboxAction::ExecutionContext::~ExecutionContext() = default; |
| |
| // ============================================================================= |
| |
| OmniboxAction::OmniboxAction(LabelStrings strings, |
| GURL url, |
| bool show_as_action_button) |
| : strings_(strings), |
| url_(url), |
| show_as_action_button_(show_as_action_button) {} |
| |
| OmniboxAction::~OmniboxAction() { |
| #if BUILDFLAG(IS_ANDROID) |
| if (j_omnibox_action_) { |
| Java_OmniboxAction_destroy(base::android::AttachCurrentThread(), |
| j_omnibox_action_); |
| j_omnibox_action_.Reset(); |
| } |
| #endif |
| } |
| |
| const OmniboxAction::LabelStrings& OmniboxAction::GetLabelStrings() const { |
| return strings_; |
| } |
| |
| void OmniboxAction::Execute(OmniboxAction::ExecutionContext& context) const { |
| DCHECK(url_.is_valid()); |
| OpenURL(context, url_); |
| } |
| |
| bool OmniboxAction::IsReadyToTrigger( |
| const AutocompleteInput& input, |
| const AutocompleteProviderClient& client) const { |
| return true; |
| } |
| |
| #if defined(SUPPORT_PEDALS_VECTOR_ICONS) |
| const gfx::VectorIcon& OmniboxAction::GetVectorIcon() const { |
| // TODO(tommycli): Replace with real icon. |
| return omnibox::kProductChromeRefreshIcon; |
| } |
| #endif |
| |
| gfx::Image OmniboxAction::GetIconImage() const { |
| return gfx::Image(); |
| } |
| |
| size_t OmniboxAction::EstimateMemoryUsage() const { |
| size_t total = 0; |
| total += base::trace_event::EstimateMemoryUsage(url_); |
| total += base::trace_event::EstimateMemoryUsage(strings_); |
| return total; |
| } |
| |
| OmniboxActionId OmniboxAction::ActionId() const { |
| return OmniboxActionId::UNKNOWN; |
| } |
| |
| #if BUILDFLAG(IS_ANDROID) |
| base::android::ScopedJavaLocalRef<jobject> OmniboxAction::GetOrCreateJavaObject( |
| JNIEnv* env) const { |
| NOTREACHED() << "This implementation does not have a java counterpart"; |
| } |
| #endif |
| |
| void OmniboxAction::OpenURL(OmniboxAction::ExecutionContext& context, |
| const GURL& url) const { |
| // Set `match_type` as if the user just typed |url| verbatim. |
| // `destination_url_entered_without_scheme` is used to determine whether |
| // navigations typed without a scheme and upgraded to HTTPS should fall back |
| // to HTTP. The URL might have been entered without a scheme, but Action |
| // destination URLs don't need a fallback so it's fine to pass false here. |
| std::move(context.open_url_callback_) |
| .Run(url, nullptr, context.disposition_, ui::PAGE_TRANSITION_GENERATED, |
| /*match_type=*/AutocompleteMatchType::URL_WHAT_YOU_TYPED, |
| context.match_selection_timestamp_, |
| /*destination_url_entered_without_scheme=*/false, |
| /*destination_url_entered_with_http_scheme=*/false, u"", |
| AutocompleteMatch(), AutocompleteMatch()); |
| } |