Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_input_event_router.cc | 
| diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc | 
| index 449b2f6850247e2b6f54da5d8ea38b04b60b73c7..d6059944d669068b6628788cd3b1a837ea2fdb0c 100644 | 
| --- a/content/browser/renderer_host/render_widget_host_input_event_router.cc | 
| +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc | 
| @@ -11,13 +11,14 @@ | 
| namespace content { | 
| RenderWidgetHostInputEventRouter::RenderWidgetHostInputEventRouter() | 
| - : current_touch_target_(nullptr), active_touches_(0) {} | 
| + : has_current_touch_target_(false), active_touches_(0) {} | 
| RenderWidgetHostInputEventRouter::~RenderWidgetHostInputEventRouter() { | 
| owner_map_.clear(); | 
| } | 
| -RenderWidgetHostViewBase* RenderWidgetHostInputEventRouter::FindEventTarget( | 
| +RenderWidgetHostInputEventRouter::WeakTarget | 
| 
 
nasko
2015/12/22 18:16:33
Why does this method need to return the WeakTarget
 
wjmaclean
2015/12/22 18:39:55
It doesn't have to return the WeakPtr ... I'll cha
 
 | 
| +RenderWidgetHostInputEventRouter::FindEventTarget( | 
| RenderWidgetHostViewBase* root_view, | 
| const gfx::Point& point, | 
| gfx::Point* transformed_point) { | 
| @@ -25,7 +26,7 @@ RenderWidgetHostViewBase* RenderWidgetHostInputEventRouter::FindEventTarget( | 
| // hit testing. | 
| if (owner_map_.size() <= 1) { | 
| *transformed_point = point; | 
| - return root_view; | 
| + return root_view->GetWeakPtr(); | 
| } | 
| // The conversion of point to transform_point is done over the course of the | 
| @@ -40,7 +41,7 @@ RenderWidgetHostViewBase* RenderWidgetHostInputEventRouter::FindEventTarget( | 
| // it likely means the RenderWidgetHostView has been destroyed but its | 
| // parent frame has not sent a new compositor frame since that happened. | 
| if (iter == owner_map_.end()) | 
| - return root_view; | 
| + return root_view->GetWeakPtr(); | 
| return iter->second; | 
| } | 
| @@ -48,24 +49,26 @@ void RenderWidgetHostInputEventRouter::RouteMouseEvent( | 
| RenderWidgetHostViewBase* root_view, | 
| blink::WebMouseEvent* event) { | 
| gfx::Point transformed_point; | 
| - RenderWidgetHostViewBase* target = FindEventTarget( | 
| - root_view, gfx::Point(event->x, event->y), &transformed_point); | 
| + WeakTarget target = FindEventTarget(root_view, gfx::Point(event->x, event->y), | 
| + &transformed_point); | 
| event->x = transformed_point.x(); | 
| event->y = transformed_point.y(); | 
| - target->ProcessMouseEvent(*event); | 
| + if (target) | 
| 
 
nasko
2015/12/22 18:16:33
Let'd use early returns - if (!target) return, rig
 
wjmaclean
2015/12/22 18:39:55
Done.
 
 | 
| + target->ProcessMouseEvent(*event); | 
| } | 
| void RenderWidgetHostInputEventRouter::RouteMouseWheelEvent( | 
| RenderWidgetHostViewBase* root_view, | 
| blink::WebMouseWheelEvent* event) { | 
| gfx::Point transformed_point; | 
| - RenderWidgetHostViewBase* target = FindEventTarget( | 
| - root_view, gfx::Point(event->x, event->y), &transformed_point); | 
| + WeakTarget target = FindEventTarget(root_view, gfx::Point(event->x, event->y), | 
| + &transformed_point); | 
| event->x = transformed_point.x(); | 
| event->y = transformed_point.y(); | 
| - target->ProcessMouseWheelEvent(*event); | 
| + if (target) | 
| 
 
nasko
2015/12/22 18:16:33
Same as above, early return.
 
wjmaclean
2015/12/22 18:39:55
Done.
 
 | 
| + target->ProcessMouseWheelEvent(*event); | 
| } | 
| void RenderWidgetHostInputEventRouter::RouteTouchEvent( | 
| @@ -83,23 +86,29 @@ void RenderWidgetHostInputEventRouter::RouteTouchEvent( | 
| event->touches[0].position.y); | 
| current_touch_target_ = | 
| FindEventTarget(root_view, original_point, &transformed_point); | 
| 
 
nasko
2015/12/22 18:16:33
You could just call ->GetWeakPtr() here, since it
 
wjmaclean
2015/12/22 18:39:55
I don't understand? You mean call it on current_to
 
 | 
| + has_current_touch_target_ = true; | 
| 
 
Fady Samuel
2015/12/22 18:06:43
Is this flag necessary? It seems you only use it f
 
 | 
| } | 
| ++active_touches_; | 
| - current_touch_target_->ProcessTouchEvent(*event, latency); | 
| + if (current_touch_target_.get()) | 
| + current_touch_target_->ProcessTouchEvent(*event, latency); | 
| break; | 
| } | 
| case blink::WebInputEvent::TouchMove: | 
| - DCHECK(current_touch_target_); | 
| - current_touch_target_->ProcessTouchEvent(*event, latency); | 
| + DCHECK(has_current_touch_target_); | 
| + if (current_touch_target_.get()) | 
| + current_touch_target_->ProcessTouchEvent(*event, latency); | 
| break; | 
| case blink::WebInputEvent::TouchEnd: | 
| case blink::WebInputEvent::TouchCancel: | 
| DCHECK(active_touches_); | 
| - DCHECK(current_touch_target_); | 
| - current_touch_target_->ProcessTouchEvent(*event, latency); | 
| + DCHECK(has_current_touch_target_); | 
| + if (current_touch_target_.get()) | 
| + current_touch_target_->ProcessTouchEvent(*event, latency); | 
| --active_touches_; | 
| - if (!active_touches_) | 
| - current_touch_target_ = nullptr; | 
| + if (!active_touches_) { | 
| + current_touch_target_ = WeakTarget(); | 
| + has_current_touch_target_ = false; | 
| + } | 
| break; | 
| default: | 
| NOTREACHED(); | 
| @@ -110,7 +119,7 @@ void RenderWidgetHostInputEventRouter::AddSurfaceIdNamespaceOwner( | 
| uint32_t id, | 
| RenderWidgetHostViewBase* owner) { | 
| DCHECK(owner_map_.find(id) == owner_map_.end()); | 
| - owner_map_.insert(std::make_pair(id, owner)); | 
| + owner_map_.insert(std::make_pair(id, owner->GetWeakPtr())); | 
| } | 
| void RenderWidgetHostInputEventRouter::RemoveSurfaceIdNamespaceOwner( |