blob: d4a6a0240f47c82595267139156c069bbbd84851 [file] [log] [blame] [view]
# CRDTP - Chrome DevTools Protocol Library.
[Canonical location for this library.](https://chromium.googlesource.com/deps/inspector_protocol/+/refs/heads/master)
This is a support library for the Chrome DevTools protocol implementation.
It's used from within the Jinja templates which we use for code generation
(see ../lib and ../templates) as well as from Chromium (headless,
chrome, content, blink), V8, and other code bases that use the DevTools
protocol.
The library is designed to be portable. The only allowed dependencies are:
- The C/C++ standard libraries, up to C++14.
The litmus test is that it compiles and passes tests for all platforms
supported by V8.
- For testing, we depend on mini_chromium and gtest. This is isolated
into the crdtp/test_platform.{h,cc} library.
We support 32 bit and 64 bit architectures.
# Common types used in this library.
uint8_t: a byte, e.g. for raw bytes or UTF8 characters
uint16_t: two bytes, e.g. for UTF16 characters
For input parameters:
span<uint8_t>: pointer to bytes and length
span<uint16_t>: pointer to UTF16 chars and length
For output parameters:
std::vector<uint8_t> - Owned segment of bytes / utf8 characters and length.
std::string - Same, for compatibility, even though char is signed.
# Building and running the tests.
If you're familiar with
[Chromium's development process](https://www.chromium.org/developers/contributing-code)
and have the depot_tools installed, you may use these commands
to fetch the package (and dependencies) and build and run the tests:
fetch inspector_protocol
cd src
gn gen out/Release
ninja -C out/Release crdtp_test
out/Release/crdtp_test
You'll probably also need to install g++, since Clang uses this to find the
standard C++ headers. E.g.,
sudo apt-get install g++-8
# Purpose of the tests
crdtp comes with unittest coverage.
Upstream, in this standalone package, the unittests make development
more pleasant because they are very fast and light (try the previous
section to see).
Downstream (in Chromium, V8, etc.), they ensure that the library behaves
correctly within each specific code base. We have seen bugs from different
architectures / compilers / etc. in the past. We have also seen
that a tweaked downstream crdtp_platform library did not behave correctly,
becaues V8's strtod routine interprets out of range literals as 'inf'.
Thus, the unittests function as a conformance test suite for such code-base
specific tweaks downstream.
# Customization by downstream users (Chrome, V8, google3, etc.).
Downstream users may need to customize the library. We isolate these typical
customizations into two platform libraries (crdtp_plaform and
crdtp_test_platform), to reduce the chance of merge conflicts and grief when
rolling as much as possible. While customized platform libraries may
depend on the downstream code base (e.g. abseil, Chromium's base, V8's utility
functions, Boost, etc.), they are not exposed to the headers that
downstream code depends on.
## crdtp_platform
This platform library is only used by the crdtp library. Thus far it consists
only of json_platform.h and json_platform.cc, because conversion between a
string and a double is tricky in multithreaded code bases (strtod
sets errno, and stringstreams are slow). In this repository, we provide a
reference implementation which only uses C++11 standard libraries, which is
correct and sufficient for running the unittests and for simple command line
utilities (e.g. crdtp/transform.cc).
Downstream, in Chrome, json_platform.cc has a different implementation that uses
the routines in Chromium's base, that is, it's a .cc file that's specific to
Chromium. Similarly, in V8, json_platform.cc uses V8's number conversion utilities,
so it's a .cc file that's specific to V8. And in google3, we use the absl
library. crdtp/json_platform.cc is designed to be easy to
modify, and the interface defined by its header is designed to be stable.
## crdtp_test_platform
This platform library is only used by the tests. Upstream, it's setup to
use mini_chromium and gtest. Downstream, Chromium uses it's //base libraries,
and V8 uses theirs; and a small amount of tweaking is needed in each code
base - e.g., Chromium, V8, and google3 each place #include declarations into
test_platform.h that are specific to their code base, and they have their
own routines in test_platform.cc which uses their own libraries.
The purpose of crdtp_test_platform is to isolate the tweaking to this small,
stable library (modifying test_platform.h and test_platform.cc). This avoids
having to modify the actual tests (json_test.cc, cbor_test.cc, ...)
when rolling changes downstream. We try to not use patch files.