| 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/browser/renderer_host/render_widget_host_impl.h" | 5 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 in_flight_event_count_(0), | 179 in_flight_event_count_(0), |
| 180 in_get_backing_store_(false), | 180 in_get_backing_store_(false), |
| 181 ignore_input_events_(false), | 181 ignore_input_events_(false), |
| 182 input_method_active_(false), | 182 input_method_active_(false), |
| 183 text_direction_updated_(false), | 183 text_direction_updated_(false), |
| 184 text_direction_(blink::WebTextDirectionLeftToRight), | 184 text_direction_(blink::WebTextDirectionLeftToRight), |
| 185 text_direction_canceled_(false), | 185 text_direction_canceled_(false), |
| 186 suppress_next_char_events_(false), | 186 suppress_next_char_events_(false), |
| 187 pending_mouse_lock_request_(false), | 187 pending_mouse_lock_request_(false), |
| 188 allow_privileged_mouse_lock_(false), | 188 allow_privileged_mouse_lock_(false), |
| 189 has_touch_handler_(false), | |
| 190 last_input_number_(static_cast<int64>(GetProcess()->GetID()) << 32), | 189 last_input_number_(static_cast<int64>(GetProcess()->GetID()) << 32), |
| 191 next_browser_snapshot_id_(1), | 190 next_browser_snapshot_id_(1), |
| 192 browser_composite_latency_history_(kBrowserCompositeLatencyHistorySize), | 191 browser_composite_latency_history_(kBrowserCompositeLatencyHistorySize), |
| 193 weak_factory_(this) { | 192 weak_factory_(this) { |
| 194 CHECK(delegate_); | 193 CHECK(delegate_); |
| 195 if (routing_id_ == MSG_ROUTING_NONE) { | 194 if (routing_id_ == MSG_ROUTING_NONE) { |
| 196 routing_id_ = process_->GetNextRoutingID(); | 195 routing_id_ = process_->GetNextRoutingID(); |
| 197 surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( | 196 surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( |
| 198 process_->GetID(), | 197 process_->GetID(), |
| 199 routing_id_); | 198 routing_id_); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 215 g_routing_id_widget_map.Get().insert(std::make_pair( | 214 g_routing_id_widget_map.Get().insert(std::make_pair( |
| 216 RenderWidgetHostID(process->GetID(), routing_id_), this)); | 215 RenderWidgetHostID(process->GetID(), routing_id_), this)); |
| 217 CHECK(result.second) << "Inserting a duplicate item!"; | 216 CHECK(result.second) << "Inserting a duplicate item!"; |
| 218 process_->AddRoute(routing_id_, this); | 217 process_->AddRoute(routing_id_, this); |
| 219 | 218 |
| 220 // If we're initially visible, tell the process host that we're alive. | 219 // If we're initially visible, tell the process host that we're alive. |
| 221 // Otherwise we'll notify the process host when we are first shown. | 220 // Otherwise we'll notify the process host when we are first shown. |
| 222 if (!hidden) | 221 if (!hidden) |
| 223 process_->WidgetRestored(); | 222 process_->WidgetRestored(); |
| 224 | 223 |
| 225 input_router_.reset(new InputRouterImpl( | 224 ResetInputRouter(); |
| 226 process_, this, this, routing_id_, GetInputRouterConfigForPlatform())); | |
| 227 | |
| 228 touch_emulator_.reset(); | |
| 229 | 225 |
| 230 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 226 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
| 231 IsRenderView() ? RenderViewHost::From(this) : NULL); | 227 IsRenderView() ? RenderViewHost::From(this) : NULL); |
| 232 if (BrowserPluginGuest::IsGuest(rvh) || | 228 if (BrowserPluginGuest::IsGuest(rvh) || |
| 233 !base::CommandLine::ForCurrentProcess()->HasSwitch( | 229 !base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 234 switches::kDisableHangMonitor)) { | 230 switches::kDisableHangMonitor)) { |
| 235 hang_monitor_timeout_.reset(new TimeoutMonitor( | 231 hang_monitor_timeout_.reset(new TimeoutMonitor( |
| 236 base::Bind(&RenderWidgetHostImpl::RendererIsUnresponsive, | 232 base::Bind(&RenderWidgetHostImpl::RendererIsUnresponsive, |
| 237 weak_factory_.GetWeakPtr()))); | 233 weak_factory_.GetWeakPtr()))); |
| 238 } | 234 } |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 GetRoutingID(), last_view_screen_rect_, last_window_screen_rect_)); | 380 GetRoutingID(), last_view_screen_rect_, last_window_screen_rect_)); |
| 385 if (delegate_) | 381 if (delegate_) |
| 386 delegate_->DidSendScreenRects(this); | 382 delegate_->DidSendScreenRects(this); |
| 387 waiting_for_screen_rects_ack_ = true; | 383 waiting_for_screen_rects_ack_ = true; |
| 388 } | 384 } |
| 389 | 385 |
| 390 void RenderWidgetHostImpl::SuppressNextCharEvents() { | 386 void RenderWidgetHostImpl::SuppressNextCharEvents() { |
| 391 suppress_next_char_events_ = true; | 387 suppress_next_char_events_ = true; |
| 392 } | 388 } |
| 393 | 389 |
| 390 void RenderWidgetHostImpl::ResetPendingInput() { |
| 391 if (input_router_->HasPendingEvents()) |
| 392 ResetInputRouter(); |
| 393 } |
| 394 |
| 394 void RenderWidgetHostImpl::FlushInput() { | 395 void RenderWidgetHostImpl::FlushInput() { |
| 395 input_router_->Flush(); | 396 input_router_->RequestFlushedNotification(); |
| 396 if (synthetic_gesture_controller_) | 397 if (synthetic_gesture_controller_) |
| 397 synthetic_gesture_controller_->Flush(base::TimeTicks::Now()); | 398 synthetic_gesture_controller_->Flush(base::TimeTicks::Now()); |
| 398 } | 399 } |
| 399 | 400 |
| 400 void RenderWidgetHostImpl::SetNeedsFlush() { | 401 void RenderWidgetHostImpl::SetNeedsFlushInput() { |
| 401 if (view_) | 402 if (view_) |
| 402 view_->OnSetNeedsFlushInput(); | 403 view_->OnSetNeedsFlushInput(); |
| 403 } | 404 } |
| 404 | 405 |
| 405 void RenderWidgetHostImpl::Init() { | 406 void RenderWidgetHostImpl::Init() { |
| 406 DCHECK(process_->HasConnection()); | 407 DCHECK(process_->HasConnection()); |
| 407 | 408 |
| 408 renderer_initialized_ = true; | 409 renderer_initialized_ = true; |
| 409 | 410 |
| 410 GpuSurfaceTracker::Get()->SetSurfaceHandle( | 411 GpuSurfaceTracker::Get()->SetSurfaceHandle( |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 void RenderWidgetHostImpl::ForwardWheelEvent( | 890 void RenderWidgetHostImpl::ForwardWheelEvent( |
| 890 const WebMouseWheelEvent& wheel_event) { | 891 const WebMouseWheelEvent& wheel_event) { |
| 891 ForwardWheelEventWithLatencyInfo(wheel_event, ui::LatencyInfo()); | 892 ForwardWheelEventWithLatencyInfo(wheel_event, ui::LatencyInfo()); |
| 892 } | 893 } |
| 893 | 894 |
| 894 void RenderWidgetHostImpl::ForwardWheelEventWithLatencyInfo( | 895 void RenderWidgetHostImpl::ForwardWheelEventWithLatencyInfo( |
| 895 const blink::WebMouseWheelEvent& wheel_event, | 896 const blink::WebMouseWheelEvent& wheel_event, |
| 896 const ui::LatencyInfo& ui_latency) { | 897 const ui::LatencyInfo& ui_latency) { |
| 897 TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardWheelEvent"); | 898 TRACE_EVENT0("input", "RenderWidgetHostImpl::ForwardWheelEvent"); |
| 898 | 899 |
| 900 if (IgnoreInputEvents()) |
| 901 return; |
| 902 |
| 899 ui::LatencyInfo::InputCoordinate logical_coordinate(wheel_event.x, | 903 ui::LatencyInfo::InputCoordinate logical_coordinate(wheel_event.x, |
| 900 wheel_event.y); | 904 wheel_event.y); |
| 901 | 905 |
| 902 ui::LatencyInfo latency_info = CreateInputEventLatencyInfoIfNotExist( | 906 ui::LatencyInfo latency_info = CreateInputEventLatencyInfoIfNotExist( |
| 903 &ui_latency, wheel_event.type, &logical_coordinate, 1); | 907 &ui_latency, wheel_event.type, &logical_coordinate, 1); |
| 904 | 908 |
| 905 if (IgnoreInputEvents()) | |
| 906 return; | |
| 907 | |
| 908 if (touch_emulator_ && touch_emulator_->HandleMouseWheelEvent(wheel_event)) | 909 if (touch_emulator_ && touch_emulator_->HandleMouseWheelEvent(wheel_event)) |
| 909 return; | 910 return; |
| 910 | 911 |
| 911 input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(wheel_event, | 912 input_router_->SendWheelEvent(MouseWheelEventWithLatencyInfo(wheel_event, |
| 912 latency_info)); | 913 latency_info)); |
| 913 } | 914 } |
| 914 | 915 |
| 915 void RenderWidgetHostImpl::ForwardGestureEvent( | 916 void RenderWidgetHostImpl::ForwardGestureEvent( |
| 916 const blink::WebGestureEvent& gesture_event) { | 917 const blink::WebGestureEvent& gesture_event) { |
| 917 ForwardGestureEventWithLatencyInfo(gesture_event, ui::LatencyInfo()); | 918 ForwardGestureEventWithLatencyInfo(gesture_event, ui::LatencyInfo()); |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1280 gfx::GLSurfaceHandle()); | 1281 gfx::GLSurfaceHandle()); |
| 1281 view_->RenderProcessGone(status, exit_code); | 1282 view_->RenderProcessGone(status, exit_code); |
| 1282 view_ = NULL; // The View should be deleted by RenderProcessGone. | 1283 view_ = NULL; // The View should be deleted by RenderProcessGone. |
| 1283 view_weak_.reset(); | 1284 view_weak_.reset(); |
| 1284 } | 1285 } |
| 1285 | 1286 |
| 1286 // Reconstruct the input router to ensure that it has fresh state for a new | 1287 // Reconstruct the input router to ensure that it has fresh state for a new |
| 1287 // renderer. Otherwise it may be stuck waiting for the old renderer to ack an | 1288 // renderer. Otherwise it may be stuck waiting for the old renderer to ack an |
| 1288 // event. (In particular, the above call to view_->RenderProcessGone will | 1289 // event. (In particular, the above call to view_->RenderProcessGone will |
| 1289 // destroy the aura window, which may dispatch a synthetic mouse move.) | 1290 // destroy the aura window, which may dispatch a synthetic mouse move.) |
| 1290 input_router_.reset(new InputRouterImpl( | 1291 ResetInputRouter(); |
| 1291 process_, this, this, routing_id_, GetInputRouterConfigForPlatform())); | |
| 1292 | 1292 |
| 1293 synthetic_gesture_controller_.reset(); | 1293 synthetic_gesture_controller_.reset(); |
| 1294 } | 1294 } |
| 1295 | 1295 |
| 1296 void RenderWidgetHostImpl::UpdateTextDirection(WebTextDirection direction) { | 1296 void RenderWidgetHostImpl::UpdateTextDirection(WebTextDirection direction) { |
| 1297 text_direction_updated_ = true; | 1297 text_direction_updated_ = true; |
| 1298 text_direction_ = direction; | 1298 text_direction_ = direction; |
| 1299 } | 1299 } |
| 1300 | 1300 |
| 1301 void RenderWidgetHostImpl::CancelUpdateTextDirection() { | 1301 void RenderWidgetHostImpl::CancelUpdateTextDirection() { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1409 NotifyRendererUnresponsive(); | 1409 NotifyRendererUnresponsive(); |
| 1410 } | 1410 } |
| 1411 | 1411 |
| 1412 void RenderWidgetHostImpl::RendererIsResponsive() { | 1412 void RenderWidgetHostImpl::RendererIsResponsive() { |
| 1413 if (is_unresponsive_) { | 1413 if (is_unresponsive_) { |
| 1414 is_unresponsive_ = false; | 1414 is_unresponsive_ = false; |
| 1415 NotifyRendererResponsive(); | 1415 NotifyRendererResponsive(); |
| 1416 } | 1416 } |
| 1417 } | 1417 } |
| 1418 | 1418 |
| 1419 void RenderWidgetHostImpl::ResetInputRouter() { |
| 1420 base::AutoReset<bool> reset_ignore_input_events(&ignore_input_events_, true); |
| 1421 input_router_.reset(new InputRouterImpl( |
| 1422 process_, this, this, routing_id_, GetInputRouterConfigForPlatform())); |
| 1423 } |
| 1424 |
| 1419 void RenderWidgetHostImpl::OnRenderViewReady() { | 1425 void RenderWidgetHostImpl::OnRenderViewReady() { |
| 1420 SendScreenRects(); | 1426 SendScreenRects(); |
| 1421 WasResized(); | 1427 WasResized(); |
| 1422 } | 1428 } |
| 1423 | 1429 |
| 1424 void RenderWidgetHostImpl::OnRenderProcessGone(int status, int exit_code) { | 1430 void RenderWidgetHostImpl::OnRenderProcessGone(int status, int exit_code) { |
| 1425 // TODO(evanm): This synchronously ends up calling "delete this". | 1431 // TODO(evanm): This synchronously ends up calling "delete this". |
| 1426 // Is that really what we want in response to this message? I'm matching | 1432 // Is that really what we want in response to this message? I'm matching |
| 1427 // previous behavior of the code here. | 1433 // previous behavior of the code here. |
| 1428 Destroy(); | 1434 Destroy(); |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1850 DCHECK_GE(in_flight_event_count_, 0); | 1856 DCHECK_GE(in_flight_event_count_, 0); |
| 1851 if (decrement_in_flight_event_count() <= 0) { | 1857 if (decrement_in_flight_event_count() <= 0) { |
| 1852 // Cancel pending hung renderer checks since the renderer is responsive. | 1858 // Cancel pending hung renderer checks since the renderer is responsive. |
| 1853 StopHangMonitorTimeout(); | 1859 StopHangMonitorTimeout(); |
| 1854 } else { | 1860 } else { |
| 1855 // The renderer is responsive, but there are in-flight events to wait for. | 1861 // The renderer is responsive, but there are in-flight events to wait for. |
| 1856 RestartHangMonitorTimeout(); | 1862 RestartHangMonitorTimeout(); |
| 1857 } | 1863 } |
| 1858 } | 1864 } |
| 1859 | 1865 |
| 1860 void RenderWidgetHostImpl::OnHasTouchEventHandlers(bool has_handlers) { | |
| 1861 has_touch_handler_ = has_handlers; | |
| 1862 } | |
| 1863 | |
| 1864 void RenderWidgetHostImpl::DidFlush() { | 1866 void RenderWidgetHostImpl::DidFlush() { |
| 1865 if (synthetic_gesture_controller_) | 1867 if (synthetic_gesture_controller_) |
| 1866 synthetic_gesture_controller_->OnDidFlushInput(); | 1868 synthetic_gesture_controller_->OnDidFlushInput(); |
| 1867 if (view_) | |
| 1868 view_->OnDidFlushInput(); | |
| 1869 } | 1869 } |
| 1870 | 1870 |
| 1871 void RenderWidgetHostImpl::DidOverscroll(const DidOverscrollParams& params) { | 1871 void RenderWidgetHostImpl::DidOverscroll(const DidOverscrollParams& params) { |
| 1872 if (view_) | 1872 if (view_) |
| 1873 view_->DidOverscroll(params); | 1873 view_->DidOverscroll(params); |
| 1874 } | 1874 } |
| 1875 | 1875 |
| 1876 void RenderWidgetHostImpl::OnKeyboardEventAck( | 1876 void RenderWidgetHostImpl::OnKeyboardEventAck( |
| 1877 const NativeWebKeyboardEvent& event, | 1877 const NativeWebKeyboardEvent& event, |
| 1878 InputEventAckState ack_result) { | 1878 InputEventAckState ack_result) { |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2421 } | 2421 } |
| 2422 #endif | 2422 #endif |
| 2423 | 2423 |
| 2424 SkColorType RenderWidgetHostImpl::PreferredReadbackFormat() { | 2424 SkColorType RenderWidgetHostImpl::PreferredReadbackFormat() { |
| 2425 if (view_) | 2425 if (view_) |
| 2426 return view_->PreferredReadbackFormat(); | 2426 return view_->PreferredReadbackFormat(); |
| 2427 return kN32_SkColorType; | 2427 return kN32_SkColorType; |
| 2428 } | 2428 } |
| 2429 | 2429 |
| 2430 } // namespace content | 2430 } // namespace content |
| OLD | NEW |