| Index: components/scheduler/renderer/user_model.cc
|
| diff --git a/components/scheduler/renderer/user_model.cc b/components/scheduler/renderer/user_model.cc
|
| deleted file mode 100644
|
| index c71e86c21d8e20f63ab20981964971f4639a08d4..0000000000000000000000000000000000000000
|
| --- a/components/scheduler/renderer/user_model.cc
|
| +++ /dev/null
|
| @@ -1,222 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "components/scheduler/renderer/user_model.h"
|
| -
|
| -#include "base/metrics/histogram_macros.h"
|
| -
|
| -namespace scheduler {
|
| -
|
| -namespace {
|
| -// This enum is used to back a histogram, and should therefore be treated as
|
| -// append-only.
|
| -enum GesturePredictionResult {
|
| - GESTURE_OCCURED_WAS_PREDICTED = 0,
|
| - GESTURE_OCCURED_BUT_NOT_PREDICTED = 1,
|
| - GESTURE_PREDICTED_BUT_DID_NOT_OCCUR = 2,
|
| - GESTURE_PREDICTION_RESULT_COUNT = 3
|
| -};
|
| -
|
| -void RecordGesturePrediction(GesturePredictionResult result) {
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "RendererScheduler.UserModel.GesturePredictedCorrectly", result,
|
| - GESTURE_PREDICTION_RESULT_COUNT);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -UserModel::UserModel()
|
| - : pending_input_event_count_(0),
|
| - is_gesture_active_(false),
|
| - is_gesture_expected_(false) {}
|
| -UserModel::~UserModel() {}
|
| -
|
| -void UserModel::DidStartProcessingInputEvent(blink::WebInputEvent::Type type,
|
| - const base::TimeTicks now) {
|
| - last_input_signal_time_ = now;
|
| - if (type == blink::WebInputEvent::TouchStart ||
|
| - type == blink::WebInputEvent::GestureScrollBegin ||
|
| - type == blink::WebInputEvent::GesturePinchBegin) {
|
| - // Only update stats once per gesture.
|
| - if (!is_gesture_active_) {
|
| - last_gesture_start_time_ = now;
|
| -
|
| - RecordGesturePrediction(is_gesture_expected_
|
| - ? GESTURE_OCCURED_WAS_PREDICTED
|
| - : GESTURE_OCCURED_BUT_NOT_PREDICTED);
|
| -
|
| - if (!last_reset_time_.is_null()) {
|
| - base::TimeDelta time_since_reset = now - last_reset_time_;
|
| - UMA_HISTOGRAM_MEDIUM_TIMES(
|
| - "RendererScheduler.UserModel.GestureStartTimeSinceModelReset",
|
| - time_since_reset);
|
| - }
|
| -
|
| - // If there has been a previous gesture, record a UMA metric for the time
|
| - // interval between then and now.
|
| - if (!last_continuous_gesture_time_.is_null()) {
|
| - base::TimeDelta time_since_last_gesture =
|
| - now - last_continuous_gesture_time_;
|
| - UMA_HISTOGRAM_MEDIUM_TIMES(
|
| - "RendererScheduler.UserModel.TimeBetweenGestures",
|
| - time_since_last_gesture);
|
| - }
|
| - }
|
| -
|
| - is_gesture_active_ = true;
|
| - }
|
| -
|
| - // We need to track continuous gestures seperatly for scroll detection
|
| - // because taps should not be confused with scrolls.
|
| - if (type == blink::WebInputEvent::GestureScrollBegin ||
|
| - type == blink::WebInputEvent::GestureScrollEnd ||
|
| - type == blink::WebInputEvent::GestureScrollUpdate ||
|
| - type == blink::WebInputEvent::GestureFlingStart ||
|
| - type == blink::WebInputEvent::GestureFlingCancel ||
|
| - type == blink::WebInputEvent::GesturePinchBegin ||
|
| - type == blink::WebInputEvent::GesturePinchEnd ||
|
| - type == blink::WebInputEvent::GesturePinchUpdate) {
|
| - last_continuous_gesture_time_ = now;
|
| - }
|
| -
|
| - // If the gesture has ended, clear |is_gesture_active_| and record a UMA
|
| - // metric that tracks its duration.
|
| - if (type == blink::WebInputEvent::GestureScrollEnd ||
|
| - type == blink::WebInputEvent::GesturePinchEnd ||
|
| - type == blink::WebInputEvent::GestureFlingStart ||
|
| - type == blink::WebInputEvent::TouchEnd) {
|
| - // Only update stats once per gesture.
|
| - if (is_gesture_active_) {
|
| - base::TimeDelta duration = now - last_gesture_start_time_;
|
| - UMA_HISTOGRAM_TIMES("RendererScheduler.UserModel.GestureDuration",
|
| - duration);
|
| - }
|
| - is_gesture_active_ = false;
|
| - }
|
| -
|
| - TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
|
| - "is_gesture_active", is_gesture_active_);
|
| -
|
| - pending_input_event_count_++;
|
| -}
|
| -
|
| -void UserModel::DidFinishProcessingInputEvent(const base::TimeTicks now) {
|
| - last_input_signal_time_ = now;
|
| - if (pending_input_event_count_ > 0)
|
| - pending_input_event_count_--;
|
| -}
|
| -
|
| -base::TimeDelta UserModel::TimeLeftInUserGesture(base::TimeTicks now) const {
|
| - base::TimeDelta escalated_priority_duration =
|
| - base::TimeDelta::FromMilliseconds(kGestureEstimationLimitMillis);
|
| -
|
| - // If the input event is still pending, go into input prioritized policy and
|
| - // check again later.
|
| - if (pending_input_event_count_ > 0)
|
| - return escalated_priority_duration;
|
| - if (last_input_signal_time_.is_null() ||
|
| - last_input_signal_time_ + escalated_priority_duration < now) {
|
| - return base::TimeDelta();
|
| - }
|
| - return last_input_signal_time_ + escalated_priority_duration - now;
|
| -}
|
| -
|
| -bool UserModel::IsGestureExpectedSoon(
|
| - const base::TimeTicks now,
|
| - base::TimeDelta* prediction_valid_duration) {
|
| - bool was_gesture_expected = is_gesture_expected_;
|
| - is_gesture_expected_ =
|
| - IsGestureExpectedSoonImpl(now, prediction_valid_duration);
|
| -
|
| - // Track when we start expecting a gesture so we can work out later if a
|
| - // gesture actually happened.
|
| - if (!was_gesture_expected && is_gesture_expected_)
|
| - last_gesture_expected_start_time_ = now;
|
| -
|
| - if (was_gesture_expected && !is_gesture_expected_ &&
|
| - last_gesture_expected_start_time_ > last_gesture_start_time_) {
|
| - RecordGesturePrediction(GESTURE_PREDICTED_BUT_DID_NOT_OCCUR);
|
| - }
|
| - return is_gesture_expected_;
|
| -}
|
| -
|
| -bool UserModel::IsGestureExpectedSoonImpl(
|
| - const base::TimeTicks now,
|
| - base::TimeDelta* prediction_valid_duration) const {
|
| - if (is_gesture_active_) {
|
| - if (IsGestureExpectedToContinue(now, prediction_valid_duration)) {
|
| - return false;
|
| - } else {
|
| - // If a gesture is not expected to continue then we expect a subsequent
|
| - // gesture soon.
|
| - *prediction_valid_duration =
|
| - base::TimeDelta::FromMilliseconds(kExpectSubsequentGestureMillis);
|
| - return true;
|
| - }
|
| - } else {
|
| - // If we've have a finished a gesture then a subsequent gesture is deemed
|
| - // likely.
|
| - base::TimeDelta expect_subsequent_gesture_for =
|
| - base::TimeDelta::FromMilliseconds(kExpectSubsequentGestureMillis);
|
| - if (last_continuous_gesture_time_.is_null() ||
|
| - last_continuous_gesture_time_ + expect_subsequent_gesture_for <= now) {
|
| - return false;
|
| - }
|
| - *prediction_valid_duration =
|
| - last_continuous_gesture_time_ + expect_subsequent_gesture_for - now;
|
| - return true;
|
| - }
|
| -}
|
| -
|
| -bool UserModel::IsGestureExpectedToContinue(
|
| - const base::TimeTicks now,
|
| - base::TimeDelta* prediction_valid_duration) const {
|
| - if (!is_gesture_active_)
|
| - return false;
|
| -
|
| - base::TimeDelta median_gesture_duration =
|
| - base::TimeDelta::FromMilliseconds(kMedianGestureDurationMillis);
|
| - base::TimeTicks expected_gesture_end_time =
|
| - last_gesture_start_time_ + median_gesture_duration;
|
| -
|
| - if (expected_gesture_end_time > now) {
|
| - *prediction_valid_duration = expected_gesture_end_time - now;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void UserModel::Reset(base::TimeTicks now) {
|
| - last_input_signal_time_ = base::TimeTicks();
|
| - last_gesture_start_time_ = base::TimeTicks();
|
| - last_continuous_gesture_time_ = base::TimeTicks();
|
| - last_gesture_expected_start_time_ = base::TimeTicks();
|
| - last_reset_time_ = now;
|
| - is_gesture_active_ = false;
|
| - is_gesture_expected_ = false;
|
| -}
|
| -
|
| -void UserModel::AsValueInto(base::trace_event::TracedValue* state) const {
|
| - state->BeginDictionary("user_model");
|
| - state->SetInteger("pending_input_event_count", pending_input_event_count_);
|
| - state->SetDouble(
|
| - "last_input_signal_time",
|
| - (last_input_signal_time_ - base::TimeTicks()).InMillisecondsF());
|
| - state->SetDouble(
|
| - "last_gesture_start_time",
|
| - (last_gesture_start_time_ - base::TimeTicks()).InMillisecondsF());
|
| - state->SetDouble(
|
| - "last_continuous_gesture_time",
|
| - (last_continuous_gesture_time_ - base::TimeTicks()).InMillisecondsF());
|
| - state->SetDouble("last_gesture_expected_start_time",
|
| - (last_gesture_expected_start_time_ - base::TimeTicks())
|
| - .InMillisecondsF());
|
| - state->SetDouble("last_reset_time",
|
| - (last_reset_time_ - base::TimeTicks()).InMillisecondsF());
|
| - state->SetBoolean("is_gesture_expected", is_gesture_expected_);
|
| - state->SetBoolean("is_gesture_active", is_gesture_active_);
|
| - state->EndDictionary();
|
| -}
|
| -
|
| -} // namespace scheduler
|
|
|