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 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 closing_(false), | 379 closing_(false), |
380 is_swapped_out_(swapped_out), | 380 is_swapped_out_(swapped_out), |
381 input_method_is_active_(false), | 381 input_method_is_active_(false), |
382 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 382 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
383 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | 383 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
384 can_compose_inline_(true), | 384 can_compose_inline_(true), |
385 popup_type_(popup_type), | 385 popup_type_(popup_type), |
386 pending_window_rect_count_(0), | 386 pending_window_rect_count_(0), |
387 suppress_next_char_events_(false), | 387 suppress_next_char_events_(false), |
388 is_accelerated_compositing_active_(false), | 388 is_accelerated_compositing_active_(false), |
389 animation_update_pending_(false), | |
390 invalidation_task_posted_(false), | 389 invalidation_task_posted_(false), |
391 screen_info_(screen_info), | 390 screen_info_(screen_info), |
392 device_scale_factor_(screen_info_.deviceScaleFactor), | 391 device_scale_factor_(screen_info_.deviceScaleFactor), |
393 is_threaded_compositing_enabled_(false), | 392 is_threaded_compositing_enabled_(false), |
394 next_output_surface_id_(0), | 393 next_output_surface_id_(0), |
395 #if defined(OS_ANDROID) | 394 #if defined(OS_ANDROID) |
396 text_field_is_dirty_(false), | 395 text_field_is_dirty_(false), |
397 outstanding_ime_acks_(0), | 396 outstanding_ime_acks_(0), |
398 body_background_color_(SK_ColorWHITE), | 397 body_background_color_(SK_ColorWHITE), |
399 #endif | 398 #endif |
(...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1137 webwidget_->setFocus(enable); | 1136 webwidget_->setFocus(enable); |
1138 } | 1137 } |
1139 | 1138 |
1140 void RenderWidget::ClearFocus() { | 1139 void RenderWidget::ClearFocus() { |
1141 // We may have got the focus from the browser before this gets processed, in | 1140 // We may have got the focus from the browser before this gets processed, in |
1142 // which case we do not want to unfocus ourself. | 1141 // which case we do not want to unfocus ourself. |
1143 if (!has_focus_ && webwidget_) | 1142 if (!has_focus_ && webwidget_) |
1144 webwidget_->setFocus(false); | 1143 webwidget_->setFocus(false); |
1145 } | 1144 } |
1146 | 1145 |
1147 void RenderWidget::AnimationCallback() { | |
1148 TRACE_EVENT0("renderer", "RenderWidget::AnimationCallback"); | |
1149 if (!animation_update_pending_) { | |
1150 TRACE_EVENT0("renderer", "EarlyOut_NoAnimationUpdatePending"); | |
1151 return; | |
1152 } | |
1153 FlushPendingInputEventAck(); | |
1154 } | |
1155 | |
1156 void RenderWidget::InvalidationCallback() { | 1146 void RenderWidget::InvalidationCallback() { |
1157 TRACE_EVENT0("renderer", "RenderWidget::InvalidationCallback"); | 1147 TRACE_EVENT0("renderer", "RenderWidget::InvalidationCallback"); |
1158 invalidation_task_posted_ = false; | 1148 invalidation_task_posted_ = false; |
1159 FlushPendingInputEventAck(); | 1149 FlushPendingInputEventAck(); |
1160 } | 1150 } |
1161 | 1151 |
1162 void RenderWidget::FlushPendingInputEventAck() { | 1152 void RenderWidget::FlushPendingInputEventAck() { |
1163 if (pending_input_event_ack_) | 1153 if (pending_input_event_ack_) |
1164 Send(pending_input_event_ack_.release()); | 1154 Send(pending_input_event_ack_.release()); |
1165 total_input_handling_time_this_frame_ = base::TimeDelta(); | 1155 total_input_handling_time_this_frame_ = base::TimeDelta(); |
1166 } | 1156 } |
1167 | 1157 |
1168 /////////////////////////////////////////////////////////////////////////////// | 1158 /////////////////////////////////////////////////////////////////////////////// |
1169 // WebWidgetClient | 1159 // WebWidgetClient |
1170 | 1160 |
1171 void RenderWidget::didInvalidateRect(const WebRect& rect) { | 1161 void RenderWidget::didInvalidateRect(const WebRect& rect) { |
1172 // The invalidated rect might be outside the bounds of the view. | 1162 // The invalidated rect might be outside the bounds of the view. |
1173 gfx::Rect view_rect(size_); | 1163 gfx::Rect view_rect(size_); |
1174 gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, rect); | 1164 gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, rect); |
1175 if (damaged_rect.IsEmpty()) | 1165 if (damaged_rect.IsEmpty()) |
1176 return; | 1166 return; |
1177 | 1167 |
1178 // We may not need to schedule another call to DoDeferredUpdate. | 1168 // We may not need to schedule another call to DoDeferredUpdate. |
1179 if (invalidation_task_posted_) | 1169 if (invalidation_task_posted_) |
1180 return; | 1170 return; |
1181 | 1171 |
1182 // When GPU rendering, combine pending animations and invalidations into | |
1183 // a single update. | |
1184 if (is_accelerated_compositing_active_ && | |
1185 animation_update_pending_ && | |
1186 animation_timer_.IsRunning()) | |
1187 return; | |
1188 | |
1189 // Perform updating asynchronously. This serves two purposes: | 1172 // Perform updating asynchronously. This serves two purposes: |
1190 // 1) Ensures that we call WebView::Paint without a bunch of other junk | 1173 // 1) Ensures that we call WebView::Paint without a bunch of other junk |
1191 // on the call stack. | 1174 // on the call stack. |
1192 // 2) Allows us to collect more damage rects before painting to help coalesce | 1175 // 2) Allows us to collect more damage rects before painting to help coalesce |
1193 // the work that we will need to do. | 1176 // the work that we will need to do. |
1194 invalidation_task_posted_ = true; | 1177 invalidation_task_posted_ = true; |
1195 base::MessageLoop::current()->PostTask( | 1178 base::MessageLoop::current()->PostTask( |
1196 FROM_HERE, base::Bind(&RenderWidget::InvalidationCallback, this)); | 1179 FROM_HERE, base::Bind(&RenderWidget::InvalidationCallback, this)); |
1197 } | 1180 } |
1198 | 1181 |
1199 void RenderWidget::didScrollRect(int dx, int dy, | 1182 void RenderWidget::didScrollRect(int dx, int dy, |
1200 const WebRect& clip_rect) { | 1183 const WebRect& clip_rect) { |
1201 // Drop scrolls on the floor when we are in compositing mode. | 1184 // Drop scrolls on the floor when we are in compositing mode. |
1202 // TODO(nduca): stop WebViewImpl from sending scrolls in the first place. | 1185 // TODO(nduca): stop WebViewImpl from sending scrolls in the first place. |
1203 if (is_accelerated_compositing_active_) | 1186 if (is_accelerated_compositing_active_) |
1204 return; | 1187 return; |
1205 | 1188 |
1206 // The scrolled rect might be outside the bounds of the view. | 1189 // The scrolled rect might be outside the bounds of the view. |
1207 gfx::Rect view_rect(size_); | 1190 gfx::Rect view_rect(size_); |
1208 gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, clip_rect); | 1191 gfx::Rect damaged_rect = gfx::IntersectRects(view_rect, clip_rect); |
1209 if (damaged_rect.IsEmpty()) | 1192 if (damaged_rect.IsEmpty()) |
1210 return; | 1193 return; |
1211 | 1194 |
1212 // We may not need to schedule another call to DoDeferredUpdate. | 1195 // We may not need to schedule another call to DoDeferredUpdate. |
1213 if (invalidation_task_posted_) | 1196 if (invalidation_task_posted_) |
1214 return; | 1197 return; |
1215 | 1198 |
1216 // When GPU rendering, combine pending animations and invalidations into | |
1217 // a single update. | |
1218 if (is_accelerated_compositing_active_ && | |
1219 animation_update_pending_ && | |
1220 animation_timer_.IsRunning()) | |
1221 return; | |
1222 | |
1223 // Perform updating asynchronously. This serves two purposes: | 1199 // Perform updating asynchronously. This serves two purposes: |
1224 // 1) Ensures that we call WebView::Paint without a bunch of other junk | 1200 // 1) Ensures that we call WebView::Paint without a bunch of other junk |
1225 // on the call stack. | 1201 // on the call stack. |
1226 // 2) Allows us to collect more damage rects before painting to help coalesce | 1202 // 2) Allows us to collect more damage rects before painting to help coalesce |
1227 // the work that we will need to do. | 1203 // the work that we will need to do. |
1228 invalidation_task_posted_ = true; | 1204 invalidation_task_posted_ = true; |
1229 base::MessageLoop::current()->PostTask( | 1205 base::MessageLoop::current()->PostTask( |
1230 FROM_HERE, base::Bind(&RenderWidget::InvalidationCallback, this)); | 1206 FROM_HERE, base::Bind(&RenderWidget::InvalidationCallback, this)); |
1231 } | 1207 } |
1232 | 1208 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1377 // TODO(nduca): replace with something a little less hacky. The reason this | 1353 // TODO(nduca): replace with something a little less hacky. The reason this |
1378 // hack is still used is because the Invalidate-DoDeferredUpdate loop | 1354 // hack is still used is because the Invalidate-DoDeferredUpdate loop |
1379 // contains a lot of host-renderer synchronization logic that is still | 1355 // contains a lot of host-renderer synchronization logic that is still |
1380 // important for the accelerated compositing case. The option of simply | 1356 // important for the accelerated compositing case. The option of simply |
1381 // duplicating all that code is less desirable than "faking out" the | 1357 // duplicating all that code is less desirable than "faking out" the |
1382 // invalidation path using a magical damage rect. | 1358 // invalidation path using a magical damage rect. |
1383 didInvalidateRect(WebRect(0, 0, 1, 1)); | 1359 didInvalidateRect(WebRect(0, 0, 1, 1)); |
1384 } | 1360 } |
1385 } | 1361 } |
1386 | 1362 |
1387 void RenderWidget::scheduleAnimation() { | |
1388 if (animation_update_pending_) | |
1389 return; | |
1390 | |
1391 TRACE_EVENT0("gpu", "RenderWidget::scheduleAnimation"); | |
1392 animation_update_pending_ = true; | |
1393 if (!animation_timer_.IsRunning()) { | |
1394 animation_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(0), this, | |
1395 &RenderWidget::AnimationCallback); | |
1396 } | |
1397 } | |
1398 | |
1399 void RenderWidget::didChangeCursor(const WebCursorInfo& cursor_info) { | 1363 void RenderWidget::didChangeCursor(const WebCursorInfo& cursor_info) { |
1400 // TODO(darin): Eliminate this temporary. | 1364 // TODO(darin): Eliminate this temporary. |
1401 WebCursor cursor; | 1365 WebCursor cursor; |
1402 InitializeCursorFromWebKitCursorInfo(&cursor, cursor_info); | 1366 InitializeCursorFromWebKitCursorInfo(&cursor, cursor_info); |
1403 // Only send a SetCursor message if we need to make a change. | 1367 // Only send a SetCursor message if we need to make a change. |
1404 if (!current_cursor_.IsEqual(cursor)) { | 1368 if (!current_cursor_.IsEqual(cursor)) { |
1405 current_cursor_ = cursor; | 1369 current_cursor_ = cursor; |
1406 Send(new ViewHostMsg_SetCursor(routing_id_, cursor)); | 1370 Send(new ViewHostMsg_SetCursor(routing_id_, cursor)); |
1407 } | 1371 } |
1408 } | 1372 } |
(...skipping 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2234 | 2198 |
2235 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2199 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { |
2236 swapped_out_frames_.AddObserver(frame); | 2200 swapped_out_frames_.AddObserver(frame); |
2237 } | 2201 } |
2238 | 2202 |
2239 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2203 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { |
2240 swapped_out_frames_.RemoveObserver(frame); | 2204 swapped_out_frames_.RemoveObserver(frame); |
2241 } | 2205 } |
2242 | 2206 |
2243 } // namespace content | 2207 } // namespace content |
OLD | NEW |