OSSCA Chromium

기여 목록 / 8448552

[Blink] Use DOMNodeIdType in Inspector storage

BlinkrefactorMerged

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/에 있습니다.

  1. 스냅샷 캐시: OriginUrlMap을 HashMap<DOMNodeIdType, String>으로 바꾸고, 최신·레거시 스냅샷 agent의 삽입·조회에서 노드 ID를 명시적으로 감쌌습니다. 해시 지원은 선행 CL의 dom_node_id_traits.h를 재사용했습니다.
  2. Overlay와 DOM agent: 대기 중인 검사 대상과 InspectableNode의 멤버를 전용 타입으로 바꾸고, detached DOM 트리 중복 제거용 std::map의 키도 맞췄습니다.
  3. 미디어 플레이어: 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과 이슈

배운 점

  • 타입 안전성을 높이려면 멤버 선언뿐 아니라 컨테이너의 키와 삽입·조회 경로를 함께 전환해야 합니다.
  • 내부에서는 전용 타입을 사용하고 기존 API 경계에서 명시적으로 변환하면, 프로토콜 형식을 유지하면서 점진적으로 타입을 전환할 수 있습니다.
  • ID 타입을 바꿀 때는 정상 값뿐 아니라 기본값과 초기화 동작도 테스트해야 합니다.

참고 자료