service worker: Prioritize registration job

I observed a considerable delay between ServiceWorkerRegisterJob::Start()
and ServiceWorkerRegisterJob::StartImpl() while I was running web_tests.
The slowness came from PostAfterStartupTask() as it delays the start
task until after startup. This CL changes to use PostTaskWithTraits to
set job priority. Use the current task priority for registration as
it is an exposed web API that may have user interactions. Use
BEST_EFFORT for update case.

Bug: 939250
Change-Id: I0a9eb627e2668b6758fb81079a8caa0fd8d4846a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1505745
Commit-Queue: Kenichi Ishibashi <bashi@chromium.org>
Reviewed-by: Makoto Shimazu <shimazu@chromium.org>
Reviewed-by: Kinuko Yasuda <kinuko@chromium.org>
Reviewed-by: Matt Falkenhagen <falken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#639739}
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc
index c129323..99b0c6c 100644
--- a/content/browser/service_worker/service_worker_register_job.cc
+++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -10,6 +10,7 @@
 #include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "content/browser/service_worker/embedded_worker_instance.h"
@@ -24,6 +25,7 @@
 #include "content/browser/url_loader_factory_getter.h"
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/common/service_worker/service_worker_utils.h"
+#include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "net/base/net_errors.h"
@@ -99,10 +101,18 @@
 }
 
 void ServiceWorkerRegisterJob::Start() {
-  BrowserThread::PostAfterStartupTask(
-      FROM_HERE, base::ThreadTaskRunnerHandle::Get(),
-      base::BindOnce(&ServiceWorkerRegisterJob::StartImpl,
-                     weak_factory_.GetWeakPtr()));
+  // Schedule the job based on job type. For registration, give it the
+  // current task priority as it's an explicit JavaScript API and sites
+  // may show a message like "offline enabled". For update, give it a lower
+  // priority as (soft) update doesn't affect user interactions directly.
+  // TODO(bashi): For explicit update() API, we may want to prioritize it too.
+  auto traits = (job_type_ == REGISTRATION_JOB)
+                    ? base::TaskTraits(BrowserThread::IO)
+                    : base::TaskTraits(BrowserThread::IO,
+                                       base::TaskPriority::BEST_EFFORT);
+  base::PostTaskWithTraits(FROM_HERE, std::move(traits),
+                           base::BindOnce(&ServiceWorkerRegisterJob::StartImpl,
+                                          weak_factory_.GetWeakPtr()));
 }
 
 void ServiceWorkerRegisterJob::StartImpl() {