| // Copyright 2023 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/omnibox/omnibox_popup_view_webui.h" |
| |
| #include <memory> |
| #include <numeric> |
| #include <optional> |
| #include <string_view> |
| |
| #include "base/feature_list.h" |
| #include "base/functional/bind.h" |
| #include "base/metrics/histogram_functions.h" |
| #include "build/build_config.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/color/chrome_color_id.h" |
| #include "chrome/browser/ui/omnibox/omnibox_controller.h" |
| #include "chrome/browser/ui/omnibox/omnibox_edit_model.h" |
| #include "chrome/browser/ui/omnibox/omnibox_next_features.h" |
| #include "chrome/browser/ui/views/location_bar/location_bar_view.h" |
| #include "chrome/browser/ui/views/omnibox/omnibox_popup_multi_presenter.h" |
| #include "chrome/browser/ui/views/omnibox/omnibox_popup_presenter.h" |
| #include "chrome/browser/ui/views/omnibox/omnibox_popup_presenter_base.h" |
| #include "chrome/browser/ui/views/omnibox/omnibox_result_view.h" |
| #include "chrome/browser/ui/views/omnibox/omnibox_row_view.h" |
| #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" |
| #include "chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h" |
| #include "chrome/browser/ui/views/theme_copying_widget.h" |
| #include "chrome/browser/ui/webui/searchbox/webui_omnibox_handler.h" |
| #include "components/omnibox/browser/omnibox_prefs.h" |
| #include "components/omnibox/common/omnibox_features.h" |
| #include "ui/accessibility/ax_node_data.h" |
| #include "ui/base/metadata/metadata_impl_macros.h" |
| #include "ui/compositor/closure_animation_observer.h" |
| #include "ui/compositor/layer.h" |
| #include "ui/compositor/scoped_layer_animation_settings.h" |
| #include "ui/gfx/image/image.h" |
| #include "ui/views/accessibility/view_accessibility.h" |
| #include "ui/views/cascading_property.h" |
| #include "ui/views/layout/box_layout.h" |
| #include "ui/views/views_features.h" |
| #include "ui/views/widget/widget.h" |
| |
| OmniboxPopupViewWebUI::OmniboxPopupViewWebUI(OmniboxViewViews* omnibox_view, |
| OmniboxController* controller, |
| LocationBarView* location_bar_view) |
| : OmniboxPopupView(controller), |
| construction_time_(base::TimeTicks::Now()), |
| omnibox_view_(omnibox_view), |
| location_bar_view_(location_bar_view) { |
| if (base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxAimPopup)) { |
| presenter_ = std::make_unique<OmniboxPopupMultiPresenter>(location_bar_view, |
| controller); |
| } else { |
| presenter_ = |
| std::make_unique<OmniboxPopupPresenter>(location_bar_view, controller); |
| } |
| model()->set_popup_view(this); |
| } |
| |
| OmniboxPopupViewWebUI::~OmniboxPopupViewWebUI() { |
| model()->set_popup_view(nullptr); |
| } |
| |
| bool OmniboxPopupViewWebUI::IsOpen() const { |
| return presenter_->IsShown(); |
| } |
| |
| void OmniboxPopupViewWebUI::InvalidateLine(size_t line) {} |
| |
| void OmniboxPopupViewWebUI::UpdatePopupAppearance() { |
| UpdatePopupAppearanceInternal(/*ai_mode=*/false); |
| } |
| |
| void OmniboxPopupViewWebUI::ProvideButtonFocusHint(size_t line) { |
| // TODO(crbug.com/40062053): Not implemented for WebUI omnibox popup yet. |
| } |
| |
| void OmniboxPopupViewWebUI::OnDragCanceled() {} |
| |
| void OmniboxPopupViewWebUI::GetPopupAccessibleNodeData( |
| ui::AXNodeData* node_data) const {} |
| |
| void OmniboxPopupViewWebUI::OpenAiMode() { |
| CHECK(base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxAimPopup)); |
| VLOG(4) << "OpenAiMode()"; |
| UpdatePopupAppearanceInternal(/*ai_mode=*/true); |
| } |
| |
| bool OmniboxPopupViewWebUI::IsAiModeOpen() const { |
| auto content_index = presenter_->GetShowingWebUIContentIndex(); |
| return content_index.has_value() && (content_index.value() > 0); |
| } |
| |
| void OmniboxPopupViewWebUI::UpdatePopupAppearanceInternal(bool ai_mode) { |
| if (!ai_mode && (controller()->autocomplete_controller()->result().empty() || |
| omnibox_view_->IsImeShowingPopup())) { |
| presenter_->Hide(); |
| } else { |
| const bool was_visible = presenter_->IsShown(); |
| VLOG(4) << "presenter_->Show(" << (ai_mode ? "true" : "false") << ");"; |
| presenter_->Show(ai_mode); |
| if (!was_visible) { |
| NotifyOpenListeners(); |
| if (!construction_time_.is_null()) { |
| const base::TimeDelta delta = |
| base::TimeTicks::Now() - construction_time_; |
| construction_time_ = base::TimeTicks(); |
| base::UmaHistogramTimes( |
| "Omnibox.Popup.WebUI.ConstructionToFirstShownDuration", delta); |
| } |
| } |
| } |
| } |