blob: d4efe08a7da3895ce36c45ebf747a1f8efdc89e0 [file] [log] [blame]
lambroslambroue0c2d0242016-03-23 01:21:201// Copyright 2016 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/client/chromoting_client_runtime.h"
6
Peter Boström42afa23f2021-04-02 22:10:467#include <memory>
8
lambroslambroue0c2d0242016-03-23 01:21:209#include "base/bind.h"
danakjdb9ae7942020-11-11 16:01:3510#include "base/callback_helpers.h"
lambroslambroue0c2d0242016-03-23 01:21:2011#include "base/logging.h"
nicholss825f7eb2017-03-17 18:48:4512#include "base/memory/singleton.h"
Carlos Caballerodd8bf7b042019-07-30 14:14:1513#include "base/message_loop/message_pump_type.h"
Carlos Caballerob25fe8472020-07-17 10:27:1714#include "base/task/current_thread.h"
Alex Clarkef7fb8a82019-06-06 15:41:5315#include "base/task/single_thread_task_executor.h"
Gabriel Charetteeadf58862019-08-29 05:20:2716#include "base/task/thread_pool/thread_pool_instance.h"
Ran Ji3d6ec662018-07-09 21:18:3017#include "build/build_config.h"
Yuwei Huang4debbed72018-08-30 20:51:2518#include "mojo/core/embedder/embedder.h"
nicholss825f7eb2017-03-17 18:48:4519#include "remoting/base/chromium_url_request.h"
Yuwei Huangfa4b0e72020-07-28 00:08:3820#include "remoting/base/directory_service_client.h"
Yuwei Huang786d8872019-04-30 01:07:2321#include "remoting/base/oauth_token_getter_proxy.h"
nicholss825f7eb2017-03-17 18:48:4522#include "remoting/base/telemetry_log_writer.h"
lambroslambroue0c2d0242016-03-23 01:21:2023#include "remoting/base/url_request_context_getter.h"
Maks Orlovich8db7d0d62018-08-16 19:22:2724#include "services/network/public/cpp/shared_url_loader_factory.h"
25#include "services/network/transitional_url_loader_factory_owner.h"
lambroslambroue0c2d0242016-03-23 01:21:2026
27namespace remoting {
28
nicholss825f7eb2017-03-17 18:48:4529// static
30ChromotingClientRuntime* ChromotingClientRuntime::GetInstance() {
31 return base::Singleton<ChromotingClientRuntime>::get();
32}
33
34ChromotingClientRuntime::ChromotingClientRuntime() {
Gabriel Charette43fd3702019-05-29 16:36:5135 base::ThreadPoolInstance::CreateAndStartWithDefaultParams("Remoting");
nicholss825f7eb2017-03-17 18:48:4536
Carlos Caballerob25fe8472020-07-17 10:27:1737 DCHECK(!base::CurrentThread::Get());
Gabriel Charette12c0fc102018-03-30 02:03:2338
39 VLOG(1) << "Starting main message loop";
Peter Boström42afa23f2021-04-02 22:10:4640 ui_task_executor_ = std::make_unique<base::SingleThreadTaskExecutor>(
41 base::MessagePumpType::UI);
nicholss825f7eb2017-03-17 18:48:4542
43#if defined(DEBUG)
44 net::URLFetcher::SetIgnoreCertificateRequests(true);
45#endif // DEBUG
lambroslambroue0c2d0242016-03-23 01:21:2046
Alex Clarkef7fb8a82019-06-06 15:41:5347 // |ui_task_executor_| runs on the main thread, so |ui_task_runner_| will run
48 // on the main thread. We can not kill the main thread when the message loop
49 // becomes idle so the callback function does nothing (as opposed to the
50 // typical base::MessageLoop::QuitClosure())
51 ui_task_runner_ = new AutoThreadTaskRunner(ui_task_executor_->task_runner(),
52 base::DoNothing());
Scott Nichols77a375a2017-09-19 20:49:0253 audio_task_runner_ = AutoThread::Create("native_audio", ui_task_runner_);
nicholss825f7eb2017-03-17 18:48:4554 display_task_runner_ = AutoThread::Create("native_disp", ui_task_runner_);
55 network_task_runner_ = AutoThread::CreateWithType(
Carlos Caballerodd8bf7b042019-07-30 14:14:1556 "native_net", ui_task_runner_, base::MessagePumpType::IO);
Yuwei Huang4debbed72018-08-30 20:51:2557
58 mojo::core::Init();
lambroslambroue0c2d0242016-03-23 01:21:2059}
60
nicholss825f7eb2017-03-17 18:48:4561ChromotingClientRuntime::~ChromotingClientRuntime() {
62 if (delegate_) {
63 delegate_->RuntimeWillShutdown();
64 } else {
65 DLOG(ERROR) << "ClientRuntime Delegate is null.";
66 }
lambroslambroue0c2d0242016-03-23 01:21:2067
nicholss825f7eb2017-03-17 18:48:4568 // Block until tasks blocking shutdown have completed their execution.
Gabriel Charette43fd3702019-05-29 16:36:5169 base::ThreadPoolInstance::Get()->Shutdown();
nicholss825f7eb2017-03-17 18:48:4570
71 if (delegate_) {
72 delegate_->RuntimeDidShutdown();
73 }
74}
75
Yuwei Huang50afc832018-03-21 22:00:2676void ChromotingClientRuntime::Init(
nicholss825f7eb2017-03-17 18:48:4577 ChromotingClientRuntime::Delegate* delegate) {
Yuwei Huang50afc832018-03-21 22:00:2678 DCHECK(delegate);
79 DCHECK(!delegate_);
nicholss825f7eb2017-03-17 18:48:4580 delegate_ = delegate;
Yuwei Huanga1f0a5b2018-09-10 20:58:3481 url_requester_ = new URLRequestContextGetter(network_task_runner_);
Erik Jensen2c673d12019-05-31 00:00:1782 log_writer_ = std::make_unique<TelemetryLogWriter>(CreateOAuthTokenGetter());
Yuwei Huang4debbed72018-08-30 20:51:2583 network_task_runner()->PostTask(
84 FROM_HERE,
85 base::BindOnce(&ChromotingClientRuntime::InitializeOnNetworkThread,
86 base::Unretained(this)));
nicholss825f7eb2017-03-17 18:48:4587}
88
Yuwei Huang50afc832018-03-21 22:00:2689std::unique_ptr<OAuthTokenGetter>
90ChromotingClientRuntime::CreateOAuthTokenGetter() {
91 return std::make_unique<OAuthTokenGetterProxy>(
92 delegate_->oauth_token_getter(), ui_task_runner());
Yuwei Huang192209302017-11-09 00:06:0893}
lambroslambroue0c2d0242016-03-23 01:21:2094
Yuwei Huangfa4b0e72020-07-28 00:08:3895base::SequenceBound<DirectoryServiceClient>
96ChromotingClientRuntime::CreateDirectoryServiceClient() {
97 // A DirectoryServiceClient subclass that calls url_loader_factory() in its
98 // constructor, as we can't call it on a non-network thread then pass it via
99 // base::SequenceBound.
100 class ClientDirectoryServiceClient : public DirectoryServiceClient {
101 public:
102 ClientDirectoryServiceClient(ChromotingClientRuntime* runtime,
103 std::unique_ptr<OAuthTokenGetter> token_getter)
104 : DirectoryServiceClient(token_getter.get(),
105 runtime->url_loader_factory()),
106 token_getter_(std::move(token_getter)) {}
107 ~ClientDirectoryServiceClient() override = default;
108
109 private:
110 std::unique_ptr<OAuthTokenGetter> token_getter_;
111 };
112
113 return base::SequenceBound<ClientDirectoryServiceClient>(
114 network_task_runner(), this, CreateOAuthTokenGetter());
115}
116
Maks Orlovich8db7d0d62018-08-16 19:22:27117scoped_refptr<network::SharedURLLoaderFactory>
118ChromotingClientRuntime::url_loader_factory() {
Yuwei Huang4debbed72018-08-30 20:51:25119 DCHECK(network_task_runner()->BelongsToCurrentThread());
Maks Orlovich8db7d0d62018-08-16 19:22:27120 return url_loader_factory_owner_->GetURLLoaderFactory();
121}
122
Yuwei Huang4debbed72018-08-30 20:51:25123void ChromotingClientRuntime::InitializeOnNetworkThread() {
124 DCHECK(network_task_runner()->BelongsToCurrentThread());
Yuwei Huang4debbed72018-08-30 20:51:25125 url_loader_factory_owner_ =
126 std::make_unique<network::TransitionalURLLoaderFactoryOwner>(
127 url_requester_);
Yuwei Huang311227be2020-07-30 21:06:40128 log_writer_->Init(url_loader_factory_owner_->GetURLLoaderFactory());
Yuwei Huang4debbed72018-08-30 20:51:25129}
130
lambroslambroue0c2d0242016-03-23 01:21:20131} // namespace remoting