{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreiacsvhqddmx4obts2dswbdzc3evch4huz7apabwihpta34h2z5yhq",
"uri": "at://did:plc:qp37y62idugoomg4hj4hfukc/app.bsky.feed.post/3mfyatewl72x2"
},
"path": "/blog/2026/02/28/january-in-servo/",
"publishedAt": "2026-05-23T05:58:57.689Z",
"site": "https://servo.org",
"tags": [
"Servo 0.0.5",
"@TimvdLippe",
"@jdm",
"40059",
"42096",
"@mrobinson",
"42220",
"@simonwuelker",
"42036",
"41789",
"41976",
"@andreubotella",
"41480",
"@lukewarlow",
"42107",
"42195",
"42095",
"Origin",
"@WaterWhisperer",
"41712",
"MouseEvent.detail",
"41833",
"Request.keepalive",
"41457",
"41811",
"@Gae24",
"41779",
"41694",
"@Narfinger",
"41689",
"Crypto",
"@kkoyung",
"41604",
"41617",
"41615",
"41627",
"41628",
"41647",
"41659",
"41676",
"41791",
"41822",
"41813",
"41829",
"GStreamer",
"@rodio",
"40761",
"@stevennovaryo",
"42068",
"keepalive",
"fetchLater()",
"41665",
"@arayaryoma",
"39438",
"EventSource",
"41651",
"42137",
"42103",
"PerformanceResourceTiming",
"@bellau",
"41804",
"41805",
"41834",
"41969",
"41637",
"41966",
"42104",
"41780",
"41661",
"41832",
"41986",
"41987",
"41988",
"41973",
"42037",
"leads other browsers",
"Web",
"Cryptography",
"41950",
"@PaulTreitel",
"@danilopedraza",
"41964",
"41468",
"41902",
"JS module",
"42185",
"42138",
"<link rel=preload>",
"@gterzian",
"41500",
"42053",
"41933",
"@arihant2math",
"41326",
"@Loirooriol",
"41906",
"41974",
"41931",
"41909",
"42049",
"41926",
"42233",
"41934",
"42078",
"41588",
"42085",
"42013",
"VisualViewport",
"41754",
"[Clamp] annotation",
"more specific rounding logic",
"@Taym95",
"41640",
"42048",
"41714",
"@minghuaw",
"42151",
"@lumi-me-not",
"41784",
"FontFace",
"@muse254",
"41968",
"42165",
"42105",
"42162",
"41876",
"41492",
"41624",
"41632",
"41655",
"41652",
"41683",
"41707",
"42005",
"@longvatrong111",
"41855",
"41967",
"42038",
"41951",
"CJK",
"@RichardTjokroutomo",
"42088",
"collapsing margins",
"phantom line boxes",
"41812",
"Stylo",
"41916",
"41696",
"style resolution engine",
"network_https_proxy_uri preference",
"network_http_no_proxy preference",
"@atbrakhi",
"41929",
"41983",
"@eerii",
"41895",
"41800",
"42007",
"41925",
"42154",
"42186",
"WebDriver server",
"@yezhizhen",
"41823",
"41801",
"41937",
"42034",
"Element Clear",
"42124",
"script execution timeout",
"42184",
"41726",
"41748",
"42029",
"forbid git dependencies",
"crates.io",
"SiteDataManager",
"clear_site_data()",
"@janvarga",
"41618",
"41709",
"41852",
"41653",
"@NiklasMerz",
"41827",
"42080",
"@delan",
"@alice",
"41924",
"tracking issue",
"@sagudev",
"41178",
"41071",
"41733",
"41806",
"41380",
"41809",
"41774",
"42032",
"42033",
"41412",
"41710",
"network_connection_timeout preference",
"41740",
"41965",
"41857",
"@TomRCummings",
"41675",
"41956",
"42180",
"41692",
"41782",
"41756",
"41808",
"41879",
"41878",
"41955",
"41971",
"42123",
"@willypuzzle",
"41717",
"41783",
"41911",
"41977",
"41984",
"42243",
"42026",
"42050",
"42208",
"42237",
"42240",
"42159",
"41960",
"session history",
"42238",
"@webbeef",
"42260",
"41963",
"speedy",
"CI",
"and",
"benchmarking",
"servers",
"Outreachy interns",
"maintainer work",
"thanks.dev",
"url",
"html5ever",
"selectors",
"cssparser",
"sponsorship tiers",
"funding request process",
"servo/project#187",
"Sponsorship page",
"here",
"Implementing Streams Spec in Servo",
"@taym95",
"Streams Standard",
"The Servo project and its impact on the web platform",
"@rego"
],
"textContent": "Servo 0.0.5 is here, bringing with it lots of improvements in web platform features. Some highlights:\n\n * **< link rel=preload>** (@TimvdLippe, @jdm, #40059)\n * **< style blocking>** and **< link blocking>** (@TimvdLippe, #42096)\n * **< img align>** (@mrobinson, #42220)\n * **< select disabled>** (@simonwuelker, #42036)\n * **OGG files** can now be played in **< audio>** (@jdm, #41789)\n * **‘cursor-color’** (@mrobinson, #41976)\n * **‘content: <image>’** works on all elements (@andreubotella, #41480)\n * **‘::details-content’** on <details> (@lukewarlow, #42107)\n * **‘:open’** on <details> (@lukewarlow, #42195)\n * **‘:active’** on <input type=button> (@mrobinson, #42095)\n * **Origin API** (@WaterWhisperer, #41712)\n * **MouseEvent.detail** (@mrobinson, #41833)\n * **Request.keepalive** (@TimvdLippe, @WaterWhisperer, #41457, #41811)\n * **Cyclic imports** , **import attributes** , and **JSON modules** (@Gae24, #41779)\n * **navigator.sendBeacon()** is enabled by default (@TimvdLippe, #41694)\n * `https_proxy`, `HTTPS_PROXY`, and `NO_PROXY` (@Narfinger, #41689)\n * **ML-KEM** , **ML-DSA** , and **AES-OCB** in **Crypto** (@kkoyung, #41604, #41617, #41615, #41627, #41628, #41647, #41659, #41676, #41791, #41822, #41813, #41829)\n\n\n\n## Web APIs \n\nServo now **plays OGG media** inside <audio> elements (@jdm, #41789)! We disabled this feature many years ago due to bugs in GStreamer, our media playback engine, but those bugs have since been fixed.\n\nWe now support non-`px` sizes for width and height attributes in <svg> elements (@rodio, #40761).\n\nInactive documents will now correctly reject fullscreen mode changes (@stevennovaryo, #42068).\n\nWe’ve enabled support for the **navigator.sendBeacon()** by default (@TimvdLippe, #41694); the `dom_navigator_sendbeacon_enabled` preference has been removed. As part of this work, we implemented the keepalive feature of the Request API (@TimvdLippe, @WaterWhisperer, #41457, #41811).\n\nThat’s not all for network-related improvements! Quota errors from the **fetchLater() API** provide more details (@TimvdLippe, #41665), and fetch response body promises now reject when **invalid gzip content** is encountered (@arayaryoma, #39438). Meanwhile, **EventSource** connections will no longer endlessly reconnect for permanent failures (@WaterWhisperer, #41651, #42137), and now use the correct **‘Last-Event-Id’ header** when reconnecting (@WaterWhisperer, #42103). Finally, Servo will create **PerformanceResourceTiming** entries for requests that returned unsuccessful responses (@bellau, #41804).\n\nThere has been lots of work related to **navigating pages** and **loading iframes**. We process **URL fragments** more consistently when navigating via **window.location** (@TimvdLippe, #41805, #41834), and allow evaluating **javascript: URLs** when a document’s domain has been modified (@jdm, #41969). XML documents loaded in an <iframe> no longer inherit their encoding from the parent document (@simonwuelker, #41637).\n\nWe’re also made it possible to use **blob: URLs** from inside **‘about:blank’** and **‘about:srcdoc’** documents (@jdm, #41966, #42104). Finally, constructed documents (e.g. `new Document()`) now inherit the origin and domain of the document that created them (@TimvdLippe, #41780), and we implemented the new **Origin API** (@WaterWhisperer, #41712).\n\nServo’s **mixed content protections** are steadily increasing. Insecure requests (e.g. HTTP) originating from <iframe> elements can now be upgraded to secure protocols (@WaterWhisperer, #41661), and redirected requests now check the most recent URL when determining if the protocol is secure (@WaterWhisperer, #41832).\n\n**< style blocking>** and **< link blocking>** can now be used to block rendering while loading stylesheets that are added dynamically (@TimvdLippe, #42096), and stylesheets loaded when parsing the document will **block the document ‘load’ event** more consistently (@TimvdLippe, @mrobinson, #41986, #41987, #41988, #41973). We also **fire the ‘error’ event** if a fetched stylesheet response is invalid (@TimvdLippe, @mrobinson, #42037).\n\nServo now **leads other browsers** in support for new **Web Cryptography** algorithms! This includes full support for **ML-KEM** (@kkoyung, #41604, #41617, #41615, #41627), **ML-DSA** (@kkoyung, #41628, #41647, #41659, #41676), and **AES-OCB** (@kkoyung, #41791, #41822, #41813, #41829), plus improvements to **AES-GCM** (@kkoyung, #41950). Additionally, the error messages returned by many Crypto APIs are now more detailed (@PaulTreitel, @danilopedraza, #41964, #41468, #41902).\n\n**JS module loading** received a lot of attention – we’ve improved support for **cyclic imports** (@Gae24, #41779), **import attributes** (@Gae24, #42185), and **JSON modules** (@Gae24, @jdm, #42138).\n\nAdditionally, the **<link rel=preload>** attribute now triggers **preload fetch operations** that can improve page load speeds (@TimvdLippe, @jdm, #40059).\n\n**IndexedDB** support continues to make progress, though for now the feature is disabled by default (`--pref dom_indexeddb_enabled`). This month we gained improvements to **connection queues** (@gterzian, #41500, #42053) and **request granularity** (@gterzian, #41933).\n\nWe were accidentally persisting **SessionStorage** data beyond the current session, but this has been corrected (@arihant2math, #41326).\n\n**Text input fields** have received a lot of love this month. Clicking in an input field will position the cursor accordingly (@mrobinson, @jdm, @Loirooriol, #41906, #41974, #41931), as will clicking past the end of a multiline input (@mrobinson, @Loirooriol, #41909). Selecting text with the mouse in input fields works (@mrobinson, #42049), and double and triple clicks now toggle selections (@mrobinson, #41926). Finally, we fixed a bug causing the input caret to be hidden in <input> elements inside of Shadow DOM content (@stevennovaryo, #42233).\n\n**‘cursor-color’** is respected when rendering the input cursor (@mrobinson, #41976), and newlines can no longer be pasted into single line inputs (@mrobinson, #41934). Finally, we fixed a panic when focusing a text field that is disabled (@mrobinson, #42078), as well as panics in APIs like **HTMLInputElement.setRangeText()** that confused bytes and UTF-8 character indices (@mrobinson, #41588).\n\nWe also made time to **improve form controls**! The default styling of many controls received some care (@mrobinson, #42085), while **< input type=button>** can now be styled with the **‘:active’ pseudo-class** (@mrobinson, #42095). Conversely, disabled **< select>** elements can no longer be activated (@simonwuelker, #42036).\n\nMouse events triggered by the embedder are more complete; MouseEvent.detail correctly reports the click count for **‘mouseup’** and **‘mousedown’** events (@mrobinson, #41833), and many other members are now consistent with other mouse events (@mrobinson, #42013).\n\nPerforming a pinch zoom on mobile is now reflected in the **VisualViewport API** (@stevennovaryo, #41754), though for now the feature is disabled by default (`--pref dom_visual_viewport_enabled`).\n\nWe’ve changed the behaviour of Web APIs that use the [Clamp] annotation (such as **Blob.slice()**). The previous implementation would cast floating point values to their integer equivalents, but the standard requires more specific rounding logic (@Taym95, #41640).\n\nThe `RGBA8` constant is now available in WebGL 1 rendering contexts; it was previously only available in WebGL 2 contexts (@simonwuelker, #42048).\n\n**Fonts** were another area of focus this month. Loading web fonts from **file: URLs** works as expected (@TimvdLippe, #41714), as does using web fonts within Shadow DOM content (@minghuaw, #42151). Each web font request now creates a PerformanceResourceTiming entry (@lumi-me-not, #41784). Servo supports font variations as of November 2025, so as of this month, the **FontFace** constructor no longer ignores the **‘font-variation-settings’ property** (@muse254, #41968).\n\n**Cursive scripts** now ignore the **‘letter-spacing’** CSS property (@mrobinson, #42165), and we significantly reduced the time and memory required when **rendering non-ASCII text** (@mrobinson, @Loirooriol, #42105, #42162) and when text nodes share the same font (@mrobinson, #41876).\n\n## CSS \n\nThere were lots of improvements to **block layout** algorithms (@Loirooriol, #41492, #41624, #41632, #41655, #41652, #41683). These often affect pages where a block element (such as a <div>) exists within some other layout mode (such as an inline <span>, or a flexbox context), and fixes like these ensure Servo matches the output of other browsers.\n\nElements with **scrollable overflow** can be scrolled more consistently, even with CSS transforms applied to them (@stevennovaryo, #41707, #42005).\n\nYou can now use **‘content: <image>’ on any element** (@andreubotella, #41480). Generated image content used to only work with pseudo-elements, but that restriction no longer applies.\n\n**< details> elements** can now be styled with the **‘::details-content’ pseudo-element** (@lukewarlow, #42107), as well as the ‘:open’ pseudo-class (@lukewarlow, #42195).\n\nCSS styles now inherit correctly through **‘display: contents’** as well as **< slot> elements** in Shadow DOM content (@longvatrong111, @Loirooriol, @mrobinson, #41855).\n\n**‘overflow-clip-margin’** now works correctly when **‘border-radius’** is present (@Loirooriol, #41967).\n\nWe fixed bugs involving text inside flexbox elements: they now use consistent baselines for alignment (@lukewarlow, @mrobinson, #42038), and style updates are propagated to the text correctly (@mrobinson, #41951).\n\n**< img align>** now aligns the image as expected (@mrobinson, #42220).\n\n**‘word-break: keep-all’** now prevents line breaks in **CJK text** (@RichardTjokroutomo, #42088).\n\nWe also fixed some bugs involving **floats** , **collapsing margins** , and **phantom line boxes** (@Loirooriol, #41812), which sound much cooler than they actually are.\n\nFinally, we upgraded our Stylo dependency to the latest changes as of January 1 2026 (@Loirooriol, #41916, #41696). Stylo powers our CSS parsing and style resolution engine, and this upgrade improves support for **parsing color functions** like **‘color-mix()’** , and improves our **CSS animations and transitions** for borders and overflow clipping.\n\n## Automation and introspection \n\nLast month Servo gained support for HTTP proxies. We now support **HTTPS proxies** as well (@Narfinger, #41689), which can be configured with the `https_proxy` or `HTTPS_PROXY` environment variables, or the network_https_proxy_uri preference. In addition, the `NO_PROXY` environment variable or the network_http_no_proxy preference can **disable any proxy** for particular domains.\n\nOur **developer tools** integration continues to improve. Worker globals are now categorized correctly in the UI (@atbrakhi, #41929), and the Sources panel is populated for very short documents (@atbrakhi, #41983). Servo will report console messages that were logged before the developer tools are opened (@eerii, @mrobinson, #41895). Finally, we fixed a panic when selecting nodes in the layout inspector that have no style information (@eerii, #41800).\n\nWe’re working towards supporting pausing in the JS debugger (@eerii, @atbrakhi, @jdm, #42007), and breakpoints can be toggled through the UI (@eerii, @atbrakhi, #41925, #42154). While the debugger is paused, hovering over JS objects will report the object’s properties for builtin JS classes (@eerii, @atbrakhi, #42186). Stay tuned for more JS debugging updates in next month’s blog post!\n\nServo’s WebDriver server is also maturing. Evaluating a synchronous script that returns a Promise will wait until that promise settles (@yezhizhen, #41823). **‘touchmove’ events** are fired for pointer actions when a button is pressed (@yezhizhen, #41801), and **‘touchcancel’ events** are fired for canceled pointer action items (@yezhizhen, #41937). Finally, any pointer actions that would trigger **duplicate ‘mousemove’ events** are silently discarded (@mrobinson, #42034).\n\n**Element Clear commands** now test whether the element is interactable (@yezhizhen, #42124). Now a null script execution timeout value will never trigger a timeout (@yezhizhen, #42184), and synthesized **‘pointermove’ events** have a consistent `pointerId` value (@yezhizhen, #41726).\n\n## Embedding \n\nYou can now **cross-compile Servo** using Windows as the host (@yezhizhen, #41748).\n\nWe’ve **pinned all git dependencies** to specific revisions, to reduce the risk of build failures (@Narfinger, #42029). We intend to eventually forbid git dependencies in Servo libraries, which will help unblock releasing Servo on crates.io.\n\n**SiteDataManager** now has a new **clear_site_data()** method to clear all stored data for a particular host (@janvarga, #41618, #41709, #41852).\n\nOur nightly testing UI, **servoshell** , now respects any customized installation path on Windows (@yezhizhen, #41653). We fixed a crash in the Android app when pausing the application (@NiklasMerz, #41827). Additionally, clicking inside a webview in the desktop app will remove focus from any browser UI (@mrobinson, #42080).\n\nWe’ve laid more groundwork towards exposing **accessibility tree** information from webviews (@delan, @lukewarlow, @alice, #41924). There’s nothing to test yet, but keep an eye on our tracking issue if you want to be notified when nightly builds are ready for testing!\n\n## Stability & performance \n\nWe’ve converted many uses of **IPC channels** in the engine to channels that are **more efficient** when multiprocess mode is disabled (@Narfinger, @jdm, @sagudev, @mrobinson, #41178, #41071, #41733, #41806, #41380, #41809, #41774, #42032, #42033, #41412). Since multiprocess mode is not yet enabled by default (`--multiprocess`), this is a significant boost to Servo’s everyday performance.\n\nServo now sets a **socket timeout for HTTP connections** (@Narfinger, @mrobinson, #41710). This is controlled by the network_connection_timeout preference, and defaults to **15 seconds**.\n\nEach instance of Servo now starts **four fewer threads** (@Narfinger, #41740). Any network operations that trigger a synchronous UI operation (such as an HTTP authentication prompt) no longer blocks other network tasks from completing (@Narfinger, @jdm, #41965, #41857).\n\nIt’s said that one of the hardest problems in computer science is **cache invalidation**. We improved the memory usage of **dynamic inline SVG content** by evicting stale SVG tree data from a cache (@TomRCummings, #41675). Meanwhile, we added a new cache to reduce memory usage and improve rendering performance for pages with animating images (@Narfinger, #41956).\n\nServo’s JS engine now accounts for 2D and 3D canvas-related memory usage when deciding how often to perform garbage collection (@sagudev, #42180). This can reduce the risk of out-of-memory (OOM) errors on pages that create large numbers of short-lived WebGL or WebGPU objects.\n\nTo reduce the risk of panics involving the JS engine integration, we’re continuing to use the **Rust type system** to make certain kinds of dynamic borrow failures impossible (@sagudev, #41692, #41782, #41756, #41808, #41879, #41878, #41955, #41971, #42123). We also continue to identify and **forbid code patterns** that can trigger rare crashes when garbage collection happens while destroying webviews (@willypuzzle, #41717, #41783, #41911, #41911, #41977, #41984, #42243).\n\nThis month also brought fixes for panics in parallel layout (@mrobinson, #42026), WebGPU (@WaterWhisperer, #42050), <link> fetching (@jdm, #42208), Element.attachShadow() (@mrobinson, #42237), text input methods (@mrobinson, #42240), Web Workers when the developer tools are active (@mrobinson, #42159), IndexedDB (@gterzian, #41960), and asynchronous session history updates (@mrobinson, #42238).\n\n**Node.compareDocumentPosition()** is now more efficient (@webbeef, #42260), and selections in text inputs no longer require a full page layout (@mrobinson, @Loirooriol, #41963).\n\n## Donations \n\nThanks again for your generous support! We are now receiving **7007 USD/month** (−1.4% over December) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers** , one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo.\n\nServo is also on thanks.dev, and already **33 GitHub users** (+3 over December) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community.\n\nWe now have sponsorship tiers that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. A big thanks from Servo to our newest Bronze Sponsor: **str4d**! If you’re interested in this kind of sponsorship, please contact us at join@servo.org.\n\n**7007** USD/month\n\n**10000**\n\nUse of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.\n\n## Conference talks and blogs \n\nThere were two talks about Servo at FOSDEM 2026 (videos and slides here):\n\n * Implementing Streams Spec in Servo – Taym Haddadi (@taym95) described the challenges of implementing the Streams Standard.\n\n * The Servo project and its impact on the web platform – Manuel Rego (@rego) highlighted the ways that Servo has shaped the web platform and contributed to web standards since it started in 2012.\n\n\n",
"title": "January in Servo: preloads, better forms, details styling, and more!",
"updatedAt": "2026-02-28T00:00:00.000Z"
}