1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_POPUP_VIEW_VIEWS_H_
#define CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_POPUP_VIEW_VIEWS_H_
#include <stddef.h>
#include <string_view>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "components/omnibox/browser/omnibox_popup_selection.h"
#include "components/omnibox/browser/omnibox_popup_view.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/base/window_open_disposition.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/image/image.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget_observer.h"
class LocationBarView;
class OmniboxController;
class OmniboxHeaderView;
class OmniboxResultView;
class OmniboxViewViews;
struct AutocompleteMatch;
// A view representing the contents of the autocomplete popup.
class OmniboxPopupViewViews : public views::View,
public OmniboxPopupView,
public views::WidgetObserver {
METADATA_HEADER(OmniboxPopupViewViews, views::View)
public:
OmniboxPopupViewViews(OmniboxViewViews* omnibox_view,
OmniboxController* controller,
LocationBarView* location_bar_view);
explicit OmniboxPopupViewViews(const OmniboxPopupViewViews&) = delete;
OmniboxPopupViewViews& operator=(const OmniboxPopupViewViews&) = delete;
~OmniboxPopupViewViews() override;
// Returns the icon that should be displayed next to |match|. If the icon is
// available as a vector icon, it will be |vector_icon_color|.
gfx::Image GetMatchIcon(const AutocompleteMatch& match,
SkColor vector_icon_color) const;
// Sets the line specified by |index| as selected and, if |index| is
// different than the previous index, sets the line state to NORMAL.
virtual void SetSelectedIndex(size_t index);
// Returns the selected line.
// Note: This and `SetSelectedIndex` above are used by property
// metadata and must follow the metadata conventions.
virtual size_t GetSelectedIndex() const;
// Returns current popup selection (includes line index).
virtual OmniboxPopupSelection GetSelection() const;
// OmniboxPopupView:
bool IsOpen() const override;
void InvalidateLine(size_t line) override;
void OnSelectionChanged(OmniboxPopupSelection old_selection,
OmniboxPopupSelection new_selection) override;
void UpdatePopupAppearance() override;
void ProvideButtonFocusHint(size_t line) override;
void OnMatchIconUpdated(size_t match_index) override;
void OnDragCanceled() override;
void GetPopupAccessibleNodeData(ui::AXNodeData* node_data) const override;
std::u16string_view GetAccessibleButtonTextForResult(
size_t line) const override;
// views::View:
bool OnMouseDragged(const ui::MouseEvent& event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
// views::WidgetObserver:
void OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& new_bounds) override;
void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override;
void OnWidgetDestroying(views::Widget* widget) override;
void FireAXEventsForNewActiveDescendant(View* descendant_view);
protected:
FRIEND_TEST_ALL_PREFIXES(OmniboxPopupViewViewsTest, ClickOmnibox);
FRIEND_TEST_ALL_PREFIXES(OmniboxPopupViewViewsTest, DeleteSuggestion);
FRIEND_TEST_ALL_PREFIXES(OmniboxPopupViewViewsTest, SpaceEntersKeywordMode);
FRIEND_TEST_ALL_PREFIXES(OmniboxPopupSuggestionGroupHeadersTest,
ShowSuggestionGroupHeadersByPageContext);
friend class OmniboxPopupViewViewsTest;
friend class OmniboxSuggestionButtonRowBrowserTest;
class AutocompletePopupWidget;
// Returns the target popup bounds in screen coordinates based on the bounds
// of |location_bar_view_|.
gfx::Rect GetTargetBounds() const;
// Gets the OmniboxHeaderView for match |i|.
OmniboxHeaderView* header_view_at(size_t i);
// Gets the OmniboxResultView for match |i|.
OmniboxResultView* result_view_at(size_t i);
const OmniboxResultView* result_view_at(size_t i) const;
// Returns true if the model has a match at the specified index.
bool HasMatchAt(size_t index) const;
// Returns the match at the specified index within the model.
const AutocompleteMatch& GetMatchAtIndex(size_t index) const;
// Find the index of the match under the given |point|, specified in window
// coordinates. Returns OmniboxPopupSelection::kNoMatch if there isn't a match
// at the specified point.
size_t GetIndexForPoint(const gfx::Point& point) const;
private:
void UpdateAccessibleStates() const;
void UpdateAccessibleControlIds();
void UpdateAccessibleActiveDescendantForInvokingView();
// The popup that contains this view. We create this, but it deletes itself
// when its window is destroyed. This is a WeakPtr because it's possible for
// the OS to destroy the window and thus delete this object before we're
// deleted, or without our knowledge.
// TODO(crbug.com/40232479): Migrate this to CLIENT_OWNS_WIDGET.
base::WeakPtr<AutocompletePopupWidget> popup_;
// Timestamp for when the current omnibox popup creation started.
std::optional<base::TimeTicks> popup_create_start_time_;
// The edit view that invokes us. May be nullptr in tests.
raw_ptr<OmniboxViewViews> omnibox_view_;
// The location bar view that owns |omnibox_view_|. May be nullptr in tests.
raw_ptr<LocationBarView> location_bar_view_;
};
#endif // CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_POPUP_VIEW_VIEWS_H_
|