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:

committed by
Commit Bot

parent
a2a028961e
commit
4cc46a949a
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_;
|
||||
|
||||
|
Reference in New Issue
Block a user