Chromium Code Reviews| 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/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 did_show_(false), | 370 did_show_(false), |
| 371 is_hidden_(hidden), | 371 is_hidden_(hidden), |
| 372 never_visible_(never_visible), | 372 never_visible_(never_visible), |
| 373 is_fullscreen_(false), | 373 is_fullscreen_(false), |
| 374 has_focus_(false), | 374 has_focus_(false), |
| 375 handling_input_event_(false), | 375 handling_input_event_(false), |
| 376 handling_ime_event_(false), | 376 handling_ime_event_(false), |
| 377 handling_event_type_(WebInputEvent::Undefined), | 377 handling_event_type_(WebInputEvent::Undefined), |
| 378 ignore_ack_for_mouse_move_from_debugger_(false), | 378 ignore_ack_for_mouse_move_from_debugger_(false), |
| 379 closing_(false), | 379 closing_(false), |
| 380 host_closing_(false), | |
| 380 is_swapped_out_(swapped_out), | 381 is_swapped_out_(swapped_out), |
| 381 input_method_is_active_(false), | 382 input_method_is_active_(false), |
| 382 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 383 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
| 383 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | 384 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
| 384 can_compose_inline_(true), | 385 can_compose_inline_(true), |
| 385 popup_type_(popup_type), | 386 popup_type_(popup_type), |
| 386 pending_window_rect_count_(0), | 387 pending_window_rect_count_(0), |
| 387 suppress_next_char_events_(false), | 388 suppress_next_char_events_(false), |
| 388 screen_info_(screen_info), | 389 screen_info_(screen_info), |
| 389 device_scale_factor_(screen_info_.deviceScaleFactor), | 390 device_scale_factor_(screen_info_.deviceScaleFactor), |
| (...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1158 } | 1159 } |
| 1159 | 1160 |
| 1160 void RenderWidget::AutoResizeCompositor() { | 1161 void RenderWidget::AutoResizeCompositor() { |
| 1161 physical_backing_size_ = gfx::ToCeiledSize(gfx::ScaleSize(size_, | 1162 physical_backing_size_ = gfx::ToCeiledSize(gfx::ScaleSize(size_, |
| 1162 device_scale_factor_)); | 1163 device_scale_factor_)); |
| 1163 if (compositor_) | 1164 if (compositor_) |
| 1164 compositor_->setViewportSize(size_, physical_backing_size_); | 1165 compositor_->setViewportSize(size_, physical_backing_size_); |
| 1165 } | 1166 } |
| 1166 | 1167 |
| 1167 void RenderWidget::initializeLayerTreeView() { | 1168 void RenderWidget::initializeLayerTreeView() { |
| 1169 // The host is currently shutting down and any old compositors have | |
| 1170 // been destroyed, so don't create any new ones. | |
| 1171 if (host_closing_) | |
|
danakj
2014/07/02 21:31:42
Do you think this can/should be a DCHECK one day?
enne (OOO)
2014/07/10 20:37:42
Done.
| |
| 1172 return; | |
| 1173 | |
| 1168 compositor_ = RenderWidgetCompositor::Create( | 1174 compositor_ = RenderWidgetCompositor::Create( |
| 1169 this, is_threaded_compositing_enabled_); | 1175 this, is_threaded_compositing_enabled_); |
| 1170 compositor_->setViewportSize(size_, physical_backing_size_); | 1176 compositor_->setViewportSize(size_, physical_backing_size_); |
| 1171 if (init_complete_) | 1177 if (init_complete_) |
| 1172 StartCompositor(); | 1178 StartCompositor(); |
| 1173 } | 1179 } |
| 1174 | 1180 |
| 1181 void RenderWidget::DestroyLayerTreeView() { | |
| 1182 if (!compositor_) | |
| 1183 return; | |
| 1184 webwidget_->willCloseLayerTreeView(); | |
| 1185 compositor_.reset(); | |
| 1186 } | |
| 1187 | |
| 1175 blink::WebLayerTreeView* RenderWidget::layerTreeView() { | 1188 blink::WebLayerTreeView* RenderWidget::layerTreeView() { |
| 1176 return compositor_.get(); | 1189 return compositor_.get(); |
| 1177 } | 1190 } |
| 1178 | 1191 |
| 1179 void RenderWidget::suppressCompositorScheduling(bool enable) { | 1192 void RenderWidget::suppressCompositorScheduling(bool enable) { |
| 1180 if (compositor_) | 1193 if (compositor_) |
| 1181 compositor_->SetSuppressScheduleComposite(enable); | 1194 compositor_->SetSuppressScheduleComposite(enable); |
| 1182 } | 1195 } |
| 1183 | 1196 |
| 1184 void RenderWidget::willBeginCompositorFrame() { | 1197 void RenderWidget::willBeginCompositorFrame() { |
| 1185 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); | 1198 TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); |
| 1186 | 1199 |
| 1187 DCHECK(RenderThreadImpl::current()->compositor_message_loop_proxy().get()); | |
| 1188 | |
| 1189 // The following two can result in further layout and possibly | 1200 // The following two can result in further layout and possibly |
| 1190 // enable GPU acceleration so they need to be called before any painting | 1201 // enable GPU acceleration so they need to be called before any painting |
| 1191 // is done. | 1202 // is done. |
| 1192 UpdateTextInputState(NO_SHOW_IME, FROM_NON_IME); | 1203 UpdateTextInputState(NO_SHOW_IME, FROM_NON_IME); |
| 1193 UpdateSelectionBounds(); | 1204 UpdateSelectionBounds(); |
| 1194 } | 1205 } |
| 1195 | 1206 |
| 1196 void RenderWidget::didBecomeReadyForAdditionalInput() { | 1207 void RenderWidget::didBecomeReadyForAdditionalInput() { |
| 1197 TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput"); | 1208 TRACE_EVENT0("renderer", "RenderWidget::didBecomeReadyForAdditionalInput"); |
| 1198 FlushPendingInputEventAck(); | 1209 FlushPendingInputEventAck(); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1282 SetPendingWindowRect(initial_pos_); | 1293 SetPendingWindowRect(initial_pos_); |
| 1283 } | 1294 } |
| 1284 | 1295 |
| 1285 void RenderWidget::didFocus() { | 1296 void RenderWidget::didFocus() { |
| 1286 } | 1297 } |
| 1287 | 1298 |
| 1288 void RenderWidget::didBlur() { | 1299 void RenderWidget::didBlur() { |
| 1289 } | 1300 } |
| 1290 | 1301 |
| 1291 void RenderWidget::DoDeferredClose() { | 1302 void RenderWidget::DoDeferredClose() { |
| 1303 // No more compositing is possible. This prevents shutdown races between | |
| 1304 // previously posted CreateOutputSurface tasks and the host being unable to | |
| 1305 // create them because the close message was handled. | |
| 1306 DestroyLayerTreeView(); | |
|
enne (OOO)
2014/07/02 21:19:43
This is the Chromium side of preventing the race t
| |
| 1307 // Also prevent new compositors from being created. | |
| 1308 host_closing_ = true; | |
| 1292 Send(new ViewHostMsg_Close(routing_id_)); | 1309 Send(new ViewHostMsg_Close(routing_id_)); |
| 1293 } | 1310 } |
| 1294 | 1311 |
| 1295 void RenderWidget::closeWidgetSoon() { | 1312 void RenderWidget::closeWidgetSoon() { |
| 1296 if (is_swapped_out_) { | 1313 if (is_swapped_out_) { |
| 1297 // This widget is currently swapped out, and the active widget is in a | 1314 // This widget is currently swapped out, and the active widget is in a |
| 1298 // different process. Have the browser route the close request to the | 1315 // different process. Have the browser route the close request to the |
| 1299 // active widget instead, so that the correct unload handlers are run. | 1316 // active widget instead, so that the correct unload handlers are run. |
| 1300 Send(new ViewHostMsg_RouteCloseEvent(routing_id_)); | 1317 Send(new ViewHostMsg_RouteCloseEvent(routing_id_)); |
| 1301 return; | 1318 return; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1321 pending_synthetic_gesture_callbacks_.push(callback); | 1338 pending_synthetic_gesture_callbacks_.push(callback); |
| 1322 | 1339 |
| 1323 SyntheticGesturePacket gesture_packet; | 1340 SyntheticGesturePacket gesture_packet; |
| 1324 gesture_packet.set_gesture_params(gesture_params.Pass()); | 1341 gesture_packet.set_gesture_params(gesture_params.Pass()); |
| 1325 | 1342 |
| 1326 Send(new InputHostMsg_QueueSyntheticGesture(routing_id_, gesture_packet)); | 1343 Send(new InputHostMsg_QueueSyntheticGesture(routing_id_, gesture_packet)); |
| 1327 } | 1344 } |
| 1328 | 1345 |
| 1329 void RenderWidget::Close() { | 1346 void RenderWidget::Close() { |
| 1330 if (webwidget_) { | 1347 if (webwidget_) { |
| 1331 webwidget_->willCloseLayerTreeView(); | 1348 DestroyLayerTreeView(); |
| 1332 compositor_.reset(); | |
| 1333 webwidget_->close(); | 1349 webwidget_->close(); |
| 1334 webwidget_ = NULL; | 1350 webwidget_ = NULL; |
| 1335 } | 1351 } |
| 1336 } | 1352 } |
| 1337 | 1353 |
| 1338 WebRect RenderWidget::windowRect() { | 1354 WebRect RenderWidget::windowRect() { |
| 1339 if (pending_window_rect_count_) | 1355 if (pending_window_rect_count_) |
| 1340 return pending_window_rect_; | 1356 return pending_window_rect_; |
| 1341 | 1357 |
| 1342 return view_screen_rect_; | 1358 return view_screen_rect_; |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2065 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { | 2081 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { |
| 2066 video_hole_frames_.AddObserver(frame); | 2082 video_hole_frames_.AddObserver(frame); |
| 2067 } | 2083 } |
| 2068 | 2084 |
| 2069 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { | 2085 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { |
| 2070 video_hole_frames_.RemoveObserver(frame); | 2086 video_hole_frames_.RemoveObserver(frame); |
| 2071 } | 2087 } |
| 2072 #endif // defined(VIDEO_HOLE) | 2088 #endif // defined(VIDEO_HOLE) |
| 2073 | 2089 |
| 2074 } // namespace content | 2090 } // namespace content |
| OLD | NEW |