summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-30 22:21:14 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-30 22:21:14 +0000
commit4938a16aad43dd11c2eeed7b0233c796935014d8 (patch)
tree75bdab63d7ac522af223b617f002066a01e936cf /ui
parent632702aad17aaaeffbac5527513998c1f6060adf (diff)
downloadchromium_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.cc3
-rw-r--r--ui/base/events/event_dispatcher.h18
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);
};