0

Hide tab hover cards on key press events in the rootview on mac.

We already hide the hover cards on any key press events to the native window for aura. This is not an option for Mac because a pretarget event handler cannot be added to the native window on Mac.  Hiding on key events to the rootview will not capture all key press event but will capture for important events like key press in the omnibox where the hover cards could obstruct the view.


Bug: 910739
Change-Id: Id5d3d6a11455350d08cba041958397ec53e07922
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1541840
Reviewed-by: Dana Fried <dfried@chromium.org>
Commit-Queue: Caroline Rising <corising@chromium.org>
Cr-Commit-Position: refs/heads/master@{#645501}
This commit is contained in:
Caroline Rising
2019-03-28 21:14:10 +00:00
committed by Commit Bot
parent a2a028961e
commit 4cc46a949a
2 changed files with 19 additions and 18 deletions
chrome/browser/ui/views/tabs

@ -115,20 +115,28 @@ 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);
views::Widget* widget)
: hover_card_(hover_card), widget_(widget) {
#if defined(OS_MACOSX)
if (widget_->GetRootView())
widget_->GetRootView()->AddPreTargetHandler(this);
#else
if (widget_->GetNativeWindow())
widget_->GetNativeWindow()->AddPreTargetHandler(this);
#endif
}
~TabHoverCardEventSniffer() override {
native_window_->RemovePreTargetHandler(this);
#if defined(OS_MACOSX)
widget_->GetRootView()->RemovePreTargetHandler(this);
#else
widget_->GetNativeWindow()->RemovePreTargetHandler(this);
#endif
}
protected:
@ -139,11 +147,9 @@ class TabHoverCardEventSniffer : public ui::EventHandler {
private:
TabHoverCardBubbleView* const hover_card_;
gfx::NativeWindow native_window_;
views::Widget* widget_;
};
#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 {
@ -1174,12 +1180,10 @@ void TabStrip::UpdateHoverCard(Tab* tab, bool should_show) {
return;
hover_card_ = new TabHoverCardBubbleView(tab);
hover_card_->views::View::AddObserver(this);
#if defined(USE_AURA)
if (GetWidget() && GetWidget()->GetNativeWindow()) {
hover_card_event_sniffer_ = std::make_unique<TabHoverCardEventSniffer>(
hover_card_, GetWidget()->GetNativeWindow());
if (GetWidget()) {
hover_card_event_sniffer_ =
std::make_unique<TabHoverCardEventSniffer>(hover_card_, GetWidget());
}
#endif
}
if (should_show)
hover_card_->UpdateAndShow(tab);
@ -2873,9 +2877,7 @@ views::View* TabStrip::TargetForRect(views::View* root, const gfx::Rect& rect) {
void TabStrip::OnViewIsDeleting(views::View* observed_view) {
if (observed_view == hover_card_) {
hover_card_->views::View::RemoveObserver(this);
#if defined(USE_AURA)
hover_card_event_sniffer_.reset();
#endif
hover_card_ = nullptr;
}
}

@ -17,6 +17,7 @@
#include "base/observer_list.h"
#include "base/scoped_observer.h"
#include "base/timer/timer.h"
#include "build/build_config.h"
#include "chrome/browser/ui/tabs/tab_utils.h"
#include "chrome/browser/ui/views/frame/browser_root_view.h"
#include "chrome/browser/ui/views/tabs/tab.h"
@ -655,9 +656,7 @@ 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_;