Uh oh!
There was an error while loading. Please reload this page.
Fix text truncation for frames named after Object.prototype methods - #6044
Conversation
TextMeasurement's width cache was a plain object, so looking up `_cache["toString"]` returned Object.prototype.toString instead of undefined. getFittedText treated that function as a cached width, which collapsed the truncation algorithm and produced just "…". This affected JS frames whose names collide with Object.prototype: toString, hasOwnProperty, valueOf, constructor, isPrototypeOf, propertyIsEnumerable, toLocaleString, __proto__. Visible in the flame graph, stack chart, marker chart, and js-tracer canvases. Switching the cache to a Map solves this problem.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@## main #6044 +/- ##
==========================================
- Coverage 83.78% 83.77% -0.01%
==========================================
Files 329 329 Lines 34528 34546 +18 Branches 9659 9666 +7 ==========================================
+ Hits 28930 28942 +12 - Misses 5169 5175 +6
Partials 429 429 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
fatadel
left a comment
There was a problem hiding this comment.
LGTM! This looks as easy to unit test, however, I could not find any. For example, smth like getTextWidth("toString") would be sufficient I guess.
Yeah, I wanted to add a test first too, but couldn't find any test to piggyback off of. Then I let claude write some and I didn't like because it was too long 😄 I think it's fine as this is very niche. |
Uh oh!
There was an error while loading. Please reload this page.
Changes: [fatadel] Remove unused dependencies from package.json (#6010) [Nazım Can Altınova] Make profiler-cli work in sandboxed environments (#6003) [Markus Stange] Make profiler-edit run profile compacting before writing out the file (#6015) [Markus Stange] Migrate from prettier to oxfmt (#5986) [Markus Stange] Add a --symbolicate-wasm arg to profiler-edit. (#6008) [Markus Stange] Build and upload the cli artifact in PRs (#6020) [Markus Stange] Use @streamparser/json if the input is too large to fit in a V8 string (#6016) [Nazım Can Altınova] Print also the status output right after cli `load` command (#6019) [Nicolas Chevobbe] Update devtools-reps to 0.27.7 (#6030) [Nazım Can Altınova] Include `--search` option in `pq filter push` (#6026) [Nazım Can Altınova] Update all Yarn dependencies (2026-05-20) (#6033) [fatadel] Translate URL track-index state through profile sanitization (#6000) [Markus Stange] Make withSize use a wrapper element so that it can stop calling findDOMNode (#5988) [Markus Stange] Fix dhat importer (#6036) [Nazım Can Altınova] Annotate inlined frames in CLI call trees and stacks (#6041) [Nazım Can Altınova] Use proper types in cli tests instead of custom inline types (#6038) [Nazım Can Altınova] Fix text truncation for frames named after Object.prototype methods (#6044) [Nazım Can Altınova] Add missing key props to CodeErrorOverlay error list items (#6047) [depfu[bot]] ⬆️ Update oxfmt to version 0.51.0 (#6054) [Nazım Can Altınova] 🔃 Sync: l10n -> main (May 26, 2026) (#6058) [Nazım Can Altınova] Use URL-state symbol server for `profiler-cli function annotate` (#6051) [Nazım Can Altınova] Bump profiler-cli version to 0.2.0 (#6059) And special thanks to our localizers: fr: YD sr: Марко Костић (Marko Kostić) tr: Ali Demirtaş zh-CN: Olvcpr423 zh-CN: wxie
Fixes#6006.
TextMeasurement's width cache was a plain object, so looking up
_cache["toString"]returned Object.prototype.toString instead of undefined. getFittedText treated that function as a cached width, which collapsed the truncation algorithm and produced just "…".This affected JS frames whose names collide with Object.prototype: toString, hasOwnProperty, valueOf, constructor, isPrototypeOf, propertyIsEnumerable, toLocaleString, proto. Visible in the flame graph, stack chart, marker chart, and js-tracer canvases.
Switching the cache to a Map solves this problem.
Example profile:
Before / After