Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_mac.mm |
| diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| index 9500038092b8c8630da89909a8f4d2ae95452169..c132bfbb4be102a94270c84fb74ad28284732022 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
| +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| @@ -39,6 +39,7 @@ |
| #include "content/browser/renderer_host/render_view_host_impl.h" |
| #include "content/browser/renderer_host/render_widget_helper.h" |
| #include "content/browser/renderer_host/render_widget_host_delegate.h" |
| +#include "content/browser/renderer_host/render_widget_host_input_event_router.h" |
| #import "content/browser/renderer_host/render_widget_host_view_mac_dictionary_helper.h" |
| #import "content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper.h" |
| #include "content/browser/renderer_host/render_widget_resize_helper.h" |
| @@ -598,6 +599,15 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget, |
| if (!is_guest_view_hack_) |
| render_widget_host_->SetView(this); |
| + |
| + // Let the page-level input event router know about our surface ID |
| + // namespace for surface-based hit testing. |
| + if (UseSurfacesEnabled() && |
| + render_widget_host_->delegate()->GetInputEventRouter()) { |
| + render_widget_host_->delegate() |
| + ->GetInputEventRouter() |
| + ->AddSurfaceIdNamespaceOwner(GetSurfaceIdNamespace(), this); |
| + } |
| } |
| RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { |
| @@ -609,6 +619,13 @@ RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { |
| UnlockMouse(); |
| + if (UseSurfacesEnabled() && render_widget_host_ && |
| + render_widget_host_->delegate()->GetInputEventRouter()) { |
| + render_widget_host_->delegate() |
| + ->GetInputEventRouter() |
| + ->RemoveSurfaceIdNamespaceOwner(GetSurfaceIdNamespace()); |
| + } |
| + |
| // Ensure that the browser compositor is destroyed in a safe order. |
| ShutdownBrowserCompositor(); |
| @@ -1097,6 +1114,15 @@ void RenderWidgetHostViewMac::RenderProcessGone(base::TerminationStatus status, |
| } |
| void RenderWidgetHostViewMac::RenderWidgetHostGone() { |
| + // Clear SurfaceID namespace ownership before we shutdown the |
| + // compositor. |
| + if (UseSurfacesEnabled() && render_widget_host_ && |
| + render_widget_host_->delegate()->GetInputEventRouter()) { |
| + render_widget_host_->delegate() |
| + ->GetInputEventRouter() |
| + ->RemoveSurfaceIdNamespaceOwner(GetSurfaceIdNamespace()); |
| + } |
| + |
| // Destroy the DelegatedFrameHost, to prevent crashes when Destroy is never |
| // called on the view. |
| // http://crbug.com/404828 |
| @@ -1126,6 +1152,15 @@ void RenderWidgetHostViewMac::Destroy() { |
| // object needs to survive until the stack unwinds. |
| pepper_fullscreen_window_.autorelease(); |
| + // Clear SurfaceID namespace ownership before we shutdown the |
| + // compositor. |
| + if (UseSurfacesEnabled() && render_widget_host_ && |
| + render_widget_host_->delegate()->GetInputEventRouter()) { |
|
lazyboy
2015/09/01 21:29:42
FYI, the mac failures seems to be b/c render_widge
kenrb
2015/09/02 16:35:05
Thanks for helping with debugging this! I didn't r
|
| + render_widget_host_->delegate() |
| + ->GetInputEventRouter() |
| + ->RemoveSurfaceIdNamespaceOwner(GetSurfaceIdNamespace()); |
| + } |
| + |
| // Delete the delegated frame state, which will reach back into |
| // render_widget_host_. |
| ShutdownBrowserCompositor(); |
| @@ -1601,6 +1636,27 @@ uint32_t RenderWidgetHostViewMac::GetSurfaceIdNamespace() { |
| return 0; |
| } |
| +uint32_t RenderWidgetHostViewMac::SurfaceIdNamespaceAtPoint( |
| + const gfx::Point& point, |
| + gfx::Point* transformed_point) { |
| + cc::SurfaceId id = |
| + delegated_frame_host_->SurfaceIdAtPoint(point, transformed_point); |
| + // It is possible that the renderer has not yet produced a surface, in which |
| + // case we return our current namespace. |
| + if (id.is_null()) |
| + return GetSurfaceIdNamespace(); |
| + return cc::SurfaceIdAllocator::NamespaceForId(id); |
| +} |
| + |
| +void RenderWidgetHostViewMac::ProcessMouseEvent( |
| + const blink::WebMouseEvent& event) { |
| + render_widget_host_->ForwardMouseEvent(event); |
| +} |
| +void RenderWidgetHostViewMac::ProcessMouseWheelEvent( |
| + const blink::WebMouseWheelEvent& event) { |
| + render_widget_host_->ForwardWheelEvent(event); |
| +} |
| + |
| bool RenderWidgetHostViewMac::Send(IPC::Message* message) { |
| if (render_widget_host_) |
| return render_widget_host_->Send(message); |
| @@ -1936,7 +1992,14 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
| WebInputEventFactory::mouseEvent(theEvent, self); |
| enterEvent.type = WebInputEvent::MouseMove; |
| enterEvent.button = WebMouseEvent::ButtonNone; |
| - renderWidgetHostView_->ForwardMouseEvent(enterEvent); |
| + if (renderWidgetHostView_->render_widget_host_->delegate() |
| + ->GetInputEventRouter()) { |
| + renderWidgetHostView_->render_widget_host_->delegate() |
| + ->GetInputEventRouter() |
| + ->RouteMouseEvent(renderWidgetHostView_.get(), &enterEvent); |
| + } else { |
| + renderWidgetHostView_->ForwardMouseEvent(enterEvent); |
| + } |
| } |
| } |
| mouseEventWasIgnored_ = NO; |
| @@ -1964,9 +2027,15 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
| [self confirmComposition]; |
| } |
| - const WebMouseEvent event = |
| - WebInputEventFactory::mouseEvent(theEvent, self); |
| - renderWidgetHostView_->ForwardMouseEvent(event); |
| + WebMouseEvent event = WebInputEventFactory::mouseEvent(theEvent, self); |
| + if (renderWidgetHostView_->render_widget_host_->delegate() |
| + ->GetInputEventRouter()) { |
| + renderWidgetHostView_->render_widget_host_->delegate() |
| + ->GetInputEventRouter() |
| + ->RouteMouseEvent(renderWidgetHostView_.get(), &event); |
| + } else { |
| + renderWidgetHostView_->ForwardMouseEvent(event); |
| + } |
| } |
| - (BOOL)performKeyEquivalent:(NSEvent*)theEvent { |
| @@ -2424,7 +2493,14 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
| WebMouseWheelEvent webEvent = WebInputEventFactory::mouseWheelEvent( |
| event, self, canRubberbandLeft, canRubberbandRight); |
| webEvent.railsMode = mouseWheelFilter_.UpdateRailsMode(webEvent); |
| - renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(webEvent); |
| + if (renderWidgetHostView_->render_widget_host_->delegate() |
| + ->GetInputEventRouter()) { |
| + renderWidgetHostView_->render_widget_host_->delegate() |
| + ->GetInputEventRouter() |
| + ->RouteMouseWheelEvent(renderWidgetHostView_.get(), &webEvent); |
| + } else { |
| + renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(webEvent); |
| + } |
| } |
| } |