fix: an open popup follows a network switch the background saves (closes #650)
check / check (push) Canceled after 0s
e2e / e2e-chrome (push) Canceled after 0s
e2e / e2e-firefox (push) Canceled after 0s

When the background saves a network switch after the user approves a
site's request, or another popup page saves one, an open popup now
notices the stored record change and takes the new network from it,
holding the lock, inside a save. It then leaves the page as a switch in
Settings does: the stack is cut, every screen counts as not yet
rendered, and the screen on top is drawn again. The cut and the redraw
are now two functions in the Settings view that both paths call. A
record already on the popup's network, such as its own Settings switch,
changes nothing. The popup never switches the network itself.

Model: opus-5-5
This commit is contained in:
2026-10-20 21:46:36 +00:00
parent e517219038
commit 59d8f478ae
15 changed files with 420 additions and 61 deletions
+20 -14
View File
@@ -1562,20 +1562,26 @@ such as an edit typed into Settings and not yet saved. Home is the one screen
"Back" always re-renders, so the wallet list reflects anything that changed
while the user was away from it.
A network switch in Settings leaves every screen beneath Settings showing the
previous network, so after it "Back" behaves as in a reopened popup: every
screen on the stack counts as not yet rendered, and the stack is cut at the
first screen that cannot be rendered from saved state, such as Send or AddToken,
or at AddressToken for any token but the native one, because that token was
picked on the previous network. The cut stack is saved with the switch, so a
popup closed straight after it and reopened onto Settings lands in the same
place. "Back" then renders the screen it lands on for the new network, and
anything typed there and not saved, which belonged to the previous network, is
dropped. ConfirmTx, WaitTx, SuccessTx, ErrorTx and TransactionDetail are
rendered instead for the network of the transaction they show: the network it
was reviewed on for ConfirmTx, and the network it was sent on for the others.
Without a wallet the stack is not cut, because it starts at Welcome, which shows
nothing from a network.
A network switch leaves every screen on the page showing the previous network.
The user makes it in Settings, or approves a site's request and the background
saves it. Any other popup open meanwhile takes the switch from the stored
record, and never switches the network itself. After either, "Back" behaves as
in a reopened popup: every screen on the stack counts as not yet rendered, and
the stack is cut at the first screen that cannot be rendered from saved state,
such as Send or AddToken, or at AddressToken for any token but the native one,
because that token was picked on the previous network and is no longer selected.
The cut stack is saved with the popup's new network, so a popup closed straight
after and reopened lands in the same place. The screen on top is drawn again for
the new network: Settings in place, and any other screen as a reopened popup
draws it, so Home takes the place of one that cannot be rendered from saved
state or of AddressToken for a token no longer selected. "Back" then renders the
screen it lands on for the new network, and anything typed there and not saved,
which belonged to the previous network, is dropped. ConfirmTx, WaitTx,
SuccessTx, ErrorTx and TransactionDetail are rendered instead for the network of
the transaction they show: the network it was reviewed on for ConfirmTx, and the
network it was sent on for the others. Without a wallet the stack is not cut and
only Settings is drawn again, because the stack starts at Welcome, and Welcome
and AddWallet show nothing from a network.
Every screen that holds secret material in the page registers a cleanup with
`onViewLeave()` (`src/popup/views/helpers.js`), which `showView()` runs on every