Полезная информация

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№119-11-2012 16:16:25

SendInfo
.
 
Группа: Members
Зарегистрирован: 14-02-2011
Сообщений: 271
UA: unknown 0.0

Simple Session Manager(Простой менеджер сессий)

Автор: 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)

Отсутствует

 

№219-11-2012 19:30:33

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 16.0

Re: Simple Session Manager(Простой менеджер сессий)

SendInfo
Создал кнопку, ничего не произошло, что должно быть?

Отсутствует

 

№319-11-2012 21:34:58

SendInfo
.
 
Группа: Members
Зарегистрирован: 14-02-2011
Сообщений: 271
UA: unknown 0.0

Re: Simple Session Manager(Простой менеджер сессий)

Kamui пишет

SendInfoСоздал кнопку, ничего не произошло, что должно быть?

скрытый текст
Simple%20Session%20Manager.png

Код с домашней страницы у меня не работал , заменил    var it = document.getElementById("appmenu_savePage");  на var it = document.getElementById("appmenu_webDeveloper");

Отсутствует

 

№419-11-2012 21:54:52

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 16.0

Re: Simple Session Manager(Простой менеджер сессий)

SendInfo
Теперь понятно, у меня рыжая кнопка скрыта, поэтому ничего не заметил :)
var it = document.getElementById("appmenu_webDeveloper");
на
var it = document.getElementById("privateBrowsingItem");
Теперь появился пункт меню в "Инструментах" :)

Отредактировано Kamui (19-11-2012 21:56:43)

Отсутствует

 

№503-10-2017 12:14:18

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 45.0

Re: Simple Session Manager(Простой менеджер сессий)

Переделал скриптег этот, под обычную кнопку на панель. Убрал из гл.меню - теперь одной кнопкой.

URl

