Commit bf2c477e authored by Farah Charab's avatar Farah Charab Committed by Commit Bot

Scheduler: Experiment with setting priorities based on frame origin.

Set the priority of same-origin loading task to high and the priority of
cross-origin tasks to low depending on the feature enabled.

Bug: 856158
Change-Id: I5bc2e17cf512ccae0cdd7a62d1afc61cc5b53cb7
Reviewed-on: https://chromium-review.googlesource.com/1112252
Commit-Queue: Farah Charab <farahcharab@chromium.org>
Reviewed-by: default avatarRobert Kaplow (OOO until 0730) <rkaplow@chromium.org>
Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Reviewed-by: default avatarSami Kyöstilä <skyostil@chromium.org>
Cr-Commit-Position: refs/heads/master@{#577256}
parent ee66e0fe
......@@ -2739,6 +2739,25 @@
]
}
],
"OriginTypePriorityExperiment": [
{
"platforms": [
"windows",
"mac",
"chromeos",
"linux",
"android"
],
"experiments": [
{
"name": "LowPriorityForCrossOriginFrame",
"enable_features": [
"BlinkSchedulerLowPriorityForCrossOrigin"
]
}
]
}
],
"OverflowIconsForMediaControls": [
{
"platforms": [
......
......@@ -100,6 +100,12 @@ const base::Feature kBestEffortPriorityForAdFrame{
const base::Feature kUseResourceFetchPriority{
"BlinkSchedulerResourceFetchPriority", base::FEATURE_DISABLED_BY_DEFAULT};
// Enables setting the priority of cross-origin task queues to
// low priority.
const base::Feature kLowPriorityForCrossOrigin{
"BlinkSchedulerLowPriorityForCrossOrigin",
base::FEATURE_DISABLED_BY_DEFAULT};
// Enables a chosen experiments only during the load use case.
const base::Feature kExperimentOnlyWhenLoading{
"BlinkSchedulerExperimentOnlyWhenLoading",
......
......@@ -857,6 +857,12 @@ TaskQueue::QueuePriority FrameSchedulerImpl::ComputePriority(
IsAdFrame()) {
return TaskQueue::QueuePriority::kBestEffortPriority;
}
if (main_thread_scheduler_->scheduling_settings()
.low_priority_cross_origin &&
IsCrossOrigin()) {
return TaskQueue::QueuePriority::kLowPriority;
}
}
return task_queue->queue_type() ==
......
......@@ -1382,6 +1382,109 @@ TEST_F(
EXPECT_EQ(task_queue->GetQueuePriority(), priority);
}
class LowPriorityCrossOriginTaskExperimentTest : public FrameSchedulerImplTest {
public:
LowPriorityCrossOriginTaskExperimentTest()
: FrameSchedulerImplTest({kLowPriorityForCrossOrigin},
{kExperimentOnlyWhenLoading}) {}
};
TEST_F(LowPriorityCrossOriginTaskExperimentTest, FrameQueuesPriorities) {
EXPECT_FALSE(frame_scheduler_->IsCrossOrigin());
// Same Origin Task Queues.
EXPECT_EQ(LoadingTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(LoadingControlTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kHighPriority);
EXPECT_EQ(DeferrableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(ThrottleableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(PausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(UnpausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
frame_scheduler_->SetCrossOrigin(true);
EXPECT_TRUE(frame_scheduler_->IsCrossOrigin());
EXPECT_EQ(LoadingTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(LoadingControlTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(DeferrableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(ThrottleableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(PausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(UnpausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
}
class LowPriorityCrossOriginTaskDuringLoadingExperimentTest
: public FrameSchedulerImplTest {
public:
LowPriorityCrossOriginTaskDuringLoadingExperimentTest()
: FrameSchedulerImplTest(
{kLowPriorityForCrossOrigin, kExperimentOnlyWhenLoading},
{}) {}
};
TEST_F(LowPriorityCrossOriginTaskDuringLoadingExperimentTest,
FrameQueuesPriorities) {
// Main thread is in the loading use case.
scheduler_->DidStartProvisionalLoad(true);
EXPECT_TRUE(page_scheduler_->IsLoading());
EXPECT_EQ(LoadingTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(LoadingControlTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kHighPriority);
EXPECT_EQ(DeferrableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(ThrottleableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(PausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(UnpausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
frame_scheduler_->SetCrossOrigin(true);
EXPECT_TRUE(frame_scheduler_->IsCrossOrigin());
EXPECT_EQ(LoadingTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(LoadingControlTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(DeferrableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(ThrottleableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(PausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
EXPECT_EQ(UnpausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kLowPriority);
// Main thread is no longer in loading use case.
scheduler_->OnFirstMeaningfulPaint();
EXPECT_FALSE(page_scheduler_->IsLoading());
EXPECT_EQ(LoadingTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(LoadingControlTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kHighPriority);
EXPECT_EQ(DeferrableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(ThrottleableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(PausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
EXPECT_EQ(UnpausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority);
}
} // namespace frame_scheduler_impl_unittest
} // namespace scheduler
} // namespace blink
......@@ -685,6 +685,9 @@ MainThreadSchedulerImpl::SchedulingSettings::SchedulingSettings() {
best_effort_ad_frame =
base::FeatureList::IsEnabled(kBestEffortPriorityForAdFrame);
low_priority_cross_origin =
base::FeatureList::IsEnabled(kLowPriorityForCrossOrigin);
use_resource_fetch_priority =
base::FeatureList::IsEnabled(kUseResourceFetchPriority);
......
......@@ -104,6 +104,9 @@ class PLATFORM_EXPORT MainThreadSchedulerImpl
bool low_priority_ad_frame;
bool best_effort_ad_frame;
// Origin type priority experiment (crbug.com/856158).
bool low_priority_cross_origin;
// Use resource fetch priority for resource loading tasks
// (crbug.com/860545).
bool use_resource_fetch_priority;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment