기여 목록 / 8513037
[Blink] Use DOMNodeIdType in ConsoleMessage
Blink의 ConsoleMessage에 연결된 DOM 노드 ID를 타입 안전한 DOMNodeIdType으로
전환했습니다. 노드 ID를 만드는 호출부부터 메시지 저장소, DevTools로 전달하는
경로까지 타입을 맞추고, 관련 노드의 정체성과 순서가 유지되는지 확인하는
CDP(Chrome DevTools Protocol) 테스트를 추가했습니다.
문제 설명
기존 ConsoleMessage는 관련 노드 ID를 Vector<DOMNodeId>로 보관했습니다.
DOMNodeId는 정수 타입의 별칭이므로 다른 의미의 정수와 혼용해도 컴파일러가
구분하지 못합니다.
관련 노드는 일반 DOM 메시지뿐 아니라 popover 오류, Speculation Rules 경고, View Transition 오류 등 여러 경로에서 추가됩니다. 따라서 저장 멤버만 바꾸는 것으로는 충분하지 않고, 노드를 전달하고 읽는 호출부도 함께 전환해야 했습니다. 또한 DevTools가 메시지에 연결된 원래 DOM 노드를 같은 순서로 받을 수 있어야 했습니다.
해결 내용
- 메시지 저장소와 API:
ConsoleMessage의nodes_,Nodes()반환 타입,SetNodes()인자를 모두Vector<DOMNodeIdType>으로 변경했습니다. - 메시지 생성 경로:
Node,LocalDOMWindow,HTMLElement, Speculation Rules와 View Transition의 관련 노드 벡터를 새 타입으로 맞췄습니다. 기존 정수 ID를 받는 지점에서는DOMNodeIdType(...)으로 명시적으로 감쌌습니다. - DevTools 전달 경로:
InspectorLogAgent에서 전용 타입으로 순회하고, 기존DOMNodeIds::NodeForId()를 호출할 때.value()로 정수를 꺼냈습니다. 노드 순회 순서와 프로토콜의 동작은 유지했습니다.
다음은 ConsoleMessage 헤더에서 변경한 선언을 발췌한 코드입니다.
Vector<DOMNodeIdType>& Nodes();
void SetNodes(LocalFrame*, Vector<DOMNodeIdType> nodes);
// private 멤버
Vector<DOMNodeIdType> nodes_;Node::AddConsoleMessage()에서는 기존 ID를 다음과 같이 전달합니다.
console_message->SetNodes(GetDocument().GetFrame(),
{DOMNodeIdType(GetDomNodeId())});반대쪽 소비자인 InspectorLogAgent는 DOMNodeIds::NodeForId(node_id.value())로
실제 노드를 찾은 뒤 기존 방식으로 DevTools의 원격 객체를 생성합니다.
테스트 방법
관련 노드의 정체성과 순서 확인
inspector-protocol/log/console-node-ids.js와 기대 결과 파일을 추가했습니다.
테스트는 다음 순서로 전체 전달 경로를 확인합니다.
first,second두 요소에 같은view-transition-name: duplicate를 지정합니다.Log도메인을 활성화하고 View Transition을 시작해 중복 이름 오류를 발생시킵니다.- 해당 오류의
Log.entryAdded이벤트를 받아entry.args의 노드 수를 기록합니다. - 각 원격 객체에
Runtime.callFunctionOn을 호출해 실제 요소의id를 읽습니다.
기대 결과는 노드 두 개가 first, second 순서로 전달되는 것입니다.
Console messages preserve related DOM nodes.
Node count: 2
first
second노드 개수뿐 아니라 실제 DOM 요소의 ID를 검사하므로, 타입 전환 중 다른 노드가
연결되거나 순서가 바뀌는 회귀도 확인할 수 있습니다. VirtualTestSuites에도
테스트 경로를 반영해 threaded 환경에서 실행되도록 구성했습니다.
기존 테스트와 CQ 확인
Speculation Rules 단위 테스트의 관련 노드 포함 여부 검사도 DOMNodeIdType을
비교하도록 변경했습니다.
Gerrit 기록상 2026년 10월 5일 Patch Set 1의 CQ dry run이 통과했습니다.
10월 10일 Patch Set 2에서는 최신 main으로 리베이스하고 node.cc의 include
충돌을 해결했습니다. Vladimir Levin과 Alex Rudenko의 리뷰를 거쳐 10월 12일
CQ 실행 후 리베이스된 Patch Set 3가 머지됐습니다.
이 문서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.
연관 CL과 이슈
- CL 8448552 — Inspector 내부 저장소의 DOMNodeIdType 전환: 스냅샷 캐시, Overlay, 검사 대상 노드와 미디어 플레이어의 ID를 전환한 선행 작업입니다. 현재 CL의 리뷰 요청에서 이 변경의 후속 작업임을 명시했습니다.
- CL 8409529 — InspectorResourceContainer 타입 전환: 앞선 단계에서 스타일 내용 캐시와 관련 API를 전환한 작업입니다.
- CL 8397547 — DOMNodeIdType의 WTF 해시 특성 추가:
같은 타입 전환 작업의 기반이 된 해시 컨테이너 지원입니다. 이번 CL은
ConsoleMessage의 벡터와 호출 경로를 전환합니다. - Chromium 이슈 532946448: 위 DOM 노드 ID 타입 전환 작업들이 참조하는 공통 이슈입니다.
배운 점
- 타입 전환은 저장 멤버뿐 아니라 데이터를 만드는 호출부와 소비하는 경로까지 함께 맞춰야 합니다.
- 기존 정수 API와 만나는 지점에 명시적인 변환을 두면, 외부 동작을 유지하면서 내부 타입 안전성을 단계적으로 높일 수 있습니다.
- 관련 노드 목록은 원소 수만 같다고 충분하지 않습니다. 실제 노드의 정체성과 순서를 프로토콜을 통해 확인하면 사용자에게 보이는 동작도 검증할 수 있습니다.