Автор: NightsoN
Домашняя страница скрипта: Simple Session Manager
Перевод: Google
Интерпретация перевода: SendInfo
Автор блокировки повторного запуска функций и обработчиков при открытии настройки панелей: bunda1
Для использования с Сustom Buttons положить код в инициализацию любой готовой или новой кнопки. В меню "рыжей кнопки" появится подменю "Сохранить сеанс". Далее разберётесь После установки потребуется перезагрузка браузера, чтобы устранить повторы меню.(Возможно кто-то из творцов кнопок захочет устранить этот глюк.)
Выделить кодКод:
/*Initialization Code*/
// Блокировать повторный запуск функций и обработчиков при открытии настройки панелей ..............
if (this.hasAttribute("stop")) return;
// ==UserScript==
// @name Simple Session Manager
// @version 0.4b
// @description Простой менеджер сессии
// @author NightsoN
// @include chrome://browser/content/browser.xul
// ==/UserScript==
(function () {
var overwrite = 1, //Если восстановление сессии устанавливается для покрытия открытых страниц, 0 при отсутствии покрытия, чтобы покрыть 2 охвата и восстановления сессию в новом окне
Cc = Components.classes,
Ci = Components.interfaces,
Cu = Components.utils,
SS = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
if (!window.Services) {
Cu.import("resource://gre/modules/Services.jsm");
}
//Сохранить функцию чтения файла, взятые из Griever из UserScriptLoader.uc.js
function saveFile(data) {
var file = Services.dirsvc.get('UChrm', Ci.nsIFile);
file.append("simple_session_manager.json");
var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
suConverter.charset = 'UTF-8';
data = suConverter.ConvertFromUnicode(data);
var foStream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0);
foStream.write(data, data.length);
foStream.close();
}
function loadFile() {
var file = Services.dirsvc.get('UChrm', Ci.nsIFile);
file.append("simple_session_manager.json");
if (file.exists() === false) return false;
var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
fstream.init(file, -1, 0, 0);
sstream.init(fstream);
var data = sstream.read(sstream.available());
try {
data = decodeURIComponent(escape(data));
} catch (e) {}
sstream.close();
fstream.close();
if (data === "undefined") return false;
data = JSON.parse(data);
return data;
}
//Получить текущее время
function getTime() {
var d = new Date();
function addzero(t) {
(t < 10) ? t = "0" + t : t;
return t;
}
var t = addzero(d.getDate()) + "." + addzero(d.getMonth()+1) + "." + d.getFullYear() + "-" + addzero(d.getHours()) + ":" + addzero(d.getMinutes());
return t;
}
//Сохранить сессию
function saveSession(ssdata) {
var name = prompt("Сохранить",getTime());
if (name != null) {
if (loadFile() === false) {
var data = {};
} else {
var data = loadFile();
}
if (data[name]) {
alert("Сессия с тем же именем уже существует")
return;
}
data[name] = JSON.parse(ssdata);
saveFile(JSON.stringify(data));
makeitems(name);
}
}
//Сохранить все окна сессии
function saveCurrentSession() {
var ssdata = SS.getBrowserState();
saveSession(ssdata);
}
//Сохранение текущей сессии окне
function saveCurrentWindowSession() {
var ssdata = SS.getWindowState(window);
saveSession(ssdata);
}
//Удаление сессии
function remove() {
var node = this.parentNode.parentNode;
var name = node.getAttribute("label");
var cf = confirm("Вы уверены, что хотите удалить " + name + " ?");
if (cf === true) {
node.style.display = "none";
var data = loadFile();
delete data[name];
saveFile(JSON.stringify(data));
}
}
//Переименовать
function rename() {
var node = this.parentNode.parentNode;
var name = node.getAttribute("label");
var newname = prompt("Переименовать " + name + " in", null);
if (!newname) return;
this.parentNode.parentNode.setAttribute("label", newname);
var data = loadFile();
var value = data[name];
data[newname] = value;
delete data[name];
saveFile(JSON.stringify(data));
}
//Восстановление сессий
function restoreSession(stateString) {
if (typeof stateString === "string") {
var state = stateString;
} else {
var name = this.parentNode.parentNode.getAttribute("label");
var data = loadFile();
var state = JSON.stringify(data[name]);
}
switch (overwrite) {
case 0:
SS.setWindowState(window, state, false);
break;
case 1:
SS.setBrowserState(state);
break;
case 2:
var watcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher);
var argstring = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
var w = watcher.openWindow(null, "chrome://browser/content/browser.xul", "name", "chrome,all,dialog=no", argstring);
w.addEventListener("load", function () {
SS.setWindowState(w, state, true);
}, true);
break;
}
}
//Селективный ответа восстановления (с помощью Firefox поставляется с краха механизм восстановления)
function restoreSessionSelectively() {
var name = this.parentNode.parentNode.getAttribute("label");
var data = loadFile();
var sessionValue = JSON.stringify(data[name]);
var newTab = gBrowser.addTab("about:sessionrestore");
var newTabBrowser = gBrowser.getBrowserForTab(newTab);
newTabBrowser.addEventListener("load", function () {
var cDoc = newTabBrowser.contentDocument;
var sessionData = cDoc.getElementById("sessionData");
sessionData.value = sessionValue;
cDoc.getElementById("errorTitleText").innerHTML = "Выборочное восстановление";
cDoc.getElementById("errorShortDescText").hidden = true;
cDoc.getElementById("errorLongDesc").innerHTML = "Вы собираетесь восстановить " + name + " . Вы можете отключить ненужные окна или вкладки";
var stateStringContainer = cDoc.createElement("div");
stateStringContainer.id = "stateStringContainer";
stateStringContainer.style.display = "none";
cDoc.getElementById("errorPageContainer").appendChild(stateStringContainer);
var script = cDoc.createElement("script");
script.innerHTML = 'function restoreTwo() {\
document.getElementById("errorTryAgain").disabled = true;\
var ix = gStateObject.windows.length - 1;\
for (var t = gTreeData.length - 1; t >= 0; t--) {\
if (treeView.isContainer(t)) {\
if (gTreeData[t].checked === 0)\
gStateObject.windows[ix].tabs = gStateObject.windows[ix].tabs.filter(function (aTabData, aIx)\
gTreeData[t].tabs[aIx].checked);\
else if (!gTreeData[t].checked)\
gStateObject.windows.splice(ix, 1);\
ix--;\
}\
}\
var stateString = JSON.stringify(gStateObject);\
document.getElementById("stateStringContainer").setAttribute("stateString", encodeURIComponent(stateString));\
}';
stateStringContainer.addEventListener("DOMAttrModified", function () {
this.removeEventListener('DOMAttrModified', arguments.callee, false);
var stateString = decodeURIComponent(stateStringContainer.getAttribute("stateString"));
gBrowser.removeCurrentTab();
restoreSession(stateString);
}, false);
cDoc.head.appendChild(script);
var restoreBtn = cDoc.getElementById("errorTryAgain");
restoreBtn.setAttribute("oncommand", "restoreTwo();");
}, true);
gBrowser.selectedTab = newTab;
}
//Создание сохранены ответил меню правой кнопки мыши
function makeitems(name) {
var ss = document.createElement("menu");
ss.setAttribute("label", name);
ss.setAttribute("class", "savedSessions");
var ss_popup = document.createElement("menupopup");
var rs = document.createElement("menuitem");
rs.setAttribute("label", "Восстановление");
rs.addEventListener("command", restoreSession, false);
var rss = document.createElement("menuitem");
rss.setAttribute("label", "Выборочное восстановление");
rss.addEventListener("command", restoreSessionSelectively, false)
var rn = document.createElement("menuitem");
rn.setAttribute("label", "Переименовать");
rn.addEventListener("command", rename, false);
var rm = document.createElement("menuitem");
rm.setAttribute("label", "Удалить");
rm.addEventListener("command", remove, false);
ss_popup.appendChild(rs);
ss_popup.appendChild(rss);
ss_popup.appendChild(rn);
ss_popup.appendChild(rm);
ss.appendChild(ss_popup);
menupopup.appendChild(ss);
}
//В appmenu В меню сборки
var menu = document.createElement("menu"); //Главное меню
menu.id = "ssm_menu";
var it = document.getElementById("appmenu_webDeveloper");
it.parentNode.insertBefore(menu, it);
menu.setAttribute("label", "Сохранить сеанс"); //Всплывающие меню
var menupopup = document.createElement("menupopup");
menupopup.id = "ssm_menupopup";
menu.appendChild(menupopup);
var scs = document.createElement("menuitem"); //Сохранение текущей сессии
scs.setAttribute("label", "Сохранить сеанс");
scs.addEventListener("command", saveCurrentSession, false);
menupopup.appendChild(scs);
var scws = document.createElement("menuitem"); //Сохранение текущей сессии окне
scws.setAttribute("label", "Сохранить в новом окне");
scws.addEventListener("command", saveCurrentWindowSession, false);
menupopup.appendChild(scws);
var menusep = document.createElement("menuseparator"); //Меню сепаратор
menupopup.appendChild(menusep);
var savedSessions = loadFile(); //Сохраненный список
for (name in savedSessions) {
makeitems(name);
}
}());
// устанавливаем флаг, чтобы функции и обработчики не исполнялась дважды
this.setAttribute("stop","true");
Отредактировано SendInfo (29-11-2012 02:20:56)