Add InternalContentCapture Task Type

ContentCaptureTask will run in Idle task queue and has the fixed
BestEffortPriority.
- This patch added BestEffortTaskQueue which has fixed BestEffortPriority.
- ContentCapture task run in BestEffortTaskQueue.

Bug: 924681
Change-Id: Iac93a983b4b82495e1e8e8f59be3677eaf9458c4
Reviewed-on: https://chromium-review.googlesource.com/c/1435840
Reviewed-by: Chris Harrelson <chrishtr@chromium.org>
Reviewed-by: Alexander Timin <altimin@chromium.org>
Reviewed-by: Sami Kyöstilä <skyostil@chromium.org>
Commit-Queue: Tao Bai <michaelbai@chromium.org>
Cr-Commit-Position: refs/heads/master@{#629417}
diff --git a/third_party/blink/public/platform/task_type.h b/third_party/blink/public/platform/task_type.h
index 19abed3..4c16d7c2 100644
--- a/third_party/blink/public/platform/task_type.h
+++ b/third_party/blink/public/platform/task_type.h
@@ -12,7 +12,8 @@
 //
 // For the task type usage guideline, see https://bit.ly/2vMAsQ4
 //
-// When a new task type is created, use kCount value as a new value.
+// When a new task type is created, use kCount value as a new value,
+// the tools/metrics/histograms/enums.xml shall also be updated.
 enum class TaskType : unsigned {
   ///////////////////////////////////////
   // Speced tasks should use one of the following task types
@@ -202,6 +203,9 @@
   // Tasks used at IntersectionObserver.
   kInternalIntersectionObserver = 44,
 
+  // Task used for ContentCapture.
+  kInternalContentCapture = 61,
+
   ///////////////////////////////////////
   // The following task types are only for thread-local queues.
   ///////////////////////////////////////
@@ -220,7 +224,7 @@
   kWorkerThreadTaskQueueV8 = 47,
   kWorkerThreadTaskQueueCompositor = 48,
 
-  kCount = 61,
+  kCount = 62,
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
index c515a10..193328f 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
@@ -392,6 +392,9 @@
     TaskType type) {
   // TODO(haraken): Optimize the mapping from TaskTypes to task runners.
   switch (type) {
+    // kInternalContentCapture uses BestEffortTaskQueue and is handled
+    // sparately.
+    case TaskType::kInternalContentCapture:
     case TaskType::kJavascriptTimer:
       return ThrottleableTaskQueueTraits();
     case TaskType::kInternalLoading:
@@ -506,6 +509,8 @@
       return frame_task_queue_controller_->LoadingControlTaskQueue();
     case TaskType::kInternalInspector:
       return frame_task_queue_controller_->InspectorTaskQueue();
+    case TaskType::kInternalContentCapture:
+      return frame_task_queue_controller_->BestEffortTaskQueue();
     case TaskType::kExperimentalWebSchedulingUserInteraction:
       return frame_task_queue_controller_->ExperimentalWebSchedulingTaskQueue(
           FrameTaskQueueController::WebSchedulingTaskQueueType::
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
index b4c1261..b6e906d 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
@@ -1809,6 +1809,14 @@
           true));
 }
 
+TEST_F(FrameSchedulerImplTest, ContentCaptureHasIdleTaskQueue) {
+  auto task_queue = GetTaskQueue(TaskType::kInternalContentCapture);
+
+  EXPECT_TRUE(task_queue->FixedPriority().has_value());
+  EXPECT_EQ(TaskQueue::QueuePriority::kBestEffortPriority,
+            task_queue->FixedPriority().value());
+}
+
 }  // namespace frame_scheduler_impl_unittest
 }  // namespace scheduler
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
index 7afcea95..553f95c 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
@@ -66,6 +66,17 @@
 }
 
 scoped_refptr<MainThreadTaskQueue>
+FrameTaskQueueController::BestEffortTaskQueue() {
+  if (!best_effort_task_queue_) {
+    best_effort_task_queue_ = main_thread_scheduler_impl_->NewTaskQueue(
+        MainThreadTaskQueue::QueueCreationParams(
+            MainThreadTaskQueue::QueueType::kIdle)
+            .SetFixedPriority(TaskQueue::QueuePriority::kBestEffortPriority));
+  }
+  return best_effort_task_queue_;
+}
+
+scoped_refptr<MainThreadTaskQueue>
 FrameTaskQueueController::ExperimentalWebSchedulingTaskQueue(
     WebSchedulingTaskQueueType task_queue_type) {
   if (!web_scheduling_task_queues_[task_queue_type])
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h
index 18235bf..336e778e 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h
@@ -72,6 +72,9 @@
   // Return the inspector task queue and create it if it doesn't exist.
   scoped_refptr<MainThreadTaskQueue> InspectorTaskQueue();
 
+  // Return the best effort task queue and create it if it doesn't exist.
+  scoped_refptr<MainThreadTaskQueue> BestEffortTaskQueue();
+
   enum WebSchedulingTaskQueueType : unsigned {
     kWebSchedulingUserVisiblePriority,
     kWebSchedulingBestEffortPriority,
@@ -139,6 +142,8 @@
   // behavior as far as virtual time is concerned.
   scoped_refptr<MainThreadTaskQueue> inspector_task_queue_;
 
+  scoped_refptr<MainThreadTaskQueue> best_effort_task_queue_;
+
   scoped_refptr<MainThreadTaskQueue>
       web_scheduling_task_queues_[kWebSchedulingPriorityCount];
 
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.cc b/third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.cc
index a4cd8be..66916aa 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.cc
@@ -129,6 +129,8 @@
       return "WorkerAnimation";
     case TaskType::kInternalTranslation:
       return "InternalTranslation";
+    case TaskType::kInternalContentCapture:
+      return "InternalContentCapture";
     case TaskType::kCount:
       return "Count";
   }
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc
index 251719bf..d3e0a98 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc
@@ -194,6 +194,7 @@
     case TaskType::kExperimentalWebSchedulingBestEffort:
     case TaskType::kInternalTranslation:
     case TaskType::kServiceWorkerClientMessage:
+    case TaskType::kInternalContentCapture:
     case TaskType::kCount:
       NOTREACHED();
       break;
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index f5702ee..f7f63e2 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -45604,6 +45604,7 @@
   <int value="57" label="ApplicationLifeCycle"/>
   <int value="58" label="BackgroundFetch"/>
   <int value="59" label="Permission"/>
+  <int value="61" label="InternalContentCapture"/>
 </enum>
 
 <enum name="RendererSchedulerTaskUseCase">