simple Session Manager button

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESimple%20Session%20Manager%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACT0lEQVQ4jYWTMWsUURSF3042yi4sIYWBmE0WiTDqujP33jO7+vYlMkV+QAoHhbQJYqFYiLK7Yh2SJZVY2QSsrCxsROyFKCgWBoxiFRurSAoNYSycicPmzfrgVXP47pl37lFqyImiaISIDDNf9TxPhmn/ewCcI6JtAHF6mfkdEa0MSAthGBYBjIZhWMzjFZh5KwiCOAj+ATPg26lOa10CUNZal5RSBRvM0VpP/YUFx2AAYhF5q5RyjDGVhQWMGWMquTBjTKXVap3JgyXAzwMwx/qbqajdDi6KyOEQ4I/5eUwOhWmtS+lEEUEeLHH+q91uT+TBVJJSOTuRmZ/YYMm9lwtTSikAo0lKRyLf91s2mIgcNBqN8RxU4cihsqQkIlsDzmIAz/Jg2T20Rs7MFwDspjBm3nFd97RF6iT7OJozTBWZ+QqARa39qebl5hKAxWq1WgIQEVFbKZW6cYwxFQDlwaY4zHydiF4Q0V4QBHGziafGmMrMend7pt/7mLh+nrRln4heAliem2uMDzblJDO/GgyAmd8rpZzaWne5ut5ZSYBfLUG9rtfrJ7JvdcuyGrGIHM7Ozk5M9ztvpvu9D/V6/axNByD2ff9aNs1HNhGAmIjuzGz0vtU2ul+Y+eEQXTfrcDUIcEyUvNVOrd95UFu9f5eZd22wRHczCzwF4DGAfVvdfKNveJeaHRtMRH6KyBqA8hEwbQqAMSJaYuZNZv7EzAfJ9O8ispe86+/k2yYRLbmuW8lsyvCmRFE0AmBSRM57nudq7U8ppUZydrcQhmHxDzZOP4I07GE/AAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u0411%u043B%u043E%u043A%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u043F%u043E%u0432%u0442%u043E%u0440%u043D%u044B%u0439%20%u0437%u0430%u043F%u0443%u0441%u043A%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u0438%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u043E%u0432%20%u043F%u0440%u0438%20%u043E%u0442%u043A%u0440%u044B%u0442%u0438%u0438%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0430%u043D%u0435%u043B%u0435%u0439%20..............%0A//%20if%20%28this.hasAttribute%28%22stop%22%29%29%20return%3B%20%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%0Athis.tooltipText%20%3D%20%22Simple%20Session%20Manager%5Cn%5C%0A------------------------------------%5Cn%5C%0A%u041F%u041A%u041C%20-%20%u041C%u0435%u043D%u044E%20%u0421%u0435%u0441%u0441%u0438%u0439%5Cn%5C%0A%u0421%u041A%u041C%20-%20%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0441%u0435%u0441%u0441%u0438%u044E%22%3B%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%0A%20this.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20%20switch%20%28e.button%29%20%7B%0A%20%20%20%20%20%20%20%20case%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20menupopup.showPopup%28this%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20case%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20saveCurrentSession%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%7D%0A%20%7D%3B%0A%0Avar%20menupopup%20%3D%20self.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Amenupopup.id%20%3D%20%22ssm_menupopup%22%3B%0A%0Avar%20scs%20%3D%20document.createElement%28%22menuitem%22%29%3B%20//%u0421%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u0435%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0441%u0435%u0441%u0441%u0438%u0438%0Ascs.setAttribute%28%22label%22%2C%20%22%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0441%u0435%u0430%u043D%u0441%22%29%3B%0Ascs.addEventListener%28%22command%22%2C%20saveCurrentSession%2C%20false%29%3B%0Amenupopup.appendChild%28scs%29%3B%0A%0Avar%20scws%20%3D%20document.createElement%28%22menuitem%22%29%3B%20//%u0421%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u0435%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0441%u0435%u0441%u0441%u0438%u0438%20%u043E%u043A%u043D%u0435%0Ascws.setAttribute%28%22label%22%2C%20%22%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0432%20%u043D%u043E%u0432%u043E%u043C%20%u043E%u043A%u043D%u0435%22%29%3B%0Ascws.addEventListener%28%22command%22%2C%20saveCurrentWindowSession%2C%20false%29%3B%0Amenupopup.appendChild%28scws%29%3B%0A%0Avar%20menusep%20%3D%20document.createElement%28%22menuseparator%22%29%3B%20//%u041C%u0435%u043D%u044E%20%u0441%u0435%u043F%u0430%u0440%u0430%u0442%u043E%u0440%0Amenupopup.appendChild%28menusep%29%3B%0A%0Avar%20savedSessions%20%3D%20loadFile%28%29%3B%20//%u0421%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u043D%u044B%u0439%20%u0441%u043F%u0438%u0441%u043E%u043A%0Afor%20%28name%20in%20savedSessions%29%20%7B%0Amakeitems%28name%29%3B%0A%7D%0A%0A//%201%20-%20%u0415%u0441%u043B%u0438%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u0441%u0435%u0441%u0441%u0438%u0438%20%u0443%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0435%u0442%u0441%u044F%20%u0434%u043B%u044F%20%u043F%u043E%u043A%u0440%u044B%u0442%u0438%u044F%20%u043E%u0442%u043A%u0440%u044B%u0442%u044B%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%2C%0A//%200%20-%20%u043F%u0440%u0438%20%u043E%u0442%u0441%u0443%u0442%u0441%u0442%u0432%u0438%u0438%20%u043F%u043E%u043A%u0440%u044B%u0442%u0438%u044F%2C%0A//%20%u0447%u0442%u043E%u0431%u044B%20%u043F%u043E%u043A%u0440%u044B%u0442%u044C%202%20%u043E%u0445%u0432%u0430%u0442%u0430%20%u0438%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u044F%20%u0441%u0435%u0441%u0441%u0438%u044E%20%u0432%20%u043D%u043E%u0432%u043E%u043C%20%u043E%u043A%u043D%u0435%0Avar%20overwrite%20%3D%201%2C%20%0ACc%20%3D%20Components.classes%2C%0ACi%20%3D%20Components.interfaces%2C%0ACu%20%3D%20Components.utils%2C%0ASS%20%3D%20Cc%5B%22@mozilla.org/browser/sessionstore%3B1%22%5D.getService%28Ci.nsISessionStore%29%3B%0Aif%20%28%21window.Services%29%20%7B%0ACu.import%28%22resource%3A//gre/modules/Services.jsm%22%29%3B%0A%7D%0A%0A//%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0444%u0443%u043D%u043A%u0446%u0438%u044E%20%u0447%u0442%u0435%u043D%u0438%u044F%20%u0444%u0430%u0439%u043B%u0430%2C%20%u0432%u0437%u044F%u0442%u044B%u0435%20%u0438%u0437%20Griever%20%u0438%u0437%20UserScriptLoader.uc.js%0Afunction%20saveFile%28data%29%20%7B%0Avar%20file%20%3D%20Services.dirsvc.get%28%27UChrm%27%2C%20Ci.nsIFile%29%3B%0Afile.append%28%22simple_session_manager.json%22%29%3B%0A%0Avar%20suConverter%20%3D%20Cc%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.createInstance%28Ci.nsIScriptableUnicodeConverter%29%3B%0AsuConverter.charset%20%3D%20%27UTF-8%27%3B%0Adata%20%3D%20suConverter.ConvertFromUnicode%28data%29%3B%0A%0Avar%20foStream%20%3D%20Cc%5B%27@mozilla.org/network/file-output-stream%3B1%27%5D.createInstance%28Ci.nsIFileOutputStream%29%3B%0AfoStream.init%28file%2C%200x02%20%7C%200x08%20%7C%200x20%2C%200664%2C%200%29%3B%0AfoStream.write%28data%2C%20data.length%29%3B%0AfoStream.close%28%29%3B%0A%7D%0A%0Afunction%20loadFile%28%29%20%7B%0Avar%20file%20%3D%20Services.dirsvc.get%28%27UChrm%27%2C%20Ci.nsIFile%29%3B%0Afile.append%28%22simple_session_manager.json%22%29%3B%0Aif%20%28file.exists%28%29%20%3D%3D%3D%20false%29%20return%20false%3B%0Avar%20fstream%20%3D%20Cc%5B%22@mozilla.org/network/file-input-stream%3B1%22%5D.createInstance%28Ci.nsIFileInputStream%29%3B%0Avar%20sstream%20%3D%20Cc%5B%22@mozilla.org/scriptableinputstream%3B1%22%5D.createInstance%28Ci.nsIScriptableInputStream%29%3B%0Afstream.init%28file%2C%20-1%2C%200%2C%200%29%3B%0Asstream.init%28fstream%29%3B%0A%0Avar%20data%20%3D%20sstream.read%28sstream.available%28%29%29%3B%0Atry%20%7B%0Adata%20%3D%20decodeURIComponent%28escape%28data%29%29%3B%0A%7D%20catch%20%28e%29%20%7B%7D%0Asstream.close%28%29%3B%0Afstream.close%28%29%3B%0Aif%20%28data%20%3D%3D%3D%20%22undefined%22%29%20return%20false%3B%0Adata%20%3D%20JSON.parse%28data%29%3B%0Areturn%20data%3B%0A%7D%0A%0A//%u041F%u043E%u043B%u0443%u0447%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0435%u0435%20%u0432%u0440%u0435%u043C%u044F%0Afunction%20getTime%28%29%20%7B%0Avar%20d%20%3D%20new%20Date%28%29%3B%0A%0Afunction%20addzero%28t%29%20%7B%0A%28t%20%3C%2010%29%20%3F%20t%20%3D%20%220%22%20+%20t%20%3A%20t%3B%0Areturn%20t%3B%0A%7D%0Avar%20t%20%3D%20addzero%28d.getDate%28%29%29%20+%20%22.%22%20+%20addzero%28d.getMonth%28%29+1%29%20+%20%22.%22%20+%20d.getFullYear%28%29%20+%20%22-%22%20+%20addzero%28d.getHours%28%29%29%20+%20%22%3A%22%20+%20addzero%28d.getMinutes%28%29%29%3B%0Areturn%20t%3B%0A%7D%0A%0A//%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0441%u0435%u0441%u0441%u0438%u044E%0Afunction%20saveSession%28ssdata%29%20%7B%0Avar%20name%20%3D%20prompt%28%22%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%22%2CgetTime%28%29%29%3B%0Aif%20%28name%20%21%3D%20null%29%20%7B%0Aif%20%28loadFile%28%29%20%3D%3D%3D%20false%29%20%7B%0Avar%20data%20%3D%20%7B%7D%3B%0A%7D%20else%20%7B%0Avar%20data%20%3D%20loadFile%28%29%3B%0A%7D%0Aif%20%28data%5Bname%5D%29%20%7B%0Aalert%28%22%u0421%u0435%u0441%u0441%u0438%u044F%20%u0441%20%u0442%u0435%u043C%20%u0436%u0435%20%u0438%u043C%u0435%u043D%u0435%u043C%20%u0443%u0436%u0435%20%u0441%u0443%u0449%u0435%u0441%u0442%u0432%u0443%u0435%u0442%22%29%0Areturn%3B%0A%7D%0Adata%5Bname%5D%20%3D%20JSON.parse%28ssdata%29%3B%0AsaveFile%28JSON.stringify%28data%29%29%3B%0Amakeitems%28name%29%3B%0A%7D%0A%7D%0A%0A//%u0421%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0432%u0441%u0435%20%u043E%u043A%u043D%u0430%20%u0441%u0435%u0441%u0441%u0438%u0438%0Afunction%20saveCurrentSession%28%29%20%7B%0Avar%20ssdata%20%3D%20SS.getBrowserState%28%29%3B%0AsaveSession%28ssdata%29%3B%0A%7D%0A%0A//%u0421%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u0435%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0441%u0435%u0441%u0441%u0438%u0438%20%u043E%u043A%u043D%u0435%0Afunction%20saveCurrentWindowSession%28%29%20%7B%0Avar%20ssdata%20%3D%20SS.getWindowState%28window%29%3B%0AsaveSession%28ssdata%29%3B%0A%7D%0A%0A//%u0423%u0434%u0430%u043B%u0435%u043D%u0438%u0435%20%u0441%u0435%u0441%u0441%u0438%u0438%0Afunction%20remove%28%29%20%7B%0Avar%20node%20%3D%20this.parentNode.parentNode%3B%0Avar%20name%20%3D%20node.getAttribute%28%22label%22%29%3B%0Avar%20cf%20%3D%20confirm%28%22%u0412%u044B%20%u0443%u0432%u0435%u0440%u0435%u043D%u044B%2C%20%u0447%u0442%u043E%20%u0445%u043E%u0442%u0438%u0442%u0435%20%u0443%u0434%u0430%u043B%u0438%u0442%u044C%20%22%20+%20name%20+%20%22%20%3F%22%29%3B%0Aif%20%28cf%20%3D%3D%3D%20true%29%20%7B%0Anode.style.display%20%3D%20%22none%22%3B%0Avar%20data%20%3D%20loadFile%28%29%3B%0Adelete%20data%5Bname%5D%3B%0AsaveFile%28JSON.stringify%28data%29%29%3B%0A%7D%0A%7D%0A%0A//%u041F%u0435%u0440%u0435%u0438%u043C%u0435%u043D%u043E%u0432%u0430%u0442%u044C%0Afunction%20rename%28%29%20%7B%0Avar%20node%20%3D%20this.parentNode.parentNode%3B%0Avar%20name%20%3D%20node.getAttribute%28%22label%22%29%3B%0Avar%20newname%20%3D%20prompt%28%22%u041F%u0435%u0440%u0435%u0438%u043C%u0435%u043D%u043E%u0432%u0430%u0442%u044C%20%22%20+%20name%20+%20%22%20in%22%2C%20null%29%3B%0Aif%20%28%21newname%29%20return%3B%0Athis.parentNode.parentNode.setAttribute%28%22label%22%2C%20newname%29%3B%0Avar%20data%20%3D%20loadFile%28%29%3B%0Avar%20value%20%3D%20data%5Bname%5D%3B%0Adata%5Bnewname%5D%20%3D%20value%3B%0Adelete%20data%5Bname%5D%3B%0AsaveFile%28JSON.stringify%28data%29%29%3B%0A%7D%0A%0A//%u0412%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u0441%u0435%u0441%u0441%u0438%u0439%0Afunction%20restoreSession%28stateString%29%20%7B%0Aif%20%28typeof%20stateString%20%3D%3D%3D%20%22string%22%29%20%7B%0Avar%20state%20%3D%20stateString%3B%0A%7D%20else%20%7B%0Avar%20name%20%3D%20this.parentNode.parentNode.getAttribute%28%22label%22%29%3B%0Avar%20data%20%3D%20loadFile%28%29%3B%0Avar%20state%20%3D%20JSON.stringify%28data%5Bname%5D%29%3B%0A%7D%0Aswitch%20%28overwrite%29%20%7B%0Acase%200%3A%0ASS.setWindowState%28window%2C%20state%2C%20false%29%3B%0Abreak%3B%0Acase%201%3A%0ASS.setBrowserState%28state%29%3B%0Abreak%3B%0Acase%202%3A%0Avar%20watcher%20%3D%20Cc%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D.getService%28Ci.nsIWindowWatcher%29%3B%0Avar%20argstring%20%3D%20Cc%5B%22@mozilla.org/supports-string%3B1%22%5D.createInstance%28Ci.nsISupportsString%29%3B%0Avar%20w%20%3D%20watcher.openWindow%28null%2C%20%22chrome%3A//browser/content/browser.xul%22%2C%20%22name%22%2C%20%22chrome%2Call%2Cdialog%3Dno%22%2C%20argstring%29%3B%0Aw.addEventListener%28%22load%22%2C%20function%20%28%29%20%7B%0ASS.setWindowState%28w%2C%20state%2C%20true%29%3B%0A%7D%2C%20true%29%3B%0Abreak%3B%0A%7D%0A%7D%0A%0A//%u0421%u0435%u043B%u0435%u043A%u0442%u0438%u0432%u043D%u044B%u0439%20%u043E%u0442%u0432%u0435%u0442%u0430%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u044F%20%28%u0441%20%u043F%u043E%u043C%u043E%u0449%u044C%u044E%20Firefox%20%u043F%u043E%u0441%u0442%u0430%u0432%u043B%u044F%u0435%u0442%u0441%u044F%20%u0441%20%u043A%u0440%u0430%u0445%u0430%20%u043C%u0435%u0445%u0430%u043D%u0438%u0437%u043C%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u044F%29%0Afunction%20restoreSessionSelectively%28%29%20%7B%0Avar%20name%20%3D%20this.parentNode.parentNode.getAttribute%28%22label%22%29%3B%0Avar%20data%20%3D%20loadFile%28%29%3B%0Avar%20sessionValue%20%3D%20JSON.stringify%28data%5Bname%5D%29%3B%0Avar%20newTab%20%3D%20gBrowser.addTab%28%22about%3Asessionrestore%22%29%3B%0Avar%20newTabBrowser%20%3D%20gBrowser.getBrowserForTab%28newTab%29%3B%0AnewTabBrowser.addEventListener%28%22load%22%2C%20function%20%28%29%20%7B%0Avar%20cDoc%20%3D%20newTabBrowser.contentDocument%3B%0Avar%20sessionData%20%3D%20cDoc.getElementById%28%22sessionData%22%29%3B%0AsessionData.value%20%3D%20sessionValue%3B%0AcDoc.getElementById%28%22errorTitleText%22%29.innerHTML%20%3D%20%22%u0412%u044B%u0431%u043E%u0440%u043E%u0447%u043D%u043E%u0435%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%22%3B%0AcDoc.getElementById%28%22errorShortDescText%22%29.hidden%20%3D%20true%3B%0AcDoc.getElementById%28%22errorLongDesc%22%29.innerHTML%20%3D%20%22%u0412%u044B%20%u0441%u043E%u0431%u0438%u0440%u0430%u0435%u0442%u0435%u0441%u044C%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u0438%u0442%u044C%20%22%20+%20name%20+%20%22%20.%20%u0412%u044B%20%u043C%u043E%u0436%u0435%u0442%u0435%20%u043E%u0442%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043D%u0435%u043D%u0443%u0436%u043D%u044B%u0435%20%u043E%u043A%u043D%u0430%20%u0438%u043B%u0438%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%22%3B%0Avar%20stateStringContainer%20%3D%20cDoc.createElement%28%22div%22%29%3B%0AstateStringContainer.id%20%3D%20%22stateStringContainer%22%3B%0AstateStringContainer.style.display%20%3D%20%22none%22%3B%0AcDoc.getElementById%28%22errorPageContainer%22%29.appendChild%28stateStringContainer%29%3B%0Avar%20script%20%3D%20cDoc.createElement%28%22script%22%29%3B%0Ascript.innerHTML%20%3D%20%27function%20restoreTwo%28%29%20%7B%5C%0Adocument.getElementById%28%22errorTryAgain%22%29.disabled%20%3D%20true%3B%5C%0Avar%20ix%20%3D%20gStateObject.windows.length%20-%201%3B%5C%0Afor%20%28var%20t%20%3D%20gTreeData.length%20-%201%3B%20t%20%3E%3D%200%3B%20t--%29%20%7B%5C%0Aif%20%28treeView.isContainer%28t%29%29%20%7B%5C%0Aif%20%28gTreeData%5Bt%5D.checked%20%3D%3D%3D%200%29%5C%0AgStateObject.windows%5Bix%5D.tabs%20%3D%20gStateObject.windows%5Bix%5D.tabs.filter%28function%20%28aTabData%2C%20aIx%29%5C%0AgTreeData%5Bt%5D.tabs%5BaIx%5D.checked%29%3B%5C%0Aelse%20if%20%28%21gTreeData%5Bt%5D.checked%29%5C%0AgStateObject.windows.splice%28ix%2C%201%29%3B%5C%0Aix--%3B%5C%0A%7D%5C%0A%7D%5C%0Avar%20stateString%20%3D%20JSON.stringify%28gStateObject%29%3B%5C%0Adocument.getElementById%28%22stateStringContainer%22%29.setAttribute%28%22stateString%22%2C%20encodeURIComponent%28stateString%29%29%3B%5C%0A%7D%27%3B%0AstateStringContainer.addEventListener%28%22DOMAttrModified%22%2C%20function%20%28%29%20%7B%0Athis.removeEventListener%28%27DOMAttrModified%27%2C%20arguments.callee%2C%20false%29%3B%0Avar%20stateString%20%3D%20decodeURIComponent%28stateStringContainer.getAttribute%28%22stateString%22%29%29%3B%0AgBrowser.removeCurrentTab%28%29%3B%0ArestoreSession%28stateString%29%3B%0A%7D%2C%20false%29%3B%0AcDoc.head.appendChild%28script%29%3B%0Avar%20restoreBtn%20%3D%20cDoc.getElementById%28%22errorTryAgain%22%29%3B%0ArestoreBtn.setAttribute%28%22oncommand%22%2C%20%22restoreTwo%28%29%3B%22%29%3B%0A%7D%2C%20true%29%3B%0AgBrowser.selectedTab%20%3D%20newTab%3B%0A%7D%0A%0A//%u0421%u043E%u0437%u0434%u0430%u043D%u0438%u0435%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u044B%20%u043E%u0442%u0432%u0435%u0442%u0438%u043B%20%u043C%u0435%u043D%u044E%20%u043F%u0440%u0430%u0432%u043E%u0439%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043C%u044B%u0448%u0438%0Afunction%20makeitems%28name%29%20%7B%0Avar%20ss%20%3D%20document.createElement%28%22menu%22%29%3B%0Ass.setAttribute%28%22label%22%2C%20name%29%3B%0Ass.setAttribute%28%22class%22%2C%20%22savedSessions%22%29%3B%0A%0Avar%20ss_popup%20%3D%20document.createElement%28%22menupopup%22%29%3B%0Avar%20rs%20%3D%20document.createElement%28%22menuitem%22%29%3B%0Ars.setAttribute%28%22label%22%2C%20%22%u0412%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%22%29%3B%0Ars.addEventListener%28%22command%22%2C%20restoreSession%2C%20false%29%3B%0A%0Avar%20rss%20%3D%20document.createElement%28%22menuitem%22%29%3B%0Arss.setAttribute%28%22label%22%2C%20%22%u0412%u044B%u0431%u043E%u0440%u043E%u0447%u043D%u043E%u0435%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%22%29%3B%0Arss.addEventListener%28%22command%22%2C%20restoreSessionSelectively%2C%20false%29%0A%0Avar%20rn%20%3D%20document.createElement%28%22menuitem%22%29%3B%0Arn.setAttribute%28%22label%22%2C%20%22%u041F%u0435%u0440%u0435%u0438%u043C%u0435%u043D%u043E%u0432%u0430%u0442%u044C%22%29%3B%0Arn.addEventListener%28%22command%22%2C%20rename%2C%20false%29%3B%0A%0Avar%20rm%20%3D%20document.createElement%28%22menuitem%22%29%3B%0Arm.setAttribute%28%22label%22%2C%20%22%u0423%u0434%u0430%u043B%u0438%u0442%u044C%22%29%3B%0Arm.addEventListener%28%22command%22%2C%20remove%2C%20false%29%3B%0A%0Ass_popup.appendChild%28rs%29%3B%0Ass_popup.appendChild%28rss%29%3B%0Ass_popup.appendChild%28rn%29%3B%0Ass_popup.appendChild%28rm%29%3B%0Ass.appendChild%28ss_popup%29%3B%0Amenupopup.appendChild%28ss%29%3B%0A%7D%0A%0A%0A//%20%u0443%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0435%u043C%20%u0444%u043B%u0430%u0433%2C%20%u0447%u0442%u043E%u0431%u044B%20%u0444%u0443%u043D%u043A%u0446%u0438%u0438%20%u0438%20%u043E%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%u0438%20%u043D%u0435%20%u0438%u0441%u043F%u043E%u043B%u043D%u044F%u043B%u0430%u0441%u044C%20%u0434%u0432%u0430%u0436%u0434%u044B%20%20%0A//%20this.setAttribute%28%22stop%22%2C%22true%22%29%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


