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.
So downgrade.
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 browser.*
ones.
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
rare,
LZ4,
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.
Here 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 grep
was
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[0].url'
For each item ([]
) in windows
array,
for each item ([]
) in tabs
array within it,
for the first ([0]
) item in entries
array within it,
print the url
field.
The -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.