| Index: ui/events/event_processor.cc
|
| diff --git a/ui/events/event_processor.cc b/ui/events/event_processor.cc
|
| index 61d2e72138a8dc51beb04f960b19197d715c750d..f80cb91b6404cd377b6fa40cb9cd35d1c4177a9c 100644
|
| --- a/ui/events/event_processor.cc
|
| +++ b/ui/events/event_processor.cc
|
| @@ -10,14 +10,11 @@
|
| namespace ui {
|
|
|
| EventDispatchDetails EventProcessor::OnEventFromSource(Event* event) {
|
| - EventTarget* root = GetRootTarget();
|
| - CHECK(root);
|
| - EventTargeter* targeter = root->GetEventTargeter();
|
| - CHECK(targeter);
|
| -
|
| // If |event| is in the process of being dispatched or has already been
|
| - // dispatched, then dispatch a copy of the event instead.
|
| + // dispatched, then dispatch a copy of the event instead. We expect event
|
| + // target to be already set if event phase is after EP_PREDISPATCH.
|
| bool dispatch_original_event = event->phase() == EP_PREDISPATCH;
|
| + DCHECK(dispatch_original_event || event->target());
|
| Event* event_to_dispatch = event;
|
| std::unique_ptr<Event> event_copy;
|
| if (!dispatch_original_event) {
|
| @@ -26,9 +23,23 @@ EventDispatchDetails EventProcessor::OnEventFromSource(Event* event) {
|
| }
|
|
|
| OnEventProcessingStarted(event_to_dispatch);
|
| - EventTarget* target = NULL;
|
| - if (!event_to_dispatch->handled())
|
| - target = targeter->FindTargetForEvent(root, event_to_dispatch);
|
| + EventTarget* target = nullptr;
|
| + EventTargeter* targeter = nullptr;
|
| + if (!event_to_dispatch->handled()) {
|
| + EventTarget* root = GetRootForEvent(event_to_dispatch);
|
| + DCHECK(root);
|
| + targeter = root->GetEventTargeter();
|
| + if (targeter) {
|
| + target = targeter->FindTargetForEvent(root, event_to_dispatch);
|
| + } else {
|
| + targeter = GetDefaultEventTargeter();
|
| + if (event_to_dispatch->target())
|
| + target = root;
|
| + else
|
| + target = targeter->FindTargetForEvent(root, event_to_dispatch);
|
| + }
|
| + DCHECK(targeter);
|
| + }
|
|
|
| EventDispatchDetails details;
|
| while (target) {
|
|
|