lacros_service.cc 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816
  1. // Copyright 2020 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. #include "chromeos/lacros/lacros_service.h"
  5. #include <atomic>
  6. #include <utility>
  7. #include "base/command_line.h"
  8. #include "base/containers/contains.h"
  9. #include "base/logging.h"
  10. #include "base/task/bind_post_task.h"
  11. #include "base/task/task_traits.h"
  12. #include "base/task/thread_pool.h"
  13. #include "build/chromeos_buildflags.h"
  14. #include "chromeos/components/remote_apps/mojom/remote_apps.mojom.h"
  15. #include "chromeos/crosapi/cpp/crosapi_constants.h"
  16. #include "chromeos/crosapi/mojom/app_service.mojom.h"
  17. #include "chromeos/crosapi/mojom/app_window_tracker.mojom.h"
  18. #include "chromeos/crosapi/mojom/arc.mojom.h"
  19. #include "chromeos/crosapi/mojom/audio_service.mojom.h"
  20. #include "chromeos/crosapi/mojom/authentication.mojom.h"
  21. #include "chromeos/crosapi/mojom/automation.mojom.h"
  22. #include "chromeos/crosapi/mojom/browser_app_instance_registry.mojom.h"
  23. #include "chromeos/crosapi/mojom/browser_version.mojom.h"
  24. #include "chromeos/crosapi/mojom/cert_database.mojom.h"
  25. #include "chromeos/crosapi/mojom/cert_provisioning.mojom.h"
  26. #include "chromeos/crosapi/mojom/chrome_app_kiosk_service.mojom.h"
  27. #include "chromeos/crosapi/mojom/clipboard.mojom.h"
  28. #include "chromeos/crosapi/mojom/clipboard_history.mojom.h"
  29. #include "chromeos/crosapi/mojom/content_protection.mojom.h"
  30. #include "chromeos/crosapi/mojom/cros_display_config.mojom.h"
  31. #include "chromeos/crosapi/mojom/crosapi.mojom.h"
  32. #include "chromeos/crosapi/mojom/desk_template.mojom.h"
  33. #include "chromeos/crosapi/mojom/device_oauth2_token_service.mojom.h"
  34. #include "chromeos/crosapi/mojom/device_settings_service.mojom.h"
  35. #include "chromeos/crosapi/mojom/diagnostics_service.mojom.h"
  36. #include "chromeos/crosapi/mojom/digital_goods.mojom.h"
  37. #include "chromeos/crosapi/mojom/dlp.mojom.h"
  38. #include "chromeos/crosapi/mojom/document_scan.mojom.h"
  39. #include "chromeos/crosapi/mojom/download_controller.mojom.h"
  40. #include "chromeos/crosapi/mojom/drive_integration_service.mojom.h"
  41. #include "chromeos/crosapi/mojom/echo_private.mojom.h"
  42. #include "chromeos/crosapi/mojom/emoji_picker.mojom.h"
  43. #include "chromeos/crosapi/mojom/extension_info_private.mojom.h"
  44. #include "chromeos/crosapi/mojom/feedback.mojom.h"
  45. #include "chromeos/crosapi/mojom/field_trial.mojom.h"
  46. #include "chromeos/crosapi/mojom/file_manager.mojom.h"
  47. #include "chromeos/crosapi/mojom/file_system_provider.mojom.h"
  48. #include "chromeos/crosapi/mojom/force_installed_tracker.mojom.h"
  49. #include "chromeos/crosapi/mojom/fullscreen_controller.mojom.h"
  50. #include "chromeos/crosapi/mojom/geolocation.mojom.h"
  51. #include "chromeos/crosapi/mojom/holding_space_service.mojom.h"
  52. #include "chromeos/crosapi/mojom/identity_manager.mojom.h"
  53. #include "chromeos/crosapi/mojom/image_writer.mojom.h"
  54. #include "chromeos/crosapi/mojom/in_session_auth.mojom.h"
  55. #include "chromeos/crosapi/mojom/keystore_service.mojom.h"
  56. #include "chromeos/crosapi/mojom/kiosk_session_service.mojom.h"
  57. #include "chromeos/crosapi/mojom/launcher_search.mojom.h"
  58. #include "chromeos/crosapi/mojom/local_printer.mojom.h"
  59. #include "chromeos/crosapi/mojom/login.mojom.h"
  60. #include "chromeos/crosapi/mojom/login_screen_storage.mojom.h"
  61. #include "chromeos/crosapi/mojom/login_state.mojom.h"
  62. #include "chromeos/crosapi/mojom/message_center.mojom.h"
  63. #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h"
  64. #include "chromeos/crosapi/mojom/network_change.mojom.h"
  65. #include "chromeos/crosapi/mojom/network_settings_service.mojom.h"
  66. #include "chromeos/crosapi/mojom/networking_attributes.mojom.h"
  67. #include "chromeos/crosapi/mojom/networking_private.mojom.h"
  68. #include "chromeos/crosapi/mojom/policy_service.mojom.h"
  69. #include "chromeos/crosapi/mojom/power.mojom.h"
  70. #include "chromeos/crosapi/mojom/prefs.mojom.h"
  71. #include "chromeos/crosapi/mojom/printing_metrics.mojom.h"
  72. #include "chromeos/crosapi/mojom/probe_service.mojom.h"
  73. #include "chromeos/crosapi/mojom/remoting.mojom.h"
  74. #include "chromeos/crosapi/mojom/resource_manager.mojom.h"
  75. #include "chromeos/crosapi/mojom/screen_manager.mojom.h"
  76. #include "chromeos/crosapi/mojom/select_file.mojom.h"
  77. #include "chromeos/crosapi/mojom/sharesheet.mojom.h"
  78. #include "chromeos/crosapi/mojom/speech_recognition.mojom.h"
  79. #include "chromeos/crosapi/mojom/sync.mojom.h"
  80. #include "chromeos/crosapi/mojom/system_display.mojom.h"
  81. #include "chromeos/crosapi/mojom/task_manager.mojom.h"
  82. #include "chromeos/crosapi/mojom/test_controller.mojom.h"
  83. #include "chromeos/crosapi/mojom/timezone.mojom.h"
  84. #include "chromeos/crosapi/mojom/tts.mojom.h"
  85. #include "chromeos/crosapi/mojom/url_handler.mojom.h"
  86. #include "chromeos/crosapi/mojom/virtual_keyboard.mojom.h"
  87. #include "chromeos/crosapi/mojom/volume_manager.mojom.h"
  88. #include "chromeos/crosapi/mojom/vpn_extension_observer.mojom.h"
  89. #include "chromeos/crosapi/mojom/vpn_service.mojom.h"
  90. #include "chromeos/crosapi/mojom/wallpaper.mojom.h"
  91. #include "chromeos/crosapi/mojom/web_app_service.mojom.h"
  92. #include "chromeos/crosapi/mojom/web_page_info.mojom.h"
  93. #include "chromeos/lacros/lacros_service_never_blocking_state.h"
  94. #include "chromeos/lacros/native_theme_cache.h"
  95. #include "chromeos/lacros/system_idle_cache.h"
  96. #include "chromeos/services/machine_learning/public/mojom/machine_learning_service.mojom.h"
  97. #include "chromeos/startup/browser_params_proxy.h"
  98. #include "components/crash/core/common/crash_key.h"
  99. #include "media/mojo/mojom/stable/stable_video_decoder.mojom.h"
  100. #include "mojo/public/cpp/bindings/pending_receiver.h"
  101. #include "mojo/public/cpp/platform/platform_channel.h"
  102. #include "mojo/public/cpp/system/invitation.h"
  103. #include "services/device/public/mojom/hid.mojom.h"
  104. #include "url/gurl.h"
  105. namespace chromeos {
  106. namespace {
  107. using Crosapi = crosapi::mojom::Crosapi;
  108. // We use a std::atomic here rather than a base::NoDestructor because we want to
  109. // allow instances of LacrosService to be destroyed to facilitate
  110. // testing.
  111. std::atomic<LacrosService*> g_instance = {nullptr};
  112. crosapi::mojom::BrowserInfoPtr ToMojo(const std::string& browser_version) {
  113. auto info = crosapi::mojom::BrowserInfo::New();
  114. info->browser_version = browser_version;
  115. return info;
  116. }
  117. std::string SessionTypeToString(crosapi::mojom::SessionType session_type) {
  118. switch (session_type) {
  119. case crosapi::mojom::SessionType::kUnknown:
  120. return "unknown";
  121. case crosapi::mojom::SessionType::kRegularSession:
  122. return "regular";
  123. case crosapi::mojom::SessionType::kGuestSession:
  124. return "guest";
  125. case crosapi::mojom::SessionType::kPublicSession:
  126. return "managed-guest-session";
  127. case crosapi::mojom::SessionType::kWebKioskSession:
  128. return "web-kiosk";
  129. case crosapi::mojom::SessionType::kChildSession:
  130. return "child";
  131. case crosapi::mojom::SessionType::kAppKioskSession:
  132. return "chrome-app-kiosk";
  133. }
  134. }
  135. } // namespace
  136. LacrosService::InterfaceEntryBase::InterfaceEntryBase() = default;
  137. LacrosService::InterfaceEntryBase::~InterfaceEntryBase() = default;
  138. template <typename CrosapiInterface,
  139. void (Crosapi::*bind_func)(mojo::PendingReceiver<CrosapiInterface>),
  140. uint32_t MethodMinVersion>
  141. class LacrosService::InterfaceEntry : public LacrosService::InterfaceEntryBase {
  142. public:
  143. InterfaceEntry() : InterfaceEntryBase() {}
  144. InterfaceEntry(const InterfaceEntry&) = delete;
  145. InterfaceEntry& operator=(const InterfaceEntry&) = delete;
  146. ~InterfaceEntry() override = default;
  147. void* GetInternal() override { return &remote_; }
  148. void MaybeBind(uint32_t crosapi_version, LacrosService* impl) override {
  149. available_ = crosapi_version >= MethodMinVersion;
  150. if (available_) {
  151. impl->InitializeAndBindRemote<CrosapiInterface, bind_func>(&remote_);
  152. }
  153. }
  154. private:
  155. mojo::Remote<CrosapiInterface> remote_;
  156. };
  157. // static
  158. LacrosService* LacrosService::Get() {
  159. // If this returns null and causes failure in a unit test, consider using
  160. // ScopedLacrosServiceTestHelper in the test to instantiate
  161. // LacrosService.
  162. return g_instance;
  163. }
  164. LacrosService::LacrosService()
  165. : never_blocking_sequence_(base::ThreadPool::CreateSequencedTaskRunner(
  166. {base::TaskPriority::USER_BLOCKING,
  167. base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})),
  168. sequenced_state_(new LacrosServiceNeverBlockingState(),
  169. base::OnTaskRunnerDeleter(never_blocking_sequence_)),
  170. weak_sequenced_state_(sequenced_state_->GetWeakPtr()),
  171. observer_list_(
  172. base::MakeRefCounted<base::ObserverListThreadSafe<Observer>>()) {
  173. if (BrowserParamsProxy::Get()->IdleInfo()) {
  174. // Presence of initial |idle_info| indicates that ash-chrome can stream
  175. // idle info updates, so instantiate under Streaming mode, using
  176. // |idle_info| as initial cached values.
  177. system_idle_cache_ = std::make_unique<SystemIdleCache>(
  178. *BrowserParamsProxy::Get()->IdleInfo());
  179. // After construction finishes, start caching.
  180. base::SequencedTaskRunnerHandle::Get()->PostTask(
  181. FROM_HERE, base::BindOnce(&LacrosService::StartSystemIdleCache,
  182. weak_factory_.GetWeakPtr()));
  183. } else {
  184. // Ash-chrome cannot stream, so instantiate under fallback mode.
  185. system_idle_cache_ = std::make_unique<SystemIdleCache>();
  186. }
  187. if (BrowserParamsProxy::Get()->NativeThemeInfo()) {
  188. // Start Lacros' native theme caching, since it is available in Ash.
  189. native_theme_cache_ = std::make_unique<NativeThemeCache>(
  190. *BrowserParamsProxy::Get()->NativeThemeInfo());
  191. // After construction finishes, start caching.
  192. base::SequencedTaskRunnerHandle::Get()->PostTask(
  193. FROM_HERE, base::BindOnce(&LacrosService::StartNativeThemeCache,
  194. weak_factory_.GetWeakPtr()));
  195. }
  196. static crash_reporter::CrashKeyString<32> session_type("session-type");
  197. session_type.Set(
  198. SessionTypeToString(BrowserParamsProxy::Get()->SessionType()));
  199. // Short term workaround: if --crosapi-mojo-platform-channel-handle is
  200. // available, close --mojo-platform-channel-handle, and remove it
  201. // from command line. It is for backward compatibility support by
  202. // ash-chrome.
  203. // TODO(crbug.com/1180712): Remove this, when ash-chrome stops to support
  204. // legacy invitation flow.
  205. auto* command_line = base::CommandLine::ForCurrentProcess();
  206. if (command_line->HasSwitch(crosapi::kCrosapiMojoPlatformChannelHandle) &&
  207. command_line->HasSwitch(mojo::PlatformChannel::kHandleSwitch)) {
  208. std::ignore = mojo::PlatformChannel::RecoverPassedEndpointFromCommandLine(
  209. *command_line);
  210. command_line->RemoveSwitch(mojo::PlatformChannel::kHandleSwitch);
  211. }
  212. never_blocking_sequence_->PostTask(
  213. FROM_HERE, base::BindOnce(&LacrosServiceNeverBlockingState::BindCrosapi,
  214. weak_sequenced_state_));
  215. // Note: sorted by the Bind method names in the lexicographical order.
  216. ConstructRemote<crosapi::mojom::Arc, &Crosapi::BindArc,
  217. Crosapi::MethodMinVersions::kBindArcMinVersion>();
  218. ConstructRemote<
  219. crosapi::mojom::AutomationFactory, &Crosapi::BindAutomationFactory,
  220. Crosapi::MethodMinVersions::kBindAutomationFactoryMinVersion>();
  221. ConstructRemote<crosapi::mojom::AppServiceProxy,
  222. &Crosapi::BindAppServiceProxy,
  223. Crosapi::MethodMinVersions::kBindAppServiceProxyMinVersion>();
  224. ConstructRemote<crosapi::mojom::AudioService, &Crosapi::BindAudioService,
  225. Crosapi::MethodMinVersions::kBindAudioServiceMinVersion>();
  226. ConstructRemote<crosapi::mojom::Authentication, &Crosapi::BindAuthentication,
  227. Crosapi::MethodMinVersions::kBindAuthenticationMinVersion>();
  228. ConstructRemote<
  229. crosapi::mojom::AppWindowTracker, &Crosapi::BindChromeAppWindowTracker,
  230. Crosapi::MethodMinVersions::kBindChromeAppWindowTrackerMinVersion>();
  231. ConstructRemote<
  232. crosapi::mojom::BrowserAppInstanceRegistry,
  233. &Crosapi::BindBrowserAppInstanceRegistry,
  234. Crosapi::MethodMinVersions::kBindBrowserAppInstanceRegistryMinVersion>();
  235. ConstructRemote<
  236. crosapi::mojom::BrowserServiceHost, &Crosapi::BindBrowserServiceHost,
  237. Crosapi::MethodMinVersions::kBindBrowserServiceHostMinVersion>();
  238. ConstructRemote<
  239. crosapi::mojom::BrowserVersionService,
  240. &crosapi::mojom::Crosapi::BindBrowserVersionService,
  241. Crosapi::MethodMinVersions::kBindBrowserVersionServiceMinVersion>();
  242. ConstructRemote<crosapi::mojom::CertDatabase, &Crosapi::BindCertDatabase,
  243. Crosapi::MethodMinVersions::kBindCertDatabaseMinVersion>();
  244. ConstructRemote<
  245. crosapi::mojom::CertProvisioning, &Crosapi::BindCertProvisioning,
  246. Crosapi::MethodMinVersions::kBindCertProvisioningMinVersion>();
  247. ConstructRemote<crosapi::mojom::Clipboard, &Crosapi::BindClipboard,
  248. Crosapi::MethodMinVersions::kBindClipboardMinVersion>();
  249. ConstructRemote<
  250. crosapi::mojom::ClipboardHistory, &Crosapi::BindClipboardHistory,
  251. Crosapi::MethodMinVersions::kBindClipboardHistoryMinVersion>();
  252. ConstructRemote<
  253. crosapi::mojom::ContentProtection, &Crosapi::BindContentProtection,
  254. Crosapi::MethodMinVersions::kBindContentProtectionMinVersion>();
  255. ConstructRemote<
  256. crosapi::mojom::CrosDisplayConfigController,
  257. &Crosapi::BindCrosDisplayConfigController,
  258. Crosapi::MethodMinVersions::kBindCrosDisplayConfigControllerMinVersion>();
  259. ConstructRemote<crosapi::mojom::DeskTemplate, &Crosapi::BindDeskTemplate,
  260. Crosapi::MethodMinVersions::kBindDeskTemplateMinVersion>();
  261. ConstructRemote<
  262. crosapi::mojom::DeviceAttributes, &Crosapi::BindDeviceAttributes,
  263. Crosapi::MethodMinVersions::kBindDeviceAttributesMinVersion>();
  264. ConstructRemote<
  265. crosapi::mojom::DeviceOAuth2TokenService,
  266. &Crosapi::BindDeviceOAuth2TokenService,
  267. Crosapi::MethodMinVersions::kBindDeviceOAuth2TokenServiceMinVersion>();
  268. ConstructRemote<
  269. crosapi::mojom::DeviceSettingsService,
  270. &Crosapi::BindDeviceSettingsService,
  271. Crosapi::MethodMinVersions::kBindDeviceSettingsServiceMinVersion>();
  272. ConstructRemote<
  273. crosapi::mojom::DiagnosticsService, &Crosapi::BindDiagnosticsService,
  274. Crosapi::MethodMinVersions::kBindDiagnosticsServiceMinVersion>();
  275. ConstructRemote<
  276. crosapi::mojom::DigitalGoodsFactory, &Crosapi::BindDigitalGoodsFactory,
  277. Crosapi::MethodMinVersions::kBindDigitalGoodsFactoryMinVersion>();
  278. ConstructRemote<crosapi::mojom::Dlp, &Crosapi::BindDlp,
  279. Crosapi::MethodMinVersions::kBindDlpMinVersion>();
  280. ConstructRemote<crosapi::mojom::DocumentScan,
  281. &crosapi::mojom::Crosapi::BindDocumentScan,
  282. Crosapi::MethodMinVersions::kBindDocumentScanMinVersion>();
  283. ConstructRemote<
  284. crosapi::mojom::DownloadController, &Crosapi::BindDownloadController,
  285. Crosapi::MethodMinVersions::kBindDownloadControllerMinVersion>();
  286. ConstructRemote<
  287. crosapi::mojom::DriveIntegrationService,
  288. &crosapi::mojom::Crosapi::BindDriveIntegrationService,
  289. Crosapi::MethodMinVersions::kBindDriveIntegrationServiceMinVersion>();
  290. ConstructRemote<crosapi::mojom::EchoPrivate,
  291. &crosapi::mojom::Crosapi::BindEchoPrivate,
  292. Crosapi::MethodMinVersions::kBindEchoPrivateMinVersion>();
  293. ConstructRemote<crosapi::mojom::EmojiPicker, &Crosapi::BindEmojiPicker,
  294. Crosapi::MethodMinVersions::kBindEmojiPickerMinVersion>();
  295. ConstructRemote<
  296. crosapi::mojom::ExtensionInfoPrivate,
  297. &crosapi::mojom::Crosapi::BindExtensionInfoPrivate,
  298. Crosapi::MethodMinVersions::kBindExtensionInfoPrivateMinVersion>();
  299. ConstructRemote<crosapi::mojom::Feedback,
  300. &crosapi::mojom::Crosapi::BindFeedback,
  301. Crosapi::MethodMinVersions::kBindFeedbackMinVersion>();
  302. ConstructRemote<crosapi::mojom::FileManager,
  303. &crosapi::mojom::Crosapi::BindFileManager,
  304. Crosapi::MethodMinVersions::kBindFileManagerMinVersion>();
  305. ConstructRemote<
  306. crosapi::mojom::FileSystemProviderService,
  307. &crosapi::mojom::Crosapi::BindFileSystemProviderService,
  308. Crosapi::MethodMinVersions::kBindFileSystemProviderServiceMinVersion>();
  309. ConstructRemote<
  310. crosapi::mojom::FieldTrialService,
  311. &crosapi::mojom::Crosapi::BindFieldTrialService,
  312. Crosapi::MethodMinVersions::kBindFieldTrialServiceMinVersion>();
  313. ConstructRemote<
  314. crosapi::mojom::ForceInstalledTracker,
  315. &crosapi::mojom::Crosapi::BindForceInstalledTracker,
  316. Crosapi::MethodMinVersions::kBindForceInstalledTrackerMinVersion>();
  317. ConstructRemote<
  318. crosapi::mojom::FullscreenController, &Crosapi::BindFullscreenController,
  319. Crosapi::MethodMinVersions::kBindFullscreenControllerMinVersion>();
  320. ConstructRemote<
  321. crosapi::mojom::GeolocationService,
  322. &crosapi::mojom::Crosapi::BindGeolocationService,
  323. Crosapi::MethodMinVersions::kBindGeolocationServiceMinVersion>();
  324. ConstructRemote<device::mojom::HidManager,
  325. &crosapi::mojom::Crosapi::BindHidManager,
  326. Crosapi::MethodMinVersions::kBindHidManagerMinVersion>();
  327. ConstructRemote<
  328. crosapi::mojom::HoldingSpaceService,
  329. &crosapi::mojom::Crosapi::BindHoldingSpaceService,
  330. Crosapi::MethodMinVersions::kBindHoldingSpaceServiceMinVersion>();
  331. ConstructRemote<crosapi::mojom::IdentityManager,
  332. &crosapi::mojom::Crosapi::BindIdentityManager,
  333. Crosapi::MethodMinVersions::kBindIdentityManagerMinVersion>();
  334. ConstructRemote<crosapi::mojom::IdleService,
  335. &crosapi::mojom::Crosapi::BindIdleService,
  336. Crosapi::MethodMinVersions::kBindIdleServiceMinVersion>();
  337. ConstructRemote<crosapi::mojom::ImageWriter,
  338. &crosapi::mojom::Crosapi::BindImageWriter,
  339. Crosapi::MethodMinVersions::kBindImageWriterMinVersion>();
  340. ConstructRemote<crosapi::mojom::InSessionAuth,
  341. &crosapi::mojom::Crosapi::BindInSessionAuth,
  342. Crosapi::MethodMinVersions::kBindInSessionAuthMinVersion>();
  343. ConstructRemote<crosapi::mojom::KeystoreService,
  344. &crosapi::mojom::Crosapi::BindKeystoreService,
  345. Crosapi::MethodMinVersions::kBindKeystoreServiceMinVersion>();
  346. ConstructRemote<
  347. crosapi::mojom::ChromeAppKioskService,
  348. &Crosapi::BindChromeAppKioskService,
  349. Crosapi::MethodMinVersions::kBindChromeAppKioskServiceMinVersion>();
  350. ConstructRemote<
  351. crosapi::mojom::KioskSessionService, &Crosapi::BindKioskSessionService,
  352. Crosapi::MethodMinVersions::kBindKioskSessionServiceMinVersion>();
  353. ConstructRemote<crosapi::mojom::LocalPrinter,
  354. &crosapi::mojom::Crosapi::BindLocalPrinter,
  355. Crosapi::MethodMinVersions::kBindLocalPrinterMinVersion>();
  356. ConstructRemote<crosapi::mojom::Login, &crosapi::mojom::Crosapi::BindLogin,
  357. Crosapi::MethodMinVersions::kBindLoginMinVersion>();
  358. ConstructRemote<
  359. crosapi::mojom::LoginScreenStorage,
  360. &crosapi::mojom::Crosapi::BindLoginScreenStorage,
  361. Crosapi::MethodMinVersions::kBindLoginScreenStorageMinVersion>();
  362. ConstructRemote<crosapi::mojom::LoginState,
  363. &crosapi::mojom::Crosapi::BindLoginState,
  364. Crosapi::MethodMinVersions::kBindLoginStateMinVersion>();
  365. ConstructRemote<
  366. chromeos::machine_learning::mojom::MachineLearningService,
  367. &crosapi::mojom::Crosapi::BindMachineLearningService,
  368. Crosapi::MethodMinVersions::kBindMachineLearningServiceMinVersion>();
  369. ConstructRemote<crosapi::mojom::MessageCenter,
  370. &crosapi::mojom::Crosapi::BindMessageCenter,
  371. Crosapi::MethodMinVersions::kBindMessageCenterMinVersion>();
  372. ConstructRemote<
  373. crosapi::mojom::NativeThemeService,
  374. &crosapi::mojom::Crosapi::BindNativeThemeService,
  375. Crosapi::MethodMinVersions::kBindNativeThemeServiceMinVersion>();
  376. ConstructRemote<crosapi::mojom::NetworkChange,
  377. &crosapi::mojom::Crosapi::BindNetworkChange,
  378. Crosapi::MethodMinVersions::kBindNetworkChangeMinVersion>();
  379. ConstructRemote<crosapi::mojom::Power, &crosapi::mojom::Crosapi::BindPower,
  380. Crosapi::MethodMinVersions::kBindPowerMinVersion>();
  381. ConstructRemote<
  382. crosapi::mojom::NetworkingAttributes, &Crosapi::BindNetworkingAttributes,
  383. Crosapi::MethodMinVersions::kBindNetworkingAttributesMinVersion>();
  384. ConstructRemote<
  385. crosapi::mojom::NetworkingPrivate, &Crosapi::BindNetworkingPrivate,
  386. Crosapi::MethodMinVersions::kBindNetworkingPrivateMinVersion>();
  387. ConstructRemote<crosapi::mojom::Prefs, &crosapi::mojom::Crosapi::BindPrefs,
  388. Crosapi::MethodMinVersions::kBindPrefsMinVersion>();
  389. if (BrowserParamsProxy::Get()->UseCupsForPrinting()) {
  390. ConstructRemote<
  391. crosapi::mojom::PrintingMetrics,
  392. &crosapi::mojom::Crosapi::BindPrintingMetrics,
  393. Crosapi::MethodMinVersions::kBindPrintingMetricsMinVersion>();
  394. }
  395. ConstructRemote<
  396. crosapi::mojom::NetworkSettingsService,
  397. &crosapi::mojom::Crosapi::BindNetworkSettingsService,
  398. Crosapi::MethodMinVersions::kBindNetworkSettingsServiceMinVersion>();
  399. ConstructRemote<crosapi::mojom::PolicyService, &Crosapi::BindPolicyService,
  400. Crosapi::MethodMinVersions::kBindPolicyServiceMinVersion>();
  401. ConstructRemote<
  402. chromeos::remote_apps::mojom::RemoteAppsLacrosBridge,
  403. &crosapi::mojom::Crosapi::BindRemoteAppsLacrosBridge,
  404. Crosapi::MethodMinVersions::kBindRemoteAppsLacrosBridgeMinVersion>();
  405. ConstructRemote<crosapi::mojom::Remoting,
  406. &crosapi::mojom::Crosapi::BindRemoting,
  407. Crosapi::MethodMinVersions::kBindRemotingMinVersion>();
  408. ConstructRemote<crosapi::mojom::ResourceManager,
  409. &crosapi::mojom::Crosapi::BindResourceManager,
  410. Crosapi::MethodMinVersions::kBindResourceManagerMinVersion>();
  411. ConstructRemote<crosapi::mojom::ScreenManager,
  412. &crosapi::mojom::Crosapi::BindScreenManager,
  413. Crosapi::MethodMinVersions::kBindScreenManagerMinVersion>();
  414. ConstructRemote<crosapi::mojom::SelectFile,
  415. &crosapi::mojom::Crosapi::BindSelectFile,
  416. Crosapi::MethodMinVersions::kBindSelectFileMinVersion>();
  417. ConstructRemote<
  418. crosapi::mojom::SearchControllerRegistry,
  419. &crosapi::mojom::Crosapi::BindSearchControllerRegistry,
  420. Crosapi::MethodMinVersions::kBindSearchControllerRegistryMinVersion>();
  421. ConstructRemote<crosapi::mojom::Sharesheet,
  422. &crosapi::mojom::Crosapi::BindSharesheet,
  423. Crosapi::MethodMinVersions::kBindSharesheetMinVersion>();
  424. ConstructRemote<
  425. crosapi::mojom::SpeechRecognition,
  426. &crosapi::mojom::Crosapi::BindSpeechRecognition,
  427. Crosapi::MethodMinVersions::kBindSpeechRecognitionMinVersion>();
  428. ConstructRemote<
  429. crosapi::mojom::StructuredMetricsService,
  430. &crosapi::mojom::Crosapi::BindStructuredMetricsService,
  431. Crosapi::MethodMinVersions::kBindStructuredMetricsServiceMinVersion>();
  432. ConstructRemote<crosapi::mojom::SyncService,
  433. &crosapi::mojom::Crosapi::BindSyncService,
  434. Crosapi::MethodMinVersions::kBindSyncServiceMinVersion>();
  435. ConstructRemote<crosapi::mojom::SystemDisplay, &Crosapi::BindSystemDisplay,
  436. Crosapi::MethodMinVersions::kBindSystemDisplayMinVersion>();
  437. ConstructRemote<crosapi::mojom::TaskManager,
  438. &crosapi::mojom::Crosapi::BindTaskManager,
  439. Crosapi::MethodMinVersions::kBindTaskManagerMinVersion>();
  440. ConstructRemote<
  441. crosapi::mojom::TelemetryProbeService,
  442. &crosapi::mojom::Crosapi::BindTelemetryProbeService,
  443. Crosapi::MethodMinVersions::kBindTelemetryProbeServiceMinVersion>();
  444. ConstructRemote<crosapi::mojom::TimeZoneService,
  445. &crosapi::mojom::Crosapi::BindTimeZoneService,
  446. Crosapi::MethodMinVersions::kBindTimeZoneServiceMinVersion>();
  447. ConstructRemote<crosapi::mojom::Tts, &crosapi::mojom::Crosapi::BindTts,
  448. Crosapi::MethodMinVersions::kBindTtsMinVersion>();
  449. ConstructRemote<crosapi::mojom::UrlHandler,
  450. &crosapi::mojom::Crosapi::BindUrlHandler,
  451. Crosapi::MethodMinVersions::kBindUrlHandlerMinVersion>();
  452. ConstructRemote<crosapi::mojom::AppPublisher, &Crosapi::BindWebAppPublisher,
  453. Crosapi::MethodMinVersions::kBindWebAppPublisherMinVersion>();
  454. ConstructRemote<crosapi::mojom::Wallpaper,
  455. &crosapi::mojom::Crosapi::BindWallpaper,
  456. Crosapi::MethodMinVersions::kBindWallpaperMinVersion>();
  457. ConstructRemote<crosapi::mojom::WebAppService,
  458. &crosapi::mojom::Crosapi::BindWebAppService,
  459. Crosapi::MethodMinVersions::kBindWebAppServiceMinVersion>();
  460. ConstructRemote<
  461. crosapi::mojom::WebPageInfoFactory,
  462. &crosapi::mojom::Crosapi::BindWebPageInfoFactory,
  463. Crosapi::MethodMinVersions::kBindWebPageInfoFactoryMinVersion>();
  464. ConstructRemote<crosapi::mojom::VolumeManager,
  465. &crosapi::mojom::Crosapi::BindVolumeManager,
  466. Crosapi::MethodMinVersions::kBindVolumeManagerMinVersion>();
  467. ConstructRemote<
  468. crosapi::mojom::VpnExtensionObserver, &Crosapi::BindVpnExtensionObserver,
  469. Crosapi::MethodMinVersions::kBindVpnExtensionObserverMinVersion>();
  470. ConstructRemote<crosapi::mojom::VpnService, &Crosapi::BindVpnService,
  471. Crosapi::MethodMinVersions::kBindVpnServiceMinVersion>();
  472. ConstructRemote<crosapi::mojom::VirtualKeyboard,
  473. &crosapi::mojom::Crosapi::BindVirtualKeyboard,
  474. Crosapi::MethodMinVersions::kBindVirtualKeyboardMinVersion>();
  475. #if !BUILDFLAG(IS_CHROMEOS_DEVICE)
  476. // The test controller is not available on production devices as tests only
  477. // run on Linux.
  478. ConstructRemote<crosapi::mojom::TestController,
  479. &crosapi::mojom::Crosapi::BindTestController,
  480. Crosapi::MethodMinVersions::kBindTestControllerMinVersion>();
  481. #endif
  482. DCHECK(!g_instance);
  483. g_instance = this;
  484. }
  485. LacrosService::~LacrosService() {
  486. DCHECK_CALLED_ON_VALID_SEQUENCE(affine_sequence_checker_);
  487. DCHECK_EQ(this, g_instance);
  488. g_instance = nullptr;
  489. }
  490. void LacrosService::BindReceiver(const std::string& browser_version) {
  491. // Accept Crosapi invitation here. Mojo IPC support should be initialized
  492. // at this stage.
  493. auto* command_line = base::CommandLine::ForCurrentProcess();
  494. // In unittests/browser_tests cases, the mojo pipe may not be set up.
  495. // Just ignore the case.
  496. if (!command_line->HasSwitch(crosapi::kCrosapiMojoPlatformChannelHandle))
  497. return;
  498. mojo::PlatformChannelEndpoint endpoint =
  499. mojo::PlatformChannel::RecoverPassedEndpointFromString(
  500. command_line->GetSwitchValueASCII(
  501. crosapi::kCrosapiMojoPlatformChannelHandle));
  502. auto invitation = mojo::IncomingInvitation::Accept(std::move(endpoint));
  503. never_blocking_sequence_->PostTask(
  504. FROM_HERE,
  505. base::BindOnce(&LacrosServiceNeverBlockingState::FusePipeCrosapi,
  506. weak_sequenced_state_,
  507. mojo::PendingRemote<crosapi::mojom::Crosapi>(
  508. invitation.ExtractMessagePipe(0), /*version=*/0)));
  509. did_bind_receiver_ = true;
  510. if (CrosapiVersion()) {
  511. for (auto& entry : interfaces_) {
  512. entry.second->MaybeBind(*CrosapiVersion(), this);
  513. }
  514. }
  515. if (IsOnBrowserStartupAvailable()) {
  516. never_blocking_sequence_->PostTask(
  517. FROM_HERE,
  518. base::BindOnce(&LacrosServiceNeverBlockingState::OnBrowserStartup,
  519. weak_sequenced_state_, ToMojo(browser_version)));
  520. }
  521. }
  522. bool LacrosService::IsAccountManagerAvailable() const {
  523. absl::optional<uint32_t> version = CrosapiVersion();
  524. return version &&
  525. version.value() >=
  526. Crosapi::MethodMinVersions::kBindAccountManagerMinVersion;
  527. }
  528. bool LacrosService::IsBrowserCdmFactoryAvailable() const {
  529. absl::optional<uint32_t> version = CrosapiVersion();
  530. return version &&
  531. version.value() >=
  532. Crosapi::MethodMinVersions::kBindBrowserCdmFactoryMinVersion;
  533. }
  534. bool LacrosService::IsMediaSessionAudioFocusAvailable() const {
  535. absl::optional<uint32_t> version = CrosapiVersion();
  536. return version &&
  537. version.value() >=
  538. Crosapi::MethodMinVersions::kBindMediaSessionAudioFocusMinVersion;
  539. }
  540. bool LacrosService::IsMediaSessionAudioFocusDebugAvailable() const {
  541. absl::optional<uint32_t> version = CrosapiVersion();
  542. return version && version.value() >=
  543. Crosapi::MethodMinVersions::
  544. kBindMediaSessionAudioFocusDebugMinVersion;
  545. }
  546. bool LacrosService::IsMediaSessionControllerAvailable() const {
  547. absl::optional<uint32_t> version = CrosapiVersion();
  548. return version &&
  549. version.value() >=
  550. Crosapi::MethodMinVersions::kBindMediaSessionControllerMinVersion;
  551. }
  552. bool LacrosService::IsMetricsReportingAvailable() const {
  553. absl::optional<uint32_t> version = CrosapiVersion();
  554. return version &&
  555. version.value() >=
  556. Crosapi::MethodMinVersions::kBindMetricsReportingMinVersion;
  557. }
  558. bool LacrosService::IsSensorHalClientAvailable() const {
  559. absl::optional<uint32_t> version = CrosapiVersion();
  560. return version &&
  561. version.value() >=
  562. Crosapi::MethodMinVersions::kBindSensorHalClientMinVersion;
  563. }
  564. bool LacrosService::IsStableVideoDecoderFactoryAvailable() const {
  565. absl::optional<uint32_t> version = CrosapiVersion();
  566. return version && version.value() >=
  567. Crosapi::MethodMinVersions::
  568. kBindStableVideoDecoderFactoryMinVersion;
  569. }
  570. void LacrosService::BindAccountManagerReceiver(
  571. mojo::PendingReceiver<crosapi::mojom::AccountManager> pending_receiver) {
  572. DCHECK(IsAccountManagerAvailable());
  573. BindPendingReceiverOrRemote<
  574. mojo::PendingReceiver<crosapi::mojom::AccountManager>,
  575. &crosapi::mojom::Crosapi::BindAccountManager>(
  576. std::move(pending_receiver));
  577. }
  578. void LacrosService::BindAudioFocusManager(
  579. mojo::PendingReceiver<media_session::mojom::AudioFocusManager> remote) {
  580. DCHECK(IsMediaSessionAudioFocusAvailable());
  581. BindPendingReceiverOrRemote<
  582. mojo::PendingReceiver<media_session::mojom::AudioFocusManager>,
  583. &crosapi::mojom::Crosapi::BindMediaSessionAudioFocus>(std::move(remote));
  584. }
  585. void LacrosService::BindAudioFocusManagerDebug(
  586. mojo::PendingReceiver<media_session::mojom::AudioFocusManagerDebug>
  587. remote) {
  588. DCHECK(IsMediaSessionAudioFocusAvailable());
  589. BindPendingReceiverOrRemote<
  590. mojo::PendingReceiver<media_session::mojom::AudioFocusManagerDebug>,
  591. &crosapi::mojom::Crosapi::BindMediaSessionAudioFocusDebug>(
  592. std::move(remote));
  593. }
  594. void LacrosService::BindBrowserCdmFactory(
  595. mojo::GenericPendingReceiver receiver) {
  596. DCHECK(IsBrowserCdmFactoryAvailable());
  597. BindPendingReceiverOrRemote<mojo::GenericPendingReceiver,
  598. &crosapi::mojom::Crosapi::BindBrowserCdmFactory>(
  599. std::move(receiver));
  600. }
  601. void LacrosService::BindGeolocationService(
  602. mojo::PendingReceiver<crosapi::mojom::GeolocationService>
  603. pending_receiver) {
  604. DCHECK(IsAvailable<crosapi::mojom::GeolocationService>());
  605. BindPendingReceiverOrRemote<
  606. mojo::PendingReceiver<crosapi::mojom::GeolocationService>,
  607. &crosapi::mojom::Crosapi::BindGeolocationService>(
  608. std::move(pending_receiver));
  609. }
  610. void LacrosService::BindMachineLearningService(
  611. mojo::PendingReceiver<
  612. chromeos::machine_learning::mojom::MachineLearningService> receiver) {
  613. DCHECK(
  614. IsAvailable<chromeos::machine_learning::mojom::MachineLearningService>());
  615. BindPendingReceiverOrRemote<
  616. mojo::PendingReceiver<
  617. chromeos::machine_learning::mojom::MachineLearningService>,
  618. &crosapi::mojom::Crosapi::BindMachineLearningService>(
  619. std::move(receiver));
  620. }
  621. void LacrosService::BindMediaControllerManager(
  622. mojo::PendingReceiver<media_session::mojom::MediaControllerManager>
  623. remote) {
  624. DCHECK(IsMediaSessionAudioFocusAvailable());
  625. BindPendingReceiverOrRemote<
  626. mojo::PendingReceiver<media_session::mojom::MediaControllerManager>,
  627. &crosapi::mojom::Crosapi::BindMediaSessionController>(std::move(remote));
  628. }
  629. void LacrosService::BindMetricsReporting(
  630. mojo::PendingReceiver<crosapi::mojom::MetricsReporting> receiver) {
  631. DCHECK(IsMetricsReportingAvailable());
  632. BindPendingReceiverOrRemote<
  633. mojo::PendingReceiver<crosapi::mojom::MetricsReporting>,
  634. &crosapi::mojom::Crosapi::BindMetricsReporting>(std::move(receiver));
  635. }
  636. void LacrosService::BindRemoteAppsLacrosBridge(
  637. mojo::PendingReceiver<chromeos::remote_apps::mojom::RemoteAppsLacrosBridge>
  638. receiver) {
  639. DCHECK(IsAvailable<chromeos::remote_apps::mojom::RemoteAppsLacrosBridge>());
  640. BindPendingReceiverOrRemote<
  641. mojo::PendingReceiver<
  642. chromeos::remote_apps::mojom::RemoteAppsLacrosBridge>,
  643. &crosapi::mojom::Crosapi::BindRemoteAppsLacrosBridge>(
  644. std::move(receiver));
  645. }
  646. void LacrosService::BindSensorHalClient(
  647. mojo::PendingRemote<chromeos::sensors::mojom::SensorHalClient> remote) {
  648. DCHECK(IsSensorHalClientAvailable());
  649. BindPendingReceiverOrRemote<
  650. mojo::PendingRemote<chromeos::sensors::mojom::SensorHalClient>,
  651. &crosapi::mojom::Crosapi::BindSensorHalClient>(std::move(remote));
  652. }
  653. bool LacrosService::IsOnBrowserStartupAvailable() const {
  654. absl::optional<uint32_t> version = CrosapiVersion();
  655. return version && version.value() >=
  656. Crosapi::MethodMinVersions::kOnBrowserStartupMinVersion;
  657. }
  658. void LacrosService::BindVideoCaptureDeviceFactory(
  659. mojo::PendingReceiver<crosapi::mojom::VideoCaptureDeviceFactory>
  660. pending_receiver) {
  661. DCHECK(IsVideoCaptureDeviceFactoryAvailable());
  662. BindPendingReceiverOrRemote<
  663. mojo::PendingReceiver<crosapi::mojom::VideoCaptureDeviceFactory>,
  664. &crosapi::mojom::Crosapi::BindVideoCaptureDeviceFactory>(
  665. std::move(pending_receiver));
  666. }
  667. bool LacrosService::IsVideoCaptureDeviceFactoryAvailable() const {
  668. absl::optional<uint32_t> version = CrosapiVersion();
  669. return version && version.value() >=
  670. Crosapi::MethodMinVersions::
  671. kBindVideoCaptureDeviceFactoryMinVersion;
  672. }
  673. void LacrosService::BindStableVideoDecoderFactory(
  674. mojo::PendingReceiver<media::stable::mojom::StableVideoDecoderFactory>
  675. receiver) {
  676. DCHECK(IsStableVideoDecoderFactoryAvailable());
  677. BindPendingReceiverOrRemote<
  678. mojo::GenericPendingReceiver,
  679. &crosapi::mojom::Crosapi::BindStableVideoDecoderFactory>(
  680. mojo::GenericPendingReceiver(std::move(receiver)));
  681. }
  682. int LacrosService::GetInterfaceVersion(base::Token interface_uuid) const {
  683. if (chromeos::BrowserParamsProxy::Get()->DisableCrosapiForTesting())
  684. return -1;
  685. if (!chromeos::BrowserParamsProxy::Get()->InterfaceVersions())
  686. return -1;
  687. const base::flat_map<base::Token, uint32_t>& versions =
  688. chromeos::BrowserParamsProxy::Get()->InterfaceVersions().value();
  689. auto it = versions.find(interface_uuid);
  690. if (it == versions.end())
  691. return -1;
  692. return it->second;
  693. }
  694. absl::optional<uint32_t> LacrosService::CrosapiVersion() const {
  695. if (chromeos::BrowserParamsProxy::Get()->DisableCrosapiForTesting())
  696. return absl::nullopt;
  697. DCHECK(did_bind_receiver_);
  698. return chromeos::BrowserParamsProxy::Get()->CrosapiVersion();
  699. }
  700. void LacrosService::StartSystemIdleCache() {
  701. system_idle_cache_->Start();
  702. }
  703. void LacrosService::StartNativeThemeCache() {
  704. native_theme_cache_->Start();
  705. }
  706. template <typename CrosapiInterface,
  707. void (Crosapi::*bind_func)(mojo::PendingReceiver<CrosapiInterface>)>
  708. void LacrosService::InitializeAndBindRemote(
  709. mojo::Remote<CrosapiInterface>* remote) {
  710. mojo::PendingReceiver<CrosapiInterface> pending_receiver =
  711. remote->BindNewPipeAndPassReceiver();
  712. BindPendingReceiverOrRemote<mojo::PendingReceiver<CrosapiInterface>,
  713. bind_func>(std::move(pending_receiver));
  714. }
  715. template <typename CrosapiInterface,
  716. void (Crosapi::*bind_func)(mojo::PendingReceiver<CrosapiInterface>),
  717. uint32_t MethodMinVersion>
  718. void LacrosService::ConstructRemote() {
  719. DCHECK(!base::Contains(interfaces_, CrosapiInterface::Uuid_));
  720. interfaces_.emplace(CrosapiInterface::Uuid_,
  721. std::make_unique<LacrosService::InterfaceEntry<
  722. CrosapiInterface, bind_func, MethodMinVersion>>());
  723. }
  724. void LacrosService::AddObserver(Observer* obs) {
  725. observer_list_->AddObserver(obs);
  726. }
  727. void LacrosService::RemoveObserver(Observer* obs) {
  728. observer_list_->RemoveObserver(obs);
  729. }
  730. void LacrosService::NotifyPolicyUpdated(
  731. const std::vector<uint8_t>& policy_fetch_response) {
  732. DCHECK_CALLED_ON_VALID_SEQUENCE(affine_sequence_checker_);
  733. observer_list_->Notify(FROM_HERE, &Observer::OnPolicyUpdated,
  734. policy_fetch_response);
  735. }
  736. void LacrosService::NotifyPolicyFetchAttempt() {
  737. observer_list_->Notify(FROM_HERE, &Observer::OnPolicyFetchAttempt);
  738. }
  739. void LacrosService::NotifyComponentPolicyUpdated(ComponentPolicyMap policy) {
  740. DCHECK_CALLED_ON_VALID_SEQUENCE(affine_sequence_checker_);
  741. observer_list_->Notify(FROM_HERE, &Observer::OnComponentPolicyUpdated,
  742. std::move(policy));
  743. }
  744. } // namespace chromeos