| Index: content/browser/renderer_host/render_widget_host_impl.cc
|
| diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
|
| index 16892a172a0dc70dc7b0efdd81ad30eaab68d82b..747f436104e1aae0c68066bef05a888372b6cb6c 100644
|
| --- a/content/browser/renderer_host/render_widget_host_impl.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_impl.cc
|
| @@ -41,6 +41,7 @@
|
| #include "content/common/input_messages.h"
|
| #include "content/common/view_messages.h"
|
| #include "content/port/browser/render_widget_host_view_port.h"
|
| +#include "content/public/browser/mouse_listener.h"
|
| #include "content/public/browser/native_web_keyboard_event.h"
|
| #include "content/public/browser/notification_service.h"
|
| #include "content/public/browser/notification_types.h"
|
| @@ -1016,6 +1017,12 @@ void RenderWidgetHostImpl::ForwardMouseEventWithLatencyInfo(
|
| const MouseEventWithLatencyInfo& mouse_event) {
|
| TRACE_EVENT2("input", "RenderWidgetHostImpl::ForwardMouseEvent",
|
| "x", mouse_event.event.x, "y", mouse_event.event.y);
|
| +
|
| + // First, let mouse listeners take a shot at handling the event. If a
|
| + // listener handles the event, it should not be propagated to the renderer.
|
| + if (MouseListenersHandleEvent(mouse_event.event))
|
| + return;
|
| +
|
| input_router_->SendMouseEvent(mouse_event);
|
| }
|
|
|
| @@ -1134,6 +1141,16 @@ void RenderWidgetHostImpl::RemoveKeyboardListener(
|
| keyboard_listeners_.RemoveObserver(listener);
|
| }
|
|
|
| +void RenderWidgetHostImpl::AddMouseListener(MouseListener* listener) {
|
| + mouse_listeners_.AddObserver(listener);
|
| +}
|
| +
|
| +void RenderWidgetHostImpl::RemoveMouseListener(MouseListener* listener) {
|
| + // Ensure that the element is actually an observer.
|
| + DCHECK(mouse_listeners_.HasObserver(listener));
|
| + mouse_listeners_.RemoveObserver(listener);
|
| +}
|
| +
|
| void RenderWidgetHostImpl::GetWebScreenInfo(WebKit::WebScreenInfo* result) {
|
| TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::GetWebScreenInfo");
|
| if (GetView())
|
| @@ -1899,6 +1916,18 @@ bool RenderWidgetHostImpl::KeyPressListenersHandleEvent(
|
| return false;
|
| }
|
|
|
| +bool RenderWidgetHostImpl::MouseListenersHandleEvent(
|
| + const WebMouseEvent& event) {
|
| + ObserverList<MouseListener>::Iterator it(mouse_listeners_);
|
| + MouseListener* listener;
|
| + while ((listener = it.GetNext()) != NULL) {
|
| + if (listener->HandleMouseEvent(event))
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| InputEventAckState RenderWidgetHostImpl::FilterInputEvent(
|
| const WebKit::WebInputEvent& event, const ui::LatencyInfo& latency_info) {
|
| if (overscroll_controller() &&
|
|
|