Manual restore of Firefox sessions
Recently I needed to downgrade my Firefox install from 87 to 84 due to a bug. With multiple windows open, I was intermitantly finding some events were being sent to the wrong window. An example is open a new (private) window and start to navigate to a new page, but discover mouse clicks and other events were still being sent to the original window. I started seeing this in FF86 and FF87 did not fix it. By that point the bug was testing my patience, and worse FF87 seemed to have new (unrelated) bugs specifically with one site I use.
It's been a long time since some Firefox bug has been serious enough to force me to install a different version, particularly a downgrade. So I was surprised to find that Firefox now marks every profile with a browser version and does not let older browsers use profiles from newer ones. Originally when profiles introduced compatibility changes it was somewhat infrequent, and downgrades were usually easy to do.
There are three things I really wanted to preserve:
- My open tabs (actual state in the tab, not as critical).
- My (few) bookmarks. Of 40 or so bookmarks, about 30 I had created (the others shipped with Firefox), and about half of those I still want.
- My preferences.
These have varying degrees of difficulty uncovering from the files in a profile. Session tabs ended up being the most complicated. Working backwards in that list.
Changed preferences are stored one-per-line in
prefs.js in the
profile directory. The chief complication is the number of entries.
Many of them are related to extensions or printing and can just be
ignored. Many more are related to internal settings like
toolkit.telemetry.* or most of the
The bookmarks are available in compressed JSON files in the
bookmarkbackups profile subdirectory. The compression format
is a bit of an oddball. The actual compression type is not so
but apparently the Mozilla implementation is slightly non-standard.
There are a lot of tools out there which can apply the standard LZ4
algorithm to the
.jsonlz4 files Firefox makes. I used
lz4jsoncat by Andi Kleen.
ls -rt finds the most recent backup file to operate on.
lz4jsoncat $(ls -rt bookmarkbackups/*.jsonlz4) | jq . | grep '"uri"'
If you are unaware,
jq is a JSON Query tool. In the simple usage
there, the query is for the whole structure and functions as a
JSON pretty printer.
Why not use
jq to slice and dice the
uri entries out? Because they
exist in several groups (probably for bookmark folders) and
way faster than figuring out the correct
jq query to use.
But that brings us to the remaining item of interest for me: the URLs
of all my tabs in the session data. There are several files in the
sessionstore-backups profile subdirectory. In my inspection they all
appeared to be valid sessions from different times, and
recovery.jsonlz4 seemed to be the most recent one.
No need to resort to time sorted file lists here.
The JSON structure holds a lot of data, from cookies to apparently
thumbnail images of the page (base64 encoded for safely storing in
JSON). Getting just tab URLs was not easily done with
grep, and I
needed to work out a
jq query. There is a
windows array with an
entry for each window, inside that there is a
tabs array with a
state for each tab, and inside that an
entries array with the
history for each tab. The history is a stack with latest entry first.
lz4jsoncat sessionstore-backups/recovery.jsonlz4 | jq -r '.windows.tabs.entries.url'
For each item (
for each item (
tabs array within it,
for the first (
) item in
entries array within it,
-r makes the output "raw", which is to say without quotes.
Not as neat and clean as actual session recovery, but a lot better than trying to recover my two dozen tabs from memory.