blob: 54ad75c996351e65cdfd10f88592e6d95d257145 [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
7#include "base/bind.h"
Peter Kasting383640f52018-02-13 06:22:408#include "base/bind_helpers.h"
lambroslambroue0c2d0242016-03-23 01:21:209#include "base/logging.h"
nicholss825f7eb2017-03-17 18:48:4510#include "base/memory/singleton.h"
Alexander Timin4f9c35c2018-11-01 20:15:2011#include "base/message_loop/message_loop.h"
Gabriel Charetteaec08d42018-04-24 21:40:3112#include "base/message_loop/message_loop_current.h"
Gabriel Charette52fa3ae2019-04-15 21:44:3713#include "base/task/thread_pool/thread_pool.h"
Ran Ji3d6ec662018-07-09 21:18:3014#include "build/build_config.h"
Yuwei Huang4debbed72018-08-30 20:51:2515#include "mojo/core/embedder/embedder.h"
nicholss825f7eb2017-03-17 18:48:4516#include "remoting/base/chromium_url_request.h"
Yuwei Huang786d8872019-04-30 01:07:2317#include "remoting/base/oauth_token_getter_proxy.h"
nicholss825f7eb2017-03-17 18:48:4518#include "remoting/base/telemetry_log_writer.h"
lambroslambroue0c2d0242016-03-23 01:21:2019#include "remoting/base/url_request_context_getter.h"
Maks Orlovich8db7d0d62018-08-16 19:22:2720#include "services/network/public/cpp/shared_url_loader_factory.h"
21#include "services/network/transitional_url_loader_factory_owner.h"
lambroslambroue0c2d0242016-03-23 01:21:2022
nicholss825f7eb2017-03-17 18:48:4523namespace {
24
25const char kTelemetryBaseUrl[] = "https://remoting-pa.googleapis.com/v1/events";
26
27} // namespace
28
lambroslambroue0c2d0242016-03-23 01:21:2029namespace remoting {
30
nicholss825f7eb2017-03-17 18:48:4531// static
32ChromotingClientRuntime* ChromotingClientRuntime::GetInstance() {
33 return base::Singleton<ChromotingClientRuntime>::get();
34}
35
36ChromotingClientRuntime::ChromotingClientRuntime() {
Gabriel Charette43fd3702019-05-29 16:36:5137 base::ThreadPoolInstance::CreateAndStartWithDefaultParams("Remoting");
nicholss825f7eb2017-03-17 18:48:4538
Gabriel Charetteaec08d42018-04-24 21:40:3139 DCHECK(!base::MessageLoopCurrent::Get());
Gabriel Charette12c0fc102018-03-30 02:03:2340
41 VLOG(1) << "Starting main message loop";
42 ui_loop_.reset(new base::MessageLoopForUI());
Ran Ji3d6ec662018-07-09 21:18:3043#if defined(OS_IOS)
44 // TODO(ranj): Attach on BindToCurrentThread().
Gabriel Charette12c0fc102018-03-30 02:03:2345 ui_loop_->Attach();
Ran Ji3d6ec662018-07-09 21:18:3046#endif
nicholss825f7eb2017-03-17 18:48:4547
48#if defined(DEBUG)
49 net::URLFetcher::SetIgnoreCertificateRequests(true);
50#endif // DEBUG
lambroslambroue0c2d0242016-03-23 01:21:2051
52 // |ui_loop_| runs on the main thread, so |ui_task_runner_| will run on the
53 // main thread. We can not kill the main thread when the message loop becomes
54 // idle so the callback function does nothing (as opposed to the typical
55 // base::MessageLoop::QuitClosure())
Peter Kasting341e1fb2018-02-24 00:03:0156 ui_task_runner_ =
57 new AutoThreadTaskRunner(ui_loop_->task_runner(), base::DoNothing());
Scott Nichols77a375a2017-09-19 20:49:0258 audio_task_runner_ = AutoThread::Create("native_audio", ui_task_runner_);
nicholss825f7eb2017-03-17 18:48:4559 display_task_runner_ = AutoThread::Create("native_disp", ui_task_runner_);
60 network_task_runner_ = AutoThread::CreateWithType(
61 "native_net", ui_task_runner_, base::MessageLoop::TYPE_IO);
Yuwei Huang4debbed72018-08-30 20:51:2562
63 mojo::core::Init();
lambroslambroue0c2d0242016-03-23 01:21:2064}
65
nicholss825f7eb2017-03-17 18:48:4566ChromotingClientRuntime::~ChromotingClientRuntime() {
67 if (delegate_) {
68 delegate_->RuntimeWillShutdown();
69 } else {
70 DLOG(ERROR) << "ClientRuntime Delegate is null.";
71 }
lambroslambroue0c2d0242016-03-23 01:21:2072
nicholss825f7eb2017-03-17 18:48:4573 // Block until tasks blocking shutdown have completed their execution.
Gabriel Charette43fd3702019-05-29 16:36:5174 base::ThreadPoolInstance::Get()->Shutdown();
nicholss825f7eb2017-03-17 18:48:4575
76 if (delegate_) {
77 delegate_->RuntimeDidShutdown();
78 }
79}
80
Yuwei Huang50afc832018-03-21 22:00:2681void ChromotingClientRuntime::Init(
nicholss825f7eb2017-03-17 18:48:4582 ChromotingClientRuntime::Delegate* delegate) {
Yuwei Huang50afc832018-03-21 22:00:2683 DCHECK(delegate);
84 DCHECK(!delegate_);
nicholss825f7eb2017-03-17 18:48:4585 delegate_ = delegate;
Yuwei Huanga1f0a5b2018-09-10 20:58:3486 url_requester_ = new URLRequestContextGetter(network_task_runner_);
87 log_writer_ = std::make_unique<TelemetryLogWriter>(kTelemetryBaseUrl,
88 CreateOAuthTokenGetter());
Yuwei Huang4debbed72018-08-30 20:51:2589 network_task_runner()->PostTask(
90 FROM_HERE,
91 base::BindOnce(&ChromotingClientRuntime::InitializeOnNetworkThread,
92 base::Unretained(this)));
nicholss825f7eb2017-03-17 18:48:4593}
94
Yuwei Huang50afc832018-03-21 22:00:2695std::unique_ptr<OAuthTokenGetter>
96ChromotingClientRuntime::CreateOAuthTokenGetter() {
97 return std::make_unique<OAuthTokenGetterProxy>(
98 delegate_->oauth_token_getter(), ui_task_runner());
Yuwei Huang192209302017-11-09 00:06:0899}
lambroslambroue0c2d0242016-03-23 01:21:20100
Maks Orlovich8db7d0d62018-08-16 19:22:27101scoped_refptr<network::SharedURLLoaderFactory>
102ChromotingClientRuntime::url_loader_factory() {
Yuwei Huang4debbed72018-08-30 20:51:25103 DCHECK(network_task_runner()->BelongsToCurrentThread());
Maks Orlovich8db7d0d62018-08-16 19:22:27104 return url_loader_factory_owner_->GetURLLoaderFactory();
105}
106
Yuwei Huang4debbed72018-08-30 20:51:25107void ChromotingClientRuntime::InitializeOnNetworkThread() {
108 DCHECK(network_task_runner()->BelongsToCurrentThread());
Yuwei Huang4debbed72018-08-30 20:51:25109 url_loader_factory_owner_ =
110 std::make_unique<network::TransitionalURLLoaderFactoryOwner>(
111 url_requester_);
112 log_writer_->Init(
113 std::make_unique<ChromiumUrlRequestFactory>(url_loader_factory()));
114}
115
lambroslambroue0c2d0242016-03-23 01:21:20116} // namespace remoting