Use signals from RenderWidgetImpl to guide scheduling

The main aim of this patch is to add a bit into the scheduler so it
can know if there are any touch handlers that could possibly fire.

If there are none then we should /not/ expect a user gesture
(because expecting one may cause expensive loading and timer tasks
to get blocked).

BUG=510398, 544185

Review URL: https://codereview.chromium.org/1412713002

Cr-Commit-Position: refs/heads/master@{#355298}
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 1210396..2ece707 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -22,6 +22,7 @@
 #include "cc/debug/benchmark_instrumentation.h"
 #include "cc/output/output_surface.h"
 #include "cc/trees/layer_tree_host.h"
+#include "components/scheduler/renderer/render_widget_scheduling_state.h"
 #include "components/scheduler/renderer/renderer_scheduler.h"
 #include "content/child/npapi/webplugin.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
@@ -529,6 +530,15 @@
 #if defined(OS_ANDROID)
   text_input_info_history_.push_back(blink::WebTextInputInfo());
 #endif
+
+  // In tests there may not be a RenderThreadImpl.
+  if (RenderThreadImpl::current()) {
+    render_widget_scheduling_state_ = RenderThreadImpl::current()
+                                          ->GetRendererScheduler()
+                                          ->NewRenderWidgetSchedulingState()
+                                          .Pass();
+    render_widget_scheduling_state_->SetHidden(is_hidden_);
+  }
 }
 
 RenderWidget::~RenderWidget() {
@@ -1830,6 +1840,9 @@
     RenderThreadImpl::current()->WidgetHidden();
   else
     RenderThreadImpl::current()->WidgetRestored();
+
+  if (render_widget_scheduling_state_)
+    render_widget_scheduling_state_->SetHidden(hidden);
 }
 
 void RenderWidget::DidToggleFullscreen() {
@@ -2239,6 +2252,8 @@
 }
 
 void RenderWidget::hasTouchEventHandlers(bool has_handlers) {
+  if (render_widget_scheduling_state_)
+    render_widget_scheduling_state_->SetHasTouchHandler(has_handlers);
   Send(new ViewHostMsg_HasTouchEventHandlers(routing_id_, has_handlers));
 }