| Index: content/renderer/render_view_impl.cc
 | 
| diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
 | 
| index 028ba4d37d48944eff7067112a52faaa5a188ec1..25e1e24ea994e0d22ebbb682ac6b9fe52ddb9006 100644
 | 
| --- a/content/renderer/render_view_impl.cc
 | 
| +++ b/content/renderer/render_view_impl.cc
 | 
| @@ -68,6 +68,7 @@
 | 
|  #include "content/renderer/browser_plugin/old/guest_to_embedder_channel.h"
 | 
|  #include "content/renderer/device_orientation_dispatcher.h"
 | 
|  #include "content/renderer/devtools_agent.h"
 | 
| +#include "content/renderer/disambiguation_popup_helper.h"
 | 
|  #include "content/renderer/dom_automation_controller.h"
 | 
|  #include "content/renderer/dom_storage/webstoragenamespace_impl.h"
 | 
|  #include "content/renderer/do_not_track_bindings.h"
 | 
| @@ -180,6 +181,7 @@
 | 
|  #include "ui/gfx/native_widget_types.h"
 | 
|  #include "ui/gfx/point.h"
 | 
|  #include "ui/gfx/rect.h"
 | 
| +#include "ui/gfx/size_conversions.h"
 | 
|  #include "v8/include/v8.h"
 | 
|  #include "webkit/appcache/web_application_cache_host_impl.h"
 | 
|  #include "webkit/dom_storage/dom_storage_types.h"
 | 
| @@ -1059,6 +1061,8 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
 | 
|      IPC_MESSAGE_HANDLER(ViewMsg_SetWindowVisibility, OnSetWindowVisibility)
 | 
|      IPC_MESSAGE_HANDLER(ViewMsg_WindowFrameChanged, OnWindowFrameChanged)
 | 
|  #endif
 | 
| +    IPC_MESSAGE_HANDLER(ViewMsg_ReleaseDisambiguationPopupDIB,
 | 
| +                        OnReleaseDisambiguationPopupDIB)
 | 
|  
 | 
|      // Have the super handle all other messages.
 | 
|      IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
 | 
| @@ -6369,3 +6373,46 @@ void RenderViewImpl::OnUpdatedFrameTree(
 | 
|  
 | 
|    updating_frame_tree_ = false;
 | 
|  }
 | 
| +
 | 
| +bool RenderViewImpl::didTapMultipleTargets(
 | 
| +    const WebKit::WebGestureEvent& event,
 | 
| +    const WebVector<WebRect>& target_rects) {
 | 
| +  using content::DisambiguationPopupHelper;
 | 
| +  gfx::Rect finger_rect(
 | 
| +      event.x - event.data.tap.width / 2, event.y - event.data.tap.height / 2,
 | 
| +      event.data.tap.width, event.data.tap.height);
 | 
| +  gfx::Rect zoom_rect;
 | 
| +  float scale = DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor(
 | 
| +      finger_rect, target_rects, GetSize(), &zoom_rect);
 | 
| +  if (!scale)
 | 
| +    return false;
 | 
| +
 | 
| +  gfx::Size canvas_size = zoom_rect.size();
 | 
| +  canvas_size = ToCeiledSize(canvas_size.Scale(scale));
 | 
| +  TransportDIB* transport_dib = NULL;
 | 
| +  {
 | 
| +    scoped_ptr<skia::PlatformCanvas> canvas(
 | 
| +        RenderProcess::current()->GetDrawingCanvas(&transport_dib,
 | 
| +                                                   gfx::Rect(canvas_size)));
 | 
| +    if (!canvas.get())
 | 
| +      return false;
 | 
| +
 | 
| +    canvas->scale(scale, scale);
 | 
| +
 | 
| +    canvas->translate(-zoom_rect.x(), -zoom_rect.y());
 | 
| +    webwidget_->paint(webkit_glue::ToWebCanvas(canvas.get()), zoom_rect,
 | 
| +        WebWidget::ForceSoftwareRenderingAndIgnoreGPUResidentContent);
 | 
| +  }
 | 
| +  Send(new ViewHostMsg_ShowDisambiguationPopup(routing_id_,
 | 
| +                                               zoom_rect,
 | 
| +                                               canvas_size,
 | 
| +                                               transport_dib->id()));
 | 
| +
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +void RenderViewImpl::OnReleaseDisambiguationPopupDIB(
 | 
| +    TransportDIB::Handle dib_handle) {
 | 
| +  TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle);
 | 
| +  RenderProcess::current()->ReleaseTransportDIB(dib);
 | 
| +}
 | 
| 
 |