File: crostini_handler.h

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (197 lines) | stat: -rw-r--r-- 10,237 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_UI_WEBUI_ASH_SETTINGS_PAGES_CROSTINI_CROSTINI_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_ASH_SETTINGS_PAGES_CROSTINI_CROSTINI_HANDLER_H_

#include <vector>

#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ash/crostini/crostini_export_import.h"
#include "chrome/browser/ash/crostini/crostini_file_selector.h"
#include "chrome/browser/ash/crostini/crostini_manager.h"
#include "chrome/browser/ash/crostini/crostini_port_forwarder.h"
#include "chrome/browser/ash/guest_os/guest_id.h"
#include "chrome/browser/ash/guest_os/guest_os_session_tracker.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
#include "chromeos/ash/components/dbus/session_manager/session_manager_client.h"
#include "chromeos/ash/components/network/network_state_handler_observer.h"
#include "chromeos/ash/components/settings/cros_settings.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/services/app_service/public/cpp/intent.h"

class Profile;

namespace crostini {
enum class CrostiniResult;
struct CrostiniDiskInfo;
}  // namespace crostini

namespace ash::settings {

class CrostiniHandler : public ::settings::SettingsPageUIHandler,
                        public crostini::CrostiniDialogStatusObserver,
                        public crostini::CrostiniExportImport::Observer,
                        public crostini::CrostiniContainerPropertiesObserver,
                        public crostini::CrostiniPortForwarder::Observer,
                        public guest_os::ContainerStartedObserver,
                        public crostini::ContainerShutdownObserver {
 public:
  explicit CrostiniHandler(Profile* profile);

  CrostiniHandler(const CrostiniHandler&) = delete;
  CrostiniHandler& operator=(const CrostiniHandler&) = delete;

  ~CrostiniHandler() override;

  // SettingsPageUIHandler
  void RegisterMessages() override;
  void OnJavascriptAllowed() override;
  void OnJavascriptDisallowed() override;

 private:
  void HandleRequestCrostiniInstallerView(const base::Value::List& args);
  void HandleRequestRemoveCrostini(const base::Value::List& args);
  // Export the crostini container.
  void HandleExportCrostiniContainer(const base::Value::List& args);
  // Import the crostini container.
  void HandleImportCrostiniContainer(const base::Value::List& args);
  // Handle a request for the CrostiniInstallerView status.
  void HandleCrostiniInstallerStatusRequest(const base::Value::List& args);
  // crostini::CrostiniDialogStatusObserver
  void OnCrostiniDialogStatusChanged(crostini::DialogType dialog_type,
                                     bool open) override;
  // crostini::CrostiniContainerPropertiesObserver
  void OnContainerOsReleaseChanged(const guest_os::GuestId& container_id,
                                   bool can_upgrade) override;
  // Handle a request for the CrostiniExportImport operation status.
  void HandleCrostiniExportImportOperationStatusRequest(
      const base::Value::List& args);
  // CrostiniExportImport::Observer:
  void OnCrostiniExportImportOperationStatusChanged(bool in_progress) override;
  // Handle a request for querying status of ARC adb sideloading.
  void HandleQueryArcAdbRequest(const base::Value::List& args);
  // Handle a request for enabling adb sideloading in ARC.
  void HandleEnableArcAdbRequest(const base::Value::List& args);
  // Called after establishing whether enabling adb sideloading is allowed for
  // the user and device
  void OnCanEnableArcAdbSideloading(bool can_change_adb_sideloading);
  // Handle a request for disabling adb sideloading in ARC.
  void HandleDisableArcAdbRequest(const base::Value::List& args);
  // Called after establishing whether disabling adb sideloading is allowed for
  // the user and device
  void OnCanDisableArcAdbSideloading(bool can_change_adb_sideloading);
  // Launch the Crostini terminal, with |intent| specifying any non-default
  // container id.
  void LaunchTerminal(apps::IntentPtr intent);
  // Handle a request for showing the container upgrade view.
  void HandleRequestContainerUpgradeView(const base::Value::List& args);
  // Callback of HandleQueryArcAdbRequest.
  void OnQueryAdbSideload(
      SessionManagerClient::AdbSideloadResponseCode response_code,
      bool enabled);
  // Handle a request for the CrostiniUpgraderDialog status.
  void HandleCrostiniUpgraderDialogStatusRequest(const base::Value::List& args);
  // Handle a request for the availability of a container upgrade.
  void HandleCrostiniContainerUpgradeAvailableRequest(
      const base::Value::List& args);
  // Handles a request for forwarding a new port.
  void HandleAddCrostiniPortForward(const base::Value::List& args);
  // Handles a request for removing one port.
  void HandleRemoveCrostiniPortForward(const base::Value::List& args);
  // Handles a request for removing all ports.
  void HandleRemoveAllCrostiniPortForwards(const base::Value::List& args);
  // CrostiniPortForwarder::Observer.
  void OnActivePortsChanged(const base::Value::List& activePorts) override;
  void OnActiveNetworkChanged(const base::Value& interface,
                              const base::Value& ipAddress) override;
  // Handles a request for activating an existing port.
  void HandleActivateCrostiniPortForward(const base::Value::List& args);
  // Handles a request for deactivating an existing port.
  void HandleDeactivateCrostiniPortForward(const base::Value::List& args);
  // Callback of port forwarding requests.
  void OnPortForwardComplete(std::string callback_id, bool success);
  // Fetches disk info for a VM, can be slow (seconds).
  void HandleGetCrostiniDiskInfo(const base::Value::List& args);
  void ResolveGetCrostiniDiskInfoCallback(
      const std::string& callback_id,
      std::unique_ptr<crostini::CrostiniDiskInfo> disk_info);
  // Handles a request to resize a Crostini disk.
  void HandleResizeCrostiniDisk(const base::Value::List& args);
  void ResolveResizeCrostiniDiskCallback(const std::string& callback_id,
                                         bool succeeded);
  // Returns a list of currently forwarded ports.
  void HandleGetCrostiniActivePorts(const base::Value::List& args);
  // Returns the current active network for forwarded ports.
  void HandleGetCrostiniActiveNetworkInfo(const base::Value::List& args);
  // Checks if Crostini is running.
  void HandleCheckCrostiniIsRunning(const base::Value::List& args);
  // Checks if Bruschetta is running.
  void HandleCheckBruschettaIsRunning(const base::Value::List& args);
  // guest_os::ContainerStartedObserver
  void OnContainerStarted(const guest_os::GuestId& container_id) override;
  // crostini::ContainerShutdownObserver
  void OnContainerShutdown(const guest_os::GuestId& container_id) override;
  // Handles a request to shut down Crostini.
  void HandleShutdownCrostini(const base::Value::List& args);
  // Handles a request to shut down Bruschetta.
  void HandleShutdownBruschetta(const base::Value::List& args);
  // Handle a request for checking permission for changing ARC adb sideloading.
  void HandleCanChangeArcAdbSideloadingRequest(const base::Value::List& args);
  // Get permission of changing ARC adb sideloading
  void FetchCanChangeAdbSideloading();
  // Callback of FetchCanChangeAdbSideloading.
  void OnCanChangeArcAdbSideloading(bool can_change_arc_adb_sideloading);
  // Handle a request for creating a container
  void HandleCreateContainer(const base::Value::List& args);
  // Callback of HandleCreateContainer
  void OnContainerCreated(guest_os::GuestId container_id,
                          crostini::CrostiniResult result);
  // Handle a request for deleting a container
  void HandleDeleteContainer(const base::Value::List& args);
  // Handle a request for the running info of all known containers
  void HandleRequestContainerInfo(const base::Value::List& args);
  // Handle a request to set the badge color for a container
  void HandleSetContainerBadgeColor(const base::Value::List& args);
  // Handle a request to stop a running lxd container
  void HandleStopContainer(const base::Value::List& args);

  // Handle a request to open a file selector
  void HandleOpenContainerFileSelector(const base::Value::List& args);
  // Callback for CrostiniFileSelector
  void OnContainerFileSelected(const std::string& callback_id,
                               const base::FilePath& path);

  // Handle a request for the shared vmdevice info of all known containers
  void HandleRequestSharedVmDevices(const base::Value::List& args);
  // Handle a request to query the sharing status of a VmDevice
  void HandleIsVmDeviceShared(const base::Value::List& args);
  // Handle a request to set the sharing status of a VmDevice
  void HandleSetVmDeviceShared(const base::Value::List& args);
  // Handle a request to show the installer for Bruschetta
  void HandleRequestBruschettaInstallerView(const base::Value::List& args);
  // Handle a request to start uninstalling Bruschetta
  void HandleRequestBruschettaUninstallerView(const base::Value::List& args);

  raw_ptr<Profile> profile_;
  base::CallbackListSubscription adb_sideloading_device_policy_subscription_;
  PrefChangeRegistrar pref_change_registrar_;
  std::unique_ptr<crostini::CrostiniFileSelector> file_selector_;

  // |handler_weak_ptr_factory_| is used for callbacks handling messages from
  // the WebUI page, and certain observers. These callbacks usually have the
  // same lifecycle as CrostiniHandler.
  base::WeakPtrFactory<CrostiniHandler> handler_weak_ptr_factory_{this};
  // |callback_weak_ptr_factory_| is used for callbacks passed into crostini
  // functions, which run JS functions/callbacks. However, running JS after
  // being disallowed (i.e. after the user closes the WebUI page) results in a
  // CHECK-fail. To avoid CHECK failing, the WeakPtrs are invalidated in
  // OnJavascriptDisallowed().
  base::WeakPtrFactory<CrostiniHandler> callback_weak_ptr_factory_{this};
};

}  // namespace ash::settings

#endif  // CHROME_BROWSER_UI_WEBUI_ASH_SETTINGS_PAGES_CROSTINI_CROSTINI_HANDLER_H_