Skip to content

Conversation

@gauthierpetetin
Copy link
Contributor

@gauthierpetetin gauthierpetetin commented Jan 5, 2026

Description

This PR implements workarounds for Firefox database corruption issues that cause browser.storage.local operations to fail with "An unexpected error occurred".

Problem

Firefox stores extension data in SQLite databases with external files for large blobs. Some corruption scenarios, like missing or renamed external files (file IDs mismatch), can break these databases.

When this happens, browser.storage.local.get() or browser.storage.local.set() fail entirely, leaving users locked out of their wallet:

Solution

This PR adds two recovery mechanisms:

  1. Vault Recovery on get() failure: When browser.storage.local.get() fails and a backup vault exists in IndexedDB, users are redirected to the vault recovery flow to restore their wallet.

  2. Informative Toast on set() failure: When browser.storage.local.set() fails (even after vault recovery), a persistent toast is displayed informing users that the storage is failing and MetaMask needs to be reinstalled. The toast includes a link to save the Secret Recovery Phrase before reinstalling.

Slack thread

Out of scope for this PR

Open in GitHub Codespaces

Changelog

CHANGELOG entry: Fixes Firefox database corruption causing "An unexpected error occurred" by redirecting to vault recovery when possible, or displaying guidance to reinstall when recovery is not possible.

Related issues

Fixes: #10091
Fixes: #35681

Manual testing steps

Prerequisites

  • Firefox browser
  • MetaMask installed from Firefox Add-ons store (or local build with yarn dist:mv2)
  • The test-vault-corruption-firefox.sh script from this PR

Test 1: Vault Recovery flow started on storage get() failure

  1. Install MetaMask and complete onboarding
  2. Close Firefox completely
  3. Run ./test-vault-corruption-firefox.sh and select option 5 (Rename files off-by-one)
  4. Open Firefox and click the MetaMask icon
  5. Expected: You should see the vault recovery screen with "Restore Accounts" button
  6. Click "Restore Accounts", enter your password, complete onboarding
  7. Expected: Wallet is restored with original accounts

Test 2: Toast displayed on storage set() failure

  1. Expected: A toast is displayed: "We couldn't save your data - Back up your Secret Recovery Phrase and reinstall MetaMask if the problem continues."
  2. Click "Back up Secret Recovery Phrase"
  3. Expected: You are navigated to the SRP reveal page

Screenshots/Recordings

Before

Users see "An unexpected error occurred" with no recovery path.
Screenshot 2026-01-05 at 06 07 46

After

  1. Vault Recovery Flow (when reads fail):
    • Users see the vault recovery screen and can restore their wallet (when backup exists)
Screenshot 2026-01-03 at 16 07 30
  1. Storage Error Toast (when writes fail):
    • Toast appears with message: "We couldn't save your data"
    • Description: "Back up your Secret Recovery Phrase and reinstall MetaMask if the problem continues."
    • Action button: "Back up Secret Recovery Phrase" → navigates to SRP reveal
Screenshot 2026-01-07 at 23 14 01

Loom recording

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

Introduces recovery UX and error signaling for storage failures, plus improved error context.

  • Persistence: Enhance PersistenceManager.get() to handle storage.local.get errors, trigger vault recovery via PersistenceError (now includes cause) when an IndexedDB backup exists; on set failures, notify UI via a new setOnSetFailed callback (background wires this to AppStateController.setShowStorageErrorToast(true)).
  • State/Types: Add appState.showStorageErrorToast (non-persisted) and expose in Sentry snapshots and background types.
  • UI: Add StorageErrorToast rendered globally in ToastMaster (gated by selectShowStorageErrorToast), with action to navigate to SRP reveal; add i18n strings for title/description/action.
  • Error delivery: In state-corruption handling, include causeMessage from PersistenceError.cause when notifying UI.
  • Tests/fixtures: Update unit/e2e/integration snapshots and mocks to cover new flags, behaviors, and logging.

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

@github-actions
Copy link
Contributor

