Skip to content

Commit

Permalink
Use per-frame task runner at extnsions' GCCallback
Browse files Browse the repository at this point in the history
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/+/1514516
Reviewed-by: Ken Rockot <rockot@google.com>
Reviewed-by: Alexander Timin <altimin@chromium.org>
Commit-Queue: Hajime Hoshi <hajimehoshi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#641104}
  • Loading branch information
Hajime Hoshi authored and Commit Bot committed Mar 15, 2019
1 parent 251c3e7 commit 3662db4
Showing 1 changed file with 14 additions and 3 deletions.
17 changes: 14 additions & 3 deletions extensions/renderer/gc_callback.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.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 {

Expand Down Expand Up @@ -57,9 +59,18 @@ void GCCallback::OnObjectGC(const v8::WeakCallbackInfo<GCCallback>& data) {
// code is RunCallback.
GCCallback* self = data.GetParameter();
self->object_.Reset();
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&GCCallback::RunCallback,
self->weak_ptr_factory_.GetWeakPtr()));

blink::WebLocalFrame* frame = self->context_->web_frame();
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() {
Expand Down

0 comments on commit 3662db4

Please sign in to comment.