Init
скрытый текст

Выделить код

Код:

// Подсказка у кнопки 
this.tooltipText = "Simple Session Manager\n\
------------------------------------\n\
ПКМ - Меню Сессий\n\
СКМ - Сохранить сессию";

// Настройка функций кликов мыши 
 this.onclick = function(e) {
     switch (e.button) {
        case 0:
             menupopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
             break;
        case 1:
             saveCurrentSession();
             break;
     }
 };

var menupopup = self.appendChild(document.createElement("menupopup"));
menupopup.id = "ssm_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);
}

// 1 - Если восстановление сессии устанавливается для покрытия открытых страниц,
// 0 - при отсутствии покрытия,
// чтобы покрыть 2 охвата и восстановления сессию в новом окне
var overwrite = 1, 
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);
}


правка: ошибки.

Отредактировано mokujin (03-10-2017 13:19:37)


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№604-11-2017 16:33:54

cookiefox
Участник
 
Группа: Members
Зарегистрирован: 10-06-2017
Сообщений: 11
UA: Firefox 35.0

Re: Simple Session Manager(Простой менеджер сессий)

Сессия сохраняется с куками и положением расширений (ваклю впн ) ? При нажатии ПКМ идет только вызов меню кнопки. исправте (firefox 35)

Отредактировано cookiefox (04-11-2017 16:36:01)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]