diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-30 22:21:14 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-30 22:21:14 +0000 |
commit | 4938a16aad43dd11c2eeed7b0233c796935014d8 (patch) | |
tree | 75bdab63d7ac522af223b617f002066a01e936cf /ui | |
parent | 632702aad17aaaeffbac5527513998c1f6060adf (diff) | |
download | chromium_src-4938a16aad43dd11c2eeed7b0233c796935014d8.zip chromium_src-4938a16aad43dd11c2eeed7b0233c796935014d8.tar.gz chromium_src-4938a16aad43dd11c2eeed7b0233c796935014d8.tar.bz2 |
events: Allow retrieving the current event being dispatched from EventDispatcher.
BUG=163607
Review URL: https://codereview.chromium.org/11415238
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170574 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/base/events/event_dispatcher.cc | 3 | ||||
-rw-r--r-- | ui/base/events/event_dispatcher.h | 18 |
2 files changed, 17 insertions, 4 deletions
diff --git a/ui/base/events/event_dispatcher.cc b/ui/base/events/event_dispatcher.cc index 74ba03a..3308ac9 100644 --- a/ui/base/events/event_dispatcher.cc +++ b/ui/base/events/event_dispatcher.cc @@ -7,7 +7,8 @@ namespace ui { EventDispatcher::EventDispatcher() - : set_on_destroy_(NULL) { + : set_on_destroy_(NULL), + current_event_(NULL) { } EventDispatcher::~EventDispatcher() { diff --git a/ui/base/events/event_dispatcher.h b/ui/base/events/event_dispatcher.h index ec5d2b1..42d208c 100644 --- a/ui/base/events/event_dispatcher.h +++ b/ui/base/events/event_dispatcher.h @@ -5,7 +5,6 @@ #ifndef UI_BASE_EVENTS_EVENT_DISPATCHER_H_ #define UI_BASE_EVENTS_EVENT_DISPATCHER_H_ -#include "base/auto_reset.h" #include "ui/base/events/event.h" #include "ui/base/events/event_constants.h" #include "ui/base/events/event_target.h" @@ -62,6 +61,9 @@ class UI_EXPORT EventDispatcher { return result; } + const Event* current_event() const { return current_event_; } + Event* current_event() { return current_event_; } + private: class UI_EXPORT ScopedDispatchHelper : public NON_EXPORTED_BASE( Event::DispatcherApi) { @@ -96,11 +98,19 @@ class UI_EXPORT EventDispatcher { return ui::ER_CONSUMED; bool destroyed = false; set_on_destroy_ = &destroyed; + + // Do not use base::AutoReset for |current_event_|. The EventDispatcher can + // be destroyed by the event-handler during the event-dispatch. That would + // cause invalid memory-write when AutoReset tries to restore the value. + Event* old_event = current_event_; + current_event_ = event; int result = DispatchEventToSingleHandler(handler, event); - if (destroyed) + if (destroyed) { result |= ui::ER_CONSUMED; - else + } else { + current_event_ = old_event; set_on_destroy_ = NULL; + } return result; } @@ -120,6 +130,8 @@ class UI_EXPORT EventDispatcher { // middle of dispatching an event. bool* set_on_destroy_; + Event* current_event_; + DISALLOW_COPY_AND_ASSIGN(EventDispatcher); }; |