docs: function(event, queue, visited, flowEvents) {
        var stopFollowing = false;
        var inputAck = false;
  
        event.iterateAllSubsequentSlices(function(slice) {
          if (stopFollowing)
            return;
  
          // Do not follow TaskQueueManager::RunTask because it causes
          // many false events to be included.
          if (slice.title === 'TaskQueueManager::RunTask')
            return;
  
          // Do not follow ScheduledActionSendBeginMainFrame because the real
          // main thread BeginMainFrame is already traced by LatencyInfo flow.
          if (slice.title === 'ThreadProxy::ScheduledActionSendBeginMainFrame')
            return;
  
          // Do not follow ScheduleBeginImplFrameDeadline that triggers an
          // OnBeginImplFrameDeadline that is tracked by another LatencyInfo.
          if (slice.title === 'Scheduler::ScheduleBeginImplFrameDeadline') {
            if (this.triggerOtherInputs(slice, flowEvents))
              return;
          }
  
          // Do not follow PostComposite that triggers CompositeImmediately
          // that is tracked by another LatencyInfo.
          if (slice.title === 'CompositorImpl::PostComposite') {
            if (this.triggerOtherInputs(slice, flowEvents))
              return;
          }
  
          // Stop following the rest of the current slice hierarchy if
          // FilterAndSendWebInputEvent occurs after ProcessInputEventAck.
          if (slice.title === 'InputRouterImpl::ProcessInputEventAck')
            inputAck = true;
          if (inputAck &&
              slice.title === 'InputRouterImpl::FilterAndSendWebInputEvent')
            stopFollowing = true;
  
          this.followCurrentSlice(slice, queue, visited);
        }, this);
      }