/*
To run this script in newer versions of Firefox, you need to use the "Scratchpad" tool.
First time setup
Enable Chrome debugging using one of these methods:
(1) Developer Tools Settings
* "3-bar" menu button > Developer > Web Console * Click the "gear" icon at the left end of the bar to open the settings panel * In the lower right of the settings panel, check the box for "Enable chrome debugging" * You can close the web console now.(2) about:config preferences editor
* In a new tab, type or paste about:config in the address bar and press Enter. Click the button promising to be careful. * Type dev in the search box above the list and pause while Firefox filters the list * Doubleclick devtools.chrome.enabled to switch it from false to true * You can close about:config now.
Modified from: http://forums.mozillazine.org/viewtopic.php?p=12098147#p12098147
*/
/*
To run the script:
* Select this script and copy it (if JavaScript is enabled, just click to select) * Open the scratchpad: "3-bar" menu button > Developer > Scratchpad * On the scratchpad menu bar, find the Environment menu and change from Content to Browser * Paste this page into the scratchpad area * Click the Run button on the toolbar, and a file picker should pop up * To extract from sessionstore.js (current live session) or sessionstore.bak (previous session) cancel the file picker */
function scrub(t){ t = converter.ConvertFromUnicode(t); t = t.replace(/&/g, "&"); t = t.replace(/>/g, ">"); t = t.replace(/</g, "<"); t = t.replace(/"/g, """); t = t.replace(/'/g, "'"); return t; } var win; if (typeof gBrowser == "undefined") { win = top.opener; /* Error Console */ } else { win = window; /* Scratchpad */ } var fp = Components.classes["@mozilla.org/filepicker;1"]. createInstance(Components.interfaces.nsIFilePicker); fp.init(win, "Open File", Components.interfaces.nsIFilePicker.modeOpen); fp.appendFilter("Session Store Files", "*.bak; *.js; *.json"); fp.appendFilter("JSON Files", "*.json"); fp.appendFilter("JS Files", "*.js"); fp.appendFilter("BAK Files", "*.bak"); fp.appendFilter("OLD Files", "*.old"); var file; if (fp.show() == Components.interfaces.nsIFilePicker.returnOK) { file = fp.file; } else { var info = Components.classes["@mozilla.org/xre/app-info;1"]. getService(Components.interfaces.nsIXULAppInfo); var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. getService(Components.interfaces.nsIPromptService); var fileExtension = info.name == "SeaMonkey" ? "json" : "js"; var parentWindow = null; var title = "Open From Current Profile Folder"; var description = "Open sessionstore." + fileExtension + " or sessionstore.bak from the currenctly active profile folder:"; var flags = ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING + ps.BUTTON_POS_1 * ps.BUTTON_TITLE_IS_STRING + ps.BUTTON_POS_2 * ps.BUTTON_TITLE_IS_STRING; var btn0 = fileExtension.toUpperCase(); var btn1 = "Cancel"; var btn2 = "BAK"; var message = null; var state = {value: false}; var choice = ps.confirmEx(parentWindow, title, description, flags, btn0, btn1, btn2, message, state); var dirService = Components.classes["@mozilla.org/file/directory_service;1"]. getService(Components.interfaces.nsIProperties); file = dirService.get("ProfD", Components.interfaces.nsILocalFile); if (choice == 0) file.append("sessionstore." + fileExtension); if (choice == 2) file.append("sessionstore.bak"); } if (file.exists() && file.isFile() && file.isReadable()) { var fis = Components.classes["@mozilla.org/network/file-input-stream;1"]. createInstance(Components.interfaces.nsIFileInputStream); fis.init(file, 0x01, 0, 0); var fileSize = fis.available(); var cis = Components.classes["@mozilla.org/intl/converter-input-stream;1"]. createInstance(Components.interfaces.nsIConverterInputStream); cis.init(fis, "UTF-8", fileSize, Components.interfaces.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); var data = new Object(); cis.readString(fileSize, data); cis.close(); var jsonObject = JSON.parse(data.value); var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; var out = new Array(); for (var i = 0, windows = jsonObject.windows; i < windows.length; i++) { out.push('<h2 style="border-bottom:1px solid #000;cursor:pointer" onclick="tog(this);">Window ' + (i + 1) + '</h2><div style="margin-left:2.25em">'); for (var j = 0, tabs = windows[i].tabs; j < tabs.length; j++) { out.push('<h3>Tab ' + (j + 1) + '</h3>\n<div class="urllist">'); for (var entries = tabs[j].entries, k = entries.length - 1; k >= 0; k--) { if (k == entries.length - 2) out.push('<p>← Back <em>(earlier pages visited in this tab)</em>:</p>'); out.push('<p><strong>' + scrub((entries[k].title || "[Title Not Available]")) + '</strong><br><a href="' + entries[k].url + '" target="_blank">' + scrub(entries[k].url) + '</a></p>'); } out.push("</div>"); } out.push("</div>"); } var data = '<!DOCTYPE html>'; data += "<html><head><title>session contents</title>"; data += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">.urllist>p{margin-left:2.25em}.urllist>p:nth-of-type(1){margin-left:0}</style>'; data += "</head><body><h1>Session Contents</h1>\n" + out.join("\n"); data += '\n<script type="text/javascript">function tog(h){var d=h.nextElementSibling;if(!d)return;if(d.style.display=="none")d.style.display="";else d.style.display="none";}</script></body></html>'; var browser = win.gBrowser.getBrowserForTab( win.gBrowser.selectedTab = win.gBrowser.addTab("data:text/html;charset=utf-8;base64," + btoa(data))); }
/* Updated 7/20/2014 */