Consider tree above iframe when creating Node path Combined with a recent change to the DOM agent backend, this supports restoring the select Node in the elements panel upon refresh, even for elements inside an iframe. Example path: 0,HTML,1,BODY,0,DIV,0,IFRAME,d,#document,0,HTML,1,BODY,0,DIV "d,#document" is always the first component after an IFRAME. Bug: 40719145 Change-Id: I490968297e8e73e90f29a681d7226823f2bdd5df Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5778499 Reviewed-by: Paul Irish <paulirish@chromium.org> Commit-Queue: Connor Clark <cjamcl@chromium.org>
diff --git a/front_end/core/sdk/DOMModel.ts b/front_end/core/sdk/DOMModel.ts index 0d6432f..919e8a8 100644 --- a/front_end/core/sdk/DOMModel.ts +++ b/front_end/core/sdk/DOMModel.ts
@@ -569,17 +569,34 @@ } path(): string { - function canPush(node: DOMNode): number|false|null { - return (node.index !== undefined || (node.isShadowRoot() && node.parentNode)) && node.#nodeNameInternal.length; + function getNodeKey(node: DOMNode): number|'u'|'a'|'d'|null { + if (!node.#nodeNameInternal.length) { + return null; + } + if (node.index !== undefined) { + return node.index; + } + if (!node.parentNode) { + return null; + } + if (node.isShadowRoot()) { + return node.shadowRootType() === DOMNode.ShadowRootTypes.UserAgent ? 'u' : 'a'; + } + if (node.nodeType() === Node.DOCUMENT_NODE) { + return 'd'; + } + return null; } const path = []; let node: (DOMNode|null) = (this as DOMNode | null); - while (node && canPush(node)) { - const index = typeof node.index === 'number' ? - node.index : - (node.shadowRootType() === DOMNode.ShadowRootTypes.UserAgent ? 'u' : 'a'); - path.push([index, node.#nodeNameInternal]); + while (node) { + const key = getNodeKey(node); + if (key === null) { + break; + } + + path.push([key, node.#nodeNameInternal]); node = node.parentNode; } path.reverse();