| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "content/renderer/render_widget.h" | 5 #include "content/renderer/render_widget.h" | 
| 6 | 6 | 
| 7 #include "base/bind.h" | 7 #include "base/bind.h" | 
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" | 
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" | 
| 10 #include "base/debug/trace_event_synthetic_delay.h" | 10 #include "base/debug/trace_event_synthetic_delay.h" | 
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 599     IPC_MESSAGE_HANDLER(ViewMsg_WasSwappedOut, OnWasSwappedOut) | 599     IPC_MESSAGE_HANDLER(ViewMsg_WasSwappedOut, OnWasSwappedOut) | 
| 600     IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck) | 600     IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck) | 
| 601     IPC_MESSAGE_HANDLER(ViewMsg_SwapBuffers_ACK, OnSwapBuffersComplete) | 601     IPC_MESSAGE_HANDLER(ViewMsg_SwapBuffers_ACK, OnSwapBuffersComplete) | 
| 602     IPC_MESSAGE_HANDLER(ViewMsg_SetInputMethodActive, OnSetInputMethodActive) | 602     IPC_MESSAGE_HANDLER(ViewMsg_SetInputMethodActive, OnSetInputMethodActive) | 
| 603     IPC_MESSAGE_HANDLER(ViewMsg_CandidateWindowShown, OnCandidateWindowShown) | 603     IPC_MESSAGE_HANDLER(ViewMsg_CandidateWindowShown, OnCandidateWindowShown) | 
| 604     IPC_MESSAGE_HANDLER(ViewMsg_CandidateWindowUpdated, | 604     IPC_MESSAGE_HANDLER(ViewMsg_CandidateWindowUpdated, | 
| 605                         OnCandidateWindowUpdated) | 605                         OnCandidateWindowUpdated) | 
| 606     IPC_MESSAGE_HANDLER(ViewMsg_CandidateWindowHidden, OnCandidateWindowHidden) | 606     IPC_MESSAGE_HANDLER(ViewMsg_CandidateWindowHidden, OnCandidateWindowHidden) | 
| 607     IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition) | 607     IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition) | 
| 608     IPC_MESSAGE_HANDLER(ViewMsg_ImeConfirmComposition, OnImeConfirmComposition) | 608     IPC_MESSAGE_HANDLER(ViewMsg_ImeConfirmComposition, OnImeConfirmComposition) | 
| 609     IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnPaintAtSize) |  | 
| 610     IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) | 609     IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnRepaint) | 
| 611     IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) | 610     IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) | 
| 612     IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) | 611     IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) | 
| 613     IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) | 612     IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) | 
| 614 #if defined(OS_ANDROID) | 613 #if defined(OS_ANDROID) | 
| 615     IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) | 614     IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) | 
| 616     IPC_MESSAGE_HANDLER(ViewMsg_ImeEventAck, OnImeEventAck) | 615     IPC_MESSAGE_HANDLER(ViewMsg_ImeEventAck, OnImeEventAck) | 
| 617 #endif | 616 #endif | 
| 618     IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot) | 617     IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot) | 
| 619     IPC_MESSAGE_UNHANDLED(handled = false) | 618     IPC_MESSAGE_UNHANDLED(handled = false) | 
| (...skipping 1543 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2163   else if (keep_selection) | 2162   else if (keep_selection) | 
| 2164     webwidget_->confirmComposition(WebWidget::KeepSelection); | 2163     webwidget_->confirmComposition(WebWidget::KeepSelection); | 
| 2165   else | 2164   else | 
| 2166     webwidget_->confirmComposition(WebWidget::DoNotKeepSelection); | 2165     webwidget_->confirmComposition(WebWidget::DoNotKeepSelection); | 
| 2167   handling_input_event_ = false; | 2166   handling_input_event_ = false; | 
| 2168 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) | 2167 #if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA) | 
| 2169   UpdateCompositionInfo(true); | 2168   UpdateCompositionInfo(true); | 
| 2170 #endif | 2169 #endif | 
| 2171 } | 2170 } | 
| 2172 | 2171 | 
| 2173 // This message causes the renderer to render an image of the |  | 
| 2174 // desired_size, regardless of whether the tab is hidden or not. |  | 
| 2175 void RenderWidget::OnPaintAtSize(const TransportDIB::Handle& dib_handle, |  | 
| 2176                                  int tag, |  | 
| 2177                                  const gfx::Size& page_size, |  | 
| 2178                                  const gfx::Size& desired_size) { |  | 
| 2179   if (!webwidget_ || !TransportDIB::is_valid_handle(dib_handle)) { |  | 
| 2180     if (TransportDIB::is_valid_handle(dib_handle)) { |  | 
| 2181       // Close our unused handle. |  | 
| 2182 #if defined(OS_WIN) |  | 
| 2183       ::CloseHandle(dib_handle); |  | 
| 2184 #elif defined(OS_MACOSX) |  | 
| 2185       base::SharedMemory::CloseHandle(dib_handle); |  | 
| 2186 #endif |  | 
| 2187     } |  | 
| 2188     return; |  | 
| 2189   } |  | 
| 2190 |  | 
| 2191   if (page_size.IsEmpty() || desired_size.IsEmpty()) { |  | 
| 2192     // If one of these is empty, then we just return the dib we were |  | 
| 2193     // given, to avoid leaking it. |  | 
| 2194     Send(new ViewHostMsg_PaintAtSize_ACK(routing_id_, tag, desired_size)); |  | 
| 2195     return; |  | 
| 2196   } |  | 
| 2197 |  | 
| 2198   // Map the given DIB ID into this process, and unmap it at the end |  | 
| 2199   // of this function. |  | 
| 2200   scoped_ptr<TransportDIB> paint_at_size_buffer( |  | 
| 2201       TransportDIB::CreateWithHandle(dib_handle)); |  | 
| 2202 |  | 
| 2203   gfx::Size page_size_in_pixel = gfx::ToFlooredSize( |  | 
| 2204       gfx::ScaleSize(page_size, device_scale_factor_)); |  | 
| 2205   gfx::Size desired_size_in_pixel = gfx::ToFlooredSize( |  | 
| 2206       gfx::ScaleSize(desired_size, device_scale_factor_)); |  | 
| 2207   gfx::Size canvas_size = page_size_in_pixel; |  | 
| 2208   float x_scale = static_cast<float>(desired_size_in_pixel.width()) / |  | 
| 2209                   static_cast<float>(canvas_size.width()); |  | 
| 2210   float y_scale = static_cast<float>(desired_size_in_pixel.height()) / |  | 
| 2211                   static_cast<float>(canvas_size.height()); |  | 
| 2212 |  | 
| 2213   gfx::Rect orig_bounds(canvas_size); |  | 
| 2214   canvas_size.set_width(static_cast<int>(canvas_size.width() * x_scale)); |  | 
| 2215   canvas_size.set_height(static_cast<int>(canvas_size.height() * y_scale)); |  | 
| 2216   gfx::Rect bounds(canvas_size); |  | 
| 2217 |  | 
| 2218   scoped_ptr<skia::PlatformCanvas> canvas( |  | 
| 2219       paint_at_size_buffer->GetPlatformCanvas(canvas_size.width(), |  | 
| 2220                                               canvas_size.height())); |  | 
| 2221   if (!canvas) { |  | 
| 2222     NOTREACHED(); |  | 
| 2223     return; |  | 
| 2224   } |  | 
| 2225 |  | 
| 2226   // Reset bounds to what we actually received, but they should be the |  | 
| 2227   // same. |  | 
| 2228   DCHECK_EQ(bounds.width(), canvas->getDevice()->width()); |  | 
| 2229   DCHECK_EQ(bounds.height(), canvas->getDevice()->height()); |  | 
| 2230   bounds.set_width(canvas->getDevice()->width()); |  | 
| 2231   bounds.set_height(canvas->getDevice()->height()); |  | 
| 2232 |  | 
| 2233   canvas->save(); |  | 
| 2234   // Add the scale factor to the canvas, so that we'll get the desired size. |  | 
| 2235   canvas->scale(SkFloatToScalar(x_scale), SkFloatToScalar(y_scale)); |  | 
| 2236 |  | 
| 2237   // Have to make sure we're laid out at the right size before |  | 
| 2238   // rendering. |  | 
| 2239   gfx::Size old_size = webwidget_->size(); |  | 
| 2240   webwidget_->resize(page_size); |  | 
| 2241   webwidget_->layout(); |  | 
| 2242 |  | 
| 2243   // Paint the entire thing (using original bounds, not scaled bounds). |  | 
| 2244   PaintRect(orig_bounds, orig_bounds.origin(), canvas.get()); |  | 
| 2245   canvas->restore(); |  | 
| 2246 |  | 
| 2247   // Return the widget to its previous size. |  | 
| 2248   webwidget_->resize(old_size); |  | 
| 2249 |  | 
| 2250   Send(new ViewHostMsg_PaintAtSize_ACK(routing_id_, tag, bounds.size())); |  | 
| 2251 } |  | 
| 2252 |  | 
| 2253 void RenderWidget::OnSnapshot(const gfx::Rect& src_subrect) { | 2172 void RenderWidget::OnSnapshot(const gfx::Rect& src_subrect) { | 
| 2254   SkBitmap snapshot; | 2173   SkBitmap snapshot; | 
| 2255 | 2174 | 
| 2256   if (OnSnapshotHelper(src_subrect, &snapshot)) { | 2175   if (OnSnapshotHelper(src_subrect, &snapshot)) { | 
| 2257     Send(new ViewHostMsg_Snapshot(routing_id(), true, snapshot)); | 2176     Send(new ViewHostMsg_Snapshot(routing_id(), true, snapshot)); | 
| 2258   } else { | 2177   } else { | 
| 2259     Send(new ViewHostMsg_Snapshot(routing_id(), false, SkBitmap())); | 2178     Send(new ViewHostMsg_Snapshot(routing_id(), false, SkBitmap())); | 
| 2260   } | 2179   } | 
| 2261 } | 2180 } | 
| 2262 | 2181 | 
| (...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2868 | 2787 | 
| 2869 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2788 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 
| 2870   swapped_out_frames_.AddObserver(frame); | 2789   swapped_out_frames_.AddObserver(frame); | 
| 2871 } | 2790 } | 
| 2872 | 2791 | 
| 2873 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2792 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 
| 2874   swapped_out_frames_.RemoveObserver(frame); | 2793   swapped_out_frames_.RemoveObserver(frame); | 
| 2875 } | 2794 } | 
| 2876 | 2795 | 
| 2877 }  // namespace content | 2796 }  // namespace content | 
| OLD | NEW | 
|---|