Skip to content

Conversation

@runway-github
Copy link
Contributor

@runway-github runway-github bot commented Nov 18, 2025

Description

Automatically restart the extension after MM is updated in order to work
around this chromium bug: https://issues.chromium.org/issues/40805401

It works by listening for the onInstalled event, and if it the
event.reason is "update" and the event.previousVersion is NOT the
current version, and the event.previousVersion has not already been
recorded in the AppStateController, we will reload the extension.

Open in GitHub Codespaces

Changelog

CHANGELOG entry: Automatically restart the extension after MM is updated
in order to work around this chromium bug:
https://issues.chromium.org/issues/40805401

Related issues

Fixes: #37503 (by hopefully making it unnecessary!)

Manual testing steps

Scenarios:

Doesn't fire on initial installation

  1. Install a version of the extension that does NOT have lavamoat (we
    need to use globalThis.chrome) and onboard
  2. open the service worker/background console
  3. logs starting with "[onUpdate]:" should not appear

Doesn't reload before onboarding

  1. close your browser completely (any and all Devtools panels too!)
  2. re-open your browser
  3. open the service_worker/background console
  4. simulate an update event by running this code in the console:
    chrome.runtime.onInstalled.dispatch({reason:"update", "previousVersion": "13.10.9"});
  5. should should see: [onUpdate]: Should reload: undefined
    (undefined indicates we didn't fetch our remote feature flags) in the
    logs

Doesn't fetch feature flags until after onboarding (`Basic

functionality` is left enabled during onboarding)

  1. Monitor the Network tab for
    https://client-config.api.cx.metamask.io/v1/flags
  2. Onboard
  3. you shouldn't see https://client-config.api.cx.metamask.io/v1/flags
    until AFTER onboarding completes.

note: you can ensure we don't fetch feature flags after onboarding by
toggling Basic functionality to off as well.

Reloads after onboarding (Basic functionality is on)

  1. close your browser completely (any and all Devtools panels too!)
  2. re-open your browser
  3. open the service_worker/background console
  4. simulate an update event by running this code in the console:
    chrome.runtime.onInstalled.dispatch({reason:"update", "previousVersion": "13.10.10"});
  5. it will reload only once.

RPC Fallback still works

  1. download a build from this PR (the build needs Quicknode ENV vars,
    which you probably don't have)
  2. install and onboard
  3. prevent connections to mainnet.infura.io however you'd like
    (probably via /etc/hosts)
  4. Check the service_worker console and ensure quicknode URLs show up
    when you open the UI.

Pre-merge author checklist

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the
    app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described
    in the ticket it closes and includes the necessary testing evidence such
    as recordings and or screenshots.

Note

Adds Chromium-only safe reload after updates gated by a remote flag, defers remote feature-flag fetching until post-onboarding/UI open, and enables/disables RPC failover via remote flags, with messenger/test updates.

  • Background/runtime:
    • Add onUpdate(controller, platform, previousVersion, requestSafeReload); on extension update, record version and (non-Firefox) request safe reload when remoteFeatureFlags.extensionPlatformAutoReloadAfterUpdate is true.
    • Lazily refresh remote feature flags whenever UI opens via updateRemoteFeatureFlags(controller); remove inline initializer.
    • Adjust getRequestSafeReload usage and remove requestSafeReload parameter from setupController.
  • Remote Feature Flags:
    • New lib/update-remote-feature-flags.ts helper.
    • Enhance RemoteFeatureFlagControllerInit: use persisted state; enable/disable based on onboarding completion and useExternalServices; subscribe to Preferences and Onboarding changes to toggle and fetch.
    • Messenger updates to allow OnboardingController state/actions and subscribe to its changes.
  • Network:
    • NetworkControllerInit reads RemoteFeatureFlagController:getState and subscribes to stateChange to set isRpcFailoverEnabled from remoteFeatureFlags.walletFrameworkRpcFailoverEnabled.
    • Messenger adds RemoteFeatureFlagController:getState and stateChange support.
  • Tests/fixtures:
    • Update unit tests for new messenger actions and RPC failover behavior.
    • E2E fixtures: add FixtureBuilder.withRemoteFeatureFlags; tests set flags (e.g., enableMultichainAccountsState2, sendRedesign).

Written by Cursor Bugbot for commit ba15bfa. This will update automatically on new commits. Configure here.


Co-authored-by: Ganesh Suresh Patra [email protected]
Co-authored-by: Mark Stacey [email protected]
Co-authored-by: Mark Stacey [email protected] 2eb650f

…e extension after MM is updated in order to work around the chromium bug https://issues.chromium.org/issues/40805401 (#37552)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Automatically restart the extension after MM is updated in order to work
around this chromium bug: https://issues.chromium.org/issues/40805401

It works by listening for the `onInstalled` event, and if it the
`event.reason` is `"update"` and the `event.previousVersion` is NOT the
current version, and the `event.previousVersion` has _not_ already been
recorded in the `AppStateController`, we will reload the extension.

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/37552?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Automatically restart the extension after MM is updated
in order to work around this chromium bug:
https://issues.chromium.org/issues/40805401

## **Related issues**

Fixes: #37503 (by hopefully making it unnecessary!)

## **Manual testing steps**

### Scenarios:

#### Doesn't fire on initial installation

1. Install a version of the extension that does NOT have lavamoat (we
need to use `globalThis.chrome`) and onboard
2. open the service worker/background console
3. logs starting with "[onUpdate]:" should not appear

#### Doesn't reload before onboarding

1. close your browser completely (any and all Devtools panels too!)
2. re-open your browser
3. open the service_worker/background console
4. simulate an update event by running this code in the console:
`chrome.runtime.onInstalled.dispatch({reason:"update",
"previousVersion": "13.10.9"});`
5. should should see: `[onUpdate]: Should reload: undefined`
(`undefined` indicates we didn't fetch our remote feature flags) in the
logs

#### Doesn't fetch feature flags until after onboarding (`Basic
functionality` is left enabled during onboarding)

1. Monitor the Network tab for
`https://client-config.api.cx.metamask.io/v1/flags`
2. Onboard
3. you shouldn't see https://client-config.api.cx.metamask.io/v1/flags
until AFTER onboarding completes.

_note: you can ensure we _don't_ fetch feature flags after onboarding by
toggling `Basic functionality` to off as well._

#### Reloads after onboarding (`Basic functionality` is on)

1. close your browser completely (any and all Devtools panels too!)
2. re-open your browser
3. open the service_worker/background console
4. simulate an update event by running this code in the console:
`chrome.runtime.onInstalled.dispatch({reason:"update",
"previousVersion": "13.10.10"});`
5. it will reload only _once_.

#### RPC Fallback still works

1. download a build from this PR (the build needs Quicknode ENV vars,
which you probably don't have)
2. install and onboard
3. prevent connections to `mainnet.infura.io` however you'd like
(probably via `/etc/hosts`)
4. Check the `service_worker` console and ensure quicknode URLs show up
when you open the UI.

<!-- 
## **Screenshots/Recordings**


### **Before**


### **After**

 -->
## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.



<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds a safe-reload flow on extension update (Chromium, gated by a
remote flag), defers/upgrades remote feature flag handling, and wires
flags into NetworkController to enable/disable RPC failover; updates
messengers, tests, and fixtures.
> 
> - **Background**:
> - Add `onUpdate` handler to record update metadata and trigger safe
reload on Chromium when `extensionPlatformAutoReloadAfterUpdate` flag is
true.
> - Handle `runtime.onInstalled` update path asynchronously and invoke
`onUpdate(controller, platform, previousVersion, requestSafeReload)`.
> - Lazily fetch remote feature flags on UI open via
`updateRemoteFeatureFlags` util.
> - Simplify `setupController` signature (stop passing
`requestSafeReload`).
> - **Remote Feature Flags**:
> - Initialize `RemoteFeatureFlagController` with persisted state; gate
enablement by onboarding completion and `useExternalServices`.
> - Subscribe to `PreferencesController` and `OnboardingController`
state changes to enable/disable and refresh flags.
> - Extend messengers to allow `RemoteFeatureFlagController:getState`
and related `stateChange` events.
> - **Network**:
> - Use remote flag `walletFrameworkRpcFailoverEnabled` to set
`NetworkController` `isRpcFailoverEnabled` at init and toggle on flag
changes.
> - **Tests/Fixtures**:
> - Update unit tests to cover new messenger actions and RPC failover
gating.
> - Add `FixtureBuilder.withRemoteFeatureFlags` and set flags/manifest
in e2e tests.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
802612e. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Ganesh Suresh Patra <[email protected]>
Co-authored-by: Mark Stacey <[email protected]>
Co-authored-by: Mark Stacey <[email protected]>
@runway-github runway-github bot requested review from a team as code owners November 18, 2025 16:53
@github-actions
Copy link
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@metamaskbot metamaskbot added the team-bots Bot team (for MetaMask Bot, Runway Bot, etc.) label Nov 18, 2025
@metamaskbot
Copy link
Collaborator

✨ Files requiring CODEOWNER review ✨

🔑 @MetaMask/accounts-engineers (1 files, +9 -1)
  • 📁 test/
    • 📁 e2e/
      • 📁 tests/
        • 📁 identity/
          • 📁 account-syncing/
            • 📄 balances.spec.ts +9 -1

🧪 @MetaMask/qa (1 files, +8 -0)
  • 📁 test/
    • 📁 e2e/
      • 📄 fixture-builder.js +8 -0

@metamaskbot
Copy link
Collaborator

Builds ready [a313e93]
UI Startup Metrics (1238 ± 115 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12381059167311513231436
load1066919144010611461258
domContentLoaded1060914143410511421250
domInteractive231498191876
firstPaint61185127541510401220
backgroundConnect2332192578238250
firstReactRender30195273245
getState22780112742
initialActions104112
loadScripts83369612031039191009
setupStore1262951524
numNetworkReqs1367519670
BrowserifyPower User HomeuiStartup20361731306734522723067
load1151947183224312651832
domContentLoaded1138939181424112551814
domInteractive561816549110165
firstPaint52319914964079831496
backgroundConnect25623528618277286
firstReactRender58497976279
getState19515730844198308
initialActions101011
loadScripts895710155323410201553
setupStore211158122058
numNetworkReqs1027418742151187
WebpackStandard HomeuiStartup86772315121248681156
load6325641273107620921
domContentLoaded6255581261105613904
domInteractive2012167211563
firstPaint234631006229207869
backgroundConnect271266133058
firstReactRender3620316303768
getState1162431318
initialActions104111
loadScripts6225561250102611893
setupStore1254361323
numNetworkReqs1367619871
WebpackPower User HomeuiStartup1055887164622913481646
load65856010041437861004
domContentLoaded643551981136756981
domInteractive33121043482104
firstPaint29362984302568984
backgroundConnect4591965452196
firstReactRender39364114041
getState1389015821149158
initialActions101011
loadScripts639549971133746971
setupStore1162471624
numNetworkReqs836013926113139
FirefoxBrowserifyStandard HomeuiStartup15321365248015215501797
load12911169186110713101484
domContentLoaded12901169186110713091484
domInteractive59332114255175
firstPaint------
backgroundConnect45261702647101
firstReactRender29235263045
getState1173351122
initialActions204123
loadScripts1263113317829912891450
setupStore158152171432
numNetworkReqs1267216762
BrowserifyPower User HomeuiStartup28952152412965536604129
load14911276188218316551882
domContentLoaded14911276188218316541882
domInteractive22473494140416494
firstPaint------
backgroundConnect3978111744269691174
firstReactRender856311317104113
getState17575617120185617
initialActions223023
loadScripts14471226180317715701803
setupStore803616733107167
numNetworkReqs1236825567177255
WebpackStandard HomeuiStartup16271462212113116861936
load13841228179511414651637
domContentLoaded13841228179411414651637
domInteractive59302103270143
firstPaint------
backgroundConnect50201372454112
firstReactRender342583113649
getState13754101252
initialActions103122
loadScripts13521204170410714131573
setupStore15654111550
numNetworkReqs1366616763
WebpackPower User HomeuiStartup28972434366536731603665
load15941398205816916842058
domContentLoaded15941398205816916832058
domInteractive17476431120289431
firstPaint------
backgroundConnect26959880241550880
firstReactRender76531271787127
getState15411524234159242
initialActions223033
loadScripts15441346186314916641863
setupStore18140631208188631
numNetworkReqs1226921950175219
📊 Page Load Benchmark Results

Current Commit: a313e93 | Date: 11/18/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.03s (±39ms) 🟡 | historical mean value: 1.04s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 719ms (±37ms) 🟢 | historical mean value: 726ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±10ms) 🟢 | historical mean value: 81ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.03s 39ms 1.01s 1.32s 1.05s 1.32s
domContentLoaded 719ms 37ms 701ms 1.00s 727ms 1.00s
firstPaint 76ms 10ms 60ms 160ms 84ms 160ms
firstContentfulPaint 76ms 10ms 60ms 160ms 84ms 160ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

@metamaskbot
Copy link
Collaborator

Builds ready [de92669]
UI Startup Metrics (1224 ± 96 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1224106815039612861403
load106091712908711291197
domContentLoaded105291112818611191193
domInteractive231494181876
firstPaint60583130441810441183
backgroundConnect23522035516237257
firstReactRender27195352938
getState2077192436
initialActions106112
loadScripts825690104486892967
setupStore1072131118
numNetworkReqs1367419670
BrowserifyPower User HomeuiStartup20571790352543420813525
load1138935193026513441930
domContentLoaded1123926190926413241909
domInteractive521817250118172
firstPaint58319119254919551925
backgroundConnect24823428213257282
firstReactRender604690137090
getState20815839462239394
initialActions103113
loadScripts892698165025810941650
setupStore221348112548
numNetworkReqs1007018843149188
WebpackStandard HomeuiStartup85272812371088561170
load622560102095613919
domContentLoaded615554100491607900
domInteractive191293161557
firstPaint215601007233188873
backgroundConnect251072132755
firstReactRender3320217203739
getState1162431317
initialActions102111
loadScripts61255299489605890
setupStore1263951420
numNetworkReqs1367519872
WebpackPower User HomeuiStartup1064909164722212171647
load665574962131849962
domContentLoaded645563945119754945
domInteractive32131043272104
firstPaint37366948300610948
backgroundConnect61112376782237
firstReactRender40374624046
getState1439516724160167
initialActions101011
loadScripts640561934116744934
setupStore96326832
numNetworkReqs79621342483134
FirefoxBrowserifyStandard HomeuiStartup14771335188712615121778
load1245114315109112781474
domContentLoaded1245114215099112781474
domInteractive55351923655164
firstPaint------
backgroundConnect4127120174284
firstReactRender27235142841
getState1164261220
initialActions203122
loadScripts1221112414838712441430
setupStore157190201233
numNetworkReqs1266616858
BrowserifyPower User HomeuiStartup30402325423861937254238
load14581231182318216951823
domContentLoaded14571231182318116941823
domInteractive21279504159453504
firstPaint------
backgroundConnect3627811183567561118
firstReactRender75541031787103
getState192100655142171655
initialActions317137
loadScripts14181203175517116501755
setupStore1122929169159291
numNetworkReqs1237025973233259
WebpackStandard HomeuiStartup16531474208014716782024
load14011240174410614391654
domContentLoaded14001239174310614391653
domInteractive56311412662121
firstPaint------
backgroundConnect50251832657120
firstReactRender342594123773
getState13766111249
initialActions103123
loadScripts1369122116769614001596
setupStore16690151357
numNetworkReqs1366718866
WebpackPower User HomeuiStartup28832346399746530343997
load15831378230922916472309
domContentLoaded15831377230922916472309
domInteractive18470620142265620
firstPaint------
backgroundConnect25383901224241901
firstReactRender72471091679109
getState207121652141192652
initialActions41297329
loadScripts15241345219320515872193
setupStore14342544137132544
numNetworkReqs1236425776246257
📊 Page Load Benchmark Results

Current Commit: de92669 | Date: 11/18/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±46ms) 🟡 | historical mean value: 1.04s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 724ms (±44ms) 🟢 | historical mean value: 725ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 77ms (±16ms) 🟢 | historical mean value: 81ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 46ms 1.01s 1.41s 1.07s 1.41s
domContentLoaded 724ms 44ms 702ms 1.08s 754ms 1.08s
firstPaint 77ms 16ms 60ms 212ms 92ms 212ms
firstContentfulPaint 77ms 16ms 60ms 212ms 92ms 212ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

@metamaskbot
Copy link
Collaborator

Builds ready [e987a18]
UI Startup Metrics (1224 ± 98 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1224108918089812791390
load105992115189011061183
domContentLoaded105391615048811011173
domInteractive2315119181969
firstPaint731157151242410831184
backgroundConnect2322212526234243
firstReactRender26204652735
getState19862102243
initialActions102112
loadScripts828695127588873955
setupStore1061621014
numNetworkReqs1367619670
BrowserifyPower User HomeuiStartup19561717260327521952603
load1094920159021914071590
domContentLoaded1079909156521813991565
domInteractive521815750103157
firstPaint70922414403749731440
backgroundConnect24222727313248273
firstReactRender58467896778
getState20815534353255343
initialActions102012
loadScripts854684131821211651318
setupStore17113451834
numNetworkReqs1017118845170188
WebpackStandard HomeuiStartup83370716571318211126
load6125521410118598891
domContentLoaded6055461388114593861
domInteractive181185151457
firstPaint19757983214180853
backgroundConnect241272142756
firstReactRender31196993543
getState1164051222
initialActions101011
loadScripts6025441378112591850
setupStore1162231217
numNetworkReqs1467620872
WebpackPower User HomeuiStartup1105909175026514281750
load68958510351548501035
domContentLoaded67557910071458371007
domInteractive39131374287137
firstPaint3536210443365961044
backgroundConnect49101765267176
firstReactRender42374524345
getState1379415919146159
initialActions102112
loadScripts671577997142825997
setupStore1172561325
numNetworkReqs83661332391133
FirefoxBrowserifyStandard HomeuiStartup14801334185111515301741
load1254114515938713031444
domContentLoaded1253114515938713031443
domInteractive58331903260143
firstPaint------
backgroundConnect4126136174967
firstReactRender27226462741
getState1176661118
initialActions103122
loadScripts1230112815668412791403
setupStore1277881124
numNetworkReqs1267316757
BrowserifyPower User HomeuiStartup28652300401754833284017
load14771308183317316661833
domContentLoaded14771307183317316651833
domInteractive23277464156443464
firstPaint------
backgroundConnect3747611873989191187
firstReactRender81451121795112
getState17164569110186569
initialActions213023
loadScripts14161257167615016061676
setupStore11141580126126580
numNetworkReqs1247025870210258
WebpackStandard HomeuiStartup16481462201413617021948
load13871221168210114201625
domContentLoaded13871221168210114201624
domInteractive55301542764125
firstPaint------
backgroundConnect50251342453117
firstReactRender362599143682
getState137152161230
initialActions203122
loadScripts1357120416169213981556
setupStore17778161553
numNetworkReqs1366717864
WebpackPower User HomeuiStartup30032369439656233194396
load16441474189814117241898
domContentLoaded16431474189814117241898
domInteractive20361419101284419
firstPaint------
backgroundConnect2907511793263941179
firstReactRender78491151791115
getState17611332854207328
initialActions215135
loadScripts16031430185914016751859
setupStore16121574183147574
numNetworkReqs1246823660183236
📊 Page Load Benchmark Results

Current Commit: e987a18 | Date: 11/18/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.03s (±39ms) 🟡 | historical mean value: 1.04s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 715ms (±36ms) 🟢 | historical mean value: 724ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±13ms) 🟢 | historical mean value: 79ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.03s 39ms 1.00s 1.30s 1.08s 1.30s
domContentLoaded 715ms 36ms 693ms 974ms 756ms 974ms
firstPaint 76ms 13ms 60ms 196ms 84ms 196ms
firstContentfulPaint 76ms 13ms 60ms 196ms 84ms 196ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

@metamaskbot
Copy link
Collaborator

Builds ready [1a8aafd]
UI Startup Metrics (1212 ± 84 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1212105314538412781349
load104591412547811071167
domContentLoaded103990912347710991160
domInteractive221486161867
firstPaint59181126741510411153
backgroundConnect2322192738236247
firstReactRender3019141133345
getState21769102447
initialActions106113
loadScripts813685100077876936
setupStore1053241018
numNetworkReqs1367620674
BrowserifyPower User HomeuiStartup19521724238322521802383
load1101939171922913881719
domContentLoaded1088933169922613721699
domInteractive511815147112151
firstPaint84315717254079961725
backgroundConnect2422302709246270
firstReactRender584795116095
getState19716728832210288
initialActions102012
loadScripts861705147322511391473
setupStore21134592345
numNetworkReqs987117740157177
WebpackStandard HomeuiStartup8317051164848361084
load61055993176612853
domContentLoaded60355291073602837
domInteractive181280151458
firstPaint20556913204199586
backgroundConnect251265123052
firstReactRender31194073638
getState1061731215
initialActions102011
loadScripts60055090071600827
setupStore1163131215
numNetworkReqs1367419870
WebpackPower User HomeuiStartup1078900187627513001876
load66656510671587921067
domContentLoaded64455510181407581018
domInteractive37121354192135
firstPaint26672921232405921
backgroundConnect581021268156212
firstReactRender40374524145
getState1409216323157163
initialActions101011
loadScripts64055410071367481007
setupStore106257925
numNetworkReqs826113027124130
FirefoxBrowserifyStandard HomeuiStartup14551298214115214661788
load1224111916589812521423
domContentLoaded1224111916579812521423
domInteractive54332093553149
firstPaint------
backgroundConnect4127190214671
firstReactRender27225352741
getState127207201022
initialActions103122
loadScripts1200110214928812231393
setupStore148192191231
numNetworkReqs1266315759
BrowserifyPower User HomeuiStartup29252207444571433914445
load14411268174917617221749
domContentLoaded14411268174917617211749
domInteractive22179701180423701
firstPaint------
backgroundConnect3176010593176021059
firstReactRender815610718104107
getState17898566107174566
initialActions318268
loadScripts13991238170417116421704
setupStore18920588190385588
numNetworkReqs1237026275236262
WebpackStandard HomeuiStartup16471447225614917051957
load13991214204413914591658
domContentLoaded13981214204313914591658
domInteractive60302924166172
firstPaint------
backgroundConnect50201482653113
firstReactRender342585123476
getState157177201351
initialActions103122
loadScripts13681193201913214041624
setupStore13781111233
numNetworkReqs1366717765
WebpackPower User HomeuiStartup31202430470466837684704
load16581459225323618352253
domContentLoaded16581459225323518352253
domInteractive20869702163353702
firstPaint------
backgroundConnect3385711503476271150
firstReactRender794995108695
getState21088681128209681
initialActions324134
loadScripts16151435217922317822179
setupStore15344577151152577
numNetworkReqs1247025671228256
📊 Page Load Benchmark Results

Current Commit: 1a8aafd | Date: 11/18/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±68ms) 🟡 | historical mean value: 1.04s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 728ms (±67ms) 🟢 | historical mean value: 726ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 75ms (±12ms) 🟢 | historical mean value: 77ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 68ms 1.00s 1.31s 1.25s 1.31s
domContentLoaded 728ms 67ms 695ms 990ms 929ms 990ms
firstPaint 75ms 12ms 60ms 168ms 84ms 168ms
firstContentfulPaint 75ms 12ms 60ms 168ms 84ms 168ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

@metamaskbot
Copy link
Collaborator

Builds ready [ba15bfa]
UI Startup Metrics (1220 ± 87 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1220107714968712741377
load105892712757911151193
domContentLoaded105192212677811101183
domInteractive221581161871
firstPaint63092127241710711197
backgroundConnect23422029510236256
firstReactRender28195772943
getState2175882434
initialActions103112
loadScripts823692104778883951
setupStore1062431114
numNetworkReqs1367419669
BrowserifyPower User HomeuiStartup19661662264727421962647
load1075926146419913841464
domContentLoaded1063918144919713601449
domInteractive511613747123137
firstPaint58218514034279651403
backgroundConnect24322428717249287
firstReactRender574493126193
getState20615131644233316
initialActions105115
loadScripts834691117518611291175
setupStore18113981739
numNetworkReqs1016918545165185
WebpackStandard HomeuiStartup8297071215918311051
load60955898782609825
domContentLoaded60255396978604809
domInteractive171278131552
firstPaint19263972184190728
backgroundConnect25967132858
firstReactRender30196783640
getState1153451219
initialActions103111
loadScripts59955195976601799
setupStore1163441317
numNetworkReqs1367419870
WebpackPower User HomeuiStartup984825147123512351471
load605517842117697842
domContentLoaded588507801107659801
domInteractive33131203479120
firstPaint32461806262525806
backgroundConnect581019370159193
firstReactRender39364524045
getState1157213321128133
initialActions101011
loadScripts584505794105651794
setupStore105257925
numNetworkReqs846313026127130
FirefoxBrowserifyStandard HomeuiStartup14641310184912214911756
load1239112916128912531473
domContentLoaded1238112916128912521473
domInteractive59351973165137
firstPaint------
backgroundConnect4026153194184
firstReactRender26216572539
getState12769101122
initialActions103122
loadScripts1215111015758412331437
setupStore177209241260
numNetworkReqs1467820875
BrowserifyPower User HomeuiStartup30372387475373636444753
load14981295199320817631993
domContentLoaded14981295199220817631992
domInteractive22476618173418618
firstPaint------
backgroundConnect3639312413887331241
firstReactRender81551402190140
getState17412426131192261
initialActions317137
loadScripts14521258195020916991950
setupStore18848631180242631
numNetworkReqs1247025474244254
WebpackStandard HomeuiStartup16621465209513416921974
load14101229172810614571648
domContentLoaded14101229172810614571648
domInteractive62311913869164
firstPaint------
backgroundConnect50241312255109
firstReactRender3526147143545
getState1276191318
initialActions207122
loadScripts13791205169110414211614
setupStore16799161355
numNetworkReqs1367017864
WebpackPower User HomeuiStartup29462448405047631464050
load16551457212320619152123
domContentLoaded16541457212220619142122
domInteractive20270558145333558
firstPaint------
backgroundConnect22292642179246642
firstReactRender76481091584109
getState287116710206529710
initialActions42103710
loadScripts16141432208220218492082
setupStore996018438110184
numNetworkReqs1226925869214258
📊 Page Load Benchmark Results

Current Commit: ba15bfa | Date: 11/18/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.05s (±43ms) 🟡 | historical mean value: 1.04s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 738ms (±64ms) 🟢 | historical mean value: 726ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 83ms (±44ms) 🟢 | historical mean value: 77ms ⬆️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.05s 43ms 1.03s 1.37s 1.07s 1.37s
domContentLoaded 738ms 64ms 713ms 1.32s 752ms 1.32s
firstPaint 83ms 44ms 64ms 516ms 88ms 516ms
firstContentfulPaint 83ms 44ms 64ms 516ms 88ms 516ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants