Index: content/browser/renderer_host/render_widget_host_view_aura.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc |
index a59880e6a98cec1506666c278943ce2fdaa17069..6ad6e41e96a7d8afbffd6b5508e44bf0edcc79a7 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
@@ -29,6 +29,7 @@ |
#include "content/browser/renderer_host/input/synthetic_gesture_target_aura.h" |
#include "content/browser/renderer_host/overscroll_controller.h" |
#include "content/browser/renderer_host/render_view_host_delegate.h" |
+#include "content/browser/renderer_host/render_view_host_delegate_view.h" |
#include "content/browser/renderer_host/render_view_host_impl.h" |
#include "content/browser/renderer_host/render_widget_host_impl.h" |
#include "content/browser/renderer_host/ui_events_helper.h" |
@@ -1231,6 +1232,89 @@ gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() { |
return ImageTransportFactory::GetInstance()->GetSharedSurfaceHandle(); |
} |
+void RenderWidgetHostViewAura::ShowDisambiguationPopup( |
+ const gfx::Rect& rect_pixels, |
+ const SkBitmap& zoomed_bitmap) { |
+ // |target_rect| is provided in pixels, not DIPs. So we convert it to DIPs |
+ // by scaling it by the inverse of the device scale factor. |
+ gfx::RectF screen_target_rect_f(rect_pixels); |
+ screen_target_rect_f.Scale(1.0f / current_device_scale_factor_); |
+ disambiguation_target_rect_ = gfx::ToEnclosingRect(screen_target_rect_f); |
+ |
+ float scale = static_cast<float>(zoomed_bitmap.width()) / |
+ static_cast<float>(rect_pixels.width()); |
+ gfx::Size zoomed_size(gfx::ToCeiledSize( |
+ gfx::ScaleSize(disambiguation_target_rect_.size(), scale))); |
+ |
+ // Save of a copy of the |last_scroll_offset_| for comparison when the copy |
+ // callback fires, to ensure that we haven't scrolled. |
+ disambiguation_scroll_offset_ = last_scroll_offset_; |
+ |
+ CopyFromCompositingSurface( |
+ disambiguation_target_rect_, |
+ zoomed_size, |
+ base::Bind(&RenderWidgetHostViewAura::DisambiguationPopupRendered, |
+ base::internal::SupportsWeakPtrBase::StaticAsWeakPtr |
+ <RenderWidgetHostViewAura>(this)), |
+ kN32_SkColorType); |
+} |
+ |
+void RenderWidgetHostViewAura::DisambiguationPopupRendered( |
+ bool success, |
+ const SkBitmap& result) { |
+ if (!success || disambiguation_scroll_offset_ != last_scroll_offset_) |
+ return; |
+ |
+ // Use RenderViewHostDelegate to get to the WebContentsViewAura, which will |
+ // actually show the delegate. |
+ RenderViewHostDelegate* delegate = NULL; |
+ if (host_->IsRenderView()) |
+ delegate = RenderViewHost::From(host_)->GetDelegate(); |
+ RenderViewHostDelegateView* delegate_view = NULL; |
+ if (delegate) |
+ delegate_view = delegate->GetDelegateView(); |
+ if (delegate_view) { |
+ delegate_view->ShowDisambiguationPopup( |
+ disambiguation_target_rect_, |
+ result, |
+ base::Bind(&RenderWidgetHostViewAura::ProcessDisambiguationGesture, |
+ base::internal::SupportsWeakPtrBase::StaticAsWeakPtr |
+ <RenderWidgetHostViewAura>(this)), |
+ base::Bind(&RenderWidgetHostViewAura::ProcessDisambiguationMouse, |
+ base::internal::SupportsWeakPtrBase::StaticAsWeakPtr |
+ <RenderWidgetHostViewAura>(this))); |
+ } |
+} |
+ |
+void RenderWidgetHostViewAura::HideDisambiguationPopup() { |
+ RenderViewHostDelegate* delegate = NULL; |
+ if (host_->IsRenderView()) |
+ delegate = RenderViewHost::From(host_)->GetDelegate(); |
+ RenderViewHostDelegateView* delegate_view = NULL; |
+ if (delegate) |
+ delegate_view = delegate->GetDelegateView(); |
+ if (delegate_view) |
+ delegate_view->HideDisambiguationPopup(); |
+} |
+ |
+void RenderWidgetHostViewAura::ProcessDisambiguationGesture( |
+ ui::GestureEvent* event) { |
+ blink::WebGestureEvent web_gesture = content::MakeWebGestureEvent(event); |
+ // If we fail to make a WebGestureEvent that is a Tap from the provided event, |
+ // don't forward it to Blink. |
+ if (web_gesture.type < blink::WebInputEvent::Type::GestureTap || |
+ web_gesture.type > blink::WebInputEvent::Type::GestureTapCancel) |
+ return; |
+ |
+ host_->ForwardGestureEvent(web_gesture); |
+} |
+ |
+void RenderWidgetHostViewAura::ProcessDisambiguationMouse( |
+ ui::MouseEvent* event) { |
+ blink::WebMouseEvent web_mouse = content::MakeWebMouseEvent(event); |
+ host_->ForwardMouseEvent(web_mouse); |
+} |
+ |
bool RenderWidgetHostViewAura::LockMouse() { |
aura::Window* root_window = window_->GetRootWindow(); |
if (!root_window) |
@@ -1847,6 +1931,10 @@ void RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) { |
reinterpret_cast<LPARAM>(toplevel_hwnd)); |
} |
#endif |
+ // The Disambiguation popup does not parent itself from this window, so we |
+ // manually dismiss it. |
+ HideDisambiguationPopup(); |
+ |
blink::WebMouseWheelEvent mouse_wheel_event = |
MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event)); |
if (mouse_wheel_event.deltaX != 0 || mouse_wheel_event.deltaY != 0) |