기여 목록 / 8448552
[Blink] Use DOMNodeIdType in Inspector storage
Blink Inspector 내부에서 보관하는 DOM 노드 ID를 타입 안전한 DOMNodeIdType으로
전환했습니다. 스타일 캐시를 전환한 CL 8409529의
후속 작업으로, 스냅샷·Overlay·DOM agent·미디어 플레이어까지 적용 범위를 넓혔습니다.
기존 정수 API와 DevTools 프로토콜 형식은 유지했습니다.
문제 설명
기존 DOMNodeId는 int의 타입 별칭이므로, 다른 용도의 정수를 잘못 전달해도
컴파일러가 구분하지 못합니다. Inspector 내부에도 다음과 같은 정수 기반 저장소와
상태가 남아 있었습니다.
- DOM 스냅샷에서 노드별 원본 URL을 보관하는
OriginUrlMap의 키 - Overlay가 활성화될 때까지 검사를 미뤄 둔 노드 ID
- 콘솔에서 검사할 노드 ID와 detached DOM 트리의 중복 제거용 키
- 미디어 플레이어에 연결된 DOM 노드 ID
이들을 전용 타입으로 바꾸면서도, 기존 API가 받는 정수와 ID가 없는 상태를
나타내는 0의 의미는 유지해야 했습니다.
해결 내용
변경한 10개 파일은 모두 third_party/blink/renderer/core/inspector/에 있습니다.
- 스냅샷 캐시:
OriginUrlMap을HashMap<DOMNodeIdType, String>으로 바꾸고, 최신·레거시 스냅샷 agent의 삽입·조회에서 노드 ID를 명시적으로 감쌌습니다. 해시 지원은 선행 CL의dom_node_id_traits.h를 재사용했습니다. - Overlay와 DOM agent: 대기 중인 검사 대상과
InspectableNode의 멤버를 전용 타입으로 바꾸고, detached DOM 트리 중복 제거용std::map의 키도 맞췄습니다. - 미디어 플레이어:
dom_node_id멤버를 전용 타입으로 저장하고, 설정 API에서 정수를 감싸며 DevTools로 전달할 때.value()로 꺼내도록 했습니다.
아래는 미디어 플레이어의 저장·전달 경계에서 변경한 부분을 발췌한 코드입니다. 각 줄은 서로 다른 선언 또는 함수에 속합니다.
// MediaPlayer 내부 저장 타입
DOMNodeIdType dom_node_id;
// SetDomNodeIdForPlayer(): 기존 int 인자를 전용 타입으로 저장
player_iter->value->dom_node_id = DOMNodeIdType(dom_node_id);
// DevTools 프로토콜에는 기존처럼 정수로 전달
if (media_player.dom_node_id) {
player_object->setDomNodeId(media_player.dom_node_id.value());
}Overlay의 대기 ID를 비울 때도 0을 직접 대입하는 대신 DOMNodeIdType()을
사용했습니다. 기존 Node API와 프로토콜 배열은 정수를 유지하고, 내부 저장소와
만나는 지점에서 변환해 변경 범위를 제한했습니다.
테스트 방법
inspector_media_context_impl_unittest.cc에
InspectorMediaContextImplTest.SetAndClearDomNodeId를 추가했습니다.
플레이어 생성 직후 ID가 없는지, 123을 설정하면 전용 타입으로 보관되는지,
다시 0을 설정하면 ID가 없는 상태로 돌아오는지 확인합니다.
auto id = impl->CreatePlayer();
EXPECT_FALSE(impl->MediaPlayerFromId(id).dom_node_id);
impl->SetDomNodeIdForPlayer(id, 123);
EXPECT_EQ(impl->MediaPlayerFromId(id).dom_node_id, DOMNodeIdType(123));
impl->SetDomNodeIdForPlayer(id, 0);
EXPECT_FALSE(impl->MediaPlayerFromId(id).dom_node_id);Gerrit 기록상 Alex Rudenko와 Philip Pfaffe가 2026년 9월 24일 Patch Set 1을 승인했습니다. 9월 30일 CQ 실행 후 리베이스된 Patch Set 2가 머지됐습니다. 이 문서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.
연관 CL과 이슈
- CL 8397547 — DOMNodeIdType의 WTF 해시 특성 추가: 전용 ID 타입을 WTF 해시 컨테이너의 키로 사용할 수 있게 한 기반 작업입니다. 이번 스냅샷 캐시 전환에서도 이 해시 특성을 사용합니다.
- CL 8409529 — InspectorResourceContainer 타입 전환: 스타일 내용 캐시와 관련 API를 먼저 전환한 선행 작업입니다. 현재 CL의 리뷰 요청 댓글에서도 이 변경의 후속 작업임을 명시했습니다.
- Chromium 이슈 532946448: 위 DOM 노드 ID 타입 전환 작업들이 참조하는 공통 이슈입니다.
배운 점
- 타입 안전성을 높이려면 멤버 선언뿐 아니라 컨테이너의 키와 삽입·조회 경로를 함께 전환해야 합니다.
- 내부에서는 전용 타입을 사용하고 기존 API 경계에서 명시적으로 변환하면, 프로토콜 형식을 유지하면서 점진적으로 타입을 전환할 수 있습니다.
- ID 타입을 바꿀 때는 정상 값뿐 아니라 기본값과 초기화 동작도 테스트해야 합니다.