Страницы: 1
Автор: 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)
Отсутствует
SendInfoСоздал кнопку, ничего не произошло, что должно быть?
Отсутствует
SendInfo
Теперь понятно, у меня рыжая кнопка скрыта, поэтому ничего не заметил
var it = document.getElementById("appmenu_webDeveloper");
на
var it = document.getElementById("privateBrowsingItem");
Теперь появился пункт меню в "Инструментах"
Отредактировано Kamui (19-11-2012 21:56:43)
Отсутствует
Переделал скриптег этот, под обычную кнопку на панель. Убрал из гл.меню - теперь одной кнопкой.
URl
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
// Подсказка у кнопки 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
Отсутствует
Сессия сохраняется с куками и положением расширений (ваклю впн ) ? При нажатии ПКМ идет только вызов меню кнопки. исправте (firefox 35)
Отредактировано cookiefox (04-11-2017 16:36:01)
Отсутствует
Страницы: 1