Chromium Code Reviews| 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)); |