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 eee2df69b76756f82a597511cb8b934f22227e9e..8a249cfc8e948aa3e9102b3931da048e2beb3867 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" |
@@ -1224,6 +1225,59 @@ gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() { |
return ImageTransportFactory::GetInstance()->GetSharedSurfaceHandle(); |
} |
+#if defined(OS_WIN) |
sky
2014/08/04 20:05:20
No ifdef here.
luken
2014/09/11 01:07:27
Done.
|
+void RenderWidgetHostViewAura::ShowDisambiguationPopup( |
+ const gfx::Rect& target_rect, |
+ 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(target_rect); |
+ 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>(target_rect.width()); |
+ gfx::Size zoomed_size(gfx::ToCeiledSize( |
+ gfx::ScaleSize(disambiguation_target_rect_.size(), scale))); |
+ |
+ CopyFromCompositingSurface( |
sky
2014/08/04 20:05:20
If this is async, how do you need it completes bef
luken
2014/09/11 01:07:27
I switched over to a weak this pointer. If this vi
|
+ disambiguation_target_rect_, |
+ zoomed_size, |
+ base::Bind(&RenderWidgetHostViewAura::DisambiguationPopupRendered, |
+ base::Unretained(this)), |
+ kN32_SkColorType); |
+} |
+ |
+void RenderWidgetHostViewAura::DisambiguationPopupRendered( |
+ bool success, |
+ const SkBitmap& result) { |
+ if (!success) |
+ 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); |
+} |
+ |
+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(); |
+} |
+#endif |
+ |
bool RenderWidgetHostViewAura::LockMouse() { |
aura::Window* root_window = window_->GetRootWindow(); |
if (!root_window) |
@@ -1839,6 +1893,9 @@ void RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) { |
DismissOwnedPopups, |
reinterpret_cast<LPARAM>(toplevel_hwnd)); |
} |
+ // The Disambiguation popup does not parent itself from this window, so we |
+ // manually dismiss it. |
+ HideDisambiguationPopup(); |
#endif |
blink::WebMouseWheelEvent mouse_wheel_event = |
MakeWebMouseWheelEvent(static_cast<ui::MouseWheelEvent*>(event)); |