Commit b2aed4cd authored by Hajime Hoshi's avatar Hajime Hoshi Committed by Commit Bot

Give per-frame task runners at MakeRequest at various places

This CL switches task runners at several places from per-thread to
per-frame. The purpose of this change is to make it possible to freeze
tasks for bfcache.

bfcache is a new feature to freeze a tab for quick back-forwarding. When
a tab goes frozen, we can stop per-frame task runners while we cannot
per-thread task runners since per-thread task runners can be shared
between multiple tags/pages. As a frozen tab must not execute any
JavaScript, all JavaScript execution must be on per-frame task runners,
which can be suspended.

Bug: 913912
Change-Id: I5dcf4d2fa650469fda473cae0b5a1e2d603176ca
Reviewed-on: https://chromium-review.googlesource.com/c/1438855
Commit-Queue: Hajime Hoshi <hajimehoshi@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#626902}
parent f697ab1d
......@@ -121,8 +121,9 @@ scoped_refptr<base::SingleThreadTaskRunner> ClipboardPromise::GetTaskRunner() {
PermissionService* ClipboardPromise::GetPermissionService() {
if (!permission_service_) {
ConnectToPermissionService(ExecutionContext::From(script_state_),
mojo::MakeRequest(&permission_service_));
ConnectToPermissionService(
ExecutionContext::From(script_state_),
mojo::MakeRequest(&permission_service_, GetTaskRunner()));
}
return permission_service_.get();
}
......
......@@ -465,7 +465,7 @@ void Geolocation::UpdateGeolocationConnection() {
GetFrame()->GetInterfaceProvider().GetInterface(&geolocation_service_,
invalidator, task_runner);
geolocation_service_->CreateGeolocation(
MakeRequest(&geolocation_, invalidator),
MakeRequest(&geolocation_, invalidator, task_runner),
LocalFrame::HasTransientUserActivation(GetFrame()));
geolocation_.set_connection_error_handler(WTF::Bind(
......
......@@ -336,8 +336,9 @@ void MediaDevices::OnDispatcherHostConnectionError() {
const mojom::blink::MediaDevicesDispatcherHostPtr&
MediaDevices::GetDispatcherHost(LocalFrame* frame) {
if (!dispatcher_host_) {
frame->GetInterfaceProvider().GetInterface(
mojo::MakeRequest(&dispatcher_host_));
// See https://bit.ly/2S0zRAS for task types
frame->GetInterfaceProvider().GetInterface(mojo::MakeRequest(
&dispatcher_host_, frame->GetTaskRunner(TaskType::kMiscPlatformAPI)));
dispatcher_host_.set_connection_error_handler(
WTF::Bind(&MediaDevices::OnDispatcherHostConnectionError,
WrapWeakPersistent(this)));
......
......@@ -69,8 +69,11 @@ ScriptPromise NotificationManager::RequestPermission(
ExecutionContext* context = ExecutionContext::From(script_state);
if (!permission_service_) {
ConnectToPermissionService(context,
mojo::MakeRequest(&permission_service_));
// See https://bit.ly/2S0zRAS for task types.
ConnectToPermissionService(
context,
mojo::MakeRequest(&permission_service_,
context->GetTaskRunner(TaskType::kMiscPlatformAPI)));
permission_service_.set_connection_error_handler(
WTF::Bind(&NotificationManager::OnPermissionServiceConnectionError,
WrapWeakPersistent(this)));
......@@ -225,7 +228,10 @@ const mojom::blink::NotificationServicePtr&
NotificationManager::GetNotificationService() {
if (!notification_service_) {
if (auto* provider = GetSupplementable()->GetInterfaceProvider()) {
provider->GetInterface(mojo::MakeRequest(&notification_service_));
// See https://bit.ly/2S0zRAS for task types.
provider->GetInterface(mojo::MakeRequest(
&notification_service_,
GetSupplementable()->GetTaskRunner(TaskType::kMiscPlatformAPI)));
notification_service_.set_connection_error_handler(
WTF::Bind(&NotificationManager::OnNotificationServiceConnectionError,
......
......@@ -279,8 +279,11 @@ ScriptPromise PaymentInstruments::clear(ScriptState* script_state) {
mojom::blink::PermissionService* PaymentInstruments::GetPermissionService(
ScriptState* script_state) {
if (!permission_service_) {
ConnectToPermissionService(ExecutionContext::From(script_state),
mojo::MakeRequest(&permission_service_));
ExecutionContext* context = ExecutionContext::From(script_state);
ConnectToPermissionService(
context,
mojo::MakeRequest(&permission_service_,
context->GetTaskRunner(TaskType::kUserInteraction)));
}
return permission_service_.get();
}
......
......@@ -147,8 +147,11 @@ ScriptPromise StorageManager::estimate(ScriptState* script_state) {
PermissionService& StorageManager::GetPermissionService(
ExecutionContext* execution_context) {
if (!permission_service_) {
ConnectToPermissionService(execution_context,
mojo::MakeRequest(&permission_service_));
// See https://bit.ly/2S0zRAS for task types.
ConnectToPermissionService(
execution_context, mojo::MakeRequest(&permission_service_,
execution_context->GetTaskRunner(
TaskType::kMiscPlatformAPI)));
permission_service_.set_connection_error_handler(
WTF::Bind(&StorageManager::PermissionServiceConnectionError,
WrapWeakPersistent(this)));
......@@ -171,8 +174,11 @@ void StorageManager::PermissionRequestComplete(ScriptPromiseResolver* resolver,
mojom::blink::QuotaDispatcherHost& StorageManager::GetQuotaHost(
ExecutionContext* execution_context) {
if (!quota_host_) {
ConnectToQuotaDispatcherHost(execution_context,
mojo::MakeRequest(&quota_host_));
// See https://bit.ly/2S0zRAS for task types.
ConnectToQuotaDispatcherHost(
execution_context,
mojo::MakeRequest(&quota_host_, execution_context->GetTaskRunner(
TaskType::kMiscPlatformAPI)));
}
return *quota_host_;
}
......
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