Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: content/browser/renderer_host/render_widget_host_impl.cc

Issue 48973005: Move TouchEvent timeout code to the TouchEventQueue (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 16 matching lines...) Expand all
27 #include "content/browser/gpu/gpu_process_host.h" 27 #include "content/browser/gpu/gpu_process_host.h"
28 #include "content/browser/gpu/gpu_process_host_ui_shim.h" 28 #include "content/browser/gpu/gpu_process_host_ui_shim.h"
29 #include "content/browser/gpu/gpu_surface_tracker.h" 29 #include "content/browser/gpu/gpu_surface_tracker.h"
30 #include "content/browser/renderer_host/backing_store.h" 30 #include "content/browser/renderer_host/backing_store.h"
31 #include "content/browser/renderer_host/backing_store_manager.h" 31 #include "content/browser/renderer_host/backing_store_manager.h"
32 #include "content/browser/renderer_host/dip_util.h" 32 #include "content/browser/renderer_host/dip_util.h"
33 #include "content/browser/renderer_host/input/input_router_impl.h" 33 #include "content/browser/renderer_host/input/input_router_impl.h"
34 #include "content/browser/renderer_host/input/synthetic_gesture.h" 34 #include "content/browser/renderer_host/input/synthetic_gesture.h"
35 #include "content/browser/renderer_host/input/synthetic_gesture_controller.h" 35 #include "content/browser/renderer_host/input/synthetic_gesture_controller.h"
36 #include "content/browser/renderer_host/input/synthetic_gesture_target.h" 36 #include "content/browser/renderer_host/input/synthetic_gesture_target.h"
37 #include "content/browser/renderer_host/input/timeout_monitor.h"
37 #include "content/browser/renderer_host/overscroll_controller.h" 38 #include "content/browser/renderer_host/overscroll_controller.h"
38 #include "content/browser/renderer_host/render_process_host_impl.h" 39 #include "content/browser/renderer_host/render_process_host_impl.h"
39 #include "content/browser/renderer_host/render_view_host_impl.h" 40 #include "content/browser/renderer_host/render_view_host_impl.h"
40 #include "content/browser/renderer_host/render_widget_helper.h" 41 #include "content/browser/renderer_host/render_widget_helper.h"
41 #include "content/browser/renderer_host/render_widget_host_delegate.h" 42 #include "content/browser/renderer_host/render_widget_host_delegate.h"
42 #include "content/common/accessibility_messages.h" 43 #include "content/common/accessibility_messages.h"
43 #include "content/common/content_constants_internal.h" 44 #include "content/common/content_constants_internal.h"
44 #include "content/common/gpu/gpu_messages.h" 45 #include "content/common/gpu/gpu_messages.h"
45 #include "content/common/input_messages.h" 46 #include "content/common/input_messages.h"
46 #include "content/common/view_messages.h" 47 #include "content/common/view_messages.h"
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 accessibility_mode_ = 227 accessibility_mode_ =
227 BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode(); 228 BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode();
228 229
229 input_router_.reset(new InputRouterImpl(process_, this, this, routing_id_)); 230 input_router_.reset(new InputRouterImpl(process_, this, this, routing_id_));
230 231
231 #if defined(USE_AURA) 232 #if defined(USE_AURA)
232 bool overscroll_enabled = CommandLine::ForCurrentProcess()-> 233 bool overscroll_enabled = CommandLine::ForCurrentProcess()->
233 GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0"; 234 GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0";
234 SetOverscrollControllerEnabled(overscroll_enabled); 235 SetOverscrollControllerEnabled(overscroll_enabled);
235 #endif 236 #endif
237
238 if (GetProcess()->IsGuest() || !CommandLine::ForCurrentProcess()->HasSwitch(
239 switches::kDisableHangMonitor)) {
240 hang_monitor_timeout_.reset(new TimeoutMonitor(
241 base::Bind(&RenderWidgetHostImpl::RendererIsUnresponsive,
242 weak_factory_.GetWeakPtr())));
243 }
236 } 244 }
237 245
238 RenderWidgetHostImpl::~RenderWidgetHostImpl() { 246 RenderWidgetHostImpl::~RenderWidgetHostImpl() {
239 SetView(NULL); 247 SetView(NULL);
240 248
241 // Clear our current or cached backing store if either remains. 249 // Clear our current or cached backing store if either remains.
242 BackingStoreManager::RemoveBackingStore(this); 250 BackingStoreManager::RemoveBackingStore(this);
243 251
244 GpuSurfaceTracker::Get()->RemoveSurface(surface_id_); 252 GpuSurfaceTracker::Get()->RemoveSurface(surface_id_);
245 surface_id_ = 0; 253 surface_id_ = 0;
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 898
891 // Send out a request to the renderer to paint the view if required. 899 // Send out a request to the renderer to paint the view if required.
892 repaint_start_time_ = TimeTicks::Now(); 900 repaint_start_time_ = TimeTicks::Now();
893 repaint_ack_pending_ = true; 901 repaint_ack_pending_ = true;
894 TRACE_EVENT_ASYNC_BEGIN0( 902 TRACE_EVENT_ASYNC_BEGIN0(
895 "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); 903 "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this);
896 Send(new ViewMsg_Repaint(routing_id_, current_size_)); 904 Send(new ViewMsg_Repaint(routing_id_, current_size_));
897 return true; 905 return true;
898 } 906 }
899 907
900 void RenderWidgetHostImpl::StartHangMonitorTimeout(TimeDelta delay) { 908 void RenderWidgetHostImpl::StartHangMonitorTimeout(base::TimeDelta delay) {
901 if (!GetProcess()->IsGuest() && CommandLine::ForCurrentProcess()->HasSwitch( 909 if (hang_monitor_timeout_)
902 switches::kDisableHangMonitor)) { 910 hang_monitor_timeout_->Start(delay);
903 return;
904 }
905
906 // Set time_when_considered_hung_ if it's null. Also, update
907 // time_when_considered_hung_ if the caller's request is sooner than the
908 // existing one. This will have the side effect that the existing timeout will
909 // be forgotten.
910 Time requested_end_time = Time::Now() + delay;
911 if (time_when_considered_hung_.is_null() ||
912 time_when_considered_hung_ > requested_end_time)
913 time_when_considered_hung_ = requested_end_time;
914
915 // If we already have a timer with the same or shorter duration, then we can
916 // wait for it to finish.
917 if (hung_renderer_timer_.IsRunning() &&
918 hung_renderer_timer_.GetCurrentDelay() <= delay) {
919 // If time_when_considered_hung_ was null, this timer may fire early.
920 // CheckRendererIsUnresponsive handles that by calling
921 // StartHangMonitorTimeout with the remaining time.
922 // If time_when_considered_hung_ was non-null, it means we still haven't
923 // heard from the renderer so we leave time_when_considered_hung_ as is.
924 return;
925 }
926
927 // Either the timer is not yet running, or we need to adjust the timer to
928 // fire sooner.
929 time_when_considered_hung_ = requested_end_time;
930 hung_renderer_timer_.Stop();
931 hung_renderer_timer_.Start(FROM_HERE, delay, this,
932 &RenderWidgetHostImpl::CheckRendererIsUnresponsive);
933 } 911 }
934 912
935 void RenderWidgetHostImpl::RestartHangMonitorTimeout() { 913 void RenderWidgetHostImpl::RestartHangMonitorTimeout() {
936 // Setting to null will cause StartHangMonitorTimeout to restart the timer. 914 if (hang_monitor_timeout_)
937 time_when_considered_hung_ = Time(); 915 hang_monitor_timeout_->Restart(
938 StartHangMonitorTimeout( 916 base::TimeDelta::FromMilliseconds(hung_renderer_delay_ms_));
939 TimeDelta::FromMilliseconds(hung_renderer_delay_ms_));
940 } 917 }
941 918
942 void RenderWidgetHostImpl::StopHangMonitorTimeout() { 919 void RenderWidgetHostImpl::StopHangMonitorTimeout() {
943 time_when_considered_hung_ = Time(); 920 if (hang_monitor_timeout_)
921 hang_monitor_timeout_->Stop();
944 RendererIsResponsive(); 922 RendererIsResponsive();
945 // We do not bother to stop the hung_renderer_timer_ here in case it will be
946 // started again shortly, which happens to be the common use case.
947 } 923 }
948 924
949 void RenderWidgetHostImpl::EnableFullAccessibilityMode() { 925 void RenderWidgetHostImpl::EnableFullAccessibilityMode() {
950 SetAccessibilityMode(AccessibilityModeComplete); 926 SetAccessibilityMode(AccessibilityModeComplete);
951 } 927 }
952 928
953 void RenderWidgetHostImpl::ForwardMouseEvent(const WebMouseEvent& mouse_event) { 929 void RenderWidgetHostImpl::ForwardMouseEvent(const WebMouseEvent& mouse_event) {
954 ForwardMouseEventWithLatencyInfo( 930 ForwardMouseEventWithLatencyInfo(
955 MouseEventWithLatencyInfo(mouse_event, 931 MouseEventWithLatencyInfo(mouse_event,
956 CreateRWHLatencyInfoIfNotExist(NULL))); 932 CreateRWHLatencyInfoIfNotExist(NULL)));
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 // Tell the view to die. 1367 // Tell the view to die.
1392 // Note that in the process of the view shutting down, it can call a ton 1368 // Note that in the process of the view shutting down, it can call a ton
1393 // of other messages on us. So if you do any other deinitialization here, 1369 // of other messages on us. So if you do any other deinitialization here,
1394 // do it after this call to view_->Destroy(). 1370 // do it after this call to view_->Destroy().
1395 if (view_) 1371 if (view_)
1396 view_->Destroy(); 1372 view_->Destroy();
1397 1373
1398 delete this; 1374 delete this;
1399 } 1375 }
1400 1376
1401 void RenderWidgetHostImpl::CheckRendererIsUnresponsive() { 1377 void RenderWidgetHostImpl::RendererIsUnresponsive() {
1402 // If we received a call to StopHangMonitorTimeout.
1403 if (time_when_considered_hung_.is_null())
1404 return;
1405
1406 // If we have not waited long enough, then wait some more.
1407 Time now = Time::Now();
1408 if (now < time_when_considered_hung_) {
1409 StartHangMonitorTimeout(time_when_considered_hung_ - now);
1410 return;
1411 }
1412
1413 // OK, looks like we have a hung renderer!
1414 NotificationService::current()->Notify( 1378 NotificationService::current()->Notify(
1415 NOTIFICATION_RENDER_WIDGET_HOST_HANG, 1379 NOTIFICATION_RENDER_WIDGET_HOST_HANG,
1416 Source<RenderWidgetHost>(this), 1380 Source<RenderWidgetHost>(this),
1417 NotificationService::NoDetails()); 1381 NotificationService::NoDetails());
1418 is_unresponsive_ = true; 1382 is_unresponsive_ = true;
1419 NotifyRendererUnresponsive(); 1383 NotifyRendererUnresponsive();
1420 } 1384 }
1421 1385
1422 void RenderWidgetHostImpl::RendererIsResponsive() { 1386 void RenderWidgetHostImpl::RendererIsResponsive() {
1423 if (is_unresponsive_) { 1387 if (is_unresponsive_) {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 1494
1531 bool RenderWidgetHostImpl::OnSwapCompositorFrame( 1495 bool RenderWidgetHostImpl::OnSwapCompositorFrame(
1532 const IPC::Message& message) { 1496 const IPC::Message& message) {
1533 ViewHostMsg_SwapCompositorFrame::Param param; 1497 ViewHostMsg_SwapCompositorFrame::Param param;
1534 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, &param)) 1498 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, &param))
1535 return false; 1499 return false;
1536 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); 1500 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
1537 uint32 output_surface_id = param.a; 1501 uint32 output_surface_id = param.a;
1538 param.b.AssignTo(frame.get()); 1502 param.b.AssignTo(frame.get());
1539 1503
1504 bool fixed_page_scale =
1505 frame->metadata.min_page_scale_factor ==
1506 frame->metadata.max_page_scale_factor;
1507 int updated_view_flags = fixed_page_scale ? InputRouter::FIXED_PAGE_SCALE
1508 : InputRouter::VIEW_FLAGS_NONE;
1509 input_router_->OnViewUpdated(updated_view_flags);
1510
1540 if (view_) { 1511 if (view_) {
1541 view_->OnSwapCompositorFrame(output_surface_id, frame.Pass()); 1512 view_->OnSwapCompositorFrame(output_surface_id, frame.Pass());
1542 view_->DidReceiveRendererFrame(); 1513 view_->DidReceiveRendererFrame();
1543 } else { 1514 } else {
1544 cc::CompositorFrameAck ack; 1515 cc::CompositorFrameAck ack;
1545 if (frame->gl_frame_data) { 1516 if (frame->gl_frame_data) {
1546 ack.gl_frame_data = frame->gl_frame_data.Pass(); 1517 ack.gl_frame_data = frame->gl_frame_data.Pass();
1547 ack.gl_frame_data->sync_point = 0; 1518 ack.gl_frame_data->sync_point = 0;
1548 } else if (frame->delegated_frame_data) { 1519 } else if (frame->delegated_frame_data) {
1549 cc::TransferableResource::ReturnResources( 1520 cc::TransferableResource::ReturnResources(
(...skipping 945 matching lines...) Expand 10 before | Expand all | Expand 10 after
2495 continue; 2466 continue;
2496 } 2467 }
2497 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rwh); 2468 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rwh);
2498 if (rwhi_set.insert(rwhi).second) 2469 if (rwhi_set.insert(rwhi).second)
2499 rwhi->FrameSwapped(latency_info); 2470 rwhi->FrameSwapped(latency_info);
2500 } 2471 }
2501 } 2472 }
2502 } 2473 }
2503 2474
2504 } // namespace content 2475 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_impl.h ('k') | content/browser/renderer_host/render_widget_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698