blob: 015990cbaa682fdab17f3d2ec89917daa11ab9bb [file] [log] [blame] [view]
# Get the Code: Checkout and Build Chromium DevTools front-end
In order to make changes to DevTools frontend, build, run, test, and submit changes, several workflows exist. Having [depot_tools](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up) set up is a common prerequisite.
[TOC]
## Standalone checkout
As a standalone project, Chrome DevTools frontend can be checked out and built independently from Chromium. The main advantage is not having to check out and build Chromium.
However, to run layout tests, you need to use the [chromium checkout](#Chromium-checkout) or [integrated checkout](#Integrated-checkout).
### Checking out source
To check out the source for DevTools frontend only, follow these steps:
```bash
mkdir devtools
cd devtools
fetch devtools-frontend
```
### Build
To build, follow these steps:
```bash
cd devtools-frontend
gclient sync
gn gen out/Default
autoninja -C out/Default
```
The resulting build artifacts can be found in `out/Default/gen/front_end`.
There are two tips to have a faster development workflow:
* Disabling type checking for TypeScript.
* Using watch script for faster incremental builds with CSS hot reload.
#### Disabling type checking
You can disable type checking for TypeScript by using `devtools_skip_typecheck` argument:
```bash
gn gen out/fast-build --args="devtools_skip_typecheck=true"
```
#### Faster incremental builds & CSS hot reload
In addition to that, you can enable CSS hot reload while using `watch` script with `devtools_css_hot_reload_enabled` argument:
```bash
gn gen out/fast-build --args="devtools_css_hot_reload_enabled=true"
```
with this and `devtools_skip_typecheck=true` in place, you can use `watch` script by:
```bash
npm run watch -- --target=fast-build
```
which will automatically apply CSS changes & instantly build changed TS files.
> Caution! `watch` script is not based on `ninja` thus the build output and behavior
> might differ with the official ninja build. In addition to that,
> there might be some cases that `watch` build doesn't reliably handle, so you
> might need to run `autoninja` and restart the script from time to time.
### Update to latest
To update to latest tip of tree version:
```bash
git fetch origin; git checkout origin/main # or, alternatively: git rebase-update
gclient sync
```
### Out of sync dependencies and cross-repo changes
The revisions of git dependencies must always be in sync between the entry in DEPS and the git submodule. PRESUBMIT will
reject CLs that try to submit changes to one but not the other.
It can happen that dependencies go out of sync for three main reasons:
1. The developer attempted a manual roll by only updating the DEPS file (which was the process before migrating to git
submodules, see [below](#Managing-dependencies)),
1. after switching branches or checking out new commit the developer didn't run `gclient sync`, or
1. they are working across repositories including changes in both.
In the first case, follow the [manual roll process](#Managing-dependencies). In the second case,
running `gclient sync` is necessary. If the changes to the submodule versions were already added to any commits (this
happens when commits were created using `git add -A`, for example), it's necessary to unstage them (for example using
`git checkout -p origin/main`). The latter also applies in the third case: Create a CL excluding the dependency changes
and a separate CL with a proper roll.
### Run in a pre-built Chromium
You can run a [build](#Build) of DevTools frontend in a pre-built Chromium in order to avoid the expensive Chromium build. For example, you can use the latest version of Chrome Canary, or the downloaded binary in `third_party/chrome`.
#### Running from file system
This works with Chromium 79 or later.
**(Requires `brew install coreutils` on Mac.)**
To run on **Mac**:
```bash
<path-to-devtools-frontend>./third_party/chrome/chrome-mac/Google\ Chrome\ for\ Testing.app/Contents/MacOS/Google\ Chrome\ for\ Testing --disable-infobars --disable-features=MediaRouter --custom-devtools-frontend=file://$(realpath out/Default/gen/front_end) --use-mock-keychain
```
To run on **Linux**:
```bash
<path-to-devtools-frontend>./third_party/chrome/chrome-linux/chrome --disable-infobars --custom-devtools-frontend=file://$(realpath out/Default/gen/front_end)
```
To run on **Windows**:
```bash
<path-to-devtools-frontend>\third_party\chrome\chrome-win\chrome.exe --disable-infobars --custom-devtools-frontend="<path-to-devtools-frontend>\out\Default\gen\front_end"
```
Note that `$(realpath out/Default/gen/front_end)` expands to the absolute path to build artifacts for DevTools frontend.
Open DevTools via F12 or Ctrl+Shift+J on Windows/Linux or Cmd+Option+I on Mac.
If you get errors along the line of `Uncaught TypeError: Cannot read property 'setInspectedTabId'` you probably specified an incorrect path - the path has to be absolute. On Mac and Linux, the file url will start with __three__ slashes: `file:///Users/...`.
**Tip**: You can inspect DevTools with DevTools by undocking DevTools and then opening a second instance of DevTools (see keyboard shortcut above).
**Tip**: On Windows it is possible the browser will re-attach to an existing session without applying command arguments. Make sure that there are no active Chrome sessions running.
#### Running from remote URL
This works with Chromium 85 or later.
Serve the content of `out/Default/gen/front_end` on a web server, e.g. via `python -m http.server`.
Then point to that web server when starting Chromium, for example:
```bash
<path-to-devtools-frontend>/third_party/chrome/chrome-<platform>/chrome --disable-infobars --custom-devtools-frontend=http://localhost:8000/
```
Open DevTools via F12 or Ctrl+Shift+J on Windows/Linux or Cmd+Option+I on Mac.
#### Running in hosted mode
Serve the content of `out/Default/gen/front_end` on a web server, e.g. via `python3 -m http.server 8000`.
Then start Chrome, allowing for accesses from the web server:
```bash
<path-to-devtools-frontend>/third_party/chrome/chrome-<platform>/chrome --disable-infobars --remote-debugging-port=9222 --remote-allow-origins=http://localhost:8000 about:blank
```
Get the list of pages together with their DevTools frontend URLs:
```bash
$ curl http://localhost:9222/json -s | grep '\(url\|devtoolsFrontend\)'
"devtoolsFrontendUrl": "/devtools/inspector.html?ws=localhost:9222/devtools/page/BADADD4E55BADADD4E55BADADD4E5511",
"url": "about:blank",
```
In a regular Chrome tab, go to the URL `http://localhost:8000/inspector.html?ws=<web-socket-url>`, where `<web-socket-url>` should be replaced by
your desired DevTools web socket URL (from `devtoolsFrontendUrl`). For example, for
`"devtoolsFrontendUrl": "/devtools/inspector.html?ws=localhost:9222/devtools/page/BADADD4E55BADADD4E55BADADD4E5511"`,
you could run the hosted DevTools with the following command:
```
$ google-chrome http://localhost:8000/inspector.html?ws=localhost:9222/devtools/page/BADADD4E55BADADD4E55BADADD4E5511
```
## Integrated checkout
**This solution is experimental, please report any trouble that you run into!**
The integrated workflow offers the best of both worlds, and allows for working on both Chromium and DevTools frontend
side-by-side. This is strongly recommended for folks working primarily on DevTools.
This workflow will ensure that your local setup is equivalent to how Chromium infrastructure tests your change.
A full [Chromium checkout](#Chromium-checkout) is a pre-requisite for the following steps.
### Untrack the existing devtools-frontend submodule
First, you need to untrack the existing devtools-frontend submodule in the chromium checkout. This ensures that devtools
isn't dragged along whenever you update your chromium dependencies.
In `chromium/src`, run `gclient sync` to make sure you have installed all required submodules.
```bash
gclient sync
```
Then, disable `gclient sync` for DevTools frontend inside of Chromium by editing `.gclient` config. From
`chromium/src/`, run
```bash
vim "$(gclient root)/.gclient"
```
In the `custom_deps` section, insert this line:
```python
"src/third_party/devtools-frontend/src": None,
```
Following this step, there are two approaches to manage your standalone checkout
### Single gclient project
**Note: it's not possible anymore to manage the two projects in separate gclient projects.**
For the integrated checkout, create a single gclient project that automatically gclient sync's all dependencies for both
repositories. After checking out chromium, modify the .gclient file for `chromium/src` to add the DevTools project:
```python
solutions = [
{
# Chromium src project
"name": "src",
"url": "https://chromium.googlesource.com/chromium/src.git",
"custom_deps": {
"src/third_party/devtools-frontend/src": None,
},
},
{
# devtools-frontend project
"name": "devtools-frontend",
"managed": False,
"url": "https://chromium.googlesource.com/devtools/devtools-frontend.git",
}
]
```
Do not run `gclient sync` now, first create the symlink. In the same directory as the .gclient file, run:
```bash
ln -s src/third_party/devtools-frontend/src devtools-frontend
```
If you did run `gclient sync` first, remove the devtools-frontend directory and start over.
Run `gclient sync` after creating the link to fetch the dependencies for the standalone checkout.
## Chromium checkout
DevTools frontend can also be developed as part of the full Chromium checkout.
This workflow can be used to make small patches to DevTools as a Chromium engineer.
However, it is different to our infrastructure setup and how to execute general maintenance work, and therefore discouraged.
### Checking out source
Follow [instructions](https://www.chromium.org/developers/how-tos/get-the-code) to check out Chromium. DevTools frontend can be found under `third_party/devtools-frontend/src/`.
### Build
Refer to [instructions](https://www.chromium.org/developers/how-tos/get-the-code) to build Chromium.
To only build DevTools frontend, use `devtools_frontend_resources` as build target.
The resulting build artifacts for DevTools frontend can be found in `out/Default/gen/third_party/devtools-frontend/src/front_end`.
### Run
Run Chrome with bundled DevTools frontend:
```bash
out/Default/chrome
```