#include "third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.h"
#include <algorithm>
#include <memory>
#include <string>
#include "base/containers/contains.h"
#include "base/metrics/field_trial_params.h"
#include "base/metrics/histogram.h"
#include "base/not_fatal_until.h"
#include "base/numerics/safe_conversions.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/default_clock.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/platform/heap/persistent.h"
#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
#include "third_party/blink/renderer/platform/loader/fetch/console_logger.h"
#include "third_party/blink/renderer/platform/loader/fetch/loading_behavior_observer.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties.h"
#include "third_party/blink/renderer/platform/network/network_state_notifier.h"
#include "third_party/blink/renderer/platform/scheduler/public/aggregated_metric_reporter.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_status.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
namespace blink {
namespace {
constexpr char kRendererSideResourceScheduler[] = …;
constexpr size_t kTightLimitForRendererSideResourceScheduler = …;
constexpr size_t kLimitForRendererSideResourceScheduler = …;
constexpr char kTightLimitForRendererSideResourceSchedulerName[] = …;
constexpr char kLimitForRendererSideResourceSchedulerName[] = …;
enum class ReportCircumstance { … };
uint32_t GetFieldTrialUint32Param(const char* trial_name,
const char* parameter_name,
uint32_t default_param) { … }
}
constexpr ResourceLoadScheduler::ClientId
ResourceLoadScheduler::kInvalidClientId;
ResourceLoadScheduler::ResourceLoadScheduler(
ThrottlingPolicy initial_throttling_policy,
ThrottleOptionOverride throttle_option_override,
const DetachableResourceFetcherProperties& resource_fetcher_properties,
FrameOrWorkerScheduler* frame_or_worker_scheduler,
DetachableConsoleLogger& console_logger,
LoadingBehaviorObserver* loading_behavior_observer)
: … { … }
ResourceLoadScheduler::~ResourceLoadScheduler() = default;
void ResourceLoadScheduler::Trace(Visitor* visitor) const { … }
void ResourceLoadScheduler::LoosenThrottlingPolicy() { … }
void ResourceLoadScheduler::Shutdown() { … }
void ResourceLoadScheduler::Request(ResourceLoadSchedulerClient* client,
ThrottleOption option,
ResourceLoadPriority priority,
int intra_priority,
ResourceLoadScheduler::ClientId* id) { … }
void ResourceLoadScheduler::SetPriority(ClientId client_id,
ResourceLoadPriority priority,
int intra_priority) { … }
bool ResourceLoadScheduler::Release(
ResourceLoadScheduler::ClientId id,
ResourceLoadScheduler::ReleaseOption option,
const ResourceLoadScheduler::TrafficReportHints& hints) { … }
void ResourceLoadScheduler::SetOutstandingLimitForTesting(
size_t tight_limit,
size_t normal_limit,
size_t tight_medium_limit) { … }
bool ResourceLoadScheduler::IsClientDelayable(ThrottleOption option) const { … }
void ResourceLoadScheduler::OnLifecycleStateChanged(
scheduler::SchedulingLifecycleState state) { … }
ResourceLoadScheduler::ClientId ResourceLoadScheduler::GenerateClientId() { … }
bool ResourceLoadScheduler::IsPendingRequestEffectivelyEmpty(
ThrottleOption option) { … }
bool ResourceLoadScheduler::GetNextPendingRequest(ClientId* id) { … }
void ResourceLoadScheduler::MaybeRun() { … }
void ResourceLoadScheduler::Run(ResourceLoadScheduler::ClientId id,
ResourceLoadSchedulerClient* client,
bool throttleable,
ResourceLoadPriority priority) { … }
size_t ResourceLoadScheduler::GetOutstandingLimit(
ResourceLoadPriority priority) const { … }
void ResourceLoadScheduler::ShowConsoleMessageIfNeeded() { … }
bool ResourceLoadScheduler::
IsRunningThrottleableRequestsLessThanOutStandingLimit(
size_t out_standing_limit,
ResourceLoadPriority priority) { … }
void ResourceLoadScheduler::SetClockForTesting(const base::Clock* clock) { … }
void ResourceLoadScheduler::SetConnectionInfo(
ClientId id,
net::HttpConnectionInfo connection_info) { … }
bool ResourceLoadScheduler::CanRequestForMultiplexedConnectionsInTight() const { … }
}