github-actions bot commented Jan 5, 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.

@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Jan 5, 2026

Builds ready [ea89449]
UI Startup Metrics (1279 ± 106 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12791034159110613431454
load107387713709311291213
domContentLoaded106786913609311221206
domInteractive2716124202383
firstPaint1416636659184228
backgroundConnect2131982499216235
firstReactRender1593651726
getState351965104058
initialActions106113
loadScripts8616681158929151003
setupStore1273351425
numNetworkReqs171176161168
BrowserifyPower User HomeuiStartup------
load------
domContentLoaded------
domInteractive------
firstPaint------
backgroundConnect------
firstReactRender------
getState------
initialActions------
loadScripts------
setupStore------
numNetworkReqs------
WebpackStandard HomeuiStartup801662107278843951
load64458082859666774
domContentLoaded63957682258660768
domInteractive2516106192283
firstPaint100623335399214
backgroundConnect226122232878
firstReactRender15114051728
getState3715129234694
initialActions102011
loadScripts63657481257658759
setupStore14675101537
numNetworkReqs181174171166
WebpackPower User HomeuiStartup------
load------
domContentLoaded------
domInteractive------
firstPaint------
backgroundConnect------
firstReactRender------
getState------
initialActions------
loadScripts------
setupStore------
numNetworkReqs------
FirefoxBrowserifyStandard HomeuiStartup14151058188616715151701
load1132904165811812011346
domContentLoaded1132904165811812011346
domInteractive65311613586135
firstPaint------
backgroundConnect65203695693170
firstReactRender13102431321
getState13688121231
initialActions102122
loadScripts108889015549511481237
setupStore143169181144
numNetworkReqs20980191476
BrowserifyPower User HomeuiStartup26111429424557029723358
load1768969264652322422463
domContentLoaded1768969264652322422462
domInteractive87323948585336
firstPaint------
backgroundConnect4192312233958961121
firstReactRender2110139162456
getState11360998121110175
initialActions203123
loadScripts1454954246644219372276
setupStore814107721953946
numNetworkReqs69212013775168
WebpackStandard HomeuiStartup15921326229719916532011
load13331103192912613991540
domContentLoaded13321103192912613991539
domInteractive822830843102143
firstPaint------
backgroundConnect66192375381199
firstReactRender15114341521
getState136110121329
initialActions103122
loadScripts12961090181711413331510
setupStore186190261672
numNetworkReqs20988201380
WebpackPower User HomeuiStartup27211718414655031263529
load20191175328953324882753
domContentLoaded20191174328953324882752
domInteractive823099011882281
firstPaint------
backgroundConnect3482213063813511214
firstReactRender201384102247
getState122621007103132200
initialActions217123
loadScripts17481155312444321402431
setupStore445108115023180
numNetworkReqs68201903577158
📊 Page Load Benchmark Results

Current Commit: ea89449 | Date: 1/5/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±58ms) 🟡 | historical mean value: 1.03s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 727ms (±43ms) 🟢 | historical mean value: 722ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±11ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 58ms 1.01s 1.48s 1.08s 1.48s
domContentLoaded 727ms 43ms 700ms 1.02s 752ms 1.02s
firstPaint 76ms 11ms 56ms 164ms 88ms 164ms
firstContentfulPaint 76ms 11ms 56ms 164ms 88ms 164ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 365 Bytes (0.01%)
  • ui: 1.27 KiB (0.02%)
  • common: 946 Bytes (0.01%)

@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Jan 5, 2026

