Do we know if the other vendors would see value in having this spec'ed properly so that we have true interop here? Reverse engineering seems like a "fun" project but what stops people from breaking stuff without realising?
David On 30 August 2017 at 22:55, Michael Smith <li...@spinda.net> wrote: > Hi everyone, > > Mozilla DevTools is exploring implementing parts of the Chrome DevTools > Protocol ("CDP") [0] in Firefox. This is an HTTP, WebSockets, and JSON > based protocol for automating and inspecting running browser pages. > > Originally built for the Chrome DevTools, it has seen wider adoption with > outside developers. In addition to Chrome/Chromium, the CDP is supported by > WebKit, Safari, Node.js, and soon Edge, and an ecosystem of libraries and > tools already exists which plug into it, for debugging, extracting > performance data, providing live-preview functionality like the Brackets > editor, and so on. We believe it would be beneficial if these could be > leveraged with Firefox as well. > > The initial implementation we have in mind is an alternate target for > third-party integrations to connect to, in addition to the existing Firefox > DevTools Server. The Servo project has also expressed interest in adding > CDP support to improve its own devtools story, and a PR is in flight to > land a CDP server implementation there [1]. > > I've been working on this project with guidance from Jim Blandy. We've > come up with the following approach: > > - A complete, typed Rust implementation of the CDP protocol messages and > (de)serialization lives in the "cdp" crate [2], automatically generated > from the protocol's JSON specification [3] using a build script (this > happens transparently as part of the normal Cargo compilation process). > This comes with Rustdoc API documentation of all messages/types in the > protocol [4] including textual descriptions bundled with the specification > JSON. The cdp crate will likely track the Chrome stable release for which > version of the protocol is supported. A maintainers' script exists which > can find and fetch the appropriate JSON [5]. > > - The "tokio-cdp" crate [6] builds on the types and (de)serialization > implementation in the cdp crate to provide a server implementation built on > the Tokio asynchronous I/O system. The server side provides traits for > consuming incoming CDP RPC commands, executing them concurrently and > sending back responses, and simultaneously pushing events to the client. > They are generic over the underlying transport, so the same backend > implementation could provide support for "remote" clients plugging in over > HTTP/WebSockets/JSON or, for example, a browser-local client communicating > over IPDL. > > - In Servo, a new component plugs into the cdp and tokio-cdp crates and > acts on behalf of connected CDP clients in response to their commands, > communicating with the rest of the Servo constellation. This server is > disabled by default and can be started by passing a "--cdp" flag to the > Servo binary, binding a TCP listener to the loopback interface at the > standard CDP port 9222 (a different port can be specified as an option to > the flag). > > - The implementation we envision in Firefox/Gecko would act similarly: a > new Rust component, disabled by default and switched on via a command line > flag, which binds to a local port and mediates between Gecko internals and > clients connected via tokio-cdp. > > We chose to build this on Rust and the Tokio event loop, along with the > hyper HTTP library and rust-websocket which plug into Tokio. > > Rust and Cargo provide excellent facilities for compile-time code > generation which integrate transparently into the normal build process, > avoiding the need to invoke scripts by hand to keep generated artifacts in > sync. The Rust ecosystem provides libraries such as quote [7] and serde [8] > which allow us to auto-generate an efficient, typed, and self-contained > interface for the entire protocol. This moves the complexity of ingesting, > validating, and extracting information from client messages out of the > Servo- and Gecko-specific backend implementations, helps to ensure they > conform correctly to the protocol specification, and provides a structured > way of upgrading to new protocol versions. > > As for Tokio, the event loop and Futures-based model of concurrency it > offers maps well to the Chrome DevTools Protocol. RPC commands typically > execute simultaneously, returning responses in order of completion, while > the server continuously generates events to which the client has > subscribed. Under Tokio we can spawn multiple lightweight Tasks, dispatch > messages to them, and multiplex their responses back over the single client > connection. The Tokio event loop is nicely self-contained to the one or, > optionally, more threads it is allocated, so the rest of the application > doesn't need to be aware of it. > > Use of Tokio is becoming a standard in the Rust ecosystem---it's worth > mentioning that Mozilla funds Tokio development [9] and employs some of its > primary developers. Servo currently depends on an older version of the > hyper HTTP client/server library, and consequently this is already present > in the Firefox tree. The current release of hyper is built on top of Tokio, > so upgrading hyper, either as maintenance or to take advantage of the > forthcoming HTTP/2 support, would require pulling in Tokio anyway. The > current release of rust-websocket, from which Servo derives its WebSockets > implementation, also supports Tokio. > > The alternative to Tokio for the networking layer would likely be to build > on top of Necko. This presents its own share of problems. > > No Rust bindings to Necko currently exist, so writing those in the first > place would become a prerequisite for the rest of the work, and may require > integration with technologies like XPCOM which also lacks Rust support. > Then rewriting the CDP networking layer on top of Necko would duplicate > effort between the CDP implementations for Gecko and Servo, the latter of > which does not presently use Necko and may not be able to take it on as a > dependency. > > Furthermore, it is my understanding through conversations with others that > while Necko's HTTP client implementation is mature, what HTTP *server* > implementation exists is bare-bones, and that at present there is no > support for upgrading HTTP connections to WebSockets in order to implement > a WebSocket server. Then building on top of Necko would entail effectively > developing a new library within Necko, when we could instead adopt existing > technologies (Tokio, hyper, rust-websocket) which are already in use by > other Mozilla projects and the surrounding Rust ecosystem. > > Feedback, suggestions, and guidance are very much welcome! > https://bugzil.la/1391465 is the bug for the CDP server implementation in > Firefox. > > -Michael Smith [:mismith] > > [0] https://chromedevtools.github.io/devtools-protocol/ > [1] https://github.com/servo/servo/pull/18133 > [2] https://github.com/devtools-html/cdp > [3] https://github.com/devtools-html/cdp/blob/master/json/browse > r_protocol.json > [4] https://www.spinda.net/files/mozilla/cdp/doc/cdp/tools/index.html > [5] https://github.com/devtools-html/cdp/blob/master/update_json.sh > [6] https://github.com/devtools-html/tokio-cdp > [7] https://github.com/dtolnay/quote > [8] https://github.com/serde-rs/serde > [9] https://blog.mozilla.org/blog/2017/04/10/mozilla-awards-3650 > 00-to-open-source-projects-as-part-of-moss/ > _______________________________________________ > dev-platform mailing list > dev-platform@lists.mozilla.org > https://lists.mozilla.org/listinfo/dev-platform > _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform