Commit 08fd6530 authored by Gabriel Charette's avatar Gabriel Charette Committed by Commit Bot

Remove RenderThreadImpl dependency on MessageLoop::current().

Instead it now always has a MessageLoop* and is allowed to use APIs
which will soon no longer be exposed on MessageLoop::current().

This is a precusor cleanup extracted from
https://chromium-review.googlesource.com/c/chromium/src/+/957760/7
in the broader effort to restrict usage of MessageLoop::current().

R=haraken@chromium.org

Bug: 825327
Change-Id: I580fe360ff9630a5ffb40b89921c6889d449e67a
Reviewed-on: https://chromium-review.googlesource.com/986813
Commit-Queue: Gabriel Charette <gab@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#548163}
parent 284db8b8
......@@ -47,7 +47,7 @@ void InProcessRendererThread::Init() {
CHECK(!render_process_);
#endif
render_process_ = RenderProcessImpl::Create();
RenderThreadImpl::Create(params_);
RenderThreadImpl::Create(params_, message_loop());
}
void InProcessRendererThread::CleanUp() {
......
......@@ -670,13 +670,14 @@ bool RenderThreadImpl::HistogramCustomizer::IsAlexaTop10NonGoogleSite(
// static
RenderThreadImpl* RenderThreadImpl::Create(
const InProcessChildThreadParams& params) {
const InProcessChildThreadParams& params,
base::MessageLoop* unowned_message_loop) {
TRACE_EVENT0("startup", "RenderThreadImpl::Create");
std::unique_ptr<blink::scheduler::RendererScheduler> renderer_scheduler =
blink::scheduler::RendererScheduler::Create();
scoped_refptr<base::SingleThreadTaskRunner> test_task_counter;
return new RenderThreadImpl(
params, std::move(renderer_scheduler), test_task_counter);
return new RenderThreadImpl(params, std::move(renderer_scheduler),
test_task_counter, unowned_message_loop);
}
// static
......@@ -733,7 +734,8 @@ RenderThreadImpl::DeprecatedGetMainTaskRunner() {
RenderThreadImpl::RenderThreadImpl(
const InProcessChildThreadParams& params,
std::unique_ptr<blink::scheduler::RendererScheduler> scheduler,
const scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue)
const scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue,
base::MessageLoop* unowned_message_loop)
: ChildThreadImpl(
Options::Builder()
.InBrowserProcess(params)
......@@ -742,6 +744,7 @@ RenderThreadImpl::RenderThreadImpl(
.IPCTaskRunner(scheduler ? scheduler->IPCTaskRunner() : nullptr)
.Build()),
renderer_scheduler_(std::move(scheduler)),
main_message_loop_(unowned_message_loop),
categorized_worker_pool_(new CategorizedWorkerPool()),
renderer_binding_(this),
client_id_(1),
......@@ -753,7 +756,7 @@ RenderThreadImpl::RenderThreadImpl(
// When we run plugins in process, we actually run them on the render thread,
// which means that we need to make the render thread pump UI events.
RenderThreadImpl::RenderThreadImpl(
std::unique_ptr<base::MessageLoop> main_message_loop,
std::unique_ptr<base::MessageLoop> owned_message_loop,
std::unique_ptr<blink::scheduler::RendererScheduler> scheduler)
: ChildThreadImpl(
Options::Builder()
......@@ -762,7 +765,8 @@ RenderThreadImpl::RenderThreadImpl(
.IPCTaskRunner(scheduler ? scheduler->IPCTaskRunner() : nullptr)
.Build()),
renderer_scheduler_(std::move(scheduler)),
main_message_loop_(std::move(main_message_loop)),
owned_message_loop_(std::move(owned_message_loop)),
main_message_loop_(owned_message_loop_.get()),
categorized_worker_pool_(new CategorizedWorkerPool()),
is_scroll_animator_enabled_(false),
renderer_binding_(this),
......@@ -781,6 +785,10 @@ void RenderThreadImpl::Init(
const scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue) {
TRACE_EVENT0("startup", "RenderThreadImpl::Init");
// Whether owned or unowned, |main_message_loop_| needs to be initialized in
// all constructors.
DCHECK(main_message_loop_);
GetContentClient()->renderer()->PostIOThreadCreated(GetIOTaskRunner().get());
base::trace_event::TraceLog::GetInstance()->SetThreadSortIndex(
......@@ -793,7 +801,7 @@ void RenderThreadImpl::Init(
#endif
lazy_tls.Pointer()->Set(this);
g_main_task_runner.Get() = base::MessageLoop::current()->task_runner();
g_main_task_runner.Get() = main_message_loop_->task_runner();
// Register this object as the main thread.
ChildProcess::current()->set_main_thread(this);
......@@ -1828,7 +1836,7 @@ void RenderThreadImpl::SetProcessBackgrounded(bool backgrounded) {
base::TimerSlack timer_slack = base::TIMER_SLACK_NONE;
if (backgrounded)
timer_slack = base::TIMER_SLACK_MAXIMUM;
base::MessageLoop::current()->SetTimerSlack(timer_slack);
main_message_loop_->SetTimerSlack(timer_slack);
renderer_scheduler_->SetRendererBackgrounded(backgrounded);
if (backgrounded) {
......
......@@ -181,7 +181,8 @@ class CONTENT_EXPORT RenderThreadImpl
public viz::mojom::CompositingModeWatcher,
public CompositorDependencies {
public:
static RenderThreadImpl* Create(const InProcessChildThreadParams& params);
static RenderThreadImpl* Create(const InProcessChildThreadParams& params,
base::MessageLoop* unowned_message_loop);
static RenderThreadImpl* Create(
std::unique_ptr<base::MessageLoop> main_message_loop,
std::unique_ptr<blink::scheduler::RendererScheduler> renderer_scheduler);
......@@ -534,7 +535,8 @@ class CONTENT_EXPORT RenderThreadImpl
RenderThreadImpl(
const InProcessChildThreadParams& params,
std::unique_ptr<blink::scheduler::RendererScheduler> scheduler,
const scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue);
const scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue,
base::MessageLoop* unowned_message_loop);
RenderThreadImpl(
std::unique_ptr<base::MessageLoop> main_message_loop,
std::unique_ptr<blink::scheduler::RendererScheduler> scheduler);
......@@ -707,7 +709,11 @@ class CONTENT_EXPORT RenderThreadImpl
// The message loop of the renderer main thread.
// This message loop should be destructed before the RenderThreadImpl
// shuts down Blink.
std::unique_ptr<base::MessageLoop> main_message_loop_;
// Some test users (e.g. InProcessRenderThread) own the MessageLoop used by
// their RenderThreadImpls. |main_message_loop_| is always non-nulll,
// |owned_message_loop_| is non-null if handed in at creation.
const std::unique_ptr<base::MessageLoop> owned_message_loop_;
base::MessageLoop* const main_message_loop_;
// May be null if overridden by ContentRendererClient.
std::unique_ptr<blink::scheduler::WebThreadBase> compositor_thread_;
......
......@@ -6,17 +6,22 @@
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <utility>
#include "base/callback.h"
#include "base/command_line.h"
#include "base/debug/leak_annotations.h"
#include "base/location.h"
#include "base/macros.h"
#include "base/memory/discardable_memory.h"
#include "base/message_loop/message_loop.h"
#include "base/metrics/field_trial.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_number_conversions.h"
#include "base/task_scheduler/task_scheduler.h"
#include "base/test/scoped_feature_list.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "base/threading/thread_task_runner_handle.h"
......@@ -128,8 +133,12 @@ class RenderThreadImplForTest : public RenderThreadImpl {
RenderThreadImplForTest(
const InProcessChildThreadParams& params,
std::unique_ptr<blink::scheduler::RendererScheduler> scheduler,
scoped_refptr<base::SingleThreadTaskRunner>& test_task_counter)
: RenderThreadImpl(params, std::move(scheduler), test_task_counter) {}
scoped_refptr<base::SingleThreadTaskRunner>& test_task_counter,
base::MessageLoop* unowned_message_loop)
: RenderThreadImpl(params,
std::move(scheduler),
test_task_counter,
unowned_message_loop) {}
~RenderThreadImplForTest() override {}
};
......@@ -166,12 +175,34 @@ class QuitOnTestMsgFilter : public IPC::MessageFilter {
class RenderThreadImplBrowserTest : public testing::Test {
public:
// Managing our own main MessageLoop also forces us to manage our own
// TaskScheduler. This ensures a basic TaskScheduler is in scope during this
// test.
class TestTaskScheduler {
public:
TestTaskScheduler() {
base::TaskScheduler::CreateAndStartWithDefaultParams(
"RenderThreadImplBrowserTest");
}
~TestTaskScheduler() {
base::TaskScheduler::GetInstance()->Shutdown();
base::TaskScheduler::GetInstance()->JoinForTesting();
base::TaskScheduler::SetInstance(nullptr);
}
private:
DISALLOW_COPY_AND_ASSIGN(TestTaskScheduler);
};
RenderThreadImplBrowserTest() : field_trial_list_(nullptr) {}
void SetUp() override {
content_renderer_client_.reset(new ContentRendererClient());
SetRendererClientForTesting(content_renderer_client_.get());
main_message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_IO));
test_task_scheduler_.reset(new TestTaskScheduler);
browser_threads_.reset(
new TestBrowserThreadBundle(TestBrowserThreadBundle::IO_MAINLOOP));
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner =
......@@ -227,7 +258,8 @@ class RenderThreadImplBrowserTest : public testing::Test {
thread_ = new RenderThreadImplForTest(
InProcessChildThreadParams(io_task_runner, &invitation,
child_connection_->service_token()),
std::move(renderer_scheduler), test_task_counter);
std::move(renderer_scheduler), test_task_counter,
main_message_loop_.get());
cmd->InitFromArgv(old_argv);
run_loop_ = std::make_unique<base::RunLoop>();
......@@ -247,12 +279,15 @@ class RenderThreadImplBrowserTest : public testing::Test {
}
}
protected:
IPC::Sender* sender() { return channel_.get(); }
scoped_refptr<TestTaskCounter> test_task_counter_;
TestContentClientInitializer content_client_initializer_;
std::unique_ptr<ContentRendererClient> content_renderer_client_;
std::unique_ptr<base::MessageLoop> main_message_loop_;
std::unique_ptr<TestTaskScheduler> test_task_scheduler_;
std::unique_ptr<TestBrowserThreadBundle> browser_threads_;
std::unique_ptr<TestServiceManagerContext> shell_context_;
std::unique_ptr<ChildConnection> child_connection_;
......@@ -266,6 +301,9 @@ class RenderThreadImplBrowserTest : public testing::Test {
base::FieldTrialList field_trial_list_;
std::unique_ptr<base::RunLoop> run_loop_;
private:
DISALLOW_COPY_AND_ASSIGN(RenderThreadImplBrowserTest);
};
class RenderThreadImplMojoInputMessagesDisabledBrowserTest
......
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