summaryrefslogtreecommitdiffstats
path: root/chromium/ui/views/event_monitor_aura.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-03-05 17:34:47 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-03-06 10:04:14 +0000
commiteaf1da4d961fbbda9455f9af3b23d1af777f43fa (patch)
tree95970599ecee31c4f7f940bc97ac98c61a3d0cad /chromium/ui/views/event_monitor_aura.cc
parent38a9a29f4f9436cace7f0e7abf9c586057df8a4e (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.cc45
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