Commit 48a3d843 authored by Dana Fried's avatar Dana Fried Committed by Commit Bot

Avoid tab hover cards eating events they shouldn't.

Pulled the event handler that spies on the root window's event stream
(pre target event handler) into a separate class. Intrinsic
BubbleDialogDelegateView behaviors were marking some events as handled
which prevented them from being passed to the appropriate browser views.

The net result was that drag no longer worked if hover cards were
active; there were probably other problems as well.

Bug: 910739
Change-Id: I747f5ff2ab492367b07ca26a96ea5a5329acb871
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1540681
Commit-Queue: Dana Fried <dfried@chromium.org>
Reviewed-by: default avatarBret Sepulveda <bsep@chromium.org>
Cr-Commit-Position: refs/heads/master@{#644652}
parent 83d44af5
......@@ -328,10 +328,6 @@ void TabHoverCardBubbleView::UpdatePreviewImage(gfx::ImageSkia preview_image) {
preview_image_->SetImage(preview_image);
}
void TabHoverCardBubbleView::OnKeyEvent(ui::KeyEvent* event) {
FadeOutToHide();
}
gfx::Size TabHoverCardBubbleView::CalculatePreferredSize() const {
gfx::Size preferred_size = GetLayoutManager()->GetPreferredSize(this);
preferred_size.set_width(GetPreferredTabHoverCardWidth());
......
......@@ -54,9 +54,6 @@ class TabHoverCardBubbleView : public views::BubbleDialogDelegateView {
void UpdatePreviewImage(gfx::ImageSkia preview_image);
// This receives all key press events in the native window.
void OnKeyEvent(ui::KeyEvent* event) override;
gfx::Size CalculatePreferredSize() const override;
base::OneShotTimer delayed_show_timer_;
......
......@@ -115,6 +115,35 @@ constexpr int kStackedPadding = 6;
int g_drop_indicator_width = 0;
int g_drop_indicator_height = 0;
#if defined(USE_AURA)
// Listens in on the browser event stream (as a pre target event handler) and
// hides an associated hover card on any keypress.
class TabHoverCardEventSniffer : public ui::EventHandler {
public:
TabHoverCardEventSniffer(TabHoverCardBubbleView* hover_card,
gfx::NativeWindow native_window)
: hover_card_(hover_card), native_window_(native_window) {
native_window_->AddPreTargetHandler(this);
}
~TabHoverCardEventSniffer() override {
native_window_->RemovePreTargetHandler(this);
}
protected:
// ui::EventTarget:
void OnKeyEvent(ui::KeyEvent* event) override {
hover_card_->FadeOutToHide();
}
private:
TabHoverCardBubbleView* const hover_card_;
gfx::NativeWindow native_window_;
};
#endif // defined(USE_AURA)
// Animation delegate used for any automatic tab movement. Hides the tab if it
// is not fully visible within the tabstrip area, to prevent overflow clipping.
class TabAnimationDelegate : public gfx::AnimationDelegate {
......@@ -1146,8 +1175,10 @@ void TabStrip::UpdateHoverCard(Tab* tab, bool should_show) {
hover_card_ = new TabHoverCardBubbleView(tab);
hover_card_->views::View::AddObserver(this);
#if defined(USE_AURA)
if (GetWidget() && GetWidget()->GetNativeWindow())
GetWidget()->GetNativeWindow()->AddPreTargetHandler(hover_card_);
if (GetWidget() && GetWidget()->GetNativeWindow()) {
hover_card_event_sniffer_ = std::make_unique<TabHoverCardEventSniffer>(
hover_card_, GetWidget()->GetNativeWindow());
}
#endif
}
if (should_show)
......@@ -2843,8 +2874,7 @@ void TabStrip::OnViewIsDeleting(views::View* observed_view) {
if (observed_view == hover_card_) {
hover_card_->views::View::RemoveObserver(this);
#if defined(USE_AURA)
if (GetWidget() && GetWidget()->GetNativeWindow())
GetWidget()->GetNativeWindow()->RemovePreTargetHandler(hover_card_);
hover_card_event_sniffer_.reset();
#endif
hover_card_ = nullptr;
}
......
......@@ -655,6 +655,9 @@ class TabStrip : public views::AccessiblePaneView,
// The view tracker is used to keep track of if the hover card has been
// destroyed by its widget.
TabHoverCardBubbleView* hover_card_ = nullptr;
#if defined(USE_AURA)
std::unique_ptr<ui::EventHandler> hover_card_event_sniffer_;
#endif
std::unique_ptr<TabStripController> controller_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment