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