mirror of
https://github.com/servo/servo
synced 2026-04-25 17:15:48 +02:00
Page:
Meeting 2012 07 20
Pages
Adding a new WebIDL binding
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
Building
CI Services we use
CSS parse error reporting
CSSOM student project
Canvas rendering project
Cargo upgrade service project
Code rust concurrency
Code Review
Code of Conduct
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 selector matching meeting 2013 07 19
DOM Design
DOM documentation
DOM missing pieces
Debugging JS web compat issues
Debugging and editing tools
Debugging
Design
Developer tools student project
Devtools CSS errors
Devtools plans
Devtools
Diagnosing SpiderMonkey JIT issues
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
GSoC project brainstorming
Garbage collected DOM
Getting started with layout
GitHub Labels
Github & Critic PR handling 101
Github workflow
Glossary
Governance
Graphics toolkit integration
HTML parser improvement project
HTMLElement binding conversion
HTTP archive support project
HTTP library requirements
Hawaii Rooting
High priority content for layout
Highfive
HoloLens 2 test plan
Home
How to generate GStreamer binaries for CI
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
Infrastructure
Integrate xml5ever
Intern project brainstorming
Intern projects
JS objects, wrappers, and cross origin concerns 2013 08 07
Layout 2020
Layout Overview
Layout resources
Layout revamp ideas
Leo meyerovich visit 2013 07 22
Linux sandboxing
London Oxidation
London Security
Meeting 2014 10 27
Meeting 2014 12 08
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 11 10
Meeting 2014 11 17
Meeting 2014 11 24
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 ServiceWorker support project
More developer tools student project
Mozlandia Automation
Mozlandia B2S
Mozlandia JS
Mozlandia Rust In Gecko
Mozlandia WPT
Mozlandia gfx
Mozlando Devtools Servo
Mozlando Oxidation
Mozlando SM Servo
Mozlando Servo Bluetooth
Mozlando Servo MagicDOM
Mozlando Servo SMStrings
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 implementation
Priority of dom bindings
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 GLES2 student project
Refactor bluetooth support student project
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 HTML parser
Rust SpiderMonkey debugger API
Rust cssparser code walk 2013 08 02
SaltStack Administration
San Francisco Oxidation
Servo Benchmarking Report (December 2024)
Servo Benchmarking Report (November 2024)
Servo Benchmarking Report (October 2024)
Servo Layout Engines Report
Servo and SpiderMonkey Report
Servo for Gecko Developers
Specification Links
SpiderMonkey related tasks
SpiderMonkey infodump
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)
TaskCluster
Testing
Tools
Tracking intermittent failures over time project
Transcription Notes from Servo Architecture talk in Suwon
Transcription notes from rust patterns talk in suwon
Transcription parallelism
Transcription rust concurrency
Transcription rust runtime
Transription layout and acid2
Trinity College Dublin student projects
UPenn student projects
Updating the Rust compiler used by Servo
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
WebSocket student project
Webdriver student project
Webdriver tests student project
Webrender Overview
Whistler 2019 notes
Whistler Bugzilla
Whistler FFOS
Whistler GFX
Whistler Houdini1
Whistler Houdini2
Whistler Necko
Whistler Oxidation 2019
Work items for new contributors
Workweek COW DOM
Workweek alt js
Workweek android arm
Workweek boot 2 servo
Workweek compiler lints
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
infra triage notes
jQuery status
webxr.today support
Clone
1
Meeting 2012 07 20
dherman edited this page 2012-07-20 17:13:06 -07:00
Table of Contents
Attending
Boris, Brendan, Dave, Patrick, Niko, Johnny
Text
- Boris: ROC or Jonathan Kew would know more
- Boris: long-term: caching situation needs to be resolved
- Patrick: my instinct: a task manages cache, and everyone queries the task
- Boris: that probably works
- Patrick: depends on speed of message; with Eric Holk's pipes work, I'm a bit more confident
- Boris: textrun process is a pretty noticeable component, timewise; creating textruns, looking them up in cache, etc
- Patrick: I assume we divide into lines; could we spawn a task for every line?
- Boris: textruns span across lines; they can span across a lot of stuff; there are exceptions...
- Boris: part of the problem is when we create a textrun we don't know where line breaks will be; preformatted is an exception, but in general you don't know
- Patrick: you could do it based on blocks maybe
- Niko: that's right, they don't span across block boundaries
- Patrick: that's not an awesome speedup
- Dave: can you do heuristic guessing of where linebreaks will be?
- Boris: we'd have to see what happens when you get it wrong
- Niko: across blocks would get parallel paragraphs? not bad, right?
- Patrick: not bad. it's not the 64cpu future, but it's the 4cpu future
- Boris: long wikipedia-like things; wherever you care about performance you'll probably have lots of blocks
- Boris: exception: one paragraph with tons of text, but that's not so critical
Rendering
- Patrick: I'm working on resizing windows
- Patrick: implemented except for gfx; doesn't have multiple buffer-size support; probably a day's work
- Patrick: we have layers now, we're GL-accelerated now
- Patrick: for rendering: plan to try an experiment: since we do tiling on mobile, I was thinking we could render every tile in parallel; copy display-list for every tile and render them in parallel, ship them to the compositor which glues them together
- Boris: you have to be a little bit careful about seaming
- Patrick: we already solved that on Fennec
- Dave: I still see bugs with seaming
- Patrick: I know what those are, due to subpixel issues with layer invalidation; those won't be a problem in Servo; those are weird subpixel hacks because we can't scroll to device pixel positions; fixing it requires a bunch of nasty stuff in Gecko but we won't have that issue since we'll design it right in the first place
- Patrick: rendering stuff in parallel will be an experiment; don't know how much it'll help, and have to overcome overhead of rendering display list multiple times
- Patrick: basically, doing same operation but with different clip rects
- Patrick: I imagine it'll be a big win for stuff like gradients, where you spend all your time in the guts of pixman doing complex operations
- Boris: question for that is how close we are to moving gradients to the GPU
- Boris: I agree it's worth having the capability, b/c we can always turn it off
- Patrick: we could conceivably have smart things where we layout memory just so, so we can render many tiles sequentially
- Boris: we can play around with it, do some dynamic decisions
- Patrick: tile-by-tile rendering is nice for other reasons: you can ship the tiles to compositor as they complete, display in some cases
- Brendan: that's parallelizable, right?
- Patrick: interpreting the display-list multiple times is overhead though
- Brendan: can you estimate how much that hurts?
- Patrick: not clear yet
- Patrick: or you could ARC the display list, to avoid copying, but you still have to interpret it multiple times, so that's overhead
- Patrick: benwa and I calculated this for Fennec, but the calculus was different because we weren't parallelizing there, just shipping things as soon as they were ready
- Niko: wanna understand: each tile looks at whole list...
- Patrick: doesn't have to do that
- Niko: oh, just executes the whole list. but kinda the same thing
- Patrick: yeah
- Boris: worst case is very big display list where they don't paint very much, so most of your time is processing but not painting
- Patrick: best case is taskjs.org: enormous gradient, cairo/skia killing. we'd probably get huge speedups there
- Boris: doing software gradients is expensive b/c it's per-pixel
- Brendan: why aren't we doing it in HW?
- Boris: working on it
- Patrick: display item is tiny, but work is enormous. so we should get a huge speedup
- Patrick: thinking of asking margaret to do parsing for gradients, since that's easy and could be a good demo. kind of hilarious to do CSS3 before implementing line breaks
- Boris: we should be doing the things that are the hard cases. we should push on the stuff we won't do as well on
- Dave: three kinds of things: things that are boring and uninteresting, things we should do well on, and things that could screw everything up. should be looking at latter for sure. floats, for example?
Floating-point
- Patrick: question for Boris: floating-point in layout?
- Boris: we've had a bunch of annoyance in Gecko dealing with integer overflow
- Patrick: didn't realize that was a big problem
- Boris: we use magic int values to mean "unspecified" or "unconstrained". just magic int values! nothing to prevent CSS from using those values, which hits assertions...
- Boris: fair amount of annoyance there. not necessarily in terms of failing on real-life web pages, but fuzz testing and what not. difficult to assert your invariants when they don't hold.
- Patrick: you can encode sentinels easily with floats with NaN boxing
- Boris: and you can use Infinity for unconstrained, etc. so that's a plus.
- Boris: that's IMO the main plus. that and we to some extent get sub-pixel layout "for free".
- Boris: third plus: no weirdness where depending on how you specify your style you get zero or not. right now our computed style rep is quantized. can cause problems in some situations.
- Boris: bad things: performance is a concern. especially on ARM though less so now since it has HW floating point. rounding error is a concern for two reasons: 1) parts of CSS like margin collapsing that depends on whether edges coincide. maybe we can do it in other terms, but we'd need to be careful to deal with rounding error one way or another.
- Brendan: epsilon testing?
- Boris: CSS says one of these things can be offset by less than epsilon
- Boris: but maybe we can do this some other way than FP. ROC would know.
- Boris: 2) say you have a block w/ bunch of kids. one kids has huge height, and a bunch of kids with 2-pixel heights. trying to compute height of parents. sum height of kids. order of operations matters for precision.
- Dave: is this something where size of screen can create limits?
- Boris: no, b/c page can be unbounded size. possible to create infinite page.
- Patrick: example: ebook novel
- Boris: not sure I've said anything you guys haven't thought of. answer is I don't know.
- Boris: worst case scenario maybe we switch from float to double and that mitigates rounding error issues
- Boris: in Gecko in theory we have ability to #ifdef nscoord. but in practice it's difficult to code to that b/c you need to be very careful what kind of operation you're doing
- Dave: we could possibly do some tricks with type classes
- Boris: that's an option, maybe that's the way to go. instead of doing arithmetic, sometimes use different higher-level operations
- Dave: sounds like premature abstraction, if it's just b/c we don't know which rep we need
- Boris: ok, if it's hard to write, we shouldn't do it.
- Boris: my feeling overall is we have some intuitions and experience already with ints. my fear is float is second system syndrome. "let's do this other thing for which we don't know the drawbacks." but I'm interested in trying floats and see where it goes
- Boris: if we do that, we should try to think of a set of worst-case scenarios and see how they work. if we handle those ok, then life is good
Boxes
- Patrick: ROC was talking about how we do this, and I wasn't entirely sure what he meant. seemed like mostly he was talking about, for line breaks, don't treat them as multiple box objects, just one box object with a line-break structure that indicates where the breaks are happening
- Boris: that's what he's suggesting, yes
- Patrick: he framed it in overarching terms but it sounds like he was really just talking about inline layout
- Boris: yes, inline layout specifically. fundamentally inline layout works in flattened list of things. way Gecko works now: box structure converted to list, do inline layout on list, then go back to boxes. kind of annoying
- Boris: other problem we have: if spans nested several levels deep broken across lines, O(depth nesting * number of boxes) -- noticeable memory & perf cost
- Patrick: when we see inline flow, ... so what do we call these things if "box" doesn't mean "box" anymore
- Boris: in gecko straightforward. but diff representations for diff kinds of floats will need some sort of better API
- Patrick: I like ROC's idea of virtual box iterator: "given this thing, tell me what the boxes are" -- creates those on the fly
- Boris: yeah
- Patrick: so question is what to call these. webkit calls them "renderobjects" or something. don't like that name
- Boris: so what are these things really...
- Patrick: "flow"?
- Boris: question is whether we have a single name for things in inline vs block layout
- Boris: element renderer? not quite b/c we want them for text nodes too
- Niko: I'm confused. we have dom tree, talking about for inline layout, rather than creating boxes that appear in the CSS spec...
- Patrick: they don't mirror dom; they're the flows. there will be one "renderer object" which represents an inline flow. all of spans point to this one object
- Boris: interesting. still don't know quite how to set this up
- Boris: was thinking one render object per span
- Patrick: so they get joined together into an inline flow?
- Boris: don't know. maybe right thing is single object. issue is you need to iterate boxes corresponding to single span
- Patrick: probably pointer into inline flow. "here's where in the flow this span is". way boxes done is per-line
- Patrick: you have to have some .eachBox or something
- Niko: so inline flow is like a list of all of the leaves of this tree, with some additional data structures with the tree structure. span knows subset of list that is its content
- Niko: inline flow also has points in that where the breaks occur
- Patrick: yeah. so two sets of pointers into list. elements pointer which comes from dom nodes, and line breaks which comes from layout
- Boris: we can turn things like padding and borders into the list as well. have to be careful where to put them in list b/c of line breaks
- Patrick: sounds cool
- Niko: seems logical
- Patrick: question is what are they called
- Niko: inline flow seems good
- Patrick: kinda like flow
- Boris: inline flow works for me
- Patrick: and block flows
- Niko: block flow is same as CSS box
- Boris: until you start doing columns or pagination
- Boris: some similarities to inline flow, but algorithms are different
- Patrick: but both can expose .eachBox
- Boris: yep
Networking
- Patrick: working on network, stuff like caching will come up. right now Brian's hooking up bindings to joyent's HTTP parser
- Boris: whatever we do, we're gonna need a real networking lib
- Dave: Jason does want to work on this for us, just not yet
- Boris: we can use whatever for now
- Patrick: we can use libuv in production
- Boris: sure, basic sockets is fine
- Patrick: they handle annoying Windows IOCP vs Unix kqueue
- Boris: plan for SSL? NSS?
- Johnny: yes
- Boris: we'll need a way of exposing libuv sockets to NSS
- Boris: NSS is NSPR happy. but we should avoid NSPR if we can
- Patrick: what does Node use?
- Johnny: probably OpenSSL
- Boris: two plausible alternatives: NSS, OpenSSL. both have serious drawbacks
- Patrick: assuming NSS FIPS-ceritifed.
- Boris: particular version we're shipping may or may not
- Brendan: let's talk about NSS. chrome using it too and we're still investing in it. don't see why we'd switch
- Boris: NSS assumes sockets are NSPR and stuff. we'd need to somehow wrap whatever we're doing in NSPR abstraction
- Dave: additional abstraction cost?
- Patrick: maybe. uv sockets + NSPR abstraction
- Boris: thing to look at: from Necko's point of view, it's a socket provider. we should look into what NSS depends on, maybe talk to bsmith. maybe it's just not an issue and we can just make it work.
- Johnny: does it really matter? if we can just use NSPR, do we need libuv?
- Patrick: yes, b/c of the way the scheduler works.
- Patrick: well, can Necko do async on all platforms?
- Johnny: yes.
- Boris: meaning what exactly?
- Patrick: basically every operation takes callback
- Niko: nonblocking I/O
- Boris: in theory Necko set up that way; in practice front-end not thread-safe. underlying code is thread-safe
- Patrick: other problem is XPCOM
- Boris: NSPR doesn't involve XPCOM
- Boris: NSPR will be needed for NSS no matter what, but whether we use it for sockets is the question
- Patrick: would like to use GLUT to add a little "right-click and enter URL" UI
Content
- Patrick: once we have networking + text, we'll have the entire pipeline of a browser
- Brendan: except for JS lexing + parsing, HTML lexing + parsing
- Patrick: jdm has document object working in JS; Node object is next, working on that
- Patrick: hoping that stuff can land soon
- Patrick: once we have that we'll have all the components of a browser in minimal form
- Johnny: there's stuff like script loading & execution
- Patrick: that's working, isn't it?
- Niko: no, doesn't take scripts out of web page
- Boris: can we block parser?
- Niko: html parser?
- Patrick: don't think so, no
- Boris: that we'll need to change
- Johnny: at some point we'll use real HTML parser
- Niko: there's a very small Rust bug blocking that. should prioritize
- Patrick: yeah, labelled break + continue
- Dave: have to touch base with Zhijia about his project
- Boris: once you hit a script, can inject random stuff into character stream
- Brendan: yeah, scripts are evil without async
- Niko: how common to inject?
- Boris: common, but scripts do crazy things like unbalanced comments piece at a time
- Boris: we have to be super careful if we aren't following the state machine
- Johnny: I'd say HTML parsing perf is rarely a bottleneck
- Brendan: Amdahl: could end up a bottleneck if other stuff gets fast
- Boris: can do tests
- Niko: even stuff like emitting a comment start & end tag is not that bad. emitting closing > sign is really bad
- Boris: could emit opening < sgn
- Niko: that kinda stuff we're just screwed on
- Dave: it's ok to do badly on these cases
- Patrick: I'd rather focus on other things than parallelizing parsing
- Boris: it's isolated in its own component
- Patrick: saying it's sequential now doesn't preclude parallel later
- Dave: and we're just starting with Zhijia
Events
- Patrick: just started adding window resize events. goes to content task, not yet to JS
- Patrick: so... yay
Image decoding
- Brendan: Company100 has been working on parallel image decoding for common formats; I'll look at that, Rust, image decoders
- Brendan: we did this in the 90's; farm out macro blocks
- Patrick: writing that in Rust wouldn't be that hard
- Brendan: besides harfbuzz, there was a PNG exploit the other year, so this stuff is valuable to move to Rust
- Boris: BMP bug filed the other day: heights can be negative meaning come up from the bottom not from the top
- Brendan: and favicons are BMP