Commit 3662db40 authored by Hajime Hoshi's avatar Hajime Hoshi Committed by Commit Bot

Use per-frame task runner at extnsions' GCCallback

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.

The callback of GC in extensions executes JavaScript, but this callback
is now executed on the default task runner. This CL replaces this with
a per-frame task runner.

Some tests hit this: e.g.
extensions_browsertests --gtest_filter=WebViewAPITest.TestDialogConfirmDefaultGCCancel

Bug: 870606
Change-Id: Ic1c2968a2e9e07629e7c117e1e1c4e97c2df0457
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1514516Reviewed-by: default avatarKen Rockot <rockot@google.com>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Commit-Queue: Hajime Hoshi <hajimehoshi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#641104}
parent 251c3e70
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "extensions/renderer/script_context.h" #include "extensions/renderer/script_context.h"
#include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/public/web/web_local_frame.h"
namespace extensions { namespace extensions {
...@@ -57,9 +59,18 @@ void GCCallback::OnObjectGC(const v8::WeakCallbackInfo<GCCallback>& data) { ...@@ -57,9 +59,18 @@ void GCCallback::OnObjectGC(const v8::WeakCallbackInfo<GCCallback>& data) {
// code is RunCallback. // code is RunCallback.
GCCallback* self = data.GetParameter(); GCCallback* self = data.GetParameter();
self->object_.Reset(); self->object_.Reset();
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&GCCallback::RunCallback, blink::WebLocalFrame* frame = self->context_->web_frame();
self->weak_ptr_factory_.GetWeakPtr())); scoped_refptr<base::SingleThreadTaskRunner> task_runner;
if (frame) {
task_runner = frame->GetTaskRunner(blink::TaskType::kInternalDefault);
} else {
// |frame| can be null on tests.
task_runner = base::ThreadTaskRunnerHandle::Get();
}
task_runner->PostTask(FROM_HERE,
base::BindOnce(&GCCallback::RunCallback,
self->weak_ptr_factory_.GetWeakPtr()));
} }
void GCCallback::RunCallback() { void GCCallback::RunCallback() {
......
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