Commit 26683c89 authored by Maciek Kumorek's avatar Maciek Kumorek Committed by Commit Bot

Store pointer to the owner RootView/NativeWindow.


TabHoverCardEventSniffer calls GetNativeWindow() in the destructor and
it appears that on latest prerelease versions of Windows the
NativeWindow is nulled at this point
- DesktopNativeWidgetAura::OnHostClosed is called first.
Work around this by keeping the pointer to owning view.

Bug: 1122123
Change-Id: I9e688c05b3182c659de0afb8e0a1d27d362f3df5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2377651Reviewed-by: default avatarDana Fried <dfried@chromium.org>
Commit-Queue: Maciek Kumorek <makumo@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#802835}
parent ef4a88bd
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/image/image_skia_operations.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/skia_util.h" #include "ui/gfx/skia_util.h"
#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/controls/image_view.h" #include "ui/views/controls/image_view.h"
...@@ -136,30 +137,41 @@ enum ShiftOffset { kLeft = -1, kRight = 1 }; ...@@ -136,30 +137,41 @@ enum ShiftOffset { kLeft = -1, kRight = 1 };
// Listens in on the browser event stream (as a pre target event handler) and // Listens in on the browser event stream (as a pre target event handler) and
// hides an associated hover card on any keypress. // hides an associated hover card on any keypress.
class TabHoverCardEventSniffer : public ui::EventHandler { class TabHoverCardEventSniffer : public ui::EventHandler {
// On Mac, events should be added to the root view.
#if defined(OS_MAC)
using OwnerView = views::View*;
#else // defined(OS_MAC)
using OwnerView = gfx::NativeWindow;
#endif // defined(OS_MAC)
public: public:
TabHoverCardEventSniffer(TabHoverCardBubbleView* hover_card, TabHoverCardEventSniffer(TabHoverCardBubbleView* hover_card,
TabStrip* tab_strip) TabStrip* tab_strip)
: hover_card_(hover_card), : hover_card_(hover_card),
tab_strip_(tab_strip), tab_strip_(tab_strip),
widget_(tab_strip->GetWidget()) {
#if defined(OS_MAC) #if defined(OS_MAC)
if (widget_->GetRootView()) owner_view_(tab_strip->GetWidget()->GetRootView()) {
widget_->GetRootView()->AddPreTargetHandler(this); #else // defined(OS_MAC)
#else owner_view_(tab_strip->GetWidget()->GetNativeWindow()) {
if (widget_->GetNativeWindow()) #endif // defined(OS_MAC)
widget_->GetNativeWindow()->AddPreTargetHandler(this); AddPreTargetHandler();
#endif
} }
~TabHoverCardEventSniffer() override { ~TabHoverCardEventSniffer() override {
#if defined(OS_MAC) RemovePreTargetHandler();
widget_->GetRootView()->RemovePreTargetHandler(this);
#else
widget_->GetNativeWindow()->RemovePreTargetHandler(this);
#endif
} }
protected: protected:
void AddPreTargetHandler() {
if (owner_view_)
owner_view_->AddPreTargetHandler(this);
}
void RemovePreTargetHandler() {
if (owner_view_)
owner_view_->RemovePreTargetHandler(this);
}
// ui::EventTarget: // ui::EventTarget:
void OnKeyEvent(ui::KeyEvent* event) override { void OnKeyEvent(ui::KeyEvent* event) override {
if (!tab_strip_->IsFocusInTabs()) if (!tab_strip_->IsFocusInTabs())
...@@ -178,7 +190,7 @@ class TabHoverCardEventSniffer : public ui::EventHandler { ...@@ -178,7 +190,7 @@ class TabHoverCardEventSniffer : public ui::EventHandler {
private: private:
TabHoverCardBubbleView* const hover_card_; TabHoverCardBubbleView* const hover_card_;
TabStrip* tab_strip_; TabStrip* tab_strip_;
views::Widget* widget_; const OwnerView owner_view_;
}; };
// Provides the ability to monitor when a tab's bounds have been animated. Used // Provides the ability to monitor when a tab's bounds have been animated. Used
......
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