Design
Overview and goals
Servo is a research project to develop a new parallel web browser engine. It has two primary goals: to prevent common, exploitable security errors using strong, static typing; and to design an architecture that takes advantage of parallelism at many levels. Servo is explicitly not aiming to create a full web browser - it is focused on just the engine, not the chrome.
To those ends Servo is written in Rust, a new language designed specifically with Servo's requirements in mind. Rust provides a strong type system, task-based parallelism, and data-race freedom.
Some more specific near-term goals:
- Task-based architecture - major components in the system should be factored into actors with isolated heaps. This alone will provide some incidental parallelism, but more importantly will force the system to be decomposed types and interfaces that are most amenable to future parallel research.
- JavaScript and layout run in parallel
- Parallel rendering
- Multiprocess architecture
The task architecture
Each engine instance can for now be thought of as a single tab or window, and manages a pipeline of tasks that accepts input, runs JavaScript against the DOM, performs layout, builds display lists, renders display lists to tiles and finally composites the final image to a surface.
The pipeline consists of three main tasks:
- Content - Content's primary mission is to create and own the DOM and execute the JavaScript engine. It receives events from multiple sources, including navigation events, and routes them as necessary. When the content task needs to query information about layout it must send a request to the layout task.
- Layout - Layout takes a snapshot of the DOM, calculates styles, and constructs the main layout data structure, the flow tree. The flow tree is used to calculate the layout of nodes and from there build a [display list], which is sent to the render task.
- Renderer - The renderer receives a display list and renders visible portions to one or more tiles, possibly in parallel, and composites them to a surface for the application to display.
Two complex data structures are involved in multi-task communication in this pipeline, the DOM and the display list. The DOM is communicated from content to layout and the display list from layout to the renderer. Figuring out an efficient and type-safe way to represent, share, and/or transmit these two structures is one of the major challenges for the project.
Resource management
Asynchrony, caching strategy.
Multi-process architecture
Pages 371
- Home
- ACID2 Status
- Adding a new WebIDL binding
- Adding a repo to Homu
- Alternative Logo Proposals and Related Swag
- Asynchronous WebAssembly compilation project
- Austin Oxidation
- Autogeneration of style structs
- Basic SVG support project
- Beginner's guide to rebasing and squashing
- Benchmarking
- Benchmarks
- Bots
- Browser Engine Research
- Build Errors FAQ
- Buildbot administration
- Building for Android
- Building for Magic Leap
- Building for UWP
- Building on ARM desktop Linux
- Canvas rendering project
- Cargo upgrade service project
- CI Services we use
- Code rust concurrency
- Code of Conduct
- Code review
- Coding standards
- Compiler upgrade recipes
- Compositor Layer Design
- Contributing
- Control Servo using WebDriver
- Creating and viewing WARC web archives in Servo
- Creating new OpenSSL Windows binary distributions
- Cross compiling from linux to mac
- Crowbot
- CSS parse error reporting
- Css selector matching meeting 2013 07 19
- CSS selector matching optimizations
- CSSOM student project
- Debugging
- Debugging and editing tools
- Debugging JS web compat issues
- Design
- Developer tools student project
- Devtools
- Devtools CSS errors
- Devtools plans
- Diagnosing SpiderMonkey JIT issues
- DOM Design
- DOM documentation
- DOM missing pieces
- ECE 517 Fall'14
- Eric Atkinson visit 2013 09 10
- Events and sundry
- Expand HTTP request response monitoring
- Fetch improvement project
- Firefox Reality release notes
- FirefoxReality build
- Firewall setup for servo master1
- Focus student project
- Form validation student project
- Garbage collected DOM
- General implementation and design notes
- Getting started with layout
- Github & Critic PR handling 101
- Github workflow
- Glossary
- Governance
- Graphics toolkit integration
- GSoC project brainstorming
- Hawaii Rooting
- High priority content for layout
- Highfive
- HoloLens 2 test plan
- Homu
- How to generate GStreamer binaries for CI
- HTML parser improvement project
- HTMLElement binding conversion
- HTTP archive support project
- HTTP library requirements
- Image load conformance student project
- Image maps project
- Implement HTML charset parsing project
- Implement ImageBitmap project
- Implement missing WebAudio automation student project
- Implement support for missing XMLHttpRequest APIs
- Implement worker modules
- Implementing a web standard (RGSoC)
- Improve specification conformance of unicode bidi library
- Incremental flow tree construction
- infra triage notes
- Infrastructure
- Integrate xml5ever
- Intern project brainstorming
- Intern projects
- jQuery status
- JS objects, wrappers, and cross origin concerns 2013 08 07
- Layout 2020
- Layout 2020 and 2013 parity
- Layout Overview
- Layout revamp ideas
- Leo meyerovich visit 2013 07 22
- Linux sandboxing
- London Oxidation
- London Security
- Meeting 2012 02 08
- Meeting 2012 02 16
- Meeting 2012 07 20
- Meeting 2013 04 01
- Meeting 2013 04 15
- Meeting 2013 04 22
- Meeting 2013 04 29
- Meeting 2013 05 06
- Meeting 2013 05 13
- Meeting 2013 05 20
- Meeting 2013 06 03
- Meeting 2013 06 10
- Meeting 2013 06 14
- Meeting 2013 06 17
- Meeting 2013 06 24
- Meeting 2013 07 01
- Meeting 2013 07 15
- Meeting 2013 07 22
- Meeting 2013 07 29
- Meeting 2013 08 05
- Meeting 2013 08 12
- Meeting 2013 08 19
- Meeting 2013 09 09
- Meeting 2013 09 16
- Meeting 2013 09 23
- Meeting 2013 09 30
- Meeting 2013 10 14
- Meeting 2013 10 21
- Meeting 2013 10 28
- Meeting 2013 11 04
- Meeting 2013 11 18
- Meeting 2013 11 25
- Meeting 2013 12 02
- Meeting 2013 12 09
- Meeting 2013 12 16
- Meeting 2014 01 06
- Meeting 2014 01 13
- Meeting 2014 01 21
- Meeting 2014 01 27
- Meeting 2014 02 03
- Meeting 2014 02 10
- Meeting 2014 02 24
- Meeting 2014 03 10
- Meeting 2014 03 17
- Meeting 2014 03 24
- Meeting 2014 03 31
- Meeting 2014 04 07
- Meeting 2014 04 14
- Meeting 2014 04 21
- Meeting 2014 04 28
- Meeting 2014 05 05
- Meeting 2014 05 13
- Meeting 2014 05 19
- Meeting 2014 06 09
- Meeting 2014 06 17
- Meeting 2014 06 23
- Meeting 2014 06 30
- Meeting 2014 07 07
- Meeting 2014 07 14
- Meeting 2014 07 21
- Meeting 2014 07 29
- Meeting 2014 08 04
- Meeting 2014 08 11
- Meeting 2014 08 12
- Meeting 2014 08 18
- Meeting 2014 08 25
- Meeting 2014 09 08
- Meeting 2014 09 15
- Meeting 2014 09 22
- Meeting 2014 09 29
- Meeting 2014 10 06
- Meeting 2014 10 13
- Meeting 2014 10 20
- Meeting 2014 10 27
- Meeting 2014 11 10
- Meeting 2014 11 17
- Meeting 2014 11 24
- Meeting 2014 12 08
- Meeting 2014 12 15
- Meeting 2015 01 05
- Meeting 2015 01 12
- Meeting 2015 01 26
- Meeting 2015 02 09
- Meeting 2015 02 23
- Meeting 2015 03 02
- Meeting 2015 03 16
- Meeting 2015 03 30
- Meeting 2015 04 06
- Meeting 2015 04 13
- Meeting 2015 04 27
- Meeting 2015 05 04
- Meeting 2015 05 11
- Meeting 2015 05 18
- Meeting 2015 06 01
- Meeting 2015 06 08
- Meeting 2015 06 15
- Meeting 2015 07 06
- Meeting 2015 07 13
- Meeting 2015 07 27
- Meeting 2015 08 10
- Meeting 2015 08 17
- Meeting 2015 08 24
- Meeting 2015 08 31
- Meeting 2015 09 14
- Meeting 2015 09 21
- Meeting 2015 09 28
- Meeting 2015 10 05
- Meeting 2015 10 12
- Meeting 2015 10 19
- Meeting 2015 10 26
- Meeting 2015 11 02
- Meeting 2015 11 09
- Meeting 2015 11 16
- Meeting 2015 11 30
- Meeting 2016 01 04
- Meeting 2016 01 11
- Meeting 2016 01 25
- Meeting 2016 02 01
- Meeting 2016 02 08
- Meeting 2016 02 22
- Meeting 2016 03 07
- Meeting 2016 03 21
- Meeting Devtools Servo 2
- Meetings
- Microdata project
- Minutes Hackathon 2012 03 27
- Missing DOM features project
- More developer tools student project
- More ServiceWorker support project
- Mozlandia Automation
- Mozlandia B2S
- Mozlandia gfx
- Mozlandia JS
- Mozlandia Rust In Gecko
- Mozlandia WPT
- Mozlando Devtools Servo
- Mozlando Oxidation
- Mozlando Servo Bluetooth
- Mozlando Servo MagicDOM
- Mozlando Servo SMStrings
- Mozlando SM Servo
- Mutation observer project
- Mutation testing project
- NCSU student projects
- Network security project
- Off main thread HTML parsing project
- Offscreen canvas improvements project
- Offscreen canvas project
- Orlando Oxidation 2018
- Oxidation 2015 11 05
- Persistent sessions student project
- Preparing ARM libraries for CI
- Priority of CSS properties
- Priority of dom bindings
- Priority of DOM implementation
- Private browsing student project
- Profiling
- Project proposal deadlines
- Prototype JS form controls student project
- Prototype ways of splitting the script crate
- Publishing a new ANGLE NuGet version
- Publishing a new app store release
- Push vs Pull for caching
- Random web content project
- Refactor bluetooth support student project
- Refactor GLES2 student project
- Relevant spec links
- Remaining work
- Removing push notifications from IRC hooks
- Replace C libraries student project
- Report new contributors project
- Representation of computed style
- Research
- Reviewer
- Roadmap
- Running Web Platform Tests on Servo
- Rust cssparser code walk 2013 08 02
- Rust HTML parser
- Rust SpiderMonkey debugger API
- SaltStack Administration
- San Francisco Oxidation
- Servo for Gecko Developers
- SpiderMonkey infodump
- SpiderMonkey related tasks
- SpiderMonkey upgrade details
- Storage student project
- Streaming webassembly student project
- Strings
- Student project brainstorm
- Student projects
- Styling overview
- Stylo hacking guide
- Summer of Code 2014: Implement XMLHttpRequest
- Summer of Code 2016: Fetch API
- Summer of Code 2016: File support
- Summer of Code 2016: ServiceWorker infrastructure
- Summer of Code projects
- Summit meeting 2013 09 09
- Support Webdriver based tests project
- Syncing web platform tests (WPT)
- Tag label names and definitions
- TaskCluster
- Testing
- Tools
- Tracking intermittent failures over time project
- Transcription notes from rust patterns talk in suwon
- Transcription Notes from Servo Architecture talk in Suwon
- Transcription parallelism
- Transcription rust concurrency
- Transcription rust runtime
- Transription layout and acid2
- Trinity College Dublin student projects
- Updating the Rust compiler used by Servo
- UPenn student projects
- Upgrading non taskcluster linux CI machines
- Upgrading the UWP gstreamer binaries
- Upgrading the windows LLVM binaries
- Upgrading wptrunner
- Using DOM types
- Using Rust Spidermonkey Prototype
- Using WebWorker Prototype
- Version 0.1
- Videos and presentations
- WebAudio JS interfaces student project
- WebAudio nodes student project
- WebCompatBug
- Webdriver student project
- Webdriver tests student project
- Webrender Overview
- WebSocket student project
- webxr.today support
- Whistler 2019 notes
- Whistler Bugzilla
- Whistler FFOS
- Whistler GFX
- Whistler Houdini1
- Whistler Houdini2
- Whistler Necko
- Whistler Oxidation 2019
- Work items for new contributors
- Workweek alt js
- Workweek android arm
- Workweek boot 2 servo
- Workweek compiler lints
- Workweek COW DOM
- Workweek displaylist
- Workweek dogfooding
- Workweek encoding
- Workweek generated content
- Workweek governance
- Workweek graphics stack
- Workweek graphics toolkit
- Workweek incremental layout
- Workweek js bindings status
- Workweek layers
- Workweek layers2
- Workweek pixels
- Workweek rasterization
- Workweek reftests
- Workweek roadmap
- Workweek script crate
- Workweek security
- Workweek string interning
- Workweek tables
- Workweek writing modes
- XML parser student project