Problem
IS_LOADING_APP can get permanently stranded at true, which blocks Inbox and Workspaces behind loading skeletons forever while Search keeps working (it is a separate request). Refreshing never heals it; only switching browsers does.
Root cause: openApp() writes IS_LOADING_APP=true optimistically to storage immediately, but the clearing finallyData of WRITE commands is queued in memory (QueuedOnyxUpdates) until the SequentialQueue flushes. If the page reloads or the tab closes in that window, the clearing update is lost while true stays on disk. On the next boot HAS_LOADED_APP=true makes the app run ReconnectApp only (never OpenApp), and ReconnectApp did not touch the flag, so nothing ever clears it. The existing recovery in DelegateAccessHandler only handles isLoadingApp === undefined, not a stuck true.
Solution
Two complementary changes:
getOnyxDataForOpenOrReconnect now clears IS_LOADING_APP in finallyData for every command in the OpenApp/ReconnectApp family, not just OpenApp, so the next successful reconnect self-heals a stranded flag within minutes.
DelegateAccessHandler gets a second recovery effect: if isLoadingApp stays true for 10s while the app is loaded, online, and there is no OpenApp/ReconnectApp pending in the ongoing slot or persisted queue, it re-fires openApp(). The pending-request guard prevents duplicate OpenApp calls during a legitimate in-flight load.
PR
#95569
Issue Owner
Current Issue Owner: @ZhenjaHorbach
Problem
IS_LOADING_APPcan get permanently stranded attrue, which blocks Inbox and Workspaces behind loading skeletons forever while Search keeps working (it is a separate request). Refreshing never heals it; only switching browsers does.Root cause:
openApp()writesIS_LOADING_APP=trueoptimistically to storage immediately, but the clearingfinallyDataof WRITE commands is queued in memory (QueuedOnyxUpdates) until the SequentialQueue flushes. If the page reloads or the tab closes in that window, the clearing update is lost whiletruestays on disk. On the next bootHAS_LOADED_APP=truemakes the app run ReconnectApp only (never OpenApp), and ReconnectApp did not touch the flag, so nothing ever clears it. The existing recovery inDelegateAccessHandleronly handlesisLoadingApp === undefined, not a stucktrue.Solution
Two complementary changes:
getOnyxDataForOpenOrReconnectnow clearsIS_LOADING_APPinfinallyDatafor every command in the OpenApp/ReconnectApp family, not just OpenApp, so the next successful reconnect self-heals a stranded flag within minutes.DelegateAccessHandlergets a second recovery effect: ifisLoadingAppstaystruefor 10s while the app is loaded, online, and there is no OpenApp/ReconnectApp pending in the ongoing slot or persisted queue, it re-firesopenApp(). The pending-request guard prevents duplicate OpenApp calls during a legitimate in-flight load.PR
#95569
Issue Owner
Current Issue Owner: @ZhenjaHorbach