Builds ready [ea89449]
UI Startup Metrics (1279 ± 106 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12791034159110613431454
load107387713709311291213
domContentLoaded106786913609311221206
domInteractive2716124202383
firstPaint1416636659184228
backgroundConnect2131982499216235
firstReactRender1593651726
getState351965104058
initialActions106113
loadScripts8616681158929151003
setupStore1273351425
numNetworkReqs171176161168
BrowserifyPower User HomeuiStartup------
load------
domContentLoaded------
domInteractive------
firstPaint------
backgroundConnect------
firstReactRender------
getState------
initialActions------
loadScripts------
setupStore------
numNetworkReqs------
WebpackStandard HomeuiStartup801662107278843951
load64458082859666774
domContentLoaded63957682258660768
domInteractive2516106192283
firstPaint100623335399214
backgroundConnect226122232878
firstReactRender15114051728
getState3715129234694
initialActions102011
loadScripts63657481257658759
setupStore14675101537
numNetworkReqs181174171166
WebpackPower User HomeuiStartup------
load------
domContentLoaded------
domInteractive------
firstPaint------
backgroundConnect------
firstReactRender------
getState------
initialActions------
loadScripts------
setupStore------
numNetworkReqs------
FirefoxBrowserifyStandard HomeuiStartup14151058188616715151701
load1132904165811812011346
domContentLoaded1132904165811812011346
domInteractive65311613586135
firstPaint------
backgroundConnect65203695693170
firstReactRender13102431321
getState13688121231
initialActions102122
loadScripts108889015549511481237
setupStore143169181144
numNetworkReqs20980191476
BrowserifyPower User HomeuiStartup26111429424557029723358
load1768969264652322422463
domContentLoaded1768969264652322422462
domInteractive87323948585336
firstPaint------
backgroundConnect4192312233958961121
firstReactRender2110139162456
getState11360998121110175
initialActions203123
loadScripts1454954246644219372276
setupStore814107721953946
numNetworkReqs69212013775168
WebpackStandard HomeuiStartup15921326229719916532011
load13331103192912613991540
domContentLoaded13321103192912613991539
domInteractive822830843102143
firstPaint------
backgroundConnect66192375381199
firstReactRender15114341521
getState136110121329
initialActions103122
loadScripts12961090181711413331510
setupStore186190261672
numNetworkReqs20988201380
WebpackPower User HomeuiStartup27211718414655031263529
load20191175328953324882753
domContentLoaded20191174328953324882752
domInteractive823099011882281
firstPaint------
backgroundConnect3482213063813511214
firstReactRender201384102247
getState122621007103132200
initialActions217123
loadScripts17481155312444321402431
setupStore445108115023180
numNetworkReqs68201903577158
📊 Page Load Benchmark Results

Current Commit: ea89449 | Date: 1/5/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±58ms) 🟡 | historical mean value: 1.03s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 727ms (±43ms) 🟢 | historical mean value: 722ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±11ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 58ms 1.01s 1.48s 1.08s 1.48s
domContentLoaded 727ms 43ms 700ms 1.02s 752ms 1.02s
firstPaint 76ms 11ms 56ms 164ms 88ms 164ms
firstContentfulPaint 76ms 11ms 56ms 164ms 88ms 164ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 365 Bytes (0.01%)
  • ui: 1.27 KiB (0.02%)
  • common: 946 Bytes (0.01%)

Copy link
Contributor

@MajorLift MajorLift left a comment

Choose a reason for hiding this comment

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

In the edge case of repeated persistence errors while the user ignores the toast, would it make sense to just keep on showing the toast?

@gauthierpetetin
Copy link
Contributor Author

gauthierpetetin commented Jan 8, 2026

In the edge case of repeated persistence errors while the user ignores the toast, would it make sense to just keep on showing the toast?

Thanks for the review. It's updated.

@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Jan 8, 2026

Builds ready [84b2ee7]
UI Startup Metrics (1296 ± 101 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12961054163810113541428
load108189213398711381200
domContentLoaded107488713358711261192
domInteractive2715106212387
firstPaint166651123115192290
backgroundConnect22219927313226248
firstReactRender17103661930
getState4322127164973
initialActions104112
loadScripts861678108886914987
setupStore1382541521
numNetworkReqs171170161163
BrowserifyPower User HomeuiStartup18701618241119420082294
load994877147211210191236
domContentLoaded981870146511310101230
domInteractive32161502330103
firstPaint193631250125225308
backgroundConnect274188700139233634
firstReactRender22164642330
getState18215125324193232
initialActions102112
loadScripts78066912651088131026
setupStore1665981635
numNetworkReqs58372133159128
WebpackStandard HomeuiStartup78964599772824953
load63656885670664802
domContentLoaded63156385070658793
domInteractive241498192185
firstPaint1005926944120193
backgroundConnect3751283458104
firstReactRender15103541625
getState3115133213659
initialActions104111
loadScripts62856184869656785
setupStore1164461218
numNetworkReqs181181181172
WebpackPower User HomeuiStartup1383987216328115741944
load68259999681693884
domContentLoaded67259299081681880
domInteractive37181623133123
firstPaint1386442777171313
backgroundConnect103763919130599
firstReactRender2417118102531
getState15112244333153165
initialActions102011
loadScripts66959098279678871
setupStore1694471836
numNetworkReqs983823947135222
FirefoxBrowserifyStandard HomeuiStartup14041096255723214881843
load1111938161612411931360
domContentLoaded1110937161512511921359
domInteractive66321904087138
firstPaint------
backgroundConnect60173746846227
firstReactRender1393941323
getState12699101125
initialActions103122
loadScripts1079920147410311581253
setupStore174210291048
numNetworkReqs19982191376
BrowserifyPower User HomeuiStartup25551905500769125064267
load1271952281340112012503
domContentLoaded1271951281340112012502
domInteractive12332713113109417
firstPaint------
backgroundConnect12027133419691370
firstReactRender23157782531
getState30043890232471799
initialActions218123
loadScripts1216935263933911772362
setupStore1216750162154573
numNetworkReqs57271824250177
WebpackStandard HomeuiStartup15671328208117517041891
load13201133175712014031537
domContentLoaded13201133175712114031537
domInteractive78282143899134
firstPaint------
backgroundConnect59182714965168
firstReactRender15102631622
getState2482524417124
initialActions103122
loadScripts12841105162910713471489
setupStore154156211345
numNetworkReqs20983191477
WebpackPower User HomeuiStartup29291974858298230354746
load16711211721977516763051
domContentLoaded16701211721877516753051
domInteractive184305126529111610
firstPaint------
backgroundConnect1742315462731511054
firstReactRender2916267372632
getState27777898232434809
initialActions203123
loadScripts15721186719372315412880
setupStore10510737145101541
numNetworkReqs55261934447177
📊 Page Load Benchmark Results

Current Commit: 84b2ee7 | Date: 1/8/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±44ms) 🟡 | historical mean value: 1.04s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 723ms (±38ms) 🟢 | historical mean value: 725ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 77ms (±12ms) 🟢 | historical mean value: 79ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 44ms 1.01s 1.34s 1.06s 1.34s
domContentLoaded 723ms 38ms 698ms 988ms 737ms 988ms
firstPaint 77ms 12ms 60ms 180ms 84ms 180ms
firstContentfulPaint 77ms 12ms 60ms 180ms 84ms 180ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 160.61 KiB (3.33%)
  • ui: 780 Bytes (0.01%)
  • common: 6.94 KiB (0.08%)

@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Jan 9, 2026

Builds ready [7a23cab]
UI Startup Metrics (1298 ± 107 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12981037158010713701447
load109186713429911481242
domContentLoaded108486113339911421237
domInteractive2715108192380
firstPaint169671193151189302
backgroundConnect21719531715220245
firstReactRender17104971932
getState3817129174274
initialActions107114
loadScripts87565911331009331032
setupStore1373351627
numNetworkReqs171169161164
BrowserifyPower User HomeuiStartup18801459255721019912361
load1018898162812310301308
domContentLoaded1005894161912310231296
domInteractive36171362836125
firstPaint197661397190231379
backgroundConnect269204690124234594
firstReactRender22166362335
getState16913333027184214
initialActions103112
loadScripts79667913951218071096
setupStore1774071938
numNetworkReqs58381392560129
WebpackStandard HomeuiStartup792649103879831955
load63757279265678780
domContentLoaded63256778564674774
domInteractive2516104202087
firstPaint1055860772125220
backgroundConnect3552273954110
firstReactRender16113751732
getState301467123955
initialActions104111
loadScripts62956478163671767
setupStore1254881234
numNetworkReqs171175171169
WebpackPower User HomeuiStartup1329994198126915081898
load65457993984677889
domContentLoaded64557293084661882
domInteractive33171442730111
firstPaint1315945870175273
backgroundConnect101761219222587
firstReactRender22174142430
getState16514428221170196
initialActions104112
loadScripts64257092483659872
setupStore1494461434
numNetworkReqs1013727249135224
FirefoxBrowserifyStandard HomeuiStartup14491078223220415901797
load1134926145412412151399
domContentLoaded1133925144812412151399
domInteractive72262374689150
firstPaint------
backgroundConnect61193795767188
firstReactRender13104441322
getState1962643812106
initialActions103122
loadScripts1095910139110011761276
setupStore154256261239
numNetworkReqs19977191475
BrowserifyPower User HomeuiStartup25011918540065924974391
load12221005288329711981739
domContentLoaded12221004288329811971739
domInteractive1123473497107338
firstPaint------
backgroundConnect1073554787108268
firstReactRender2315115112334
getState27475811217406759
initialActions204123
loadScripts1174981269825111541717
setupStore119885917382592
numNetworkReqs58292154846191
WebpackStandard HomeuiStartup16171345237221617452099
load13441147213313414121559
domContentLoaded13431147213213514121559
domInteractive822821538110141
firstPaint------
backgroundConnect67182995669192
firstReactRender16115771624
getState218251381457
initialActions103123
loadScripts13041112200712213531492
setupStore2242764214139
numNetworkReqs19979191376
WebpackPower User HomeuiStartup28712045492773632304518
load16121148324053818172978
domContentLoaded16121148323953818172977
domInteractive136281038182107536
firstPaint------
backgroundConnect2122812252862271033
firstReactRender2616253252732
getState29769902246490818
initialActions207123
loadScripts15121131302445216642797
setupStore93781014980624
numNetworkReqs56281854348173
📊 Page Load Benchmark Results

Current Commit: 7a23cab | Date: 1/9/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.06s (±37ms) 🟡 | historical mean value: 1.04s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 737ms (±35ms) 🟢 | historical mean value: 723ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 80ms (±11ms) 🟢 | historical mean value: 77ms ⬆️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.06s 37ms 1.03s 1.32s 1.09s 1.32s
domContentLoaded 737ms 35ms 712ms 996ms 763ms 996ms
firstPaint 80ms 11ms 60ms 176ms 88ms 176ms
firstContentfulPaint 80ms 11ms 60ms 176ms 88ms 176ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 535 Bytes (0.01%)
  • ui: 1.24 KiB (0.02%)
  • common: 973 Bytes (0.01%)

Copy link
Contributor

@MajorLift MajorLift left a comment

Choose a reason for hiding this comment

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

Works like a charm. LGTM!

Screenshot 2026-01-09 at 8 44 27 AM Screenshot 2026-01-09 at 8 53 57 AM Screenshot 2026-01-09 at 8 40 28 AM Screenshot 2026-01-09 at 8 40 44 AM

@MajorLift
Copy link
Contributor

nit: I feel like the UX in the vault recovery screen's a little confusing. Users might close and re-open the app repeatedly without discovering the "restore accounts" button timeout. Thoughts on reducing the wait a little bit? Doesn't need to happen in this pr but will be happy to reapprove if it does.

diff --git a/ui/helpers/utils/state-corruption-html.ts b/ui/helpers/utils/state-corruption-html.ts
index ec8b4f7c90..c7b501925f 100644
--- a/ui/helpers/utils/state-corruption-html.ts
+++ b/ui/helpers/utils/state-corruption-html.ts
@@ -129,6 +129,6 @@ export async function displayStateCorruptionError(
       button.disabled = false;
       // wait a while before enabling the button to try to prevent accidental
       // or rush clicks.
-    }, 5000);
+    }, 3000);
   }
 }

@davidmurdoch
Copy link
Contributor

nit: I feel like the UX in the vault recovery screen's a little confusing. Users might close and re-open the app repeatedly without discovering the "restore accounts" button timeout. Thoughts on reducing the wait a little bit? Doesn't need to happen in this pr but will be happy to reapprove if it does.

diff --git a/ui/helpers/utils/state-corruption-html.ts b/ui/helpers/utils/state-corruption-html.ts
index ec8b4f7c90..c7b501925f 100644
--- a/ui/helpers/utils/state-corruption-html.ts
+++ b/ui/helpers/utils/state-corruption-html.ts
@@ -129,6 +129,6 @@ export async function displayStateCorruptionError(
       button.disabled = false;
       // wait a while before enabling the button to try to prevent accidental
       // or rush clicks.
-    }, 5000);
+    }, 3000);
   }
 }

No one can read, understand, and consider the ramifications of pressing that button within 5 seconds. The wait was intentionally long to make users a bit uneasy about pressing this button. Pressing the button is scary.

@metamaskbotv2
Copy link
Contributor

metamaskbotv2 bot commented Jan 13, 2026

Builds ready [03a318d]
UI Startup Metrics (1278 ± 105 ms)
PlatformBuildTypePageMetricTest Title (ms)Persona (ms)Mean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard Home0--------
1--------
2--------
3--------
4--------
5--------
6--------
7--------
8--------
9--------
10--------
11--------
12--------
13--------
14--------
15--------
16--------
17--------
18--------
uiStartup--12781035153310513391428
load--106786413419811221217
domContentLoaded--106185813359811171213
domInteractive--2715117222284
firstPaint--1436237770190293
backgroundConnect--2081962337212226
firstReactRender--1810259251726
getState--3817125164369
initialActions--107113
loadScripts--8606591138979091012
setupStore--1272941421
numNetworkReqs--171173171167
19--------
BrowserifyPower User Home0--------
1--------
2--------
3--------
4--------
5--------
6--------
7--------
8--------
9--------
10--------
11--------
12--------
13--------
14--------
15--------
16--------
17--------
18--------
uiStartup--18091560245920319512275
load--95582916901359721316
domContentLoaded--94381916831369551300
domInteractive--32161612531107
firstPaint--189621324136213358
backgroundConnect--266181649143216616
firstReactRender--20143642226
getState--17914128925190226
initialActions--104112
loadScripts--75664114681337631103
setupStore--1694381540
numNetworkReqs--60362463056134
19--------
WebpackStandard Home0--------
1--------
2--------
3--------
4--------
5--------
6--------
7--------
8--------
9--------
10--------
11--------
12--------
13--------
14--------
15--------
16--------
17--------
18--------
uiStartup--8596751101819051012
load--69560288868759811
domContentLoaded--68959687468751806
domInteractive--2816108212495
firstPaint--1116429152140224
backgroundConnect--235132262793
firstReactRender--17123752027
getState--3415106164463
initialActions--106112
loadScripts--68659386566749803
setupStore--1474281630
numNetworkReqs--171178171167
19--------
WebpackPower User Home0--------
1--------
2--------
3--------
4--------
5--------
6--------
7--------
8--------
9--------
10--------
11--------
12--------
13--------
14--------
15--------
16--------
17--------
18--------
uiStartup--13481031198724914781879
load--689591101087716915
domContentLoaded--680585100487697906
domInteractive--34171572733110
firstPaint--1316529662168265
backgroundConnect--82561616719543
firstReactRender--22173532429
getState--1497120716156181
initialActions--102111
loadScripts--67758299586695900
setupStore--1765491742
numNetworkReqs--1033728948137212
19--------
FirefoxBrowserifyStandard Home0--------
1--------
2--------
3--------
4--------
5--------
6--------
7--------
8--------
9--------
10--------
11--------
12--------
13--------
14--------
15--------
16--------
17--------
18--------
uiStartup--13771087198618515111723
load--1094899146712211661361
domContentLoaded--1093895146712211661361
domInteractive--59312083385120
firstPaint--------
backgroundConnect--57214095867158
firstReactRender--1393531317
getState--1164651120
initialActions--103122
loadScripts--1060885133610111241281
setupStore--143173211145
numNetworkReqs--19987191474
19--------
BrowserifyPower User Home0--------
1--------
2--------
3--------
4--------
5--------
6--------
7--------
8--------
9--------
10--------
11--------
12--------
13--------
14--------
15--------
16--------
17--------
18--------
uiStartup--25741951530368225184233
load--1294948282344012612686
domContentLoaded--1293947282244012602686
domInteractive--139341021155119401
firstPaint--------
backgroundConnect--1582715002771121044
firstReactRender--24156392632
getState--28257873215433793
initialActions--213123
loadScripts--1224930279936312122428
setupStore--1547758196166647
numNetworkReqs--60302054563185
19--------
WebpackStandard Home0--------
1--------
2--------
3--------
4--------
5--------
6--------
7--------
8--------
9--------
10--------
11--------
12--------
13--------
14--------
15--------
16--------
17--------
18--------
uiStartup--15771318232919516591967
load--13231117165412314001570
domContentLoaded--13221117165412313991570
domInteractive--74272474094140
firstPaint--------
backgroundConnect--66173155282154
firstReactRender--15105361524
getState--186182231634
initialActions--103122
loadScripts--12821092159210913351507
setupStore--2132143416117
numNetworkReqs--20989201478
19--------
WebpackPower User Home0--------
1--------
2--------
3--------
4--------
5--------
6--------
7--------
8--------
9--------
10--------
11--------
12--------
13--------
14--------
15--------
16--------
17--------
18--------
uiStartup--29182196524978728534669
load--16441238331556816903007
domContentLoaded--16441237331456816903007
domInteractive--121311063158104407
firstPaint--------
backgroundConnect--1673012372391581062
firstReactRender--2516108102934
getState--27264851214349751
initialActions--214123
loadScripts--15611217312749116442812
setupStore--11810771170105635
numNetworkReqs--57212044849192
19--------
📊 Page Load Benchmark Results

Current Commit: 03a318d | Date: 1/13/2026

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.05s (±54ms) 🟡 | historical mean value: 1.05s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 732ms (±52ms) 🟢 | historical mean value: 731ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 78ms (±13ms) 🟢 | historical mean value: 77ms ⬆️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.05s 54ms 1.02s 1.37s 1.10s 1.37s
domContentLoaded 732ms 52ms 705ms 1.04s 771ms 1.04s
firstPaint 78ms 13ms 60ms 192ms 88ms 192ms
firstContentfulPaint 78ms 13ms 60ms 192ms 88ms 192ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 535 Bytes (0.01%)
  • ui: 1.24 KiB (0.02%)
  • common: 973 Bytes (0.01%)

@github-project-automation github-project-automation bot moved this from Needs dev review to Review finalised - Ready to be merged in PR review queue Jan 13, 2026
@gauthierpetetin gauthierpetetin added this pull request to the merge queue Jan 13, 2026
Merged via the queue into main with commit 0053df5 Jan 13, 2026
178 checks passed
@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 Jan 13, 2026
@gauthierpetetin gauthierpetetin deleted the database-corruption-workarounds branch January 13, 2026 19:28
@github-actions github-actions bot locked and limited conversation to collaborators Jan 13, 2026
@metamaskbot metamaskbot added the release-13.15.0 Issue or pull request that will be included in release 13.15.0 label Jan 13, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

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

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

Mysterious Firefox error "An unexpected error occurred" [Bug]: Metamask stopped working on Firefox

5 participants