chromium/docs/ios/running_against_tot_webkit.md

# Running Against ToT WebKit in the Simulator

This is a simplified workflow intended to make it as easy as possible to compile
and run against ToT WebKit locally. If you intend to do daily development in a
WebKit tree, you may want to consider an alternate workflow as described
[here](https://docs.google.com/document/d/1l74JNYr9dniUnT5aKUS1_EswlDmuQghlEfyVCiPh9a4).

A design doc explaining the details behind these steps can be found
[here](https://docs.google.com/document/d/15HCmvC_yKNpmcrgHaGUA5LWWwROCmOz7qyYnMmhQkBQ)

Note: this only works on Simulator.  At present, we do not have the ability to
compile WebKit for devices.

## Warning: do this in a new checkout

The changes below will substantially increase compile times, for both clean and
incremental builds.  No-op builds will jump from ~0s to ~60s, which will
likely be an unacceptable regression in a daily development checkout.

By pulling a separate, new checkout for WebKit, you sidestep these issues at the
expense of greater disk usage.

## Updating .gclient to pull WebKit

To start, edit your `.gclient` file to checkout WebKit @HEAD. Both of the custom
variables are necessary, as by default webkit.git is pinned to a revision in the
distant past.

```
solutions = [
  {
    "url": "https://chromium.googlesource.com/chromium/src.git",
    "name": "src",

    "custom_vars": {
      "checkout_ios_webkit": True,
      "ios_webkit_revision": "refs/heads/master",
    },

  },
]
target_os = ["ios"]
target_os_only = "True"
````

Add the `custom_vars` section as above and re-run `gclient sync`.  After it
completes, you should have a WebKit checkout in `ios/third_party/webkit/src`.

## Building

WebKit-enabled checkouts expose a `webkit` target via GN/ninja. The WebKit
libraries will automatically be built as part of the default set of targets, or
you can build it individually.

```
# Builds all targets, including webkit.
ninja -C out/Debug-iphonesimulator

# Builds just the webkit target.
ninja -C out/Debug-iphonesimulator webkit
```

The WebKit build output can be found at
`out/Debug-iphonesimulator/obj/ios/third_party/webkit/`.

### Speeding up clean builds by building WebKit first

We build using a set of scripts provided by WebKit; they set up an environment
and then invoke xcodebuild directly.  To prevent xcodebuild from competing with
ninja for CPU/RAM, we limit the WebKit build to four parallel jobs. This is
generally sufficient for incremental builds, but for clean builds (or after a
sync) it may be faster to build WebKit without this limitation.

```
# After a sync, build WebKit first.
ios/third_party/webkit/build-webkit.py

# Once WebKit is built, invoke ninja as usual to build Chromium.
ninja -C out/Debug-iphonesimulator
```

### One-time setup (per machine, per version of Xcode)

If you move to a new machine or install a new version of Xcode, you'll need to
run a setup script in order to copy some headers from the macOS SDK into the iOS
SDK.

```
sudo ios/third_party/webkit/src/Tools/Scripts/configure-xcode-for-ios-development
```


## Running against locally-built libraries

To run against the libraries you've just built, set the `DYLD_FRAMEWORK_PATH`
environment variable to the directory containing the WebKit build output.  This
is usually easiest to do in the Xcode UI.

```
DYLD_FRAMEWORK_PATH = /path/to/out/Debug-iphonesimulator/obj/ios/third_party/webkit/Debug-iphonesimulator/
```