diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-03-05 17:34:47 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-03-06 10:04:14 +0000 |
commit | eaf1da4d961fbbda9455f9af3b23d1af777f43fa (patch) | |
tree | 95970599ecee31c4f7f940bc97ac98c61a3d0cad /chromium/ui/views/event_monitor_aura.cc | |
parent | 38a9a29f4f9436cace7f0e7abf9c586057df8a4e (diff) |
BASELINE: Update Chromium to 73.0.3683.64
Change-Id: I76517dc277ba4e16bfd7e098fda3d079656b3b9f
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/ui/views/event_monitor_aura.cc')
-rw-r--r-- | chromium/ui/views/event_monitor_aura.cc | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/chromium/ui/views/event_monitor_aura.cc b/chromium/ui/views/event_monitor_aura.cc index d560a66bd72..5909080e22a 100644 --- a/chromium/ui/views/event_monitor_aura.cc +++ b/chromium/ui/views/event_monitor_aura.cc @@ -4,7 +4,10 @@ #include "ui/views/event_monitor_aura.h" +#include <memory> + #include "base/logging.h" +#include "base/scoped_observer.h" #include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/events/event_observer.h" @@ -12,6 +15,38 @@ namespace views { +namespace { + +// An EventMonitorAura that removes its event observer on window destruction. +class WindowMonitorAura : public EventMonitorAura, public aura::WindowObserver { + public: + WindowMonitorAura(aura::Env* env, + ui::EventObserver* event_observer, + aura::Window* target_window, + const std::set<ui::EventType>& types) + : EventMonitorAura(env, event_observer, target_window, types), + target_window_(target_window) { + window_observer_.Add(target_window); + } + ~WindowMonitorAura() override = default; + + // aura::WindowObserver: + void OnWindowDestroying(aura::Window* window) override { + DCHECK_EQ(window, target_window_); + window_observer_.Remove(target_window_); + target_window_ = nullptr; + TearDown(); + } + + private: + aura::Window* target_window_; + ScopedObserver<aura::Window, aura::WindowObserver> window_observer_{this}; + + DISALLOW_COPY_AND_ASSIGN(WindowMonitorAura); +}; + +} // namespace + // static std::unique_ptr<EventMonitor> EventMonitor::CreateApplicationMonitor( ui::EventObserver* event_observer, @@ -26,7 +61,7 @@ std::unique_ptr<EventMonitor> EventMonitor::CreateWindowMonitor( ui::EventObserver* event_observer, gfx::NativeWindow target_window, const std::set<ui::EventType>& types) { - return std::make_unique<EventMonitorAura>( + return std::make_unique<WindowMonitorAura>( target_window->env(), event_observer, target_window, types); } @@ -42,11 +77,17 @@ EventMonitorAura::EventMonitorAura(aura::Env* env, } EventMonitorAura::~EventMonitorAura() { - env_->RemoveEventObserver(event_observer_); + TearDown(); } gfx::Point EventMonitorAura::GetLastMouseLocation() { return env_->last_mouse_location(); } +void EventMonitorAura::TearDown() { + if (event_observer_) + env_->RemoveEventObserver(event_observer_); + event_observer_ = nullptr; +} + } // namespace views |