Repository navigation
Deploy October 22, 2026 - #6417
Merged
Merged
Conversation
Combine schemas from all input profiles instead of keeping only the first profile's schemas. Schema-driven screenshots need their field definitions to translate image URL indexes and create screenshot tracks, including when only the second profile contains screenshots.
Add schema formats for image string indexes and window dimensions so marker rendering can describe screenshots without knowing their payload field names. Resolve the image aspect ratio through a sibling size field and keep image data out of text formatting and marker searches.
This fixes missing search-filter information when loading profiles from URLs. The imported search is now shown in session and query output, and filter clear removes it instead of leaving it active. Fixes #6385
Traditionally, we were only using symbolication for C++ / Rust functions, not for JS functions - when profiling Firefox, JS functions already appear fully symbolicated in the profile JSON, they don't need to be symbolicated in the front-end. If we want to treat JS functions more like native functions, where we start with an address and then get all the information via symbolication, we need to make sure we cover the pieces of information that JS functions have but which we've never had for native functions: - frame column - function start line - function start column For example, the column is crucial if we eventually want to support source mapped JS for profiles from samply + jitdump. This commit lets us add those pieces of information via new fields in the symbolication response. All the new properties in the symbolication response are treated as optional; the current symbolication service and older samply versions do not have these fields. This also adds support for an `isScript` property, so that symbolication can create both JS and non-JS frames. In the past, we were relying on the information in the unsymbolicated frame, which means that samply needed to include accurate "isJS" information in the unsymbolicated profile. (It did that by string-matching the jitdump symbol name during profile recording.)
The tests for updating inverted call node paths applied non-inverted transforms: a non-inverted "focus-subtree" on [Z, Y], which doesn't exist in the non-inverted tree, and "merge-call-node", which isn't available for inverted trees. The expected paths didn't exist in the transformed tree, so the tests passed without covering a realistic case. Use an inverted "focus-subtree" and a "merge-function" instead, and check that the selected path refers to an existing call node.
The JS funcs of samply profiles don't have a source. Their location is only in their name, like "onFilterChange (http://127.0.0.1:62764/assets/index.js:25:354)", so --map-source-paths had no sources to embed for them. The new --js-sources-from-func-names option moves the source, line and column out of the name of these JS funcs, like the processing of Gecko profiles does, so that their sources and source maps can be embedded. Unnamed functions are named "(root scope) <url>", like in Gecko profiles. The JS funcs that already have a source are left alone, and the option can be dropped once samply provides the source of JS funcs.
Co-authored-by: Lobodzets (uk) <lobodzets@meta.ua> Co-authored-by: Іhor Hordiichuk (uk) <igor_ck@outlook.com> Co-authored-by: uya2521 (uk) <uya2521@gmail.com>
Co-authored-by: Jim Spentzos (el) <jimspentzos2000@gmail.com>
An index map has a sections array instead of a top-level mappings string. Each section pairs a generated-code offset with an embedded source map (ECMA-426 section 10). Closure Compiler output, for example, can come with one. The source-map library already reads index maps, but parseSourceMapFileContents rejected them, so profiler-edit's --map-source-paths and the "apply source map file" button skipped them. Accept and validate index maps, and widen the type of the parsed map to RawSourceMap | RawIndexMap.
Store window dimensions as one windowSize value so a schema field can describe them together. Normalize window IDs to strings at the profile boundary so consumers can use one representation regardless of whether Gecko supplies a numeric ID or a hexadecimal string. Apply the same payload shape in Gecko processing, Chrome import, and the processed profile upgrader.
Persist screenshot field definitions with profiles so tooltip rendering, string-index translation, and query output can use the schema instead of separate CompositorScreenshot cases. Identify image URLs by their field format to keep query results compact.
Encode screenshot lifetimes as start and end marker pairs and include the window ID in their names. Generic interval derivation can then match screenshots without its own per-window bookkeeping. Window destruction closes the last screenshot. An unclosed window leaves an incomplete interval extending to the end of the thread.
Select screenshot markers through the timeline-screenshots display location and group tracks by marker name. Read image fields from their schema so tracks do not depend on CompositorScreenshot payload names. Use the same classification during sanitization and comparison, and keep first-screenshot ordering so shared track indexes remain stable.
…ght of the panel, even if the source code is short.
…ght of the panel, even if the source code is short. (#6405)
Replace marker timestamp formatting based on timestamp magnitude with fractional seconds whose precision follows the current view width. This lets displayed times be reused as zoom inputs and keeps nearby events distinguishable when zoomed in.
Replace duration formatting for marker stack capture times with the shared timestamp formatter. Fractional seconds and precision based on the current view keep capture times consistent with other marker commands and distinguish nearby events.
findAddressProofForFile took the first func with the file as its source, then that func's first frame, and gave up if that frame had no address. A file can still have other frames with addresses, which the symbolication API would accept just as well. Go through the frames instead and take the first one that has an address and a func with the file as its source. Files that were fetchable but failed now load in the source view and in profiler-cli. The helpers will also be used to find the addresses for all files at once when sharing source code.
The bottom box can currently only be opened for a call node. Add the equivalent lookup for a bare function index, so that views which select functions rather than call nodes can open the bottom box too.
…ative symbols. A function inlined in many places can have tens of thousands of native symbols. Each one cost a pass over the whole stack table plus an assembly fetch, so the daemon appeared to hang.
TypeScript 7 is the native Go port of the compiler. It ships only the
`tsc` binary. Its JavaScript compiler API won't return until 7.1, and
typescript-eslint refuses to load without it. So both switches have to
happen together.
Timings on this machine, from a cold cache:
yarn ts 4.83s -> 1.04s
yarn lint-js 11.00s -> 1.93s
yarn lint 14.03s -> 2.98s
The rules in .oxlintrc.json were derived from the effective configuration
of the old eslint.config.mjs. Every lint category is switched off and each
rule is listed explicitly. Enabling a category would turn on rules that
ESLint didn't enforce.
Rules that oxlint doesn't implement natively come from the original ESLint
plugins, loaded through `jsPlugins` in the same oxlint pass:
eslint-plugin-testing-library 20 rules
eslint-plugin-jest-dom 11 rules
eslint-plugin-react 7 rules, loaded as `react-js`
eslint-plugin-jest-formatting padding-around-describe-blocks
eslint-plugin-import no-unresolved, for JavaScript files
only, loaded as `import-js`
oxlint implements consistent-return and dot-notation only as type-aware
rules, which can't run on JavaScript files. A small local plugin,
scripts/lib/oxlint-eslint-core-rules.mjs, applies ESLint's own versions
to .js, .mjs and .cjs files.
In TypeScript files, tsc already reports unresolved imports (TS2307).
`eslint` stays a devDependency because these plugins import it. Nothing
runs the ESLint CLI.
These rules are not carried over:
- no-invalid-this. In TypeScript files, tsc reports the same problem
(TS2683). ESLint's implementation crashes under oxlint, so it doesn't
run on JavaScript files. Only one of those uses `this`.
- react/no-did-mount-set-state and react/no-did-update-set-state.
eslint-plugin-react makes them no-ops for React 16.3 and newer.
- no-return-await, which ESLint has deprecated. typescript/return-await
in `error-handling-correctness-only` mode replaces it. It only reports
an `await` that changes which errors a surrounding try/catch sees.
Both linters were run over a corpus of 57 files with one defect each, one
per rule. oxlint catches everything ESLint caught, with no false
positives.
eslint-disable comments for jsPlugins rules are renamed to the names
oxlint reports. One jest/no-conditional-expect disable comment is
removed: oxlint's version of the rule misses `function () {}` test
callbacks, so the comment counted as unused. This is
oxc-project/oxc#28054.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changes:
[Markus Stange] Accept more fields from symbolication. (#6373)
[Markus Stange] Support index source maps. (#6399)
[fatadel] Make CompositorScreenshot markers schema-based (#6261)
[Markus Stange] Use inverted transforms in the tests for inverted call node paths. (#6393)
[fatadel] Expose and clear URL-imported call tree search in the CLI (#6387)
[Markus Stange] Make the scrollable editor view in the source view cover the full height of the panel, even if the source code is short. (#6405)
[Nazım Can Altınova] Silence profile loader logs in profile-querier-url tests (#6409)
[Nazım Can Altınova] Add
--js-sources-from-func-namestoprofiler-edit(#6394)[Nazım Can Altınova] Look for a source file's address proof in all of its frames (#6407)
[Markus Stange] Some preparations for a function list panel (#6401)
[fatadel] Use fractional seconds with adaptive precision for CLI marker timestamps (#6384)
[fatadel] 🔃 Sync: l10n -> main (October 22, 2026) (#6415)
[Markus Stange] Switch to TypeScript 7 (tsgo) and replace ESLint with oxlint (#6354)
[fatadel] Bump profiler-cli version to 0.12.0 (#6416)
And special thanks to our localizers:
el: Jim Spentzos
uk: Lobodzets, uya2521, Іhor Hordiichuk