OSSCA Chromium

기여 목록 / 8513037

[Blink] Use DOMNodeIdType in ConsoleMessage

BlinkrefactorMerged

Blink의 ConsoleMessage에 연결된 DOM 노드 ID를 타입 안전한 DOMNodeIdType으로 전환했습니다. 노드 ID를 만드는 호출부부터 메시지 저장소, DevTools로 전달하는 경로까지 타입을 맞추고, 관련 노드의 정체성과 순서가 유지되는지 확인하는 CDP(Chrome DevTools Protocol) 테스트를 추가했습니다.

문제 설명

기존 ConsoleMessage는 관련 노드 ID를 Vector<DOMNodeId>로 보관했습니다. DOMNodeId는 정수 타입의 별칭이므로 다른 의미의 정수와 혼용해도 컴파일러가 구분하지 못합니다.

관련 노드는 일반 DOM 메시지뿐 아니라 popover 오류, Speculation Rules 경고, View Transition 오류 등 여러 경로에서 추가됩니다. 따라서 저장 멤버만 바꾸는 것으로는 충분하지 않고, 노드를 전달하고 읽는 호출부도 함께 전환해야 했습니다. 또한 DevTools가 메시지에 연결된 원래 DOM 노드를 같은 순서로 받을 수 있어야 했습니다.

해결 내용

  1. 메시지 저장소와 API: ConsoleMessage의 nodes_, Nodes() 반환 타입, SetNodes() 인자를 모두 Vector<DOMNodeIdType>으로 변경했습니다.
  2. 메시지 생성 경로: Node, LocalDOMWindow, HTMLElement, Speculation Rules와 View Transition의 관련 노드 벡터를 새 타입으로 맞췄습니다. 기존 정수 ID를 받는 지점에서는 DOMNodeIdType(...)으로 명시적으로 감쌌습니다.
  3. 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와 기대 결과 파일을 추가했습니다. 테스트는 다음 순서로 전체 전달 경로를 확인합니다.

  1. first, second 두 요소에 같은 view-transition-name: duplicate를 지정합니다.
  2. Log 도메인을 활성화하고 View Transition을 시작해 중복 이름 오류를 발생시킵니다.
  3. 해당 오류의 Log.entryAdded 이벤트를 받아 entry.args의 노드 수를 기록합니다.
  4. 각 원격 객체에 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과 이슈

배운 점

  • 타입 전환은 저장 멤버뿐 아니라 데이터를 만드는 호출부와 소비하는 경로까지 함께 맞춰야 합니다.
  • 기존 정수 API와 만나는 지점에 명시적인 변환을 두면, 외부 동작을 유지하면서 내부 타입 안전성을 단계적으로 높일 수 있습니다.
  • 관련 노드 목록은 원소 수만 같다고 충분하지 않습니다. 실제 노드의 정체성과 순서를 프로토콜을 통해 확인하면 사용자에게 보이는 동작도 검증할 수 있습니다.

참고 자료