# Servo 5월 업데이트: 사용자 스크립트, mp4 호환성, DevTools 블랙박싱 등

> Clean Markdown view of GeekNews topic #31017. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=31017](https://news.hada.io/topic?id=31017)
- GeekNews Markdown: [https://news.hada.io/topic/31017.md](https://news.hada.io/topic/31017.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-07-02T04:04:54+09:00
- Updated: 2026-07-02T04:04:54+09:00
- Original source: [servo.org](https://servo.org/blog/2026/06/30/may-in-servo/)
- Points: 1
- Comments: 1

## Topic Body

- **Servo 0.3.0**은 5월 병합분 391개 커밋을 담아 웹 플랫폼, 임베딩 API, 성능, 안정성, 보안 수정을 한 번에 반영한 릴리스임
- 웹 플랫폼은 `font-variant-*`, fast start 없는 **mp4** `&lt;video&gt;` 재생, 폼 인코딩, DOM API 추가로 실제 사이트 호환성을 넓힘
- 보안 측면에서는 JS 런타임을 **SpiderMonkey 140.10.1**로 올려 메모리 안전성 버그를 수정했고, CVE-2026-7322·CVE-2026-7323·MFSA 2026-36과 연결됨
- 사용자와 개발자는 servoshell의 `--host-file=`, `--userscripts=` 옵션과 Firefox **DevTools Debugger**의 “Ignore source” 블랙박싱을 활용할 수 있음
- 임베더는 **Rust 1.88.0 이상** 요구와 SiteDataManager·Preferences·DiagnosticsLogging의 breaking change를 반영해야 하며, 성능 개선은 레이아웃 순회 축소와 스레드 풀 통합에 집중됨

---

### Servo 0.3.0에 포함된 5월 변경
- [**Servo 0.3.0**](https://github.com/servo/servo/releases/tag/v0.3.0)은 5월에 병합된 변경을 담았고, 총 **391개 커밋**이 포함됨
- 새 웹 플랫폼 기능은 글꼴, 미디어, 폼, 레이아웃 호환성에 걸쳐 추가됨
  - **CSS 글꼴 기능**: `font-kerning: none`, `font-variant-east-asian`, `font-variant-ligatures`, `font-variant-numeric`, `font-variant-position`
  - **미디어와 폼**: fast start 없는 mp4 파일의 `&lt;video&gt;` 지원, `&lt;form enctype="multipart/form-data"&gt;`, `&lt;form enctype="text/plain"&gt;`
  - **레이아웃**: `<![CDATA[]]>` 레이아웃
- DOM API도 여러 표준 영역에서 늘어남
  - `onslotchange` 속성이 **ShadowRoot**에 추가됨
  - `screenLeft`, `screenTop`이 **Window**에 추가됨
  - `new Blob()`에서 `{endings: "native"}`를 지원함
  - `new PerformanceMark()`가 추가됨
  - `parseHTML()`이 **Document**에 추가됨
  - `readAsBinaryString()`이 **FileReader**에 추가됨
  - `performance.measure()`가 `redirectStart`, `redirectEnd`, `secureConnectionStart`, `responseEnd` mark 값을 지원함
- Windows, FreeBSD, NixOS 또는 Nix 기반 환경의 **빌드 문제**도 수정됨

### 보안: SpiderMonkey 메모리 안전성 수정
- Servo의 JS 런타임인 **SpiderMonkey 140.10.0**에는 여러 메모리 안전성 버그가 있었음
- Servo 0.3.0은 **SpiderMonkey 140.10.1** 업데이트로 해당 문제를 수정함
- 세부 정보는 [CVE-2026-7322](https://nvd.nist.gov/vuln/detail/CVE-2026-7322), [CVE-2026-7323](https://nvd.nist.gov/vuln/detail/CVE-2026-7323), [MFSA 2026-36](https://www.mozilla.org/en-US/security/advisories/mfsa2026-36/)에서 확인할 수 있음

### 진행 중인 웹 기능
- `document.execCommand()` 구현은 **리치 텍스트 편집** 지원을 위해 계속 진행 중이며, `--pref dom_exec_command_enabled` 아래에서 동작함
  - 이번 릴리스는 `backColor`, `foreColor`, `createLink`, `unlink`, `superscript`, `subscript`, `removeFormat` 명령을 지원함
  - `insertParagraph` 명령은 부분 지원됨
- **Sanitizer API** 작업은 `--pref dom_sanitizer_enabled` 아래에서 이어짐
  - servoshell의 실험 모드에서 활성화됨
  - `Sanitizer`의 `setComments()`, `setDataAttributes()`, `allowProcessingInstruction()`, `removeProcessingInstruction()`, `removeUnsafe()`가 추가됨
- **IndexedDB**는 `--pref dom_indexeddb_enabled` 아래에서 개선 중이며, `IDBTransaction.abort()`의 표준 적합성이 높아짐
- 위 기능들은 servoshell의 **실험 모드**에서 활성화됨
- 접근성 지원은 [name from contents](https://w3c.github.io/aria/#namefromcontent) 알고리듬과 접근성 트리를 **점진적으로 구축**하는 변경을 포함함
  - 점진적 접근성 트리 구축은 실제 웹 콘텐츠 성능에 중요함
- 워커 관련 구현도 시작됨
  - `SharedWorker`는 `--pref dom_sharedworker_enabled` 아래에서 `new SharedWorker()`를 지원함
  - `ServiceWorker`는 `--pref dom_serviceworker_enabled` 아래에서 API 일부가 추가됨

### 임베딩 API 변경과 마이그레이션 포인트
- Servo의 최소 지원 Rust 버전인 **MSRV**가 1.86.0에서 **1.88.0 이상**으로 올라감
  - MSRV로 컴파일 테스트를 수행하지만, 대부분의 테스트는 Rust 1.95.0으로 수행됨
- [**SiteDataManager**](https://doc.servo.org/servo/struct.SiteDataManager.html)의 쿠키 메서드에는 breaking change가 있음
  - `clear_cookies`, `clear_session_cookies`, `set_cookie_for_url`가 추가 `callback` 인자를 받으며, 비동기 호출이 가능해짐
  - 동기 호출을 유지하려면 `callback`에 `None`을 전달함
  - `set_cookie_for_url_async`는 제거됐고, `set_cookie_for_url(Some(Box::new(callback)))` 형태로 대체해야 함
- [**Preferences**](https://doc.servo.org/servo/struct.Preferences.html) API는 스레드 풀 설정 이름이 정리됨
  - `threadpools_image_cache_workers_max`, `threadpools_indexeddb_workers_max`, `threadpools_webstorage_workers_max`는 통합된 [`thread_pool_workers_max`](https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_workers_max)로 대체됨
  - `threadpools_fallback_worker_num`은 [`thread_pool_fallback_workers`](https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_fallback_workers)로 이름이 바뀜
  - `threadpools_async_runtime_workers_max`는 [`thread_pool_async_runtime_workers_max`](https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_async_runtime_workers_max)로 이름이 바뀜
  - `threadpools_webrender_workers_max`는 [`thread_pool_webrender_workers_max`](https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_webrender_workers_max)로 이름이 바뀜
- [**DiagnosticsLogging**](https://doc.servo.org/servo/struct.DiagnosticsLogging.html) API도 재작업됨
  - [`toggle_option`](https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.toggle_option)으로 옵션을 설정하고 [`is_enabled`](https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.is_enabled)로 활성화 여부를 확인함
  - 각 옵션은 새 타입 [`DiagnosticsLoggingOption`](https://doc.servo.org/servo/enum.DiagnosticsLoggingOption.html)의 variant임
  - `DiagnosticsLogging`의 옵션별 `pub` 필드는 제거됐으며, 필드 쓰기와 읽기는 각각 `toggle_option`, `is_enabled`로 바꿔야 함
  - `extend_from_string`은 더 이상 `help` 옵션을 받지 않고, 해당 구현은 servoshell로 이동함

### 사용자·개발자 기능
- **servoshell**에 새 옵션 2개가 추가됨
  - `--host-file=`은 hosts file 경로를 설정하며, `HOST_FILE` 환경 변수의 대안임
  - `--userscripts=`는 모든 문서에서 실행할 **사용자 스크립트** 디렉터리를 지정함
- Firefox **DevTools Debugger** 탭에서 스크립트 블랙박싱이 가능해짐
  - “Ignore source”를 클릭하면 해당 스크립트 내부에서 breakpoint가 걸리지 않음
  - 디버거에서 실행을 단계적으로 진행할 때도 해당 스크립트 내부에서 멈추지 않도록 동작해야 함
  - **Scopes** 패널의 정확도도 개선됨
- Servo 자체 개발자는 프로젝트 정책에 따라 **대규모 언어 모델** 또는 생성형 AI 도구의 출력을 기여에 사용할 수 없음
  - 이를 강제하기 위해 AI agent를 coauthor로 포함한 기여를 거부하는 CI 검사가 추가됨
- `--features vello` 빌드 문제도 수정됨

### 웹 플랫폼 세부 개선
- 여러 HTML 요소의 기본 표시가 개선됨
  - 대상은 `&lt;dl&gt;`, `&lt;ol&gt;`, `&lt;ul&gt;`, `&lt;table&gt;`, `&lt;thead&gt;`, `&lt;tbody&gt;`, `&lt;tfoot&gt;`, `&lt;tr&gt;`, `&lt;td&gt;`, `&lt;th&gt;`, `&lt;dir&gt;`, `&lt;menu&gt;`, `&lt;form&gt;`임
- **CryptoKey**가 직렬화 가능해져 `structuredClone()`과 `postMessage()`에서 사용할 수 있음
- DOM 여러 부분의 **JS 오류 메시지**가 개선됨
- 표준 적합성 개선은 다음 영역을 포함함
  - 폼 제출, 탭 내비게이션, `javascript:` URL 내비게이션
  - `Refresh` 헤더와 `&lt;meta http-equiv=Refresh&gt;`
  - `line-break: anywhere`, `Location.assign()`
  - `crypto.subtle.deriveBits()`, `getComputedStyle()`, `performance.measure()`
  - `FileReader.readAsDataURL()`, `Blob.stream()`
  - `SubtleCrypto`의 **ML-KEM**
- **WebGPU** 쪽에서는 `GPUSupportedLimits`, `GPUTexture`, `GPUDevice.createBindGroup()` 및 기타 WebGPU 기능이 개선됨
- 버그 수정은 `&lt;svg&gt;`와 `Content-Security-Policy`, `:active`, `:hover`, `align-items`, `border-image-outset`, `overflow: scroll`의 `padding`, `pointerup` 이벤트, `slotchange` 이벤트, 동적 `import()`, `CanvasRenderingContext2D.clip()` 등을 포함함

### 성능 개선: 레이아웃 순회 축소와 지연 처리
- `about:memory` 개선을 위해 추적되지 않는 **할당**을 찾는 도구가 만들어짐
- 이미지 캐시, 웹 스토리지, IndexedDB의 **스레드 풀**이 통합돼 CPU당 필요한 OS 스레드 수가 줄어듦
- 레이아웃 최적화는 fragment tree 순회와 캐싱 비용을 줄이는 데 집중됨
  - fragment tree는 대부분 **불변**이 되어, 많은 접근에서 `AtomicRefCell` borrow의 런타임 비용이 없어짐
  - containing block 계산과 stacking context tree 구축이 대부분의 경우 **단일 fragment tree 순회**로 합쳐짐
  - scrollable overflow 계산은 lazy·incremental 방식으로 바뀌어 전체 fragment tree 순회가 사실상 제거됨
  - reflow 사이에서 fragment, shaping 결과, 기타 레이아웃 결과의 캐싱이 개선됨
  - incremental fragment layout의 정밀도가 높아짐
  - 텍스트 shaping의 메모리 사용량이 줄어듦
- **DOM attributes** 처리도 효율화됨
  - 스크립트가 속성 값을 쓸 때 다시 읽기 전까지 직렬화를 피하며, inline style의 잦은 쓰기가 최대 **25%** 빨라짐
  - HTML 파싱 또는 내부 속성 읽기 시 스크립트가 실제로 필요로 하기 전까지 `Attr` 노드 생성을 피해 메모리 사용과 가비지 컬렉션 가능성을 낮춤
- `&lt;iframe&gt;`이 트리에 붙을 때마다 전체 DOM tree를 순회하던 동작이 제거돼, 많은 `&lt;iframe&gt;` 태그를 가진 문서 파싱에서 체감됨
- stylesheet lock은 `parking_lot::RwLock`보다 효율적인 **AtomicRefCell**을 사용함
- OpenHarmony에서는 실제 refresh driver가 추가돼 idle CPU 사용량이 줄고, font list를 디스크에 캐시해 시작 속도가 빨라짐
- 빌드 시간 개선을 위해 거대한 **script crate**에서 더 많은 코드를 분리하고, 의존성 트리 크기도 줄임

### 안정성 수정과 타입 시스템 활용
- 여러 crash와 hang이 수정됨
  - `content`, `MediaStream`, `Element.attributes.item()`, `CSSKeyframesRule.appendRule()`, `FocusEvent.initEvent()`, `Window.stop()`
  - `document.execCommand("delete")`
  - `--debug-mozjs` 빌드
  - DevTools에서 일시정지 중 스크립트 평가
  - DevTools에서 일부 JS 값 미리보기
  - layout에서 zero-width space shaping
  - servoshell의 실험 모드를 런타임에 토글하는 경우
- Rust **타입 시스템**을 사용해 특정 동적 borrow 실패를 불가능하게 만드는 장기 작업이 계속됨

### 기여자와 후원 현황
- 9명이 Servo에 첫 패치를 병합함
  - AbdAlRahman Gad, Onyeka Obi, Steve Sharon Sam, avis137, Xabier Rodríguez, June, Matt Van Horn, nicole, panxt8
- 새 기여자에게 적합한 이슈 목록은 [curated list](https://starters.servo.org/)로 제공됨
- 반복 후원은 **월 7659달러**로, 4월 대비 4.2% 증가함
  - 후원금은 CI·벤치마킹 서버, Outreachy 인턴, maintainer 작업 지원에 쓰임
- [thanks.dev](https://thanks.dev/)에서는 Servo에 의존하는 **35명의 GitHub 사용자**가 후원 중이며, 4월보다 2명 늘어남
- 후원금 사용은 Technical Steering Committee의 공개 [funding request process](https://github.com/servo/project/blob/main/FUNDING_REQUEST.md)를 통해 결정되며, 활성 제안은 [servo/project#187](https://github.com/servo/project/issues/187)에 추적됨

## Comments



### Comment 60989

- Author: neo
- Created: 2026-07-02T04:04:55+09:00
- Points: 1

###### [Lobste.rs 의견들](https://lobste.rs/s/t2gomd/may_servo_user_scripts_mp4_compat) 
- lobste.rs가 **Servo**에서 거의 완벽하게 동작해서 기쁨  
  눈에 띈 건 굵은 링크가 굵게 보이지 않는 것, 글꼴이 조금 어색한 것(Fira Sans처럼 느껴짐), 로그인 페이지 입력 필드가 너무 얇은 것, 이 텍스트 필드를 클릭하면 커서가 클릭한 위치와 다르게 놓이는 것 정도임  
  댓글에서 JavaScript 엔진이 Firefox와 같다고 했으니, 전반적으로는 기대대로 동작하는 듯함  
  수정: 실험적 설정을 켜니 **굵은 글씨** 문제가 해결됨
- **Servo**는 개발된 지 몇 년이나 됐고, 애초에 무슨 의미가 있는 건가?
  - Servo는 Mozilla가 **Rust로 새 브라우저**를 만들려고 시작한 실험 프로젝트였음  
    주요 목표 중 하나가 Microsoft HoloLens였지만 결국 큰 프로젝트로는 중단됐고, 일부 구성요소는 Firefox에 들어갔음  
    예를 들어 다중 스레드 특성 때문에 C++로 작성하기 까다로웠던 CSS 엔진이 그중 하나임  
    이후 Igalia가 이어받아 새 관리 주체가 되었고, 프로젝트를 되살려 새로운 경쟁자로 만들려는 중임  
    JavaScript 엔진은 Firefox와 같음
  - 프로젝트는 **2012년**에 시작됐지만, 아는 한 몇 년 동안 개발이 정체됐다가 최근에야 빠른 속도로 재개됨  
    목적은 주요 브라우저 엔진의 대안을 갖는 것이고, 특히 Chrome 엔진인 **Blink**에 더 많은 경쟁을 주는 데 있음
  - 현재 하드웨어가 지원하는 병렬성과 동시성을 더 쉽게 활용할 수 있는 **메모리 안전 언어**로 브라우저 엔진을 구현하는 건, 프로젝트가 처음 시작됐을 때처럼 여전히 큰 이점임  
    거대 기술 기업의 영향에서 벗어난 별도 웹 플랫폼 구현을 갖는 것도 중요함  
    Google은 지금 너무 큰 힘을 갖고 있고, Mozilla는 수년간 최악에 가까운 모습을 보여 왔음  
    그래서 적어도 나는 매달 몇 달러씩 후원하고 있음
