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() && |