blob: ced10104eca20d9bc7bbcadcfc77c4e5a656285b [file] [log] [blame] [view]
# Cobalt
## Overview
Cobalt is a lightweight application container (i.e. an application runtime, like
a JVM or the Flash Player) that is compatible with a subset of the W3C HTML5
specifications. If you author a single-page web application (SPA) that complies
with the Cobalt Subset of W3C standards, it will run as well as possible on all
the devices that Cobalt supports.
## Motivation
The Cobalt Authors originally maintained a port of Chromium called H5VCC, the
HTML5 Video Container for Consoles, ported to each of the major game consoles,
designed to run our HTML5-based video browse and play application. This took a
long time to port to each platform, consisted of 9 million lines of C++ code
(before we touched it), was dangerous to modify without unintended consequences,
and was thoroughly designed for a resource-rich, multi-process environment
(e.g. a desktop, laptop, or modern smartphone).
After wrestling with this for several years, we imagined an environment that was
not designed for traditional scrolling web content, but was intended to be a
runtime environment for rich client applications built with the same
technologies -- HTML, CSS, JavaScript -- and designed from the ground-up to run
on constrained, embedded, Living Room Consumer Electronics (CE) devices, such as
Game Consoles, Set-Top Boxes (e.g. Cable, Satellite), OTT devices (e.g. Roku,
Apple TV, Chromecast, Fire TV), Blu-ray Disc Players, and Smart TVs.
These constraints (not intended to be a canonical list) make this device
spectrum vastly different from the desktop computer environment targeted by
Chromium, FireFox, and IE:
* **Limited Memory.** All except the very latest, expensive CE devices have a
very small amount of memory available for applications. This usually is
somewhere in the ballpark of 200MB-500MB, including graphics and media
memory, as opposed to multiple gigabytes of CPU memory (and more gigabytes
of GPU memory) in modern desktop and laptop computers, and mobile devices.
* **Slow CPUs.** Most CE devices have much slower CPUs than what is available
on even a budget desktop computer. Minor performance concerns can be greatly
exaggerated, which seriously affects priorities.
* **Fewer cores.** CE System-on-a-Chip (SoC) processors often do not have as
many processor cores as we are used to in modern computers. Many deployed
devices still only have a single core.
* **Sometimes No GPU.** Not all CE devices have a monster GPU to throw shaders
at to offload CPU work. A different strategy is required to maximize
leverage of an accelerated blitter, which is all some older devices
have. Some newer CE devices have a GPU, but it's not nearly as powerful as
what one would even see on a laptop.
* **Sometimes No JIT.** Many CE devices are dealing with "High-Value Content,"
and, as such, are very sensitive to security concerns. Ensuring that
writable pages are not executable is a strong security protocol that can
prevent a wide spectrum of attacks. But, as a side effect, this also means
no ability to JIT.
* **Heterogenous Development Environments.** This is slowly evening out, but
all CE devices run on custom hardware, often with proprietary methods of
building, packaging, deploying, and running programs. Almost all CE devices
have ARM or MIPS processors instead of the more familiar x86. Sometimes the
toolchain doesn't support contemporary C++11 features. Sometimes the OS
isn't POSIX, or it tries to be, but it is only partially implemented.
Sometimes the program entry point is in another language or architecture
that requires a "trampoline" over to native binary code.
* **No navigation.** The point of a Single-Page Application is that you don't
go through the HTTP page dance every time you switch screens. It's slow, and
provides poor user feedback, not to mention a jarring transition. Instead,
one loads data from an XMLHttpRequest (XHR), and then updates one's DOM to
reflect the new data. AJAX! Web 2.0!!
* **No scrolling.** Well, full-screen, 10-foot UI SPA apps might scroll, but
not like traditional web pages, with scroll bars and a mouse
wheel. Scrolling is generally built into the app very carefully, with
support for a Directional Pad and a focus cursor.
## Architecture
The Cobalt Authors forked H5VCC, removed most of the Chromium code -- in
particular WebCore and the Chrome Renderer and Compositor -- and built up from
scratch an implementation of a simplified subset of HTML, the CSS Box Model for
layout, and the Web APIs that were really needed to build a full-screen SPA
browse and play application.
The Cobalt technology stack has these major components, roughly in a high-level
application to a low-level platform order:
* **Web Implementation** - This is where the W3C standards are implemented,
ultimately producing an annotated DOM tree that can be passed into the
Layout Engine to produce a Render Tree.
* **JavaScript Engine** - We have, perhaps surprisingly, *not* written our own
JavaScript Engine from scratch. Because of the JITing constraint, we have to
be flexible with which engine(s) we work with. We have a bindings layer that
interfaces with the JS Engine so that application script can interface with
natively-backed objects (like DOM elements).
* **Layout Engine** - The Layout Engine takes an annotated DOM Document
produced by the Web Implementation and JavaScript Engine working together,
and calculates a tree of rendering commands to send to the renderer (i.e. a
Render Tree). It caches intermediate layout artifacts so that subsequent
incremental layouts can be sped up.
* **Renderer/Skia** - The Renderer walks a Render Tree produced by the Layout
Engine, rasterizes it using the third-party graphics library Skia, and swaps
it to the front buffer. There are two major paths here, one using Hardware
Skia on OpenGL ES 2.0, and one using Software Skia combined with the
hardware-accelerated Starboard Blitter. Note that the renderer runs in a
different thread from the Layout Engine, and can interpolate animations that
do not require re-layout. This decouples rendering from Layout and
JavaScript, allowing for smooth, consistent animations on platforms with a
variety of capabilities.
* **Net / Media** - These are Chromium's Network and Media engines. We are
using them directly, as they don't cause any particular problems with the
extra constraints listed above.
* **Base** - This is Chromium's "Base" library, which contains a wide variety
of useful things used throughout Cobalt, Net, and Media. Cobalt uses a
combination of standard C++ containers (e.g. vector, string) and Base as the
foundation library for all of its code.
* **Other Third-party Libraries** - Most of these are venerable, straight-C,
open-source libraries that are commonly included in other open-source
software. Mostly format decoders and parsers (e.g. libpng, libxml2,
zlib). We fork these from Chromium, as we want them to be the most
battle-tested versions of these libraries.
* **Starboard/Glimp/ANGLE** - **Starboard** is the Cobalt porting
interface. One major difference between Cobalt and Chromium is that we have
created a hard straight-C porting layer, and ported ALL of the compiled
code, including Base and all third-party libraries, to use it instead of
directly using POSIX standard libraries, which are not consistent, even on
modern systems (see Android, Windows, MacOS X, and iOS). Additionally,
Starboard includes APIs that haven't been effectively standardized across
platforms, such as display Window creation, Input events, and Media
playback. **Glimp** is an OpenGL ES 2.0 implementation framework, built by
the Cobalt team directly on Starboard, designed to adapt proprietary 3D APIs
to GLES2. **ANGLE** Is a third-party library that adapts DirectX to GLES2,
similar to Glimp, but only for DirectX.
Cobalt is like a flaky layered pastry - perhaps Baklava. It shouldn't be too
difficult to rip the Web Implementation and Layout off the top, and just use the
Renderer, or even to just use Base + Starboard + GLES2 as the basis of a new
project.
## The Cobalt Subset
> Oh, we got both kinds of HTML tags,\
> we got `<span>` and `<div>`!
See the [Cobalt Subset specification](TODO) for more details on which tags,
properties, and Web APIs are supported in Cobalt.
*More to come.*
## Interesting Source Locations
All source locations are specified relative to `src/` (this directory).
* `base/` - Chromium's Base library. Contains common utilities, and a light
platform abstraction, which has been superceded in Cobalt by Starboard.
* `net/` - Chromium's Network library. Contains enough infrastructure to
support the network needs of an HTTP User-Agent (like Chromium or Cobalt),
an HTTP server, a DIAL server, and several abstractions for networking
primitives. Also contains SPDY and QUIC implementations.
* `cobalt/` - The home of all Cobalt application code. This includes the Web
Implementation, Layout Engine, Renderer, and some other Cobalt-specific
features.
* `cobalt/build/` - The core build generation system, `gyp_cobalt`, and
configurations for supported platforms. (NOTE: This should eventually be
mostly moved into `starboard/`.)
* `cobalt/media/` - Chromium's Media library. Contains all the code that
parses, processes, and manages buffers of video and audio data. It
send the buffers to the SbPlayer implementation for playback.
* `starboard/` - Cobalt's porting layer. Please see Starboard's
[`README.md`](starboard/README.md) for more detailed information about
porting Starboard (and Cobalt) to a new platform.
* `third_party/` - Where all of Cobalt's third-party dependencies live. We
don't mean to be perjorative, we love our third-party libraries! This
location is dictated by Google OSS release management rules...
* `third_party/starboard/` - The location for third-party ports. This
directory will be scanned automatically by gyp_cobalt for available
Starboard ports.
## Building and Running the Code
Here's a quick and dirty guide to get to build the code on Linux.
1. Pull `depot_tools` into your favorite directory. It has been slightly
modified from Chromium's `depot_tools`.
git clone https://cobalt.googlesource.com/depot_tools
2. Add that directory to the end of your `$PATH`.
3. Ensure you have these packages installed:
sudo apt-get install libgles2-mesa-dev libpulse-dev libavformat-dev \
libavresample-dev libasound2-dev libxrender-dev libxcomposite-dev
4. Ensure you have the standard C++ header files installed
(e.g. `libstdc++-4.8-dev`).
5. For now, we also require ruby:
sudo apt-get install ruby
6. Remove bison-3 and install bison-2.7. (NOTE: We plan on moving to bison-3
in the future.)
$ sudo apt-get remove bison
$ sudo apt-get install m4
$ wget http://ftp.gnu.org/gnu/bison/bison-2.7.1.tar.gz
$ tar zxf bison-2.7.1.tar.gz
$ cd bison-2.7.1
$ sh configure && make && sudo make install
$ which bison
/usr/local/bin/bison
$ bison --version
bison (GNU Bison) 2.7.12-4996
7. (From this directory) run GYP:
cobalt/build/gyp_cobalt -C debug linux-x64x11
8. Run Ninja:
ninja -C out/linux-x64x11_debug cobalt
9. Run Cobalt:
out/linux-x64x11_debug/cobalt [--url=<url>]
* If you want to connect to an `https` host that doesn't have a
certificate validatable by our set of root CAs, you must pass the
`--ignore_certificate_errors` flag to the Cobalt command-line.
* Cobalt requires that the HTML5 content be fetched over HTTPS and
enforces CSP when compiled in the "gold" configuration. However, if
CSP is served in other builds, Cobalt still respects it. Currently
Cobalt is at CSP level 2.
* When the HTML5 content is served with a special "h5vcc-location-src"
CSP directive, a navigation jail is enabled in Cobalt that cannot be
disabled via Cobalt options.
* See [`cobalt/browser/switches.cc`](cobalt/browser/switches.cc) for more
command-line options.
## Build Types
Cobalt has four build optimization levels, going from the slowest, least
optimized, with the most debug information at the top (debug) to the fastest,
most optimized, and with the least debug information at the bottom (gold):
Type | Optimizations | Logging | Asserts | Debug Info | Console
:---- | :------------ | :------ | :------ | :--------- | :-------
debug | None | Full | Full | Full | Enabled
devel | Full | Full | Full | Full | Enabled
qa | Full | Limited | None | None | Enabled
gold | Full | None | None | None | Disabled
When building for release, you should always use a gold build for the final
product.
$ cobalt/build/gyp_cobalt -C gold linux-x64x11
$ ninja -C out/linux-x64x11_gold cobalt
$ out/linux-x64x11_gold/cobalt
## Origin of this Repository
This is a fork of the chromium repository at http://git.chromium.org/git/chromium.git