← All issues

Web Inspector: introduce FrameDOMAgent for cross-origin iframe DOM tree access

c48671a

Source/WebCore/inspector/agents/frame/FrameDOMAgent.cpp

+FrameDOMAgent::FrameDOMAgent(WebCore::Frame& frame, BackendDispatcher& backendDispatcher)
+ : InspectorAgentBase("DOM"_s)
+ , m_frame(frame)
+ , m_backendDispatcher(InspectorDOMBackendDispatcher::create(backendDispatcher, this))
+ , m_destroyedNodesTimer(*this, &FrameDOMAgent::destroyedNodesTimerFired)
+{ }

Source/WebInspectorUI/UserInterface/Controllers/DOMManager.js

+_initializeFrameTarget(target)
+{
+ target.DOMAgent.getDocument().then((payload) => {
+ let documentNode = this._bindFrameTargetNode(target, payload.root);
+ this._frameTargetDocuments.set(target, documentNode);
+ this._spliceFrameDocumentIntoPageTree(target, documentNode);
+ });
+}

WebKit의 site isolation 모델에서 cross-origin iframe은 별도의 WebProcess 인스턴스에서 실행됩니다. 이로 인해 해당 subtree는 InspectorDOMAgent에 노출되지 않습니다. 이 commit은 각 frame의 WebProcess에 독립적인 FrameDOMAgent를 배포하는 방식으로 이 문제를 해결합니다.

Node ID는 process 내부에서만 유효한 정수입니다. 따라서 frontend에서는 targetId:nodeId 형태의 복합 문자열로 이를 구분하여 통합된 뷰를 유지합니다. cross-origin frame 문서는 처리 이후에 page tree에 삽입됩니다. 한편 didInsertDOMNode, didRemoveDOMNode 등의 mutation event handler는 연결되어 있지만, DOMObserver의 early-return을 통해 현재는 비활성화 상태입니다. 실시간 mutation 추적은 이후 패치에서 구현될 예정입니다.

Site isolation 환경에서의 완전한 cross-process DOM inspection을 향한 첫 번째 단계입니다. Inspector의 privilege boundary를 확장하고, 이후 패치가 기반으로 삼을 IPC 구조를 마련합니다.

🔒

Cross-process node ID scoping and splice-time ordering in this new inspector path have several edge cases worth auditing.

더 확인하려면 구독해 주세요