Skip to content

Deploy October 22, 2026 - #6417

Merged
fatadel merged 45 commits into
productionfrom
main
Oct 22, 2026
Merged

fatadel merged 45 commits into
productionfrom
main

Conversation

@fatadel

@fatadel fatadel commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

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-names to profiler-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

fatadel and others added 30 commits October 9, 2026 14:39
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.
canova and others added 15 commits October 21, 2026 17:22
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.
@fatadel
fatadel requested a review from canova as a code owner October 22, 2026 16:19
@fatadel
fatadel merged commit 5b88c03 into production Oct 22, 2026
55 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants