| 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 |