Chromium Code Reviews| Index: ui/events/event_source.cc |
| diff --git a/ui/events/event_source.cc b/ui/events/event_source.cc |
| index a40813079d837398644acc295b54fba54f865f6c..b072898e5af9647d352115cf56138fa82127c05d 100644 |
| --- a/ui/events/event_source.cc |
| +++ b/ui/events/event_source.cc |
| @@ -4,11 +4,58 @@ |
| #include "ui/events/event_source.h" |
| +#include <algorithm> |
| + |
| #include "ui/events/event_processor.h" |
| +#include "ui/events/event_rewriter.h" |
| namespace ui { |
| +void EventSource::AddEventRewriter(EventRewriter* rewriter) { |
| + DCHECK(rewriter); |
| + rewriter_list_.push_back(rewriter); |
| +} |
| + |
| +void EventSource::RemoveEventRewriter(EventRewriter* rewriter) { |
| + EventRewriterList::iterator find = |
| + std::find(rewriter_list_.begin(), rewriter_list_.end(), rewriter); |
| + if (find != rewriter_list_.end()) |
| + rewriter_list_.erase(find); |
| +} |
| + |
| EventDispatchDetails EventSource::SendEventToProcessor(Event* event) { |
| + Event* rewritten_event = 0; |
|
sadrul
2014/03/24 21:15:38
We should use a scoped_ptr<> to avoid accidentally
|
| + EventRewriteStatus status = EVENT_REWRITE_CONTINUE; |
| + for (EventRewriterList::const_iterator it = rewriter_list_.begin(), |
| + end = rewriter_list_.end(); |
| + (it != end) && (status == EVENT_REWRITE_CONTINUE); |
| + ++it) { |
| + DCHECK(*it); |
| + status = (*it)->RewriteEvent(*event, &rewritten_event); |
| + while (status == EVENT_REWRITE_DISPATCH_ANOTHER) { |
|
sadrul
2014/03/24 21:15:38
Can we do this more like:
for (....) {
status =
|
| + DCHECK(rewritten_event); |
| + EventDispatchDetails details = DeliverEventToProcessor(rewritten_event); |
| + if (details.dispatcher_destroyed || details.target_destroyed) |
| + return details; |
| + Event* last_event = rewritten_event; |
| + status = (*it)->NextDispatchEvent(*last_event, &rewritten_event); |
| + delete last_event; |
| + } |
| + } |
| + if (status == EVENT_REWRITE_REWRITTEN) { |
| + DCHECK(rewritten_event); |
| + EventDispatchDetails details = DeliverEventToProcessor(rewritten_event); |
| + delete rewritten_event; |
| + return details; |
| + } |
| + DCHECK(!rewritten_event); |
| + if (status == EVENT_REWRITE_CONTINUE) { |
| + return DeliverEventToProcessor(event); |
| + } |
| + return EventDispatchDetails(); |
| +} |
| + |
| +EventDispatchDetails EventSource::DeliverEventToProcessor(Event* event) { |
| EventProcessor* processor = GetEventProcessor(); |
| CHECK(processor); |
| return processor->OnEventFromSource(event); |