Skip to content

fix: stop showing update modal when required version isn't in store yet#39884

Merged
gauthierpetetin merged 16 commits intomainfrom
fix/39570-update-modal-pending-version
Feb 20, 2026
Merged

fix: stop showing update modal when required version isn't in store yet#39884
gauthierpetetin merged 16 commits intomainfrom
fix/39570-update-modal-pending-version

Conversation

@gauthierpetetin
Copy link
Contributor

@gauthierpetetin gauthierpetetin commented Feb 6, 2026

Description

Replaces the update-modal’s isUpdateAvailable boolean with pendingExtensionVersion (string | null). When the browser reports an available update via runtime.onUpdateAvailable, we store the pending version and only show the force-upgrade modal when:

  1. there is a pending version newer than the current version, and
  2. the current version is below the remote minimum.

This avoids prompting users when the store doesn’t yet offer a version that satisfies the minimum (e.g. Firefox publishing lag) and keeps a single source of truth (pending version implies “update available”).

Open in GitHub Codespaces

Changelog

CHANGELOG entry: Adjusts update modal logic to use the pending extension version and only show when a newer version is available.

Related issues

Fixes: #39570

Manual testing steps

  1. Build the extension (yarn start).
  2. Load the extension and complete onboarding/unlock if needed.
  3. From the background context (e.g. service worker console), run: controller.appStateController.setPendingExtensionVersion('99.0.0') and ensure remote feature flags set extensionUpdatePromptMinimumVersion above current version; open the extension UI and confirm the update modal appears.
  4. Repeat with setPendingExtensionVersion(version) (same as current version) and confirm the update modal does not appear.
  5. Dismiss the modal and confirm it respects the 24h cooldown (or adjust time for testing).

To set remote feature flags, you can add the following in .manifest-overrides.json

{
  "_flags": {
    "remoteFeatureFlags": {
      "extensionUpdatePromptMinimumVersion": "x.y.z"
    }
  }
}

and the following line in .metamaskrc:


MANIFEST_OVERRIDES=.manifest-overrides.json

Screenshots/Recordings

N/A – No UI changes to the modal itself; behavior change is when it is shown/hidden.

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

Medium Risk
Changes the logic that determines when the forced update modal appears and introduces custom version parsing/comparison (including 4-segment versions), which could affect upgrade prompting behavior across browsers.

Overview
Updates the force-upgrade/update-modal flow to track a specific pending store version instead of a boolean flag. runtime.onUpdateAvailable now stores details.version in AppStateController.pendingExtensionVersion, and this value is cleared on successful update install via onUpdate.

getShowUpdateModal is rewritten to only show when a newer pending version exists and the current version is below the remote minimum, with added comparison support for four-segment build versions (e.g. 10.2.3.111). Types, Sentry masks/state snapshots, mocks, and E2E/unit tests are updated accordingly (including a new test ensuring the modal doesn’t show when the pending version isn’t newer than current).

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

- Replace isUpdateAvailable with pendingExtensionVersion in AppStateController
- Set pending version from runtime.onUpdateAvailable(details.version) in background
- Clear pending version in onUpdate when update is applied
- Update getShowUpdateModal: show only when pending > current and current < minimum
- Add E2E test for 'pending not newer than current' and fix update-modal confirm wait
- Update fixtures, types, and JSDoc

Co-authored-by: Cursor <cursoragent@cursor.com>
@gauthierpetetin gauthierpetetin self-assigned this Feb 6, 2026
@gauthierpetetin gauthierpetetin added the team-extension-platform Extension Platform team label Feb 6, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Feb 6, 2026

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.

@gauthierpetetin gauthierpetetin changed the title fix: use pendingExtensionVersion for update modal (fixes #39570) fix: use pendingExtensionVersion for update modal Feb 6, 2026
@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Feb 6, 2026

✨ Files requiring CODEOWNER review ✨

🕵️ @MetaMask/extension-privacy-reviewers (1 files, +1 -1)
  • 📁 test/
    • 📁 e2e/
      • 📁 tests/
        • 📁 settings/
          • 📄 state-logs.json +1 -1

🧪 @MetaMask/qa (1 files, +1 -1)
  • 📁 test/
    • 📁 e2e/
      • 📁 tests/
        • 📁 settings/
          • 📄 state-logs.json +1 -1

@gauthierpetetin gauthierpetetin changed the title fix: use pendingExtensionVersion for update modal fix: stop showing update modal when required version isn't in store yet Feb 6, 2026
@github-actions github-actions bot added the size-M label Feb 6, 2026
Co-authored-by: Cursor <cursoragent@cursor.com>
@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Feb 6, 2026

Builds ready [a242d0d]
UI Startup Metrics (1370 ± 103 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup13701166173210314161524
load117899715009712291336
domContentLoaded116996614269212221322
domInteractive2616114212279
firstPaint162661269162199287
backgroundConnect23321354734232256
firstReactRender17113341925
initialActions106113
loadScripts95275312089410061106
setupStore1366471520
numNetworkReqs231589201582
BrowserifyPower User HomeuiStartup192013521001389118862240
load11751041197416511631614
domContentLoaded11621031196316311521563
domInteractive39182984033117
firstPaint1747352888238298
backgroundConnect4192867727745347425
firstReactRender22144662333
initialActions103111
loadScripts91179816341499141300
setupStore1684661727
numNetworkReqs1124924446137208
WebpackStandard HomeuiStartup8346681085878831002
load69959886777758843
domContentLoaded69359586076753836
domInteractive251686172274
firstPaint1116334752140198
backgroundConnect40181402748106
firstReactRender16103551727
initialActions104112
loadScripts69059385875751829
setupStore1163341220
numNetworkReqs231598221587
WebpackPower User HomeuiStartup1238892203821313381689
load71361211451137001004
domContentLoaded7046061131113689998
domInteractive3117125233099
firstPaint147631139152151264
backgroundConnect1586536046156263
firstReactRender21174742227
initialActions102011
loadScripts7016041121111687991
setupStore1264451320
numNetworkReqs1235027854145252
FirefoxBrowserifyStandard HomeuiStartup16481344270220417551992
load13991165253718914831682
domContentLoaded13981165253718914821682
domInteractive8433119612191169
firstPaint------
backgroundConnect66272173866146
firstReactRender1292721314
initialActions102112
loadScripts13631140252017914411595
setupStore145122171133
numNetworkReqs241198211888
BrowserifyPower User HomeuiStartup28292035442853429903950
load15881213249030717322340
domContentLoaded15871213249030717272339
domInteractive11634552109113372
firstPaint------
backgroundConnect3291171345284333981
firstReactRender17142821921
initialActions103122
loadScripts15281187246427515812185
setupStore1186765177107572
numNetworkReqs68381523088131
WebpackStandard HomeuiStartup16401352242220717231965
load14001193192614514971620
domContentLoaded13991192192514514921620
domInteractive882724445119170
firstPaint------
backgroundConnect70252835292154
firstReactRender15115461522
initialActions103122
loadScripts13601147190013114191578
setupStore165163231253
numNetworkReqs231284181873
WebpackPower User HomeuiStartup27271901838874227843737
load15651243712361616022162
domContentLoaded15641243712361616022162
domInteractive1083160288106216
firstPaint------
backgroundConnect3291141362286340950
firstReactRender22157482430
initialActions206123
loadScripts15091223707859615591941
setupStore1718815218229717
numNetworkReqs67371623290126
📊 Page Load Benchmark Results

Current Commit: a242d0d | Date: 2/6/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.05s (±43ms) 🟡 | historical mean value: 1.03s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 729ms (±41ms) 🟢 | historical mean value: 720ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 77ms (±13ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.05s 43ms 1.01s 1.38s 1.08s 1.38s
domContentLoaded 729ms 41ms 701ms 1.05s 756ms 1.05s
firstPaint 77ms 13ms 60ms 196ms 88ms 196ms
firstContentfulPaint 77ms 13ms 60ms 196ms 88ms 196ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs
  • background: 192 Bytes (0%)
  • ui: 0 Bytes (0%)
  • common: 133 Bytes (0%)

pendingExtensionVersion was set to string '0.0.0' but maskObject() only
accepts true, false, or sub-mask objects. That caused a throw when
Sentry attached state to traces, preventing the trace from being sent
and failing the Traces E2E tests. Use true so the value is included.

Co-authored-by: Cursor <cursoragent@cursor.com>
@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Feb 6, 2026

Builds ready [377c3d0]
UI Startup Metrics (1461 ± 99 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1461126717039915301613
load12481025146310013161417
domContentLoaded12411015145210113101407
domInteractive2817101182578
firstPaint153691085114200255
backgroundConnect24722530516253280
firstReactRender17102841924
initialActions107114
loadScripts1009779121510010821161
setupStore1263551521
numNetworkReqs231595201582
BrowserifyPower User HomeuiStartup17281377250717418021992
load11431022167815511241580
domContentLoaded11291017166915311051569
domInteractive3518167253588
firstPaint185711482154228324
backgroundConnect31928346631331378
firstReactRender23155872336
initialActions104112
loadScripts89378214371478751319
setupStore1674771727
numNetworkReqs1162827751137223
WebpackStandard HomeuiStartup87568011651179541077
load7466031026113820969
domContentLoaded7406001016112812963
domInteractive2616106172373
firstPaint1125966273138196
backgroundConnect3518148263681
firstReactRender15103441625
initialActions104112
loadScripts7385981014112806962
setupStore1052431114
numNetworkReqs231587201582
WebpackPower User HomeuiStartup1223853206020813181625
load70161512091246911046
domContentLoaded69261011981246791040
domInteractive36172203333102
firstPaint144641078134150364
backgroundConnect17212939365160341
firstReactRender21163732227
initialActions104111
loadScripts68960811861226771030
setupStore1254461318
numNetworkReqs1164429055146230
FirefoxBrowserifyStandard HomeuiStartup16361335237822817352119
load13771158194318214391743
domContentLoaded13761158194318214391743
domInteractive67322083888147
firstPaint------
backgroundConnect67272303963148
firstReactRender12102021316
initialActions103112
loadScripts13411137189517014041716
setupStore164157241159
numNetworkReqs251196231889
BrowserifyPower User HomeuiStartup27671992486954528713961
load15781243237829917052213
domContentLoaded15771243237729917042212
domInteractive11734608108107447
firstPaint------
backgroundConnect288661399244318885
firstReactRender18142931923
initialActions203122
loadScripts15191226222426016152098
setupStore118870917699523
numNetworkReqs64261523285123
WebpackStandard HomeuiStartup16561357231818317772028
load14051182183312414861618
domContentLoaded14041182183312514851617
domInteractive852821744127148
firstPaint------
backgroundConnect78252715898201
firstReactRender15105441618
initialActions103122
loadScripts13621132169010614181540
setupStore206179291465
numNetworkReqs231282181876
WebpackPower User HomeuiStartup27042010442451027953813
load15401184253832016732364
domContentLoaded15391184253832016722364
domInteractive11433572116104442
firstPaint------
backgroundConnect3381181385308339926
firstReactRender20153952329
initialActions213123
loadScripts14821169251126816261928
setupStore1798772222296679
numNetworkReqs63331272991113
📊 Page Load Benchmark Results

Current Commit: 377c3d0 | Date: 2/6/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±37ms) 🟡 | historical mean value: 1.05s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 722ms (±34ms) 🟢 | historical mean value: 731ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±13ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 37ms 1.01s 1.31s 1.05s 1.31s
domContentLoaded 722ms 34ms 704ms 977ms 739ms 977ms
firstPaint 76ms 13ms 60ms 196ms 84ms 196ms
firstContentfulPaint 76ms 13ms 60ms 196ms 84ms 196ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs
  • background: 192 Bytes (0%)
  • ui: 0 Bytes (0%)
  • common: 128 Bytes (0%)

Revert to delay(3000) + waitUntilXWindowHandles(1) to mitigate
webdriver disconnect race when tab is closed and re-opened after
confirming the update.

Co-authored-by: Cursor <cursoragent@cursor.com>
@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Feb 9, 2026

Builds ready [044603b]
UI Startup Metrics (1405 ± 99 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1405122717749914701561
load1204100515479812591348
domContentLoaded119799315419712531340
domInteractive271693192382
firstPaint150651261129201241
backgroundConnect23721530117238274
firstReactRender18123752027
initialActions108215
loadScripts976761129610010351122
setupStore1363861522
numNetworkReqs231589211584
BrowserifyPower User HomeuiStartup17281406272620317792034
load11491013209718711231603
domContentLoaded11361000208218611111595
domInteractive36181572935111
firstPaint1757259490229321
backgroundConnect32028244327327372
firstReactRender21144452231
initialActions106112
loadScripts89677717481748731309
setupStore1565571625
numNetworkReqs1184727550139238
WebpackStandard HomeuiStartup87668410971109511075
load734616992102803944
domContentLoaded729612985101798938
domInteractive261591182379
firstPaint1066328646124197
backgroundConnect3417133203776
firstReactRender17103661830
initialActions105112
loadScripts726610983100794936
setupStore1263661226
numNetworkReqs231587201582
WebpackPower User HomeuiStartup1269960216921913551762
load72160614531427081093
domContentLoaded71260114361407001081
domInteractive38181763037120
firstPaint15065830131148496
backgroundConnect17512939763172334
firstReactRender21163132327
initialActions102111
loadScripts70959914261386981072
setupStore1244361322
numNetworkReqs1174728754145268
FirefoxBrowserifyStandard HomeuiStartup15961288209319117251916
load13441138182715214271612
domContentLoaded13431138182215214271612
domInteractive65263374484134
firstPaint------
backgroundConnect60251583160132
firstReactRender12101911315
initialActions102122
loadScripts13121122179914913891571
setupStore145140201247
numNetworkReqs251394221889
BrowserifyPower User HomeuiStartup28112021663067628653891
load15891280527547515662359
domContentLoaded15881280527447515662359
domInteractive12534778128112388
firstPaint------
backgroundConnect3201191435280327903
firstReactRender19146461925
initialActions103122
loadScripts15401257524646314952228
setupStore1477761200146660
numNetworkReqs673715234100133
WebpackStandard HomeuiStartup15981336201915317241833
load13631206157410314561525
domContentLoaded13621206157410314561525
domInteractive913023246130166
firstPaint------
backgroundConnect752521747117161
firstReactRender14114341418
initialActions2043412
loadScripts1318118414808313791451
setupStore185189301275
numNetworkReqs241295191875
WebpackPower User HomeuiStartup28042011892377728563904
load16431282682761917122480
domContentLoaded16421281682761917122479
domInteractive144321368187122535
firstPaint------
backgroundConnect3151171570263309900
firstReactRender22166762532
initialActions207123
loadScripts16001262679760816672389
setupStore1725767207236631
numNetworkReqs66361363199129
📊 Page Load Benchmark Results

Current Commit: 044603b | Date: 2/9/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 984ms (±37ms) 🟢 | historical mean value: 1.05s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 682ms (±35ms) 🟢 | historical mean value: 731ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±9ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 984ms 37ms 956ms 1.23s 1.03s 1.23s
domContentLoaded 682ms 35ms 661ms 926ms 715ms 926ms
firstPaint 76ms 9ms 60ms 148ms 84ms 148ms
firstContentfulPaint 76ms 9ms 60ms 148ms 84ms 148ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs
  • background: 192 Bytes (0%)
  • ui: 0 Bytes (0%)
  • common: 128 Bytes (0%)

State logs E2E expects the type map to match downloaded state; when
no update is pending the value is null, so the reference type is
set to "null" to match.

Co-authored-by: Cursor <cursoragent@cursor.com>
@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Feb 16, 2026

Builds ready [f49316b]
UI Startup Metrics (1389 ± 109 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup13891204190910914251563
load1197101815969212391351
domContentLoaded1192101415879112341338
domInteractive271688172479
firstPaint153691234130205282
backgroundConnect25023532914253277
firstReactRender2010207201932
initialActions105113
loadScripts95578313299110021100
setupStore1263451522
numNetworkReqs231589201582
BrowserifyPower User HomeuiStartup3204150110863219136939302
load12941109169012613301569
domContentLoaded12741098165811813011539
domInteractive3420126193370
firstPaint207741303138263333
backgroundConnect12893189050189011724651
firstReactRender25175162837
initialActions1012112
loadScripts1006835140211410351267
setupStore17781101834
numNetworkReqs904814624106130
WebpackStandard HomeuiStartup88971312331059691065
load771639108198847932
domContentLoaded764634107497839924
domInteractive2917100192685
firstPaint1316840060169223
backgroundConnect28186283245
firstReactRender16114061927
initialActions104112
loadScripts761632107296835922
setupStore1373651323
numNetworkReqs231587201582
WebpackPower User HomeuiStartup1344986300027114201802
load79866513161208151119
domContentLoaded78566013111218001107
domInteractive45202183841130
firstPaint1646847586183318
backgroundConnect1821361005107168290
firstReactRender23185342530
initialActions101011
loadScripts78265813021197981095
setupStore1344051622
numNetworkReqs1407225435155199
FirefoxBrowserifyStandard HomeuiStartup16071383232919316062072
load13881190210215713991664
domContentLoaded13871189209615613991663
domInteractive843625243108154
firstPaint------
backgroundConnect5627155185886
firstReactRender12112421314
initialActions103012
loadScripts13611163207215313721642
setupStore167123181432
numNetworkReqs241397211783
BrowserifyPower User HomeuiStartup28812065720659830373460
load16171303588949016372033
domContentLoaded16171303588949016372032
domInteractive182441592196197460
firstPaint------
backgroundConnect48213413703447901100
firstReactRender18156351922
initialActions217122
loadScripts15761277583648516041921
setupStore12013793160122561
numNetworkReqs93442303996168
WebpackStandard HomeuiStartup15681350190012516581797
load1365118016289614241507
domContentLoaded1364117516289614241506
domInteractive842824847120154
firstPaint------
backgroundConnect52251682757112
firstReactRender14112431419
initialActions102112
loadScripts1342116615579214041486
setupStore156162211253
numNetworkReqs231287181774
WebpackPower User HomeuiStartup27582015432836429283282
load15351313281121115901935
domContentLoaded15341313281121115901934
domInteractive171521406178160489
firstPaint------
backgroundConnect448741391278656935
firstReactRender22157072430
initialActions2013122
loadScripts14901249277920815201896
setupStore16810711191255562
numNetworkReqs88372403797165
📊 Page Load Benchmark Results

Current Commit: f49316b | Date: 2/16/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.06s (±42ms) 🟡 | historical mean value: 1.05s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 750ms (±39ms) 🟢 | historical mean value: 738ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 83ms (±11ms) 🟢 | historical mean value: 87ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.06s 42ms 1.02s 1.36s 1.09s 1.36s
domContentLoaded 750ms 39ms 715ms 1.03s 780ms 1.03s
firstPaint 83ms 11ms 72ms 180ms 88ms 180ms
firstContentfulPaint 83ms 11ms 72ms 180ms 88ms 180ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs
  • background: 192 Bytes (0%)
  • ui: 5 Bytes (0%)
  • common: 128 Bytes (0%)

/**
* Determines whether the update modal should be shown.
*
* Logic:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: would be nice to append some unit tests to reflect the logic

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, they're now added in this commit: 04fc190

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Feb 17, 2026

Builds ready [a158b3f]
UI Startup Metrics (1405 ± 108 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup14051169192210814801548
load12101017165510112861348
domContentLoaded1205101016339912791339
domInteractive2815135212480
firstPaint157691265137203333
backgroundConnect25023128913255275
firstReactRender16104551821
initialActions107113
loadScripts96977413839810391101
setupStore1374261524
numNetworkReqs231589211585
BrowserifyPower User HomeuiStartup252814709945147924325277
load12541065180916512741655
domContentLoaded12361050180016112621637
domInteractive38192513633114
firstPaint1977445292272360
backgroundConnect69729741068055662451
firstReactRender24154362737
initialActions104113
loadScripts97679015211559911359
setupStore18868101936
numNetworkReqs1134926246135205
WebpackStandard HomeuiStartup8357051223958791011
load727622105192778909
domContentLoaded722617104492774903
domInteractive271695182479
firstPaint1156331758129228
backgroundConnect27195573140
firstReactRender15103251724
initialActions104112
loadScripts719615103490772897
setupStore1264161322
numNetworkReqs231590201583
WebpackPower User HomeuiStartup1295937208119613661684
load75565011851217331091
domContentLoaded74564311781227231082
domInteractive41201643239134
firstPaint1457053183158288
backgroundConnect18113372886173299
firstReactRender24184542530
initialActions103111
loadScripts74264011691207211071
setupStore1455571624
numNetworkReqs1344827746153244
FirefoxBrowserifyStandard HomeuiStartup16571404263919616821970
load14321212243817214551661
domContentLoaded14301205243817214531660
domInteractive8734111011195139
firstPaint------
backgroundConnect6131205236386
firstReactRender13102621316
initialActions103122
loadScripts14031186241316614261635
setupStore167124161548
numNetworkReqs241293201881
BrowserifyPower User HomeuiStartup28561993401435430103477
load16081342282525816702098
domContentLoaded16081342282525816692097
domInteractive180361418204148634
firstPaint------
backgroundConnect3541261252249499864
firstReactRender221571122053
initialActions203122
loadScripts15711318277725316402063
setupStore1589727189164587
numNetworkReqs893917736107161
WebpackStandard HomeuiStartup16151382216313516581923
load14071195165710314691599
domContentLoaded14061195165610314681599
domInteractive902923443123150
firstPaint------
backgroundConnect52251462454114
firstReactRender14112531422
initialActions102122
loadScripts1383117316289814431558
setupStore146119151242
numNetworkReqs231293191776
WebpackPower User HomeuiStartup27712023415041229643605
load15741298243924216562050
domContentLoaded15741298243924216552049
domInteractive14333900149133442
firstPaint------
backgroundConnect3621331038236501853
firstReactRender23175862634
initialActions208123
loadScripts15301205228822316162018
setupStore19013867224238721
numNetworkReqs81352233595153
📊 Page Load Benchmark Results

Current Commit: a158b3f | Date: 2/17/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±42ms) 🟡 | historical mean value: 1.05s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 730ms (±39ms) 🟢 | historical mean value: 741ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 79ms (±11ms) 🟢 | historical mean value: 83ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 42ms 1.02s 1.34s 1.05s 1.34s
domContentLoaded 730ms 39ms 709ms 1.02s 741ms 1.02s
firstPaint 79ms 11ms 64ms 164ms 88ms 164ms
firstContentfulPaint 79ms 11ms 64ms 164ms 88ms 164ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs
  • background: 192 Bytes (0%)
  • ui: 5 Bytes (0%)
  • common: 128 Bytes (0%)

@hjetpoluru hjetpoluru self-requested a review February 19, 2026 14:27
hjetpoluru
hjetpoluru previously approved these changes Feb 19, 2026
Copy link
Contributor

@hjetpoluru hjetpoluru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

QA related files are lgtm.

davidmurdoch
davidmurdoch previously approved these changes Feb 19, 2026
Copy link
Contributor

@davidmurdoch davidmurdoch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

approved with one comment. if you do "fix" this issue now (which isn't really an issue!) ping me and I'll give a quick second approval.

semver.coerce(remoteFeatureFlags.extensionUpdatePromptMinimumVersion),
);
const isExtensionOutdated =

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might be an existing "issue", and maybe not even worth fixing.

I was wondering if we need to be concerned with "pre-release" versions?

For prereleases we technically support the ability to have public releases versions like:

10.2.3.111
10.2.3.112
10.2.3.113

yarn webpack --type beta --releaseVersion 2 would output something like 10.2.3.112 (beta has an id of 11, and when releaseVersion is 2 it will generate a 4th segment in the version number equal to 112)

Since semver.coerce lops off the last segment here (since it isn't valid semver) we wouldn't be able to show the update prompt when the installed version of 10.2.3.111 and the update version is 10.2.3.112, since semver.gt(pendingVersionValid, extensionCurrentVersion) will return false.

Again, not a serious concern, since we don't currently do this. Just thought I'd mention it here since I thought about it and you're in here editing this code already :-)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea, here's a commit to handle it: a4fbd64

@github-project-automation github-project-automation bot moved this from Needs dev review to Review finalised - Ready to be merged in PR review queue Feb 19, 2026
gauthierpetetin and others added 2 commits February 19, 2026 18:34
- Add versionToComparable() and isExtensionVersionNewer() for 3- and 4-segment versions
- Use new comparison in getShowUpdateModal so beta builds (e.g. 10.2.3.111 -> 10.2.3.112) show update prompt
- Add unit tests for four-segment version comparison

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Feb 19, 2026

Builds ready [0bc37b2]
UI Startup Metrics (1560 ± 114 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup15601294211111416131754
load13171074176011013741485
domContentLoaded13091070175110613701472
domInteractive3019128202681
firstPaint191741311170237287
backgroundConnect27624632915283301
firstReactRender21136882136
initialActions105114
loadScripts1050820148110411051211
setupStore1475461523
numNetworkReqs312285182880
BrowserifyPower User HomeuiStartup16751349278920417232033
load11301018207916811071544
domContentLoaded11161006204116310911489
domInteractive34171522830112
firstPaint1536844784177337
backgroundConnect31527851328329352
firstReactRender23155282642
initialActions107113
loadScripts88177517071528621249
setupStore1674381833
numNetworkReqs61371622857143
WebpackStandard HomeuiStartup89369811881029521079
load76362597598847926
domContentLoaded75662097097841920
domInteractive3016122222591
firstPaint1186141064145224
backgroundConnect27184673141
firstReactRender2112230222234
initialActions103112
loadScripts75461896896839914
setupStore1263241219
numNetworkReqs312294202584
WebpackPower User HomeuiStartup1179887162415612781485
load688612103495683944
domContentLoaded679607102395671937
domInteractive33171522829113
firstPaint1316434668162265
backgroundConnect16312833852156305
firstReactRender21162732326
initialActions102011
loadScripts676605101193669930
setupStore1142031316
numNetworkReqs1103925650141209
FirefoxBrowserifyStandard HomeuiStartup16401369247519716712049
load13781166218316114211676
domContentLoaded13771165218316214211676
domInteractive823220845108169
firstPaint------
backgroundConnect61272713758132
firstReactRender14111811417
initialActions102112
loadScripts13501143215515413951588
setupStore188174211644
numNetworkReqs3120101202590
BrowserifyPower User HomeuiStartup27392133375736228983613
load15621269235322616201997
domContentLoaded15621269234822616201996
domInteractive12534579117112435
firstPaint------
backgroundConnect3191211257252349887
firstReactRender18143132023
initialActions203123
loadScripts15151247233021915421939
setupStore109872617198587
numNetworkReqs63301613691136
WebpackStandard HomeuiStartup16551390351323116581967
load14001221325520014181532
domContentLoaded13991221325420014181531
domInteractive993123341132156
firstPaint------
backgroundConnect58272013263128
firstReactRender15112931621
initialActions103112
loadScripts13741202322719713951481
setupStore227154301481
numNetworkReqs311993182782
WebpackPower User HomeuiStartup27531916434448728153759
load15811305256627816942174
domContentLoaded15811305256627816932174
domInteractive12731831145115476
firstPaint------
backgroundConnect3141191362267271945
firstReactRender22164152430
initialActions207123
loadScripts15451280250926716692115
setupStore212101230267293730
numNetworkReqs60281913389124
📊 Page Load Benchmark Results

Current Commit: 0bc37b2 | Date: 2/19/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.07s (±38ms) 🟡 | historical mean value: 1.05s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 742ms (±36ms) 🟢 | historical mean value: 740ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 80ms (±11ms) 🟢 | historical mean value: 84ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.07s 38ms 1.04s 1.34s 1.10s 1.34s
domContentLoaded 742ms 36ms 719ms 1.00s 763ms 1.00s
firstPaint 80ms 11ms 64ms 172ms 88ms 172ms
firstContentfulPaint 80ms 11ms 64ms 172ms 88ms 172ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs
  • background: 192 Bytes (0%)
  • ui: 5 Bytes (0%)
  • common: 424 Bytes (0%)

@gauthierpetetin gauthierpetetin added this pull request to the merge queue Feb 20, 2026
Merged via the queue into main with commit 22ec50b Feb 20, 2026
181 checks passed
@gauthierpetetin gauthierpetetin deleted the fix/39570-update-modal-pending-version branch February 20, 2026 15:48
@github-project-automation github-project-automation bot moved this from Review finalised - Ready to be merged to Merged, Closed or Archived in PR review queue Feb 20, 2026
@github-actions github-actions bot locked and limited conversation to collaborators Feb 20, 2026
@metamaskbot metamaskbot added the release-13.21.0 Issue or pull request that will be included in release 13.21.0 label Feb 20, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-13.21.0 Issue or pull request that will be included in release 13.21.0 size-M team-extension-platform Extension Platform team

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Don't show update modal if version isnt published in store yet

6 participants