blob: 1d17909a9454be5384b1613cd5bd030980be0b57 [file] [view]
# Chrome Remote Desktop Instructions
Instructions that are relevant when working with the Chrome Remote Desktop (aka.
CRD and chromoting) host binaries, or code located in //remoting.
While code for the Chrome Remote Desktop host lives in the Chromium repo (this
repo), it is mostly an independent product, separate from Chrome, except for
ChromeOS, where the IT2ME native messaging host is part of the Chrome binary.
IMPORTANT: When making suggestions for CRD code changes, make sure they are
actually relevant to CRD. For example, code changes outside of //remoting
usually aren't relevant.
## Overview
### ME2ME and IT2ME
Remote access (ME2ME) refers to a feature/mode of CRD where:
* The user sets up Me2Me once on the host machine. After that it continues to
run as a daemon process, surviving logouts and reboots.
* Chrome need not be running in order for the host process to be active.
Specifically, it is possible to connect as soon as the computer has booted
up, before anyone is logged on.
Remote support (IT2ME) refers to a feature/mode of CRD where:
* A user is required at the Host computer to "invite" the Viewer computer to
connect. This is done via a short-lived numerical code displayed at the Host
and relayed over the phone to the Viewer.
* Sessions are paused after 30 minutes, at which point the Host user must
explicitly approve continuation. The Host process runs as a Native Messaging
binary, with no privileged access to the system.
### Host and client
The `host` is either the machine that is sharing out its screen, or the process
or software that allows for such functionality, depending on the context. Use
terms like `host machine` and `host process` to disambiguate if necessary.
The `client` is the website used to connect to (and remotely control) the host,
or the machine that does that, depending on the context. Use terms like `client
machine` and `client website` to disambiguate if necessary. Note that the code
for the client website **is not in this repo**.
### WebRTC and Chromotocol
CRD currently uses WebRTC for communication between the host and the client.
There is obsolete code in our code base for a communication protocol called
Chromotocol, which was used by deprecated non-website clients, which will soon
be deleted.
### Multi-process architecture
The CRD Windows host has a multi-process architecture, where we run a daemon
process as SYSTEM at MIC SYSTEM level (//remoting/host/daemon_process.h), which
also acts as a mojo IPC broker. A network process
(//remoting/host/remoting_me2me_host.cc) is run as LOCAL_SERVICE at MIC LOW
level for actually communicating with the client via network requests. A third
desktop process (//remoting/host/desktop_process.h) is run as SYSTEM at MIC
SYSTEM level, which is responsible to capturing screen frame data and other
operations that need to be done on the user session. There are also user
processes such as the remote-open-url process and file transfer process, which
is run by the logged in user with MIC MEDIUM level within the CRD session, which
talks to other CRD processes using Mojo IPC. All CRD processes use Mojo IPC to
communicate with each other. Mojo connection is established by connecting to
the broker process, i.e. the daemon process.
The Mac host has an agent process broker process
(//remoting/host/mac/agent_process_broker_main.cc), which is used to make sure
only one host process (i.e. network process, but with screen capturing and all
other logic in it) is run at a time. The agent process broker process also acts
as the mojo broker for user processes. It doesn't have a real multi-process
architecture. Network request handling and screen capturing are done in the same
process.
The official Linux host currently only has one single host process (i.e. network
process), and it acts as the mojo broker for user processes. However, we are
currently working on a true multi-process architecture for Linux. The dev
multi-process host on Linux can be run with
`remoting/tools/run_multi_process_host.py $OUT_DIRECTORY`
(e.g. OUT_DIRECTORY=out/debug) after building `remoting_dev_me2me_host`.
When necessary, read the following files:
* remoting/host/host_main.cc: Logic to select which routine should be run, based
on the `--type` switch.
* This file defines all entry points for processes without a standalone
binary. The implementations of the entry points live in other files, so you
will need to look them up if necessary.
* This file also has the logic to determine whether the current process is a
mojo broker.
* remoting/host/remoting_me2me_host.cc: Entry point of the network process.
* remoting/host/daemon_process.h: Class that holds the daemon process logic.
Note that different platforms have different entry points for the daemon
process:
* remoting/host/win/host_service.cc: The entry point of the daemon process on
Windows.
* remoting/host/linux/daemon_process_main.cc: The entry point of the daemon
process on Linux.
* remoting/host/desktop_process_main.cc: Entry point of the desktop process.
* remoting/host/mojom/desktop_session.mojom: Defines interfaces for
communications between the network process and the desktop process.
* remoting/host/mojom/remoting_host.mojom: Defines interfaces for communications
between the network process and the daemon process.
* remoting/host/mojom/chromoting_host_services.mojom: Defines interfaces to
allow user processes to communicate with the network process.
* Other files in remoting/host/mojom: Interfaces for other purposes. Read when
necessary.
## Adding/removing processes
There are two types of processes in CRD, namely, processes with a standalone
binary and processes without a standalone binary. If the developer asks you to
add a new process, ask them which type of process they want to add.
### Processes with a standalone binary
These are processes such as remote-open-url and remote-webauthn. To add a new
process with a standalone binary:
1. Ask if the developer wants to add everything to a new subdirectory or to an
existing directory.
1. Create a main function header for the new binary. Make sure the function
has `HOST_EXPORT`. See remoting/host/remote_open_url/remote_open_url_main.h
as an example.
1. Implement the main function. See
remoting/host/remote_open_url/remote_open_url_main.cc as an example.
1. Create an entry point file with the actual `main` function, which calls the
function in the main function header. See
remoting/host/remote_open_url/remote_open_url_entry_point.cc as an example.
1. Create a `source_set` in a BUILD.gn file for the main header, which depends
on //remoting/host:host_main_headers, and update the `host_main_headers`
target in remoting/host/BUILD.gn so that it is visible to the new target.
See remoting/host/remote_open_url/BUILD.gn as an example.
1. The main function implementation may be added to either a new target
(usually when it is in a new directory), or an existing target. If it is a
new target, make sure it has
`configs += [ "//remoting/build/config:host_implementation" ]`. The target
should depend on the main header target created in the step above. Otherwise
the symbol won't be exposed. See remoting/host/remote_open_url/BUILD.gn as
an example.
1. Add the executable target, which depends on the main header target and
remoting_core. See remoting/host/remote_open_url/BUILD.gn as an example.
1. If the process needs to be run on Windows, then pay attention to the
`if (is_win) {...}` section of the example in the step above, and also
update remoting/host/win/core.rc.jinja2. If it is never run on Windows, then
you can ignore this step.
### Processes without a standalone binary
These are processes like the daemon process and the network process. They are
run with `$MAIN_HOST_BINARY --type=$PROCESS_TYPE`. For example, you can run the
dev daemon process with `remoting_me2me_host --type=daemon`. To add a new
process without a standalone binary:
1. Add a new entry point to remoting/host/host_main.cc
1. Update SelectMainRoutine in remoting/host/host_main.cc
1. Implement the the entry point in another file that is built into
remoting_core.
## Sanity Checks
Always do the following after making edits.
### Build Targets
Always build relevant targets after making edits. Typical targets could be:
* `remoting_all` - Build everything that's related to remoting, including
everything below.
* `remoting_unittests` - unittests.
* `remoting_dev_me2me_host` - build a bunch of targets including everything
below that allows for running the CRD host in the current directory.
* `remoting_me2me_host` - the Me2Me host binary.
* `remoting_native_messaging_host` - Native Messaging host for Me2Me.
* `remote_assistance_host` - Native Messaging host for It2Me.
### Dependencies
Always run `gn check` after making edits to validate target dependencies.
Sometimes you may need to create new build targets to break circular
dependencies. For example, targets like //remoting/host:common are huge and
likely to cause problems. Prefer adding `deps` as opposed to `public_deps` when
possible.
### Formatting
Always run `git cl format` after making edits.