Insights: fix broken re-rendering of Insights

This CL makes a change to how we render Insights in the sidebar. We
found that if you have two traces, and the ordering of the Insights in
the sidebar changes, you could end up with a completely broken sidebar.
In the logs, this would appear as the code passing the LCP Breakdown
model into the Cache insight, for example.

Tracking this down, I think it is down to how Lit deals with trying to
re-render efficiently. Now we are rendering a series of
devtools-widgets, rather than the component itself, it would not always
destroy and re-order the list.

Looking at
https://lit.dev/docs/templates/lists/#when-to-use-map-or-repeat, it
states:

> If the DOM nodes have state that isn't controlled by a template
> expression, use the repeat directive.

The introduction of the repeat() directive here, even though we have
just one item in the array, provides a way for us to put an explicit key
to the node. In this case, the key is the model (each trace has unique
model references) and Lit supports using an object here. Doing this
means we relate the DOM to the exact model that backs it and avoids any
chance of Lit trying to reuse elements and causing a breakage.

Bug: 498621626
Change-Id: I1f23bba7fd3ad818632c0f6484085ebd318d1659
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7817996
Commit-Queue: Alina Varkki <alinavarkki@chromium.org>
Auto-Submit: Jack Franklin <jacktfranklin@chromium.org>
Reviewed-by: Alina Varkki <alinavarkki@chromium.org>
Commit-Queue: Jack Franklin <jacktfranklin@chromium.org>
1 file changed
tree: 6e21acf0d28b51a58eff49a2908961d56a18f20b
  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. 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: