Trawling

Servo 0.7.0, 숨긴 WebView는 자동 조절하고 시스템 포커스는 앱이 전달

Servo 0.7.0은 숨겨진 WebView의 프레임 알림과 애니메이션 틱을 자동으로 줄이고, 시스템 포커스 변경은 임베더가 `WebView::set_focused`로 전달하도록 바꿨습니다. 가시 상태와 시스템 포커스를 별개로 처리해, 보이는 WebView가 포커스를 잃어도 숨겨진 뷰처럼 스로틀링되지 않습니다.

Servo 프로젝트는 11월 5일 9월 변경사항을 담은 Servo 0.7.0을 공개했습니다. 527개 커밋에 걸친 업데이트 가운데 임베더가 알아야 할 변화는 WebView의 가시 상태와 시스템 포커스를 별개로 처리한다는 점입니다.

Servo는 앱에 웹 콘텐츠를 넣을 수 있는 웹 엔진입니다. 앱을 만드는 임베더는 WebView가 숨겨졌는지, 운영체제의 시스템 포커스를 얻거나 잃었는지 엔진이 구분할 수 있도록 연결합니다. 0.7.0에서는 두 상태의 처리 방식이 달라졌습니다.

숨겨진 WebView를 수동으로 조절하던 WebView::set_throttled API는 제거됐습니다. 이제 WebView가 숨겨지면 Servo가 자동으로 스로틀링하고, 다시 표시되면 스로틀링을 멈춥니다. 숨겨진 뷰에는 새 프레임 알림을 보내지 않고 애니메이션 틱도 실행하지 않아, 화면에 보이지 않는 콘텐츠의 갱신 작업을 줄입니다.

시스템 포커스는 반대로 임베더가 알려야 합니다. 기존 WebViewDelegate::notify_focus_changed와 Servo의 focus, blur 메서드가 제거됐고, 운영체제에서 WebView가 포커스를 얻거나 잃을 때 앱이 WebView::set_focused를 호출하도록 바뀌었습니다. 여기서 포커스는 페이지 안의 입력 요소가 선택된 상태가 아니라, WebView가 시스템 포커스를 받았는지를 뜻합니다.

이 구분은 WebDriver에서 상호작용 대상으로 선택한 브라우징 컨텍스트와 시스템 포커스를 따로 다루는 데 쓰입니다. 문서가 시스템 포커스를 얻으면 이에 맞는 포커스 이벤트가 발생하고 document.hasFocus()도 그 상태를 반영합니다. 여러 WebView가 동시에 화면에 표시될 수 있는 앱에서는 포커스를 잃은 뷰도 계속 보일 수 있습니다. 시스템 포커스를 잃었다는 이유만으로 숨겨진 뷰처럼 스로틀링되지는 않습니다.

참고 자료

오류 제보