Commit 6ca7b664 authored by Minoru Chikamune's avatar Minoru Chikamune Committed by Commit Bot

[MBI] Use per-AgentSchedulingGroup task runners for RemoteFrame's mojo interfaces

Context:

RemoteFrame’s mojo interfaces should be associated with per-AgentSchedulingGroup task runners instead of per-thread task runners.

What this CL does:

Use per-AgentSchedulingGroup task runners for AgentSchedulingGroup’s mojo interfaces instead of per-thread task runners.

Bug: 1105403
Change-Id: Ia4e2885163bb73a73e4a73d6459f37e68738e18f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2497961Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Reviewed-by: default avatarKouhei Ueno <kouhei@chromium.org>
Commit-Queue: Minoru Chikamune <chikamune@chromium.org>
Cr-Commit-Position: refs/heads/master@{#821490}
parent 1e924c3b
......@@ -109,9 +109,12 @@ RemoteFrame::RemoteFrame(
frame_token,
MakeGarbageCollected<RemoteWindowProxyManager>(*this),
inheriting_agent_factory),
interface_registry_(
interface_registry ? interface_registry
: InterfaceRegistry::GetEmptyInterfaceRegistry()) {
interface_registry_(interface_registry
? interface_registry
: InterfaceRegistry::GetEmptyInterfaceRegistry()),
task_runner_(page.GetPageScheduler()
->GetAgentGroupScheduler()
.DefaultTaskRunner()) {
// TODO(crbug.com/1094850): Remove this check once the renderer is correctly
// handling errors during the creation of HTML portal elements, which would
// otherwise cause RemoteFrame() being created with empty frame tokens.
......@@ -126,8 +129,9 @@ RemoteFrame::RemoteFrame(
interface_registry->AddAssociatedInterface(WTF::BindRepeating(
&RemoteFrame::BindToReceiver, WrapWeakPersistent(this)));
DCHECK(task_runner_);
associated_interface_provider->GetInterface(
remote_frame_host_remote_.BindNewEndpointAndPassReceiver());
remote_frame_host_remote_.BindNewEndpointAndPassReceiver(task_runner_));
UpdateInertIfPossible();
UpdateInheritedEffectiveTouchActionIfPossible();
......@@ -832,14 +836,14 @@ void RemoteFrame::BindToReceiver(
RemoteFrame* frame,
mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver) {
DCHECK(frame);
frame->receiver_.Bind(std::move(receiver));
frame->receiver_.Bind(std::move(receiver), frame->task_runner_);
}
void RemoteFrame::BindToMainFrameReceiver(
RemoteFrame* frame,
mojo::PendingAssociatedReceiver<mojom::blink::RemoteMainFrame> receiver) {
DCHECK(frame);
frame->main_frame_receiver_.Bind(std::move(receiver));
frame->main_frame_receiver_.Bind(std::move(receiver), frame->task_runner_);
}
} // namespace blink
......@@ -228,6 +228,7 @@ class CORE_EXPORT RemoteFrame final : public Frame,
mojo::AssociatedReceiver<mojom::blink::RemoteFrame> receiver_{this};
mojo::AssociatedReceiver<mojom::blink::RemoteMainFrame> main_frame_receiver_{
this};
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
};
inline RemoteFrameView* RemoteFrame::View() const {
......
......@@ -92,10 +92,28 @@ class DummyFrameScheduler : public FrameScheduler {
DISALLOW_COPY_AND_ASSIGN(DummyFrameScheduler);
};
class DummyAgentGroupScheduler : public AgentGroupScheduler {
public:
DummyAgentGroupScheduler() = default;
~DummyAgentGroupScheduler() override = default;
AgentGroupScheduler& AsAgentGroupScheduler() override { return *this; }
std::unique_ptr<PageScheduler> CreatePageScheduler(
PageScheduler::Delegate*) override {
return CreateDummyPageScheduler();
}
scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override {
return base::ThreadTaskRunnerHandle::Get();
}
private:
DISALLOW_COPY_AND_ASSIGN(DummyAgentGroupScheduler);
};
class DummyPageScheduler : public PageScheduler {
public:
DummyPageScheduler() {}
~DummyPageScheduler() override {}
DummyPageScheduler()
: agent_group_scheduler_(std::make_unique<DummyAgentGroupScheduler>()) {}
~DummyPageScheduler() override = default;
std::unique_ptr<FrameScheduler> CreateFrameScheduler(
FrameScheduler::Delegate* delegate,
......@@ -132,26 +150,13 @@ class DummyPageScheduler : public PageScheduler {
WebScopedVirtualTimePauser::VirtualTaskDuration) override {
return WebScopedVirtualTimePauser();
}
private:
DISALLOW_COPY_AND_ASSIGN(DummyPageScheduler);
};
class DummyAgentGroupScheduler : public AgentGroupScheduler {
public:
DummyAgentGroupScheduler() = default;
~DummyAgentGroupScheduler() override = default;
AgentGroupScheduler& AsAgentGroupScheduler() override { return *this; }
std::unique_ptr<PageScheduler> CreatePageScheduler(
PageScheduler::Delegate*) override {
return CreateDummyPageScheduler();
}
scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override {
return base::ThreadTaskRunnerHandle::Get();
scheduler::WebAgentGroupScheduler& GetAgentGroupScheduler() override {
return *agent_group_scheduler_;
}
private:
DISALLOW_COPY_AND_ASSIGN(DummyAgentGroupScheduler);
std::unique_ptr<DummyAgentGroupScheduler> agent_group_scheduler_;
DISALLOW_COPY_AND_ASSIGN(DummyPageScheduler);
};
// TODO(altimin,yutak): Merge with SimpleThread in platform.cc.
......
......@@ -115,7 +115,7 @@ class PLATFORM_EXPORT PageSchedulerImpl : public PageScheduler {
bool IsOrdinary() const;
MainThreadSchedulerImpl* GetMainThreadScheduler() const;
AgentGroupSchedulerImpl& GetAgentGroupScheduler();
AgentGroupSchedulerImpl& GetAgentGroupScheduler() override;
void Unregister(FrameSchedulerImpl*);
void OnNavigation();
......
......@@ -18,6 +18,10 @@
namespace blink {
namespace scheduler {
class WebAgentGroupScheduler;
} // namespace scheduler
class PLATFORM_EXPORT PageScheduler {
public:
class PLATFORM_EXPORT Delegate {
......@@ -156,6 +160,9 @@ class PLATFORM_EXPORT PageScheduler {
virtual WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
const String& name,
WebScopedVirtualTimePauser::VirtualTaskDuration) = 0;
// Returns WebAgentGroupScheduler
virtual scheduler::WebAgentGroupScheduler& GetAgentGroupScheduler() = 0;
};
} // namespace blink
......
......@@ -5,6 +5,7 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_TEST_FAKE_PAGE_SCHEDULER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_TEST_FAKE_PAGE_SCHEDULER_H_
#include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/public/page_scheduler.h"
namespace blink {
......@@ -14,7 +15,8 @@ class FakePageScheduler final : public PageScheduler {
public:
FakePageScheduler(bool is_audio_playing, bool is_throttling_exempt)
: is_audio_playing_(is_audio_playing),
is_throttling_exempt_(is_throttling_exempt) {}
is_throttling_exempt_(is_throttling_exempt),
agent_group_scheduler_(WebAgentGroupScheduler::CreateForTesting()) {}
class Builder {
public:
......@@ -85,10 +87,14 @@ class FakePageScheduler final : public PageScheduler {
WebScopedVirtualTimePauser::VirtualTaskDuration) override {
return WebScopedVirtualTimePauser();
}
scheduler::WebAgentGroupScheduler& GetAgentGroupScheduler() override {
return *agent_group_scheduler_;
}
private:
bool is_audio_playing_;
bool is_throttling_exempt_;
std::unique_ptr<WebAgentGroupScheduler> agent_group_scheduler_;
DISALLOW_COPY_AND_ASSIGN(FakePageScheduler);
};
......
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