blob: 28a428489f477a0973cb332838018c1b74a48b2a [file] [log] [blame]
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_PUBLIC_FRAME_SCHEDULER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_PUBLIC_FRAME_SCHEDULER_H_
#include <memory>
#include "base/memory/scoped_refptr.h"
#include "base/single_thread_task_runner.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "third_party/blink/public/mojom/loader/pause_subresource_loading_handle.mojom-blink.h"
#include "third_party/blink/public/platform/scheduler/web_resource_loading_task_runner_handle.h"
#include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/public/platform/web_scoped_virtual_time_pauser.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace ukm {
class UkmRecorder;
}
namespace blink {
class PageScheduler;
class FrameScheduler : public FrameOrWorkerScheduler {
public:
class PLATFORM_EXPORT Delegate {
public:
virtual ~Delegate() = default;
virtual ukm::UkmRecorder* GetUkmRecorder() = 0;
virtual ukm::SourceId GetUkmSourceId() = 0;
};
~FrameScheduler() override = default;
// Represents the type of frame: main (top-level) vs not.
enum class FrameType {
kMainFrame,
kSubframe,
};
// The scheduler may throttle tasks associated with offscreen frames.
virtual void SetFrameVisible(bool) = 0;
virtual bool IsFrameVisible() const = 0;
// Query the page visibility state for the page associated with this frame.
// The scheduler may throttle tasks associated with pages that are not
// visible.
// TODO(altimin): Remove this method.
virtual bool IsPageVisible() const = 0;
// Set whether this frame is suspended. Only unthrottledTaskRunner tasks are
// allowed to run on a suspended frame.
virtual void SetPaused(bool) = 0;
// Set whether this frame is cross origin w.r.t. the top level frame. Cross
// origin frames may use a different scheduling policy from same origin
// frames.
virtual void SetCrossOrigin(bool) = 0;
virtual bool IsCrossOrigin() const = 0;
virtual void SetIsAdFrame() = 0;
virtual bool IsAdFrame() const = 0;
virtual void TraceUrlChange(const String&) = 0;
// Returns the frame type, which currently determines whether this frame is
// the top level frame, i.e. a main frame.
virtual FrameType GetFrameType() const = 0;
// Returns a task runner that is suitable with the given task type.
virtual scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(
TaskType) = 0;
// Returns a WebResourceLoadingTaskRunnerHandle which is intended to be used
// by the loading stack to post resource loading tasks to the renderer's main
// thread and to notify the main thread of any change in the resource's fetch
// (net) priority.
virtual std::unique_ptr<scheduler::WebResourceLoadingTaskRunnerHandle>
CreateResourceLoadingTaskRunnerHandle() = 0;
// Returns the parent PageScheduler.
virtual PageScheduler* GetPageScheduler() const = 0;
// Returns a WebScopedVirtualTimePauser which can be used to vote for pausing
// virtual time. Virtual time will be paused if any WebScopedVirtualTimePauser
// votes to pause it, and only unpaused only if all
// WebScopedVirtualTimePausers are either destroyed or vote to unpause. Note
// the WebScopedVirtualTimePauser returned by this method is initially
// unpaused.
virtual WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
const String& name,
WebScopedVirtualTimePauser::VirtualTaskDuration) = 0;
// Tells the scheduler that a provisional load has started, the scheduler may
// reset the task cost estimators and the UserModel. Must be called from the
// main thread.
virtual void DidStartProvisionalLoad(bool is_main_frame) = 0;
// Tells the scheduler that a provisional load has committed, the scheduler
// may reset the task cost estimators and the UserModel. Must be called from
// the main thread.
virtual void DidCommitProvisionalLoad(bool is_web_history_inert_commit,
bool is_reload,
bool is_main_frame) = 0;
// Tells the scheduler that the first meaningful paint has occured for this
// frame.
virtual void OnFirstMeaningfulPaint() = 0;
// Returns true if this frame is should not throttled (e.g. due to an active
// connection).
// Note that this only applies to the current frame,
// use GetPageScheduler()->IsExemptFromBudgetBasedThrottling for the status
// of the page.
virtual bool IsExemptFromBudgetBasedThrottling() const = 0;
// Returns UKM source id for recording metrics associated with this frame.
virtual ukm::SourceId GetUkmSourceId() = 0;
FrameScheduler* ToFrameScheduler() override { return this; }
// Returns a handle that prevents resource loading as long as the handle
// exists.
virtual std::unique_ptr<blink::mojom::blink::PauseSubresourceLoadingHandle>
GetPauseSubresourceLoadingHandle() = 0;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_PUBLIC_FRAME_SCHEDULER_H_