blob: 44447a7ff82c752a9038322fa52bc86472bf89bd [file] [log] [blame]
// Copyright 2017 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.
#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_
#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_
#include "base/macros.h"
#include "base/optional.h"
#include "base/time/time.h"
#include "platform/PlatformExport.h"
#include "platform/scheduler/renderer/main_thread_task_queue.h"
#include "platform/scheduler/renderer/task_duration_metric_reporter.h"
#include "platform/scheduler/util/thread_load_tracker.h"
namespace blink {
class WebFrameScheduler;
namespace scheduler {
enum class MainThreadTaskLoadState;
class MainThreadTaskQueue;
class RendererSchedulerImpl;
// This enum is used for histogram and should not be renumbered.
// This enum should be kept in sync with FrameThrottlingState and
// FrameOriginState.
//
// There are three main states:
// VISIBLE describes frames which are visible to the user (both page and frame
// are visible).
// Without this service frame would have had kBackgrounded state.
// HIDDEN describes frames which are out of viewport but the page is visible
// to the user.
// BACKGROUND describes frames in background pages.
//
// There are four auxillary states:
// VISIBLE_SERVICE describes frames which are treated as visible to the user
// but it is a service (e.g. audio) which forces the page to be foregrounded.
// HIDDEN_SERVICE describes offscreen frames in pages which are treated as
// foregrounded due to a presence of a service (e.g. audio playing).
// BACKGROUND_EXEMPT_SELF describes background frames which are
// exempted from background throttling due to a special conditions being met
// for this frame.
// BACKGROUND_EXEMPT_kOther describes background frames which are exempted from
// background throttling due to other frames granting an exemption for
// the whole page.
//
// Note that all these seven states are disjoint, e.g, when calculating
// a metric for background BACKGROUND, BACKGROUND_EXEMPT_SELF and
// BACKGROUND_EXEMPT_kOther should be added together.
enum class FrameType {
// Used to describe a task queue which doesn't have a frame associated
// (e.g. global task queue).
kNone = 0,
// This frame was detached and does not have origin or visibility status
// anymore.
kDetached = 1,
kSpecialCasesCount = 2,
kMainFrameVisible = 2,
kMainFrameVisibleService = 3,
kMainFrameHidden = 4,
kMainFrameHiddenService = 5,
kMainFrameBackground = 6,
kMainFrameBackgroundExemptSelf = 7,
kMainFrameBackgroundExemptOther = 8,
kSameOriginVisible = 9,
kSameOriginVisibleService = 10,
kSameOriginHidden = 11,
kSameOriginHiddenService = 12,
kSameOriginBackground = 13,
kSameOriginBackgroundExemptSelf = 14,
kSameOriginBackgroundExemptOther = 15,
kCrossOriginVisible = 16,
kCrossOriginVisibleService = 17,
kCrossOriginHidden = 18,
kCrossOriginHiddenService = 19,
kCrossOriginBackground = 20,
kCrossOriginBackgroundExemptSelf = 21,
kCrossOriginBackgroundExemptOther = 22,
kCount = 23
};
// This enum is used for histogram and should not be renumbered.
// It tracks the following possible transitions:
// -> kBackgrounded (-> [STOPPED_* -> kResumed])? -> kForegrounded
enum class BackgroundedRendererTransition {
// Renderer is backgrounded
kBackgrounded = 0,
// Renderer is stopped after being backgrounded for a while
kStoppedAfterDelay = 1,
// Renderer is stopped due to critical resources, reserved for future use.
kStoppedDueToCriticalResources = 2,
// Renderer is resumed after being stopped
kResumed = 3,
// Renderer is foregrounded
kForegrounded = 4,
kCount = 5
};
PLATFORM_EXPORT FrameType GetFrameType(WebFrameScheduler* frame_scheduler);
// Helper class to take care of metrics on behalf of RendererScheduler.
// This class should be used only on the main thread.
class PLATFORM_EXPORT RendererMetricsHelper {
public:
static void RecordBackgroundedTransition(
BackgroundedRendererTransition transition);
RendererMetricsHelper(RendererSchedulerImpl* renderer_scheduler,
base::TimeTicks now,
bool renderer_backgrounded);
~RendererMetricsHelper();
void RecordTaskMetrics(MainThreadTaskQueue* queue,
base::TimeTicks start_time,
base::TimeTicks end_time);
void OnRendererForegrounded(base::TimeTicks now);
void OnRendererBackgrounded(base::TimeTicks now);
void OnRendererShutdown(base::TimeTicks now);
void RecordMainThreadTaskLoad(base::TimeTicks time, double load);
void RecordForegroundMainThreadTaskLoad(base::TimeTicks time, double load);
void RecordBackgroundMainThreadTaskLoad(base::TimeTicks time, double load);
private:
RendererSchedulerImpl* renderer_scheduler_; // NOT OWNED
base::Optional<base::TimeTicks> last_reported_task_;
ThreadLoadTracker main_thread_load_tracker;
ThreadLoadTracker background_main_thread_load_tracker;
ThreadLoadTracker foreground_main_thread_load_tracker;
using TaskDurationPerQueueTypeMetricReporter =
TaskDurationMetricReporter<MainThreadTaskQueue::QueueType>;
TaskDurationPerQueueTypeMetricReporter task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter foreground_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
foreground_first_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
foreground_second_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
foreground_third_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
foreground_after_third_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter background_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
background_first_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
background_second_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
background_third_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
background_fourth_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
background_fifth_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter
background_after_fifth_minute_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter hidden_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter visible_task_duration_reporter;
TaskDurationPerQueueTypeMetricReporter hidden_music_task_duration_reporter;
TaskDurationMetricReporter<FrameType> frame_type_duration_reporter;
MainThreadTaskLoadState main_thread_task_load_state;
DISALLOW_COPY_AND_ASSIGN(RendererMetricsHelper);
};
} // namespace scheduler
} // namespace blink
#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_RENDERER_METRICS_HELPER_H_