Deploy July 21, 2026#6210
Merged
Merged
Conversation
<!-- profiler-preview-links:start --> [Main](https://main--perf-html.netlify.app/public/1g98hh2q406ng1dx7517j22qn7tn5nc7wtbkx4g/flame-graph/?globalTrackOrder=0&thread=0&v=16) | [Deploy preview](https://deploy-preview-6161--perf-html.netlify.app/public/1g98hh2q406ng1dx7517j22qn7tn5nc7wtbkx4g/flame-graph/?globalTrackOrder=0&thread=0&v=16) <!-- profiler-preview-links:end --> ## Summary - Limit the preview-link workflow to pull requests that target the main branch. - Skip deployment PRs that target production by not running the workflow for them. ## Example For a deployment PR like #6156 that targets production, the add-preview-links workflow no longer runs, so it will not re-add preview links after they are removed. Addresses #6157. ## Testing - `node --test .github/scripts/add-preview-links.test.mjs` - `node --check .github/scripts/add-preview-links.mjs` - `node --check .github/scripts/add-preview-links.test.mjs` - `git diff --check` - `oxfmt --check .github/scripts/add-preview-links.mjs .github/scripts/add-preview-links.test.mjs`
Co-authored-by: Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com> (sr)
Bumps [ws](https://github.com/websockets/ws) from 8.18.0 to 8.21.0. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](websockets/ws@8.18.0...8.21.0) --- updated-dependencies: - dependency-name: ws dependency-version: 8.21.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nazım Can Altınova <canaltinova@gmail.com>
Add an "over time" section to counter info that splits the current view into time buckets, so a counter's trajectory is visible rather than only an aggregate. Each slice shows the graph-type-appropriate value (level and delta for accumulated counters, the amount for rate counters), its share of the range, and a CO2e estimate where the schema requests one. Values reuse the tooltip formatters and ts-N time names, matching the timeline. A fixed-width sparkline of the trajectory is drawn alongside, in both `counter info` and `counter list`. Closes #6112
Co-authored-by: Olvcpr423 <oliverchan86@outlook.com> (zh-CN) Co-authored-by: Ariel <geo.yujia.wang@gmail.com> (zh-CN)
profile-conversion.test.ts was creating a snapshot file that was just a bunch of raw profile JSONs, with around 900 000 lines total. There's no way to catch regressions with such a test. Whenever we change the shape of the tables in the profile format, it affects so many lines that github's diff viewer will not render the diff, and you wouldn't be able to meaningfully read it anyway. For example, when I introduced the shared tables, I regressed the dhat importer (it was overwriting some tables with empty tables), and I missed the regression even though the test in theory "caught" it. This commit replaces the raw profile snapshots with profile "summary" snapshots. See the new snapshot file for examples. I think the new snapshots are definitely more readable / reviewable, but there's also quite a bit of new code to generate them. I'd be happy to cut back on the amount of detail we collect when we make these summaries, to simplify that new code. (Or maybe we can find a way to share some code with profiler-cli? Not sure.) The new snapshot file is around 500 lines, and around 160 times smaller than the old snapshot file. As a second measure of defense, this commit also adds a generic profile consistency checker function called `assertProfileIntegrity`. This would have caught the dhat regression by itself, because nativeAllocations.stack[0] = 55 would have tripped over the stack table being empty.
<!-- profiler-preview-links:start --> [Main](https://main--perf-html.netlify.app/) | [Deploy preview](https://deploy-preview-6152--perf-html.netlify.app/) <!-- profiler-preview-links:end --> profile-conversion.test.ts was creating a snapshot file that was just a bunch of raw profile JSONs, with around 900 000 lines total. There's no way to catch regressions with such a test. Whenever we change the shape of the tables in the profile format, it affects so many lines that github's diff viewer will not render the diff, and you wouldn't be able to meaningfully read it anyway. For example, when I introduced the shared tables, I regressed the dhat importer (it was overwriting some tables with empty tables), and I missed the regression even though the test in theory "caught" it. This commit replaces the raw profile snapshots with profile "summary" snapshots. See the new snapshot file for examples. I think the new snapshots are definitely more readable / reviewable, but there's also quite a bit of new code to generate them. I'd be happy to cut back on the amount of detail we collect when we make these summaries, to simplify that new code. (Or maybe we can find a way to share some code with profiler-cli? Not sure.) The new snapshot file is around 500 lines, and around 160 times smaller than the old snapshot file. As a second measure of defense, this commit also adds a generic profile consistency checker function called `assertProfileIntegrity`. This would have caught the dhat regression by itself, because nativeAllocations.stack[0] = 55 would have tripped over the stack table being empty.
We already have this split for the SamplesTable, but not yet for the other tables. Having it for all tables means that SamplesLikeTable can always be one of the derived tables. The goal is to make the derived SamplesTable have a Float64Array for the time column, and for the raw tables to allow both number[] and Float64Array for their time or timeDeltas columns. This will be easier once SamplesLikeTable is always a derived table.
The following derived tables now use `Float64Array` for their `time` column: - `SamplesTable` (derived samples) - `CounterSamplesTable` - `JsAllocationsTable` and `UnbalancedNativeAllocationsTable` (derived allocations, introduced by the previous commit) - `SamplesLikeTable` The raw tables still use `number[]`, as before, so the profile format is unchanged.
Same principle as what we've done for the stack table and the samples table. The goal is to have the columns in the derived version always be typed arrays, and the raw ones can take either a typed array or a plain array. This commit doesn't introduce any differences between the raw and derived frame table; the two are identical for now.
Specifically: - `func` as Int32Array - `address` as Int32Array (already uses -1 for "no address") - `inlineDepth` as a Uint8Array. The raw frame table is unchanged, so this does not affect the profile format.
Similar to what we've done for the raw stack table builder: The builder always has plain arrays so that we can add frames one by one by pushing to the column arrays.
…tables. Same idea as with the other builders.
…6139) <!-- profiler-preview-links:start --> [Main](https://main--perf-html.netlify.app/) | [Deploy preview](https://deploy-preview-6139--perf-html.netlify.app/) <!-- profiler-preview-links:end --> This PR adds version 67. Here's a JSLB size profile for [this sp3 profile](https://main--perf-html.netlify.app/from-url/https%3A%2F%2Fstorage.googleapis.com%2Fprofiler-get-symbols-fixtures%2FCVdpkviXTEyAJH37VBMTGQ_compact.jslb.gz/) before the changes from this PR: https://share.firefox.dev/4vleTif This PR takes care of a few more columns, i.e. lets us store more of them as separate slabs.
…sistency. The other getRawXYZBuilderWithExistingContents functions do the same; the samples version is only called in places where we then overwrite the original table so it didn't really make a difference, but let's be consistent with the other tables and actually make it so that if you push to the builder columns, the original table is unaffected.
Co-authored-by: Grk <gu0townkg@relay.firefox.com> (tr)
#6163) Before this commit, renderMarkerFieldValue linkified any url-format field whose value started with `http(s)://`, using the entire value as the href. But it might be possible to have a string that starts with a URL and then continues with a regular text. This commit covers this case as well so it doesn't incorrectly turns invalid urls into clickable links. Now we require the value to be entirely a URL before rendering a link. otherwise fall back to plain text.
Bumps [morgan](https://github.com/expressjs/morgan) from 1.10.0 to 1.11.0. - [Release notes](https://github.com/expressjs/morgan/releases) - [Changelog](https://github.com/expressjs/morgan/blob/master/HISTORY.md) - [Commits](expressjs/morgan@1.10.0...1.11.0) --- updated-dependencies: - dependency-name: morgan dependency-version: 1.11.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nazım Can Altınova <canaltinova@gmail.com>
Counters listed by "pq counter list" gave no hint about which process they belonged to, so profiles with many identically-named counters (one "Process CPU" per process) were impossible to tell apart. Each counter line now carries its process handle, name, and pid, mirroring how "profile info" labels processes so the two outputs cross-reference: c-2: Process CPU (CPU) [p-0 Parent Process, pid 47021] [2787 samples] "counter info" gains a matching Process line. The handle is dropped when the owning process can't be resolved, leaving just the name and pid. Closes #6134
… cli (#6171) It looks like we forgot to add the schemas of these commands while adding. Let's add them now.
…sistency (#6168) <!-- profiler-preview-links:start --> [Main](https://main--perf-html.netlify.app/) | [Deploy preview](https://deploy-preview-6168--perf-html.netlify.app/) <!-- profiler-preview-links:end --> The other getRawXYZBuilderWithExistingContents functions do the same; the samples version is only called in places where we then overwrite the original table so it didn't really make a difference, but let's be consistent with the other tables and actually make it so that if you push to the builder columns, the original table is unaffected.
…summaries Route `collectThreadNetwork` through the `gatherNetworkRecords` / `clampInterval` / `clampedDurationMs` helpers that `profile info` and `thread info` already use, and export them from network-summary.ts. This drops the command's own inline copy of the gather / clamp / count / cache logic, so there is a single source of truth for "what are this thread's network requests."
Expose the profile's metadata via a new `profiler-cli profile meta` command. It mostly mirrors the web UI's "Profile Info" panel. Groups into Recording, Application, Platform, Import, and free-form Extra sections.
…t64Array (#6169) <!-- profiler-preview-links:start --> [Main](https://main--perf-html.netlify.app/) | [Deploy preview](https://deploy-preview-6169--perf-html.netlify.app/) <!-- profiler-preview-links:end --> The "raw" vs "derived" split for markers is a bit different than for the other tables, but regardless, it turns out we can just make the raw version take typed arrays without much trouble. We just needed to add the builder.
<!-- profiler-preview-links:start --> [Main](https://main--perf-html.netlify.app/) | [Deploy preview](https://deploy-preview-6186--perf-html.netlify.app/) <!-- profiler-preview-links:end --> Fixes #6180 ## Summary - Declare the root document's light color scheme explicitly. - Keep the existing `.dark-mode` override so browser-native colors follow the selected Profiler theme instead of the operating-system theme. ## Testing - `yarn test-all` (154 browser suites / 2435 tests passed; 9 CLI suites / 135 tests passed) - `yarn build`
Chrome traces recorded with the "disabled-by-default-devtools.v8-source-rundown" category (enabled by default in the DevTools Performance panel) emit a ScriptCatchup event per parsed script that declares the script's source map URL. This way we will be able to apply source maps to them with the "apply sourcemaps" button later on.
Every time I need to type it by hand, I get annoyed by how long it is :) It's not a huge thing, as mostly the shells have auto-complete, but still I think it's a nice ergonomic improvement.
Co-authored-by: Luna Jernberg <bittin@cafe8bitar.se> (sv-SE)
Husky has been very out of date lately, and it wasn't using the new git `core.hooksPath` for resolving the paths for hooks.
.Details relied on `overflow: clip` to avoid spilling its contents over neighboring panels. But `overflow: clip` is not a scroll container, so it doesn't zero out the flex automatic minimum size the way a scroll container would. As a flex item of .DetailsContainer, .Details kept its content-based min-width and refused to shrink below the min-content width of its widest child. A long transform navigator then could push .Details past its container, overflowed the `contain: size` DetailsContainer (which doesn't clip), and gave the whole viewport a horizontal scrollbar. This regressed in #4606, which replaced react-splitter-layout (whose absolutely-positioned panes gave .Details a definite width) with flexbox. That PR added `min-width: 0` to the sidebar wrapper but not to .Details.
Lets markers display integer values, such as bit flags, in hexadecimal with a "0x" prefix instead of forcing producers to pre-format them into strings. Closes #5998
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Bumps [shell-quote](https://github.com/ljharb/shell-quote) from 1.8.4 to 1.10.0. - [Changelog](https://github.com/ljharb/shell-quote/blob/main/CHANGELOG.md) - [Commits](ljharb/shell-quote@v1.8.4...v1.10.0) --- updated-dependencies: - dependency-name: shell-quote dependency-version: 1.10.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ⬆️ Update oxfmt to version 0.59.0 * Reformat files to satisfy oxfmt 0.59.0 --------- Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> Co-authored-by: fatadel <afatkhutdinov@mozilla.com>
`source-map` package got recently bumped to `0.8.0` which I was waiting eagerly because previous version had a TypeScript type error for `LibSourceMapConsumer.initialize` which we had to workaround. Now we can remove that workaround completely.
Updated locales: fr, sr, sv-SE, tr, zh-CN.
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:
[Sky Ning] Skip preview links for non-main PRs (#6161)
[spokodev] fix(gecko-upgrade): don't crash on a counter with empty sample_groups (#6160)
[fatadel] Show counter values over time in profiler-cli (#6136)
[Markus Stange] Make profile-conversion snapshots more compact and meaningful (#6152)
[Markus Stange] More typed arrays: sample + counter times, some frametable columns (#6139)
[Nazım Can Altınova] Only render a marker url field as a link when the whole value is a URL (#6163)
[fatadel] Show each counter's owning process in profiler-cli (#6164)
[Nazım Can Altınova] Document the pre-existing thread info and network JSON schemas in the cli (#6171)
[Markus Stange] Copy column contents in getRawSamplesTableBuilderFromExisting for consistency (#6168)
[Markus Stange] Convert eligible columns to typed arrays when outputting from profiler-edit (#6167)
[Markus Stange] Remove unused samples.thread column (#6151)
[Markus Stange] Fixed botched merge which broke 'yarn ts' (#6174)
[Nazım Can Altınova] Add marker handles to
profiler-cli thread network(#6172)[Markus Stange] Update json-slabs 0.3.0 → 0.4.0 (major) (#6176)
[Nazım Can Altınova] Surface network activity across profiler-cli (#6175)
[Nazım Can Altınova] Add
profile metacommand to profiler-cli (#6177)[Markus Stange] Allow raw marker table's
startTimeandendTimecolumns to be Float64Array (#6169)[nightcityblade] Fix light theme text selection colors (#6186)
[Nazım Can Altınova] Import source map URLs from Chrome DevTools traces (#6190)
[Nazım Can Altınova] Rename yarn
build-profiler-cliscript tobuild-cli(#6191)[Nazım Can Altınova] Migrate husky to version 9 (#6201)
[Nazım Can Altınova] Fix horizontal overflow when the transform navigator is long (#6199)
[fatadel] Add a 'hexadecimal' marker schema field format (#6197)
[Nazım Can Altınova] Bump source-map to 0.8.0 and remove the old type workaround (#6202)
[Nazım Can Altınova] 🔃 Sync: l10n -> main (July 21, 2026) (#6209)
And special thanks to our localizers:
fr: parmegiani.thomas
fr: Théo Chevalier
sr: Марко Костић (Marko Kostić)
sv-SE: Luna Jernberg
tr: Grk
zh-CN: Ariel
zh-CN: Olvcpr423