Package Exports
- chromium-bidi/lib/cjs/bidiMapper/bidiMapper.js
- chromium-bidi/lib/cjs/protocol/protocol.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (chromium-bidi) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
WebDriver BiDi for Chromium 
CI status
This is an implementation of the WebDriver BiDi protocol with some extensions (BiDi+) for Chromium, implemented as a JavaScript layer translating between BiDi and CDP, running inside a Chrome tab.
Current status can be checked at WPT WebDriver BiDi status.
BiDi+
"BiDi+" is an extension of the WebDriver BiDi protocol. In addition to WebDriver BiDi it has:
Command cdp.sendCommand
CdpSendCommandCommand = {
method: "cdp.sendCommand",
params: ScriptEvaluateParameters,
}
CdpSendCommandParameters = {
method: text,
params: any,
session?: text,
}
CdpSendCommandResult = {
result: any,
session: text,
}The command runs the described CDP command and returns the result.
Command cdp.getSession
CdpGetSessionCommand = {
method: "cdp.sendCommand",
params: ScriptEvaluateParameters,
}
CdpGetSessionParameters = {
context: BrowsingContext,
}
CdpGetSessionResult = {
session: text,
}The command returns the default CDP session for the selected browsing context.
Events cdp
CdpEventReceivedEvent = {
method: "cdp.<CDP Event Name>",
params: CdpEventReceivedParameters,
}
CdpEventReceivedParameters = {
event: text,
params: any,
session: text,
}The event contains a CDP event.
Field channel
Each command can be extended with a channel:
Command = {
id: js-uint,
channel?: text,
CommandData,
Extensible,
}If provided and non-empty string, the very same channel is added to the response:
CommandResponse = {
id: js-uint,
channel?: text,
result: ResultData,
Extensible,
}
ErrorResponse = {
id: js-uint / null,
channel?: text,
error: ErrorCode,
message: text,
?stacktrace: text,
Extensible
}When client uses
commands session.subscribe
and session.unsubscribe
with channel, the subscriptions are handled per channel, and the corresponding
channel filed is added to the event message:
Event = {
channel?: text,
EventData,
Extensible,
}Dev Setup
npm
This is a Node.js project, so install dependencies as usual:
npm installcargo
We use cddlconv to generate our WebDriverBidi types before building.
- Install Rust.
- Run
cargo install --git https://github.com/google/cddlconv.git cddlconv
pre-commit.com integration
Refer to the documentation at .pre-commit-config.yaml.
Starting the Server
This will run the server on port 8080:
npm run serverUse the PORT= environment variable or --port= argument to run it on another port:
PORT=8081 npm run server
npm run server -- --port=8081Use the DEBUG environment variable to see debug info:
DEBUG=* npm run serverUse the CLI argument --headless=false to run browser in headful mode:
npm run server -- --headless=falseUse the CHANNEL=... environment variable or --channel=... argument with one of
the following values to run the specific Chrome channel: stable,
beta, canary, dev.
The requested Chrome version should be installed.
CHANNEL=dev npm run server
npm run server -- --channel=devUse the CLI argument --verbose to have CDP events printed to the console. Note: you have to enable debugging output bidi:mapper:debug:* as well.
DEBUG=bidi:mapper:debug:* npm run server -- --verboseor
DEBUG=* npm run server -- --verboseStarting on Linux and Mac
TODO: verify it works on Windows.
You can also run the server by using npm run server. It will write
output to the file log.txt:
npm run server -- --port=8081 --headless=falseRunning
Unit tests
Running:
npm run unitE2E tests
The E2E tests are written using Python, in order to learn how to eventually do this in web-platform-tests.
Installation
Python 3.6+ and some dependencies are required:
python3 -m pip install --user -r tests/requirements.txtRunning
The E2E tests require BiDi server running on the same host. By default, tests
try to connect to the port 8080. The server can be run from the project root:
npm run e2e # alias to to e2e-headless
npm run e2e-headful
npm run e2e-headlessUse the PORT environment variable to connect to another port:
PORT=8081 npm run e2eExamples
Refer to examples/README.md.
WPT (Web Platform Tests)
WPT is added as a git submodule. To get run WPT tests:
Check out and setup WPT
1. Check out WPT
git submodule update --init2. Go to the WPT folder
cd wpt3. Set up virtualenv
Follow the System Setup instructions.
4. Setup hosts file
Follow
the hosts File Setup
instructions.
4.a On Linux, macOS or other UNIX-like system
./wpt make-hosts-file | sudo tee -a /etc/hosts4.b On Windows
This must be run in a PowerShell session with Administrator privileges:
python wpt make-hosts-file | Out-File $env:SystemRoot\System32\drivers\etc\hosts -Encoding ascii -AppendIf you are behind a proxy, you also need to make sure the domains above are excluded from your proxy lookups.
5. Set BROWSER_BIN
Set the BROWSER_BIN environment variable to a Chrome, Edge or Chromium binary to launch.
For example, on macOS:
# Chrome
export BROWSER_BIN="/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"
export BROWSER_BIN="/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev"
export BROWSER_BIN="/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta"
export BROWSER_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
export BROWSER_BIN="/Applications/Chromium.app/Contents/MacOS/Chromium"
# Edge
export BROWSER_BIN="/Applications/Microsoft Edge Canary.app/Contents/MacOS/Microsoft Edge Canary"
export BROWSER_BIN="/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"Run WPT tests
1. Make sure you have Chrome Dev installed
https://www.google.com/chrome/dev/
2. Build Chromedriver BiDi
Oneshot:
npm run buildContinuously:
npm run build --watch3. Run
npm run wpt -- webdriver/tests/bidi/Update WPT expectations if needed
UPDATE_EXPECTATIONS=true npm run wpt -- webdriver/tests/bidi/How does it work?
The architecture is described in the WebDriver BiDi in Chrome Context implementation plan .
There are 2 main modules:
- backend WS server in
src. It runs webSocket server, and for each ws connection runs an instance of browser with BiDi Mapper. - front-end BiDi Mapper in
src/bidiMapper. Gets BiDi commands from the backend, and map them to CDP commands.
Contributing
The BiDi commands are processed in the src/bidiMapper/commandProcessor.ts. To add a
new command, add it to _processCommand, write and call processor for it.
Publish new npm release
Automatic release
We use release-please to automate releases. When a release should be done, check for the release PR in our pull requests and merge it.
Manual release
Dry-run
npm publish --dry-runOpen a PR bumping the chromium-bidi version number in
package.jsonfor review:npm version patch -m 'chore: Release v%s' --no-git-tag-version
Instead of
patch, useminorormajoras needed.After the PR is reviewed, create a GitHub release specifying the tag name matching the bumped version. Our CI then automatically publishes the new release to npm based on the tag name.
Roll into Chromium
Assuming that you already have a Chromium set-up locally, and knowledge on how to submit changes to the repo. Else submit an issue for a project maintainer to do.
- Create a new branch.
- Navigate to
third_party/bidimapper/. - Then run the following commands:
./pull.sh
./build.sh- Submit a CL with bug
chromedriver:4226 - Add appropriate reviewers or comment the CL link on the PR