Servo 0.3.0에는 5월에 적용된 391개의 커밋이 포함되어 있으며, 사용자 스크립트, mp4 호환성, DevTools 블랙박싱, 성능 개선, 안정성 수정 등 다양한 업데이트가 담겨 있습니다.
Servo 0.3.0에는 5월에 적용된 모든 변경 사항이 포함되어 있으며, 총 391개의 커밋이 반영되었습니다(3월: 534). 보안 수정 사항은 § Security를 참고하세요.
<form enctype="multipart/form-data"> (@yezhizhen, #45028)<form enctype="text/plain"> (@yezhizhen, #45111)여기에 더해 새로운 DOM API도 다수 추가되었습니다:
{endings: "native"}를 사용하는 new Blob() (@yezhizhen, #44803)또한 Windows (@mukilan, #45079), FreeBSD (@delan, @mrobinson, @mukilan, #44600), 그리고 NixOS에서 또는 Nix로 Servo를 빌드하는 사용자를 위한 빌드 문제도 수정했습니다 (@freyacodes, #45051, #45135).
이번에도 큰 규모의 업데이트이므로, 다음과 같이 개요를 정리했습니다:
– 메모리 안전성 수정
– execCommand(), Sanitizer, IndexedDB, 접근성, 워커
– MSRV, 쿠키, 환경설정, 진단
– --host-file, --userscripts, DevTools Debugger
– 포커스, 폼, 내비게이션, SubtleCrypto, WebGPU
– about:memory, 스레드, 레이아웃, DOM, 빌드 시간
– 크래시, 멈춤, 정적 분석
Servo의 JS 런타임인 SpiderMonkey 140.10.0에는 여러 메모리 안전성 버그가 있었으며, 이는 SpiderMonkey 140.10.1로 업데이트하면서 Servo 0.3.0에서 수정되었습니다 (@jschwe, #44755). 자세한 내용은 CVE-2026-7322, CVE-2026-7323, 그리고 MFSA 2026-36를 참고하세요.
현재 --pref dom_exec_command_enabled 아래에서 리치 텍스트 편집을 위한 document.execCommand() 구현을 계속 진행하고 있습니다 (@TimvdLippe, #44735, #44973, #44887). 이번 릴리스에서는 ‘backColor’, ‘foreColor’, ‘createLink’, ‘unlink’, ‘superscript’, ‘subscript’, ‘removeFormat’ 명령을 지원하며 (@TimvdLippe, #44644, #44682, #44657, #44710, #44677), ‘insertParagraph’ 명령도 부분적으로 지원합니다 (@TimvdLippe, #44909).
또한 --pref dom_sanitizer_enabled 아래에서 Sanitizer API도 작업 중입니다. 이제 이 기능이 servoshell의 실험 모드에서 활성화되었고 (@kkoyung, #44701), 이번 릴리스에서는 Sanitizer의 setComments(), setDataAttributes(), allowProcessingInstruction(), removeProcessingInstruction(), **removeUnsafe()**를 지원합니다 (@kkoyung, #44734, #44983).
IndexedDB도 --pref dom_indexeddb_enabled 아래에서 계속 개선되고 있습니다. 이번 릴리스에서는 IDBTransaction의 보다 규격에 맞는 **abort()**가 추가되었습니다 (@Taym95, #43950).
위의 기능은 모두 servoshell의 실험 모드에서 활성화됩니다.
name from contents 알고리즘을 포함해 접근성 지원을 향한 추가 진전을 이루었고 (@alice, @delan, @mrobinson, #44439), 접근성 트리를 점진적으로 빌드하기 위한 여러 변경도 진행했습니다 (@alice, @delan, @mrobinson, #44766, #45035, #45207, #44768, #44785, #44801, #44767, #45029). 후자는 실제 웹 콘텐츠에서 성능에 매우 중요합니다.
이제 각각 --pref dom_sharedworker_enabled와 --pref dom_serviceworker_enabled 아래에서 SharedWorker와 ServiceWorker 작업도 진행하고 있습니다. 이번 릴리스에서는 **new SharedWorker()**를 지원하고 (@Taym95, #44761), ServiceWorker API의 일부도 추가되었습니다 (@gterzian, @arihant2math, #45082, #44787).
이제 Servo는 이전 MSRV 1.86.0보다 높은 Rust 1.88.0 이상을 요구합니다 (@sagudev, #44815). 컴파일 테스트는 MSRV로 실행하지만, 이제 대부분의 테스트는 Rust 1.95.0으로 수행합니다 (@simonwuelker, #44632).
SiteDataManager API의 cookies 메서드에 대한 호환성 깨짐 변경이 있습니다 (@longvatrong111, #44708):
SiteDataManager::clear_cookies는 이제 추가적인 callback 인자를 받으며, 이를 통해 비동기 호출이 가능해졌습니다. 기존처럼 동기 호출을 계속하려면 callback에 None을 전달하세요.
SiteDataManager::clear_session_cookies는 이제 추가적인 callback 인자를 받으며, 이를 통해 비동기 호출이 가능해졌습니다. 기존처럼 동기 호출을 계속하려면 callback에 None을 전달하세요.
SiteDataManager::set_cookie_for_url는 이제 추가적인 callback 인자를 받으며, 이를 통해 비동기 호출이 가능해졌습니다. 기존처럼 동기 호출을 계속하려면 callback에 None을 전달하세요.
SiteDataManager::set_cookie_for_url_async는 set_cookie_for_url로 대체되어 제거되었습니다. 마이그레이션하려면 set_cookie_for_url_async(callback)를 set_cookie_for_url(Some(Box::new(callback)))로 바꾸세요.
Preferences API에도 호환성 깨짐 변경이 있습니다 (@Narfinger, @mrobinson, #44307):
threadpools_image_cache_workers_max, threadpools_indexeddb_workers_max, threadpools_webstorage_workers_max는 통합된 thread_pool_workers_max로 대체되어 제거되었습니다.
threadpools_fallback_worker_num은 thread_pool_fallback_workers로 이름이 변경되었습니다.
threadpools_async_runtime_workers_max는 thread_pool_async_runtime_workers_max로 이름이 변경되었습니다.
threadpools_webrender_workers_max는 thread_pool_webrender_workers_max로 이름이 변경되었습니다.
또한 DiagnosticsLogging API도 재구성했습니다 (@mukilan, #44703):
이제 DiagnosticsLogging::toggle_option으로 옵션을 설정하고, DiagnosticsLogging::is_enabled로 활성화 여부를 확인할 수 있습니다.
각 옵션은 새로운 타입인 DiagnosticsLoggingOption의 변형이며, 이 타입에는 임베더 UI에서 옵션을 노출하는 데 유용한 메서드도 포함되어 있습니다.
(호환성 깨짐 변경) DiagnosticsLogging에는 더 이상 각 옵션을 나타내는 pub 필드가 없습니다. 마이그레이션하려면 필드 쓰기와 읽기를 각각 toggle_option 및 is_enabled로 바꾸세요.
(호환성 깨짐 변경) DiagnosticsLogging::extend_from_string은 더 이상 help 옵션을 받지 않습니다. 이 옵션은 servoshell의 -Z help / --debug=help 옵션 지원용으로만 존재했기 때문에, 해당 구현 코드는 servoshell로 옮겨졌습니다.
servoshell에는 두 가지 새로운 옵션이 추가되었습니다:
이제 hosts file의 경로를 HOST_FILE(단수) 환경 변수 대신 --host-file=(단수)로 설정할 수 있습니다 (@jschwe, #44880).
이제 모든 문서에서 실행할 사용자 스크립트 디렉터리를 **--userscripts=**로 제공할 수 있습니다 (@jdm, #44754).
Firefox DevTools의 Debugger 탭을 사용할 때:
이제 Ignore source를 클릭해 스크립트를 “blackbox” 처리할 수 있습니다 (@freyacodes, #44359). 이렇게 하면 해당 스크립트 내부의 브레이크포인트가 더 이상 적중하지 않으며, 디버거에서 실행을 단계별로 따라갈 때도 그 스크립트 내부에서 멈추지 않게 됩니다.
Servo 자체를 개발하는 분들은 프로젝트 정책에 따라, 기여물에 대규모 언어 모델이나 기타 생성형 AI 도구의 출력을 사용해서는 안 됩니다. 이를 집행하는 데 도움이 되도록, 이제 공동 작성자로 AI 에이전트를 거부하는 CI 검사도 추가되었습니다 (@SimonSapin, @delan, #44723).
또한 --features vello 관련 빌드 문제도 수정했습니다 (@Gae24, @yezhizhen, #44875, #45036).
<dl>, <ol>, <ul>, <table>, <thead>, <tbody>, <tfoot>, <tr>, <td>, <th>, <dir>, <menu>, **<form>**의 기본 표시 형태를 개선했습니다 (@avis137, #44837, #44920).
이제 CryptoKey는 직렬화 가능하여 structuredClone()과 postMessage()에서 사용할 수 있습니다 (@kkoyung, #45163).
DOM의 여러 부분에서 JS 오류 메시지를 개선했습니다 (@n0blenote, @jdm, @TG199, @PuercoPop, #44704, #45186, #44656).
폼 제출 (@yezhizhen, #44943, #44953, #44954, #44957), 탭 내비게이션 (@mrobinson, #44684), javascript: url 내비게이션 (@jdm, @TimvdLippe, #43490), ‘Refresh’ 헤더와 <meta http-equiv=Refresh> (@jschwe, @mrobinson, #45113, #45116), ‘line-break: anywhere’ (@mrobinson, @SimonSapin, #44609), Location의 assign() (@TG199, @jdm, #44298), crypto.subtle.deriveBits() (@kkoyung, #44706), getComputedStyle() (@Loirooriol, #44856), performance.measure() (@shubhamg13, #44675), FileReader의 readAsDataURL() (@yezhizhen, #44897, #44924), Blob의 stream() (@Taym95, #45133), 그리고 SubtleCrypto의 ML-KEM에 대한 규격 준수도 개선했습니다 (@kkoyung, #45153).
또한 GPUSupportedLimits (@sagudev, #45114), GPUTexture (@sagudev, #45154), GPUDevice의 createBindGroup() (@sagudev, #45140), 그리고 기타 WebGPU 기능도 개선했습니다 (@sagudev, #45097).
**‘Content-Security-Policy’**가 있는 <svg> (@TimvdLippe, @jdm, #44974), ‘:active’ (@SharanRP, @mrobinson, #43953), ‘:hover’ (@SharanRP, @mrobinson, #43979), ‘align-items’ (@yezhizhen, #44396), ‘border-image-outset’ (@lumiscosity, #45039), **‘overflow: scroll’**과 함께 쓰이는 ‘padding’ (@stevennovaryo, #44263), ‘pointerup’ 이벤트 (@mrobinson, #44666), ‘slotchange’ 이벤트 (@jdm, #44688), 동적 import() (@Gae24, #44741), CanvasRenderingContext2D의 **clip()**과 관련된 버그도 수정했습니다 (@yezhizhen, #44831).
추적되지 않는 할당을 찾아내어 ‘about:memory’ 개선에 도움이 될 도구를 만들었습니다 (@jdm, @TimvdLippe, @webbeef, #44674, #44980).
이제 이미지 캐시, 웹 스토리지, IndexedDB의 스레드 풀을 통합했기 때문에, Servo는 CPU당 더 적은 OS 스레드를 요구합니다 (@Narfinger, @mrobinson, #44307).
다수의 레이아웃 최적화도 적용했습니다:
이제 fragment tree는 대부분 불변이며, 변경 가능성이 필요한 곳에만 작은 범위의 interior mutability를 둡니다. 이는 대부분의 fragment tree 접근에서 AtomicRefCell 차용에 따른 런타임 비용이 더 이상 필요 없음을 의미합니다 (@mrobinson, @Loirooriol, #44849).
레이아웃 과정의 두 단계인 containing block 계산과 stacking context tree 구축은 fragment tree 순회가 필요합니다. 이는 비용이 클 수 있지만, 이제 대부분의 경우 이를 단일 fragment tree 순회로 결합했습니다 (@SimonSapin, @mrobinson, #44911, #45210).
레이아웃 과정의 또 다른 단계인 scrollable overflow 계산은 이전에는 전체 fragment tree 순회가 필요했습니다. 이제 이 계산을 지연(lazy) 및 **점진적(incremental)**으로 만들어 사실상 그 순회를 제거했습니다 (@mrobinson, @Loirooriol, #44854).
리플로우 사이에서 fragment, shaping 결과, 기타 레이아웃 결과의 캐싱도 개선했습니다 (@mrobinson, @Loirooriol, @SimonSapin, #45038, #44769).
점진적 fragment 레이아웃의 정밀도도 높였습니다 (@Loirooriol, @mrobinson, #44925).
텍스트 shaping의 메모리 사용량도 줄였습니다 (@mrobinson, @SimonSapin, #44609).
이번 릴리스에서는 DOM 속성도 훨씬 더 효율적입니다:
스크립트가 속성 값을 쓸 때, 해당 속성을 스크립트가 다시 읽기 전까지(혹은 영원히 읽지 않을 수도 있음) 직렬화를 피합니다. 이로 인해 인라인 스타일에 대한 빈번한 쓰기 성능이 최대 25%까지 향상됩니다 (@mrobinson, #44931).
HTML에서 속성을 파싱하거나 내부적으로 속성 값을 읽을 때, 스크립트가 실제로필요로 하기 전까지 Attr 노드를 만들지 않으므로, 메모리 사용량이 줄고 가비지 컬렉션 가능성도 낮아집니다 (@webbeef, @TimvdLippe, @mrobinson, #44209, #45023, #45031, #45060).
**<iframe>**가 트리에 연결될 때마다 전체 DOM 트리를 순회하던 동작도 제거했으며, 이는 특히 많은 <iframe> 태그가 있는 문서를 파싱할 때 두드러집니다 (@mrobinson, #45236).
이제 스타일시트 락은 parking_lot::RwLock보다 더 효율적인 AtomicRefCell을 사용합니다 (@mrobinson, #44883).
OpenHarmony에서는 이제 유휴 상태 CPU 사용량을 줄이기 위한 실제 refresh driver를 갖추었고 (@jschwe, @yezhizhen, #44927), 더 빠른 시작을 위해 폰트 목록을 디스크에 캐시합니다 (@RichardTjokroutomo, @d-desyatkin, #44158).
또한 Servo의 여러 부분에서 할당, GC 루팅 단계, 기타 연산도 줄였습니다 (@jschwe, @kkoyung, @mrobinson, @SteveSharonSam, @Narfinger, @jdm, @nodelpit, @simonwuelker, #44961, #44944, #44972, #45231, #45078, #44662, #44679, #44967, #44963, #44933, #44935, #44905).
Servo의 빌드 시간을 줄이기 위해, 방대한 script crate에서 더 많은 코드를 분리하고 있으며 (@Narfinger, @jdm, #44598, #44636, #44823), 의존성 트리의 크기도 줄였습니다 (@jschwe, #44818).
여러 크래시와 멈춤 현상이 수정되었습니다:
document.execCommand("delete")에서 (@TimvdLippe, #44748)--debug-mozjs 빌드에서 (@Gae24, @SharanRP, #44745, #45001)특정 종류의 동적 차용 실패를 불가능하게 만들기 위해 Rust 타입 시스템을 활용하는 오랜 작업도 계속 진행했습니다 (@Gae24, @MavenRain, @Narfinger, @SteveSharonSam, @TimvdLippe, @elomscansio, @jdm, @kkoyung, @yezhizhen, #44712, #44759, #44879, #45014, #45058, #45061, #45076, #45098, #45110, #45149, #45117, #45184, #45201, #44806, #44930, #44942, #44946, #45233, #45181, #44659, #44660, #44664, #44668, #44992, #45000, #45081, #45009, #45225, #45087, #45244, #45245, #45247, #44663, #44665, #44993, #45040, #45053, #44647, #44671, #44681, #44717, #44733, #44686, #44653).
Servo에 첫 패치를 반영한 다음 분들께 특별한 감사를 전합니다:
웹 브라우저 개발에 관심이 있으신가요? 새로운 기여자에게 적합한 이슈를 모아 둔 curated list를 살펴보세요!
너그러운 지원에 다시 한 번 감사드립니다! 현재 매월 반복 후원으로 7659 USD/month를 받고 있으며(4월 대비 +4.2%), 이는 speedyCIandbenchmarkingservers 운영 비용, 최근 Outreachy interns 중 한 명, 그리고 더 많은 사람들이 Servo에 기여할 수 있도록 돕는 maintainer work 자금 지원에 도움이 됩니다.
Servo는 thanks.dev에도 등록되어 있으며, 이미 Servo에 의존하는 35 GitHub users가 그곳에서 우리를 후원하고 있습니다(4월 대비 +2). url, html5ever, selectors, cssparser 같은 Servo 라이브러리를 사용한다면, thanks.dev 가입은 여러분(또는 여러분의 고용주)이 커뮤니티에 환원하는 좋은 방법이 될 수 있습니다.
이제 여러분 또는 여러분의 조직이 Servo 프로젝트를 공개적으로 후원 사실을 알리며 지원할 수 있는 sponsorship tiers도 마련되어 있습니다. 이런 형태의 후원에 관심이 있다면 join@servo.org로 연락해 주세요.
7659 USD/month
10000
후원금 사용은 Technical Steering Committee의 공개 **funding request process**를 통해 투명하게 결정되며, 현재 진행 중인 제안은 servo/project#187에서 추적할 수 있습니다. 더 자세한 내용은 Sponsorship page를 참고하세요.