[elements] Derive a DOM tree node's shape in one place in DOMTreeWidget

The view computed "does this node have children, is it expanded, which
children are shown, does it need a closing tag" twice, once to render
and once to count rows for maxRowsShown, and the "not collapsible" and
"being edited as HTML" predicates were spelled out in four and three
places across the view and the presenter.

- resolveNodeShape() in the view feeds both renderNode() and
  countVisibleRowsForNode(); isNotCollapsible() and
  isBeingEditedAsHTML() are module-level helpers used by the presenter
  as well.
- nodeHasVisibleChildren() / getVisibleChildren() take a TreeOptions
  object that both the view input and the presenter satisfy, instead
  of the same three or four positional arguments at every call site.
- The three opening/closing-tag handler pairs (mousemove, dragover,
  drop) become factories parameterized by isClosingTag, and the
  per-node copy of the InterceptBindingDirective is gone.
- ViewInput is module-private and the presenter always provides every
  callback, so they are now required. That removes the optional
  chaining and the dead expandRoot / InitialChildrenLimit fallbacks in
  the view. The view no longer receives the presenter itself; the
  three things it used it for are explicit inputs (onRevealInTopLayer,
  onSetMultilineEditing, visibleWidth).

No change in behavior.

Bug: 407751692
Change-Id: I249f0425320700fe751bc25d7dde03e793fbd79b
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/8568723
Reviewed-by: Simon Zünd <szuend@chromium.org>
Auto-Submit: Alex Rudenko <alexrudenko@chromium.org>
Commit-Queue: Simon Zünd <szuend@chromium.org>
1 file changed
tree: dfe9e61aef10ec1527c9135f67be1130611a25d2
  1. .agents/
  2. .gemini/
  3. .github/
  4. .vscode/
  5. build_overrides/
  6. config/
  7. docs/
  8. extension-api/
  9. extensions/
  10. front_end/
  11. inspector_overlay/
  12. mcp/
  13. node_modules/
  14. scripts/
  15. test/
  16. third_party/
  17. v8/
  18. .clang-format
  19. .clang-format-ignore
  20. .editorconfig
  21. .env.template
  22. .geminiignore
  23. .git-blame-ignore-revs
  24. .gitallowed
  25. .gitattributes
  26. .gitignore
  27. .gitmodules
  28. .gn
  29. .mailmap
  30. .npmignore
  31. .npmrc
  32. .style.yapf
  33. .stylelintignore
  34. .stylelintrc.json
  35. AUTHORS
  36. BUILD.gn
  37. codereview.settings
  38. CONTRIBUTING.md
  39. DEPS
  40. DIR_METADATA
  41. eslint.config.mjs
  42. favicon.ico
  43. LICENSE
  44. OWNERS
  45. package-lock.json
  46. package.json
  47. PRESUBMIT.py
  48. README.md
  49. SECURITY.md
  50. WATCHLISTS
README.md

Chrome DevTools frontend

npm package

The client-side of the Chrome DevTools, including all TypeScript & CSS to run the DevTools webapp.

Source code and documentation

The frontend is available on chromium.googlesource.com. Check out the Chromium DevTools documentation for instructions to set up, use, and maintain a DevTools front-end checkout, as well as design guidelines, and architectural documentation.

Source mirrors

DevTools frontend repository is mirrored on GitHub.

DevTools frontend is also available on NPM as the chrome-devtools-frontend package. It's not currently available via CJS or ES modules, so consuming this package in other tools may require some effort.

The version number of the npm package (e.g. 1.0.373466) refers to the Chromium commit position of latest frontend git commit. It's incremented with every Chromium commit, however the package is updated roughly daily.

Getting in touch

There are a few options to keep an eye on the latest and greatest of DevTools development: