В 59.0.3 стояла неподписанная версия отсюда http://custombuttons.sourceforge.net/fo … 3&start=90 и прекрасно работала. После обновления
на версию 60.0.1 отвалилась.
На форуме
Dumby если будет время.... Экспорт в HTML файл в контекстном меню закладок
Удобная вещь. Тут каждую папку закладок отдельно копировать можно.скрытый текстВыделить кодКод:
/*Initialization Code*/ //-------------------- Экспорт в HTML файл в контекстном меню закладок //Источник - https://github.com/ardiman/userChrome.js/blob/master/exporthtmlfolder/ExportHTMLFolder.uc.xul (function () { function ImageConverter(imageURL) { this.imageURL = imageURL; this.channel = Services.io.newChannel(imageURL, null, null); this.channel.asyncOpen(this, null); } ImageConverter.prototype = { imageURL : "", channel : null, bytes : [], stream : null, Database64 : null, iscompleted : false, QueryInterface : function (iid) { if (!iid.equals(Components.interfaces.nsISupports) && !iid.equals(Components.interfaces.nsIRequestObserver) && !iid.equals(Components.interfaces.nsIStreamListener)) { throw Components.results.NS_ERROR_NO_INTERFACE; } return this; }, onStartRequest : function (aRequest, aContext) { this.stream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream); this.iscompleted = false; }, onStopRequest : function (aRequest, aContext, aStatusCode) { this.Database64 = 'data:' + this.channel.contentType + ';base64,' + btoa(String.fromCharCode.apply(null, this.bytes)); this.iscompleted = true; }, onDataAvailable : function (aRequest, aContext, aInputStream, aOffset, aCount) { this.stream.setInputStream(aInputStream); var chunk = this.stream.readByteArray(aCount); this.bytes = this.bytes.concat(chunk); } }; var ExportHTMLFolder = { escapeHTML: function(str) { return str.replace(/[&"<>]/g, function (m) ({ "&": "&", '"': """, "<": "<", ">": ">" })[m]); }, onMenuItemCommand: function(event) { var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService); var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService); var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); var MPMenu = PlacesUtils.getString("BookmarksMenuFolderTitle"); var NodeID = document.popupNode._placesNode || document.popupNode.parentNode.selectedNode; fp.init(window, PlacesUIUtils.getString("EnterExport"),Ci.nsIFilePicker.modeSave); fp.appendFilters(Ci.nsIFilePicker.filterHTML); fp.defaultString = NodeID.title+".html"; fp.open(res => { if (res == fp.returnCancel || !fp.file) return; var file = fp.file; var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance(Components.interfaces.nsIFileOutputStream); var charset = "UTF-8"; foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0); var os = Components.classes["@mozilla.org/intl/converter-output-stream;1"] .createInstance(Components.interfaces.nsIConverterOutputStream); os.init(foStream, charset, 0, 0x0000); var nbTab = 5; var data = '<!DOCTYPE NETSCAPE-Bookmark-file-1>\n'; data = data + '<!-- This is an automatically generated file.\n'; data = data + '\tIt will be read and overwritten.\n'; data = data + '\tDO NOT EDIT! -->\n'; data = data + '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">\n'; data = data + '<TITLE>Bookmarks</TITLE>\n'; data = data + '<H1>'+ExportHTMLFolder.escapeHTML(MPMenu)+'</H1>\n'; data = data + '\n'; data = data + '<DL><p>\n'; os.writeString(data); var options = historyService.getNewQueryOptions(); var query = historyService.getNewQuery(); if( NodeID.type != 0 ) { query.setFolders([NodeID.itemId], 1); var result = historyService.executeQuery(query, options); node = result.root; } else { query.setFolders([NodeID.parent.itemId], 1); var result = historyService.executeQuery(query, options); var rootNode = result.root; rootNode.containerOpen = true; inc = 0; var node = rootNode.getChild(inc); while(( inc < rootNode.childCount )&&( node.itemId != NodeID.itemId )) { inc++; var node = rootNode.getChild(inc); } rootNode.containerOpen = false; } this.ecrireUnMP( os, node, nbTab ); data = '</DL></p>\n'; os.writeString(data); os.close(); }); }, ecrireUnMP: function( flux, elem, nbTab ) { var resultTypes = Ci.nsINavHistoryResultNode; if( elem.type == resultTypes.RESULT_TYPE_SEPARATOR ) { var chaine = new Array(nbTab).join(' ') + "<HR>\n"; flux.writeString(chaine); } else if( elem.type == resultTypes.RESULT_TYPE_URI ) { var Description= PlacesUIUtils.getItemDescription(elem.itemId); var chaine = new Array(nbTab).join(' ') + '<DT><A HREF="' + this.escapeHTML(elem.uri); if ( elem.icon.indexOf('moz-anno:favicon:http') >= 0 ) { if ( elem.icon.indexOf('http://www.mozilla.org/2005/made-up-favicon/') < 0 ){ chaine = chaine + '" ICON_URI="' + elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http') + 'moz-anno:favicon:'.length); } var Image = new ImageConverter( elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http')) ); var thread = Cc['@mozilla.org/thread-manager;1'].getService().mainThread; while ( !Image.iscompleted ) { thread.processNextEvent(true); } chaine = chaine + '" ICON="' + Image.Database64; } else if ( elem.icon.indexOf('moz-anno:favicon:data:image') >= 0 ) { chaine = chaine + '" ICON="' +elem.icon.slice(elem.icon.indexOf('data:image')); } var chaine = chaine + '">' + this.escapeHTML(elem.title) + '</A>\n' + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n'; flux.writeString(chaine); } else if(( elem.type == resultTypes.RESULT_TYPE_FOLDER )||( elem.type == resultTypes.RESULT_TYPE_FOLDER_SHORTCUT )) { var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService); var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService); var Description= PlacesUIUtils.getItemDescription(elem.itemId); this.escapeHTML(elem.title) + '</H3>\n'; var chaine = new Array(nbTab).join(' ') + '<DT><H3>' + this.escapeHTML(elem.title) + '</H3>\n'; var chaine = chaine + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n'; chaine = chaine + new Array(nbTab).join(' ') + '<DL><p>\n'; flux.writeString(chaine); nbTab = nbTab + 4; var options = historyService.getNewQueryOptions(); var query = historyService.getNewQuery(); query.setFolders([elem.itemId], 1); var result = historyService.executeQuery(query, options); var rootNode = result.root; rootNode.containerOpen = true; for (var inc = 0; inc < rootNode.childCount; inc ++) { var node = rootNode.getChild(inc); this.ecrireUnMP( flux, node, nbTab ); } rootNode.containerOpen = false; nbTab = nbTab - 4; chaine = new Array(nbTab).join(' ') + '</DL></p>\n'; flux.writeString(chaine); } }, init: function() { var contextMenu = document.getElementById("placesContext"); if (contextMenu) contextMenu.addEventListener("popupshowing", this.ExportHTMLFolderShowHideItem, false); }, ExportHTMLFolderShowHideItem: function(event) { var show = document.getElementById("placesContext_ExportHTMLFolder"); show.hidden = (document.popupNode.localName == "menuseparator")||( document.popupNode.className == "openintabs-menuitem"); document.getElementById("placesContext_ExportHTMLFolderSep").hidden = show.hidden; }, }; window.addEventListener("load", function load(event) { window.removeEventListener("load", load, false); //remove listener, no longer needed ExportHTMLFolder.init(); }, false); if ( document.getElementById("placesContext_ExportHTMLFolder") ) return; var contextMenu = document.getElementById("placesContext"); var copyBothMenuItem = document.createElement("menuitem"); copyBothMenuItem.id = "placesContext_ExportHTMLFolder"; copyBothMenuItem.setAttribute("label", "Экспорт в HTML"); copyBothMenuItem.setAttribute("selection", "any"); copyBothMenuItem.setAttribute("closemenu", "single"); copyBothMenuItem.addEventListener("command", function () { ExportHTMLFolder.onMenuItemCommand(event); }); contextMenu.insertBefore(copyBothMenuItem, document.getElementById("placesContext_newSeparator") ); var SMenuItem = document.createElement("menuseparator"); SMenuItem.id = "placesContext_ExportHTMLFolderSep"; contextMenu.insertBefore(SMenuItem, document.getElementById("placesContext_ExportHTMLFolder") ); })();
Нет, вот с этого, премного извиняюсь, уволь.
Может подойдёт только с папок закладок и только экспорт
(popup => addEventListener("popupshowing", { handleEvent() { if (this.shouldHide()) return; var before = document.getElementById("placesContext_openSeparator"); var menuitem = popup.insertBefore(document.createElement("menuitem"), before); menuitem.setAttribute("label", "Экспорт папки в HTML"); menuitem.setAttribute("oncommand", "exportFolder();"); menuitem.exportFolder = this.pick.bind(this); addDestructor(() => menuitem.remove()); (this.handleEvent = () => menuitem.hidden = menuitem.disabled = this.shouldHide())(); }, shouldHide() { var node = popup.triggerNode._placesNode; var hide = !node || node.type != node.RESULT_TYPE_FOLDER; if (!hide) this.guid = node.bookmarkGuid, this.title = node.title; return hide; }, pick() { var fp = makeFilePicker(); fp.init(window, PlacesUIUtils.getString("EnterExport"), fp.modeSave); fp.appendFilters(fp.filterHTML); fp.defaultString = (this.title ? DownloadPaths.sanitize(this.title) : "untitled") + ".html"; fp.open(res => res == fp.returnCancel || this.export(fp.file.path)); }, async export(path) { var tree = await PlacesUtils.promiseBookmarksTree( this.guid, {includeItemIds: true} ); var bookmarks = {children: [ {root: "toolbarFolder"}, {root: "unfiledBookmarksFolder"}, {root: "bookmarksMenuFolder", children: [tree], guid: PlacesUtils.bookmarks.menuGuid} ]}; new this.nsvo.BookmarkExporter(bookmarks).exportToFile(path); }, get nsvo() { delete this.nsvo; return this.nsvo = Cu.import("resource://gre/modules/BookmarkHTMLUtils.jsm", {}); } }, false, popup))(document.getElementById("placesContext") || 1);
Отредактировано Dumby (30-05-2018 08:44:15)
Отсутствует
Dumby
Да, отлично! То, что и требовалось. Спасибо!
Еще одна маленькая просьба. Есть простая кнопка
this._handleClick =()=> { cbu.setPrefs(s, cbu.getPrefs(s) == true ? false : true); }; var s = "dom.indexedDB.enabled"; var ps = Services.prefs; function toggleImage() { var val = cbu.getPrefs(s); var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon"); icon.src = cbu.getPrefs(s) == true ? self.image : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACGUlEQVR42pXSwWvTUBgA8O81pro0gQ4EpxtURNgOFcYGwiqUXnqpB3sreihxHSuoDASLsEPBw4ZSsDD1qj2IVf8Ad5BC10NF8dDdtO4i9ial0jpTm+W9fe8lnUntZR985OXlfb/3vSQknU6DO6LR6GVVVauU0olutws8efR6PRoKhZZqtdon93riBpLJ5Kt+v38dA0aj0WhAsVgEQkiZMXbjP4DvrCjKx2FxuVyGVqsldtY0zRePx8U8RzDmML96gEQi8SeVSk3wcaFQ4IXrhmGU+H273dYty9rUdR2azSbU6/XfOK15gEgkwrLZrNi5Uqk8M03zjvsIsiw/xbnbHCmVhEs8QDgcZrlcDvL5PMUXN9fpdL6NvIZZzC9jgec377LB6mPIXzsjVj68uuKqO+lcT8Hyi/tilHmrw5XtBbxfI0eAFJuH44RV3Ufg1hC4h8AlsHaqQBQFyNlzAGoASHBSLGa/OkB3d3HAu/GDFFtE4C8Cq0NgHYFZAQA7LYp889NAGwP7Wwe+A9ufco7TsoH3B7D8MjMG4AVOF3RPBnNDBv/mHgIGPlEFIsXCo8ADBM5jWzu4gO9kgu9iEAENBmsS+J98xs4uOB38tIF3CLwZBxBmH2Fm5uiFUfwj7fOLf2cc8AiBKQQ+4ONpTEN0ATBwiABmUHxKgB8COHhtQmZ7xQscJ0aALbtvOOEkb0Byrv+KWJd5EA4cAjGVAsBnQ+9cAAAAAElFTkSuQmCC"; self.tooltipText = val ? 'Да Storage' : 'Нет Storage'; }; toggleImage(); Services.prefs.addObserver( s, toggleImage, false ); addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) });
Отсутствует
Garalf
Во-первых, это не возможно, во-вторых- это ничего не даст, и в- третьих - к чертям все расширения, требующие лок.хранилище.KeepPass, тем более, это стрёмно...
Как можно доверять пароли каким-то фраерам, требующих авторизацию?
Отсутствует
Еще одна маленькая просьба. Есть простая кнопка
скрытый текстВыделить кодКод:
this._handleClick =()=> { cbu.setPrefs(s, cbu.getPrefs(s) == true ? false : true); }; var s = "dom.indexedDB.enabled"; var ps = Services.prefs; function toggleImage() { var val = cbu.getPrefs(s); var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon"); icon.src = cbu.getPrefs(s) == true ? self.image : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACGUlEQVR42pXSwWvTUBgA8O81pro0gQ4EpxtURNgOFcYGwiqUXnqpB3sreihxHSuoDASLsEPBw4ZSsDD1qj2IVf8Ad5BC10NF8dDdtO4i9ial0jpTm+W9fe8lnUntZR985OXlfb/3vSQknU6DO6LR6GVVVauU0olutws8efR6PRoKhZZqtdon93riBpLJ5Kt+v38dA0aj0WhAsVgEQkiZMXbjP4DvrCjKx2FxuVyGVqsldtY0zRePx8U8RzDmML96gEQi8SeVSk3wcaFQ4IXrhmGU+H273dYty9rUdR2azSbU6/XfOK15gEgkwrLZrNi5Uqk8M03zjvsIsiw/xbnbHCmVhEs8QDgcZrlcDvL5PMUXN9fpdL6NvIZZzC9jgec377LB6mPIXzsjVj68uuKqO+lcT8Hyi/tilHmrw5XtBbxfI0eAFJuH44RV3Ufg1hC4h8AlsHaqQBQFyNlzAGoASHBSLGa/OkB3d3HAu/GDFFtE4C8Cq0NgHYFZAQA7LYp889NAGwP7Wwe+A9ufco7TsoH3B7D8MjMG4AVOF3RPBnNDBv/mHgIGPlEFIsXCo8ADBM5jWzu4gO9kgu9iEAENBmsS+J98xs4uOB38tIF3CLwZBxBmH2Fm5uiFUfwj7fOLf2cc8AiBKQQ+4ONpTEN0ATBwiABmUHxKgB8COHhtQmZ7xQscJ0aALbtvOOEkb0Byrv+KWJd5EA4cAjGVAsBnQ+9cAAAAAElFTkSuQmCC"; self.tooltipText = val ? 'Да Storage' : 'Нет Storage'; }; toggleImage(); Services.prefs.addObserver( s, toggleImage, false ); addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) });
Нужно, чтобы она при запуске FF (или при закрытии) переключалась в состояние "включена"
Попробуйте добавить к вашему коду:
var switchOn = { observe: function(subject, topic, data) { if ( data == "shutdown" ) cbu.setPrefs("dom.indexedDB.enabled", true); } }; Services.obs.addObserver(switchOn, "quit-application", false);
Отсутствует
просто добавь в инициализацию строчку cbu.setPrefs("dom.indexedDB.enabled", true);
возможно придется обернуть её в таймаут
я помню те времена когда обновления программ убирали проблемы и исправляли баги, а не добавляли их.
toxID:05AB9B827D896AACEE7FF4573A02FB8F025F46ADC856B98F65BC1BA9BD21A81DC98BA9C36CE3
Отсутствует
А может кто поправить [CB]Toggle Find+ или упрощенный вариант
const forceFind = false, forceFindCS = true; // Приклеить элемент findbar к странице( #appcontent ) ................................ const fbID = "FindToolbar-m"; delete window.gFindBar; window.gFindBar = document.getElementById(fbID); if (!gFindBar) { gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser); gFindBar.id = fbID; gFindBar.setAttribute("browserid", "content"); gFindBar.clientTop; delete window.gFindBarInitialized; window.gFindBarInitialized = true; gFindBar._selectionMaxLen = 1000; // лимит символов для поиска setTimeout(function() { eval("gFindBar.startFind = " + gFindBar.startFind.toString() .replace('this.browser.finder.getInitialSelection();', 'this.onCurrentSelection(gBrowser.finder.getActiveSelectionText(), false)')); var {Finder} = Cu.import("resource://gre/modules/Finder.jsm"); eval("Finder.prototype.getActiveSelectionText = " + Finder.prototype .getActiveSelectionText.toString().replace('.replace', '; //')); }, 3000 ); } // Ctrl+F, показать - скрыть панель поиска .................................... function toggleFindbar() { if (gFindBar.hidden) { gFindBar.onFindCommand(); setTimeout(function() { gFindBar._find() }, 50) } else gFindBar.close(); }; addEventListener("keydown", function(e) e.keyCode == e.DOM_VK_F && e.ctrlKey && !e.altKey && !e.shiftKey && !e.preventDefault() && toggleFindbar() , false); this.onclick = function(e) { if (!e.button) toggleFindbar() }; // Показать количество совпадений на панели поиска ................................ const textbox = gFindBar.getElement("findbar-textbox"), nrm = Ci.nsISelectionController.SELECTION_NORMAL, labID = "hits-m"; var lab = document.getElementById(labID); if (!lab) { lab = textbox.parentNode.insertBefore(document.createElement("label"), textbox); lab.id = labID; } var curHit, allHits; function updateHits(arg) { if (gFindBar.hidden) return; var word = textbox.value; if (!word) { lab.value = "0/0"; textbox.removeAttribute("status"); return; } var win = arg instanceof Window && arg || content; if (win == content) curHit = allHits = 0; var findbarFinder = gFindBar._browser.finder; var controller = findbarFinder._getSelectionController(win); var doc = win.document; if (word && controller && doc && doc.documentElement) { var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement; var searchRange = doc.createRange(); searchRange.selectNodeContents(body); var startPt = searchRange.cloneRange(); startPt.collapse(true); var endPt = searchRange.cloneRange(); endPt.collapse(false); var retRange = null; var finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind); finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word); while ((retRange = finder.Find(word, searchRange, startPt, endPt))) { allHits++; if (!curHit) { var sel = controller.getSelection(nrm), range; if (sel.toString()) range = sel.getRangeAt(0); else { var editableNode = findbarFinder._getEditableNode(retRange.startContainer); if (editableNode) sel = editableNode.editor.selectionController.getSelection(nrm); if (sel.toString()) range = sel.getRangeAt(0); } var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"] .every(function(prop) range[prop] == retRange[prop]); if (comp) curHit = allHits; } startPt = retRange.cloneRange(); startPt.collapse(false); } Array.forEach(win.frames, function(frame) updateHits(frame)); } if (win != content) return; allHits ? textbox.removeAttribute("status") : textbox.setAttribute("status", "notfound"); forceFind && !curHit && allHits && gFindBar._find(); lab.value = curHit + "/" + allHits; } updateHits(); gFindBar.updateHits = updateHits; function insUpd(methodName, code) { const method = gFindBar[methodName]; gFindBar[methodName] = Function("arguments.callee.method.apply(this, arguments);" + (code || "") + " this.updateHits();"); gFindBar[methodName].method = method; addDestructor(function() gFindBar[methodName] = method); } insUpd("_find"); insUpd("_findAgain"); insUpd("_setCaseSensitivity", forceFindCS && " this._find();"); const progressListener = { onStateChange: function(wpr, req, state) state & Ci.nsIWebProgressListener.STATE_STOP && setTimeout(updateHits, 320), onLocationChange: function(wpr, req) !req && updateHits() }; addDestructor(function() gBrowser.removeProgressListener(progressListener)); function onFindbar() { gBrowser[(gFindBar.hidden ? "remove" : "add") + "ProgressListener"](progressListener); !gFindBar.hidden && updateHits(); } onFindbar(); const observer = new MutationObserver(onFindbar); observer.observe(gFindBar, { attributes: true, attributesFilter: ["hidden"] }); addDestructor(function() observer.disconnect());
Отредактировано momo2000 (30-05-2018 15:45:21)
Отсутствует
momo2000
Эта кнопка реализована стилем (извиняюсь за офтоп). Помести код в userchrome.css
/* Панель поиска вверху слева */ @-moz-document url-prefix("chrome:") { findbar { -moz-box-ordinal-group: 0 !important; position: fixed !important; right: auto !important; left: 20px !important; top: auto !important; bottom: auto !important; margin: -1px 0 0 0 !important; padding: 0 !important; white-space: nowrap !important; max-width: calc(100% - 20px) !important; overflow: hidden !important; border: 1px solid var(--toolbox-border-bottom-color, rgba(0,0,0,.25)) !important; border-top-width: 0 !important; box-shadow: none !important; visibility: visible !important; transition: none !important; z-index: 3 !important; border-radius: 0 0 6px 6px !important; } findbar > hbox.findbar-container { max-width: calc(100% - 22px) !important; overflow: hidden !important; margin: 0 !important; padding: 0 2px !important; } findbar > hbox.findbar-container > * { margin: 0 !important; } findbar > hbox.findbar-container > :-moz-any(toolbarbutton,label,description) { margin: 1px !important; } findbar textbox { min-height: 22px !important; height: auto !important; font-size: 100% !important; } findbar > .findbar-closebutton { margin: 0 !important; padding: 3px !important; border: none !important; -moz-appearance: none !important; } findbar > .findbar-closebutton > .toolbarbutton-icon { margin: 0 !important; padding: 0 !important; border: none !important; height: 16px !important; width: 16px !important; } findbar[hidden="true"], #main-window[inFullscreen] #navigator-toolbox[style*="margin-top"] ~ #content-deck .browserContainer > findbar { visibility: collapse !important; } #sidebar-box[positionend="true"][ordinal] ~ #appcontent .browserContainer > findbar:-moz-locale-dir(ltr), findbar:-moz-locale-dir(rtl) { right: auto !important; left: 20px !important; } #sidebar-box[positionend="true"][ordinal] ~ #appcontent .browserContainer > findbar:-moz-locale-dir(rtl) { right: 20px !important; left: auto !important; } findbar:-moz-locale-dir(ltr) > hbox.findbar-container, findbar:-moz-locale-dir(rtl) > hbox.findbar-container > *, #sidebar-box[positionend="true"][ordinal] ~ #appcontent .browserContainer > findbar:-moz-locale-dir(rtl) > hbox.findbar-container { direction: rtl !important; } findbar:-moz-locale-dir(rtl) > hbox.findbar-container, findbar:-moz-locale-dir(ltr) > hbox.findbar-container > *, #sidebar-box[positionend="true"][ordinal] ~ #appcontent .browserContainer > findbar:-moz-locale-dir(ltr) > hbox.findbar-container { direction: ltr !important; } findbar:not(:-moz-lwtheme) { background-color: var(--toolbar-bgcolor, -moz-Dialog) !important; background-image: var(--toolbar-bgimage, none) !important; color: var(--toolbar-color, -moz-DialogText) !important; } findbar > * { vertical-align: middle !important; } findbar > hbox.findbar-container > .find-status-icon, findbar .findbar-button > .toolbarbutton-text { display: none !important; } findbar .findbar-button > .toolbarbutton-icon { display: -moz-box !important; margin: 0 !important; padding: 0 !important; border: none !important; height: 16px !important; width: 16px !important; } findbar .findbar-button { -moz-appearance: none !important; padding: 3px 6px !important; border: none !important; background: none !important; box-shadow: none !important; } findbar .findbar-button:not(:-moz-any([checked="true"],[disabled="true"])):hover { border-image-source: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4'><polygon points='0.5,0.5 3.5,0.5 3.5,3.5 0.5,3.5' style='fill:Highlight;fill-opacity:0.15;stroke:Highlight;stroke-width:0.9px;stroke-opacity:0.6'/></svg>") !important; border-image-repeat: stretch !important; border-image-slice: 1 fill !important; border-image-width: 1px !important; } findbar .findbar-button:not([disabled="true"]):-moz-any([checked="true"],:hover:active) { border-image-source: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4'><polygon points='0.5,0.5 3.5,0.5 3.5,3.5 0.5,3.5' style='fill:Highlight;fill-opacity:0.3;stroke:Highlight;stroke-width:0.9px;stroke-opacity:0.4'/></svg>") !important; border-image-repeat: stretch !important; border-image-slice: 1 fill !important; border-image-width: 1px !important; } findbar .findbar-highlight { list-style-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><g><path d='M 0,15 V 1 C 0,0.4 0.4,0 1,0 H 15 C 15.6,0 16,0.4 16,1 V 15 C 16,15.6 15.6,16 15,16 H 1 C 0.4,16 0,15.6 0,15 Z' style='fill:rgb(0,120,173);fill-opacity:1;' /><path style='opacity:0.25;fill:black;' d='M 10.1,2.9 16,8.8 V 6 L 13,3 Z M 9.7,3.26 8.92,4 16,11.1 V 9.6 Z M 8.48,4.47 3.7,9.65 2.17,13.9 4.3,16 H 15.1 C 15.6,16 16,15.6 16,15 V 12 Z'/><path style='fill:white;' d='M 10.7,2.3 10.1,2.9 13.1,5.9 13.7,5.3 C 14.2,4.8 14,4 13.5,3.5 L 12.5,2.5 C 12,2 11.2,1.79 10.7,2.3 Z M 9.7,3.26 8.92,4 12,7.03 12.7,6.3 Z M 8.48,4.47 3.87,9.04 3.27,9.53 3.18,9.69 2.03,13.3 C 1.96,13.5 2.02,13.7 2.17,13.9 2.29,14 2.45,14.1 2.6,14 L 6.23,12.8 6.35,12.7 6.89,12.1 11.5,7.49 Z M 3.96,10.3 C 4.01,10.3 4.06,10.3 4.08,10.4 L 4.35,10.7 5.34,10.6 C 5.38,10.6 5.41,10.7 5.43,10.7 H 5.48 L 5.43,11.8 5.64,11.9 C 5.7,12 5.68,12.2 5.58,12.2 L 3.84,12.6 H 3.72 L 3.39,12.2 C 3.35,12.2 3.33,12.2 3.36,12.1 L 3.87,10.4 C 3.89,10.4 3.92,10.3 3.96,10.3 Z' /></g></svg>") !important; -moz-image-region: auto !important; } findbar .findbar-case-sensitive { list-style-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><g><path d='M 0,15 V 1 C 0,0.4 0.4,0 1,0 H 15 C 15.6,0 16,0.4 16,1 V 15 C 16,15.6 15.6,16 15,16 H 1 C 0.4,16 0,15.6 0,15 Z' style='fill:rgb(0,120,173);fill-opacity:1;' /><path style='opacity:0.25;fill:black;' d='M 5,16 1,12 3.8,4 H 6.1 L 11.1,9 H 11.4 L 9.9,7.5 12,6.44 14.6,6.7 16,8.1 V 15 C 16,15.6 15.6,16 15,16 Z'/><path style='fill:white;' d='M 3.8,4 1,12 H 2.9 L 3.42,10.4 H 6.44 L 7,12 H 8.9 L 6.11,4 H 3.8 M 12.1,5.83 C 11.7,5.83 11.4,5.83 11,5.9 10.7,5.96 10.3,6.03 9.88,6.12 V 7.54 C 10.2,7.39 10.5,7.28 10.8,7.22 11.1,7.13 11.4,7.1 11.7,7.1 12.3,7.1 12.6,7.16 12.9,7.3 13.1,7.43 13.2,7.65 13.2,7.94 V 8.1 H 12.1 C 11.2,8.1 10.5,8.25 10.1,8.59 9.6,8.89 9.36,9.41 9.36,10 9.36,10.7 9.52,11.1 9.88,11.5 10.4,11.9 10.8,12 11.3,12 11.7,12 12,12 12.4,11.8 12.7,11.6 13,11.3 13.2,11 V 12 H 15 V 8.51 C 15,7.54 14.8,6.88 14.4,6.45 14,6.03 13.1,5.83 12.1,5.83 M 4.93,5.83 5.96,8.98 H 3.93 L 4.93,5.83 M 12.2,9.22 H 13.2 V 9.41 C 13.2,9.8 13.1,10.2 12.9,10.4 12.6,10.7 12.3,10.8 12,10.8 11.7,10.8 11.5,10.7 11.4,10.6 11.3,10.4 11.2,10.2 11.2,9.94 11.2,9.74 11.3,9.54 11.4,9.41 11.6,9.32 11.9,9.22 12.2,9.22' /></g></svg>") !important; -moz-image-region: auto !important; } findbar .findbar-entire-word { list-style-image: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><g><path d='M 0,15 V 1 C 0,0.4 0.4,0 1,0 H 15 C 15.6,0 16,0.4 16,1 V 15 C 16,15.6 15.6,16 15,16 H 1 C 0.4,16 0,15.6 0,15 Z' style='fill:rgb(0,120,173);fill-opacity:1;' /><path style='opacity:0.25;fill:black;' d='M 8,16 4,12 3,4 6,7 9,4 12,7 15,4 16,5 V 15 C 16,15.6 15.6,16 15,16 Z'/><path style='fill:white;' d='M 1,4 4,12 H 6 L 8,6.7 10,12 H 12 L 15,4 H 13 L 11,9.3 9,4 H 7 L 5,9.3 3,4 Z' /></g></svg>") !important; -moz-image-region: auto !important; } #add-additional-bottom-closebutton { display: none !important; }
Отредактировано Garalf (30-05-2018 20:18:11)
Отсутствует
momo2000, Где ctrl+f я вырезал его с другого кода... так что может в плане кода он кривоват но работает.
Вообще было-бы лучше если знающие люди подправят, и приведут в норм.вид. Ставить в кнопку.
//(auto-hide Findbar)................................. (function(e) {this.clickPage = function(event) {gBrowser.addEventListener('mousedown',on, false);};function go() {clickPage(event);gFindBar.close();} function on() {gBrowser.removeEventListener('mousedown',on, false);timeoutId = setTimeout(go, 1000)} function off() {clickPage(event);clearTimeout(timeoutId)} gFindBar.addEventListener('click',off, false);clickPage(event);})(); //(Ctrl+F Findbar)................................. addEventListener('keydown', e=> {if (e.ctrlKey && !e.altKey && !e.shiftKey && (e.keyCode == 70) && !gFindBar.hidden) {e.preventDefault(); gFindBar.close();}});
/*Задаем положение панели поиска наверху*/ @-moz-document url("chrome://browser/content/browser.xul"),url("chrome://global/content/viewSource.xul") { :-moz-any(.browserContainer, #viewSource) .findbar-container > *, :-moz-any(.browserContainer, #viewSource) .findbar-container > *:not(spacer), :-moz-any(.browserContainer, #viewSource) :-moz-any(.findbar-find-previous, .findbar-find-next) {display: -moz-box;} :-moz-any(.browserContainer, #viewSource) .findbar-container :-moz-any(spacer, .findbar-find-fast[anonid="match-case-status"], .findbar-find-fast[anonid="entire-word-status"]) {visibility: collapse} :-moz-any(.browserContainer, #viewSource) .findbar-find-fast.findbar-find-status, .found-matches {-moz-box-ordinal-group: 0;margin:0 5px 0 -6px!important;} :-moz-any(.browserContainer, #viewSource) .findbar-button {margin:0 -1px!important;padding:0!important;max-width: 125px!important;} :-moz-any(.browserContainer, #viewSource) .findbar-closebutton {position: relative !important;right: 0 !important;margin: 0px -3px -5px 0px!important;} :-moz-any(.browserContainer, #viewSource) .findbar-textbox {height: 20px !important;font-size: medium !important;max-width: 170px!important;}.browserContainer findbar, #viewSource #FindToolbar {-moz-box-ordinal-group: 0;position: fixed !important;left: 5px;margin-top: -1px !important;box-shadow: 1px 2px 3px rgba(0, 0, 0, .25) !important;border: 1px solid threedshadow !important;border-top: none !important;border-radius: 0 0 9px 9px;transition-property: margin-top, opacity, visibility !important;} #viewSource #FindToolbar {background-color: -moz-dialog;color: -moz-dialogtext;} :-moz-any(.browserContainer, #viewSource) .findbar-find-status { color: inherit !important }}
Отредактировано func4ptch4 (31-05-2018 20:33:54)
Отсутствует
Garalf пишетDumby если будет время.... Экспорт в HTML файл в контекстном меню закладок
Удобная вещь. Тут каждую папку закладок отдельно копировать можно.скрытый текстВыделить кодКод:
/*Initialization Code*/ //-------------------- Экспорт в HTML файл в контекстном меню закладок //Источник - https://github.com/ardiman/userChrome.js/blob/master/exporthtmlfolder/ExportHTMLFolder.uc.xul (function () { function ImageConverter(imageURL) { this.imageURL = imageURL; this.channel = Services.io.newChannel(imageURL, null, null); this.channel.asyncOpen(this, null); } ImageConverter.prototype = { imageURL : "", channel : null, bytes : [], stream : null, Database64 : null, iscompleted : false, QueryInterface : function (iid) { if (!iid.equals(Components.interfaces.nsISupports) && !iid.equals(Components.interfaces.nsIRequestObserver) && !iid.equals(Components.interfaces.nsIStreamListener)) { throw Components.results.NS_ERROR_NO_INTERFACE; } return this; }, onStartRequest : function (aRequest, aContext) { this.stream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream); this.iscompleted = false; }, onStopRequest : function (aRequest, aContext, aStatusCode) { this.Database64 = 'data:' + this.channel.contentType + ';base64,' + btoa(String.fromCharCode.apply(null, this.bytes)); this.iscompleted = true; }, onDataAvailable : function (aRequest, aContext, aInputStream, aOffset, aCount) { this.stream.setInputStream(aInputStream); var chunk = this.stream.readByteArray(aCount); this.bytes = this.bytes.concat(chunk); } }; var ExportHTMLFolder = { escapeHTML: function(str) { return str.replace(/[&"<>]/g, function (m) ({ "&": "&", '"': """, "<": "<", ">": ">" })[m]); }, onMenuItemCommand: function(event) { var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService); var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService); var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); var MPMenu = PlacesUtils.getString("BookmarksMenuFolderTitle"); var NodeID = document.popupNode._placesNode || document.popupNode.parentNode.selectedNode; fp.init(window, PlacesUIUtils.getString("EnterExport"),Ci.nsIFilePicker.modeSave); fp.appendFilters(Ci.nsIFilePicker.filterHTML); fp.defaultString = NodeID.title+".html"; fp.open(res => { if (res == fp.returnCancel || !fp.file) return; var file = fp.file; var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance(Components.interfaces.nsIFileOutputStream); var charset = "UTF-8"; foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0); var os = Components.classes["@mozilla.org/intl/converter-output-stream;1"] .createInstance(Components.interfaces.nsIConverterOutputStream); os.init(foStream, charset, 0, 0x0000); var nbTab = 5; var data = '<!DOCTYPE NETSCAPE-Bookmark-file-1>\n'; data = data + '<!-- This is an automatically generated file.\n'; data = data + '\tIt will be read and overwritten.\n'; data = data + '\tDO NOT EDIT! -->\n'; data = data + '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">\n'; data = data + '<TITLE>Bookmarks</TITLE>\n'; data = data + '<H1>'+ExportHTMLFolder.escapeHTML(MPMenu)+'</H1>\n'; data = data + '\n'; data = data + '<DL><p>\n'; os.writeString(data); var options = historyService.getNewQueryOptions(); var query = historyService.getNewQuery(); if( NodeID.type != 0 ) { query.setFolders([NodeID.itemId], 1); var result = historyService.executeQuery(query, options); node = result.root; } else { query.setFolders([NodeID.parent.itemId], 1); var result = historyService.executeQuery(query, options); var rootNode = result.root; rootNode.containerOpen = true; inc = 0; var node = rootNode.getChild(inc); while(( inc < rootNode.childCount )&&( node.itemId != NodeID.itemId )) { inc++; var node = rootNode.getChild(inc); } rootNode.containerOpen = false; } this.ecrireUnMP( os, node, nbTab ); data = '</DL></p>\n'; os.writeString(data); os.close(); }); }, ecrireUnMP: function( flux, elem, nbTab ) { var resultTypes = Ci.nsINavHistoryResultNode; if( elem.type == resultTypes.RESULT_TYPE_SEPARATOR ) { var chaine = new Array(nbTab).join(' ') + "<HR>\n"; flux.writeString(chaine); } else if( elem.type == resultTypes.RESULT_TYPE_URI ) { var Description= PlacesUIUtils.getItemDescription(elem.itemId); var chaine = new Array(nbTab).join(' ') + '<DT><A HREF="' + this.escapeHTML(elem.uri); if ( elem.icon.indexOf('moz-anno:favicon:http') >= 0 ) { if ( elem.icon.indexOf('http://www.mozilla.org/2005/made-up-favicon/') < 0 ){ chaine = chaine + '" ICON_URI="' + elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http') + 'moz-anno:favicon:'.length); } var Image = new ImageConverter( elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http')) ); var thread = Cc['@mozilla.org/thread-manager;1'].getService().mainThread; while ( !Image.iscompleted ) { thread.processNextEvent(true); } chaine = chaine + '" ICON="' + Image.Database64; } else if ( elem.icon.indexOf('moz-anno:favicon:data:image') >= 0 ) { chaine = chaine + '" ICON="' +elem.icon.slice(elem.icon.indexOf('data:image')); } var chaine = chaine + '">' + this.escapeHTML(elem.title) + '</A>\n' + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n'; flux.writeString(chaine); } else if(( elem.type == resultTypes.RESULT_TYPE_FOLDER )||( elem.type == resultTypes.RESULT_TYPE_FOLDER_SHORTCUT )) { var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService); var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService); var Description= PlacesUIUtils.getItemDescription(elem.itemId); this.escapeHTML(elem.title) + '</H3>\n'; var chaine = new Array(nbTab).join(' ') + '<DT><H3>' + this.escapeHTML(elem.title) + '</H3>\n'; var chaine = chaine + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n'; chaine = chaine + new Array(nbTab).join(' ') + '<DL><p>\n'; flux.writeString(chaine); nbTab = nbTab + 4; var options = historyService.getNewQueryOptions(); var query = historyService.getNewQuery(); query.setFolders([elem.itemId], 1); var result = historyService.executeQuery(query, options); var rootNode = result.root; rootNode.containerOpen = true; for (var inc = 0; inc < rootNode.childCount; inc ++) { var node = rootNode.getChild(inc); this.ecrireUnMP( flux, node, nbTab ); } rootNode.containerOpen = false; nbTab = nbTab - 4; chaine = new Array(nbTab).join(' ') + '</DL></p>\n'; flux.writeString(chaine); } }, init: function() { var contextMenu = document.getElementById("placesContext"); if (contextMenu) contextMenu.addEventListener("popupshowing", this.ExportHTMLFolderShowHideItem, false); }, ExportHTMLFolderShowHideItem: function(event) { var show = document.getElementById("placesContext_ExportHTMLFolder"); show.hidden = (document.popupNode.localName == "menuseparator")||( document.popupNode.className == "openintabs-menuitem"); document.getElementById("placesContext_ExportHTMLFolderSep").hidden = show.hidden; }, }; window.addEventListener("load", function load(event) { window.removeEventListener("load", load, false); //remove listener, no longer needed ExportHTMLFolder.init(); }, false); if ( document.getElementById("placesContext_ExportHTMLFolder") ) return; var contextMenu = document.getElementById("placesContext"); var copyBothMenuItem = document.createElement("menuitem"); copyBothMenuItem.id = "placesContext_ExportHTMLFolder"; copyBothMenuItem.setAttribute("label", "Экспорт в HTML"); copyBothMenuItem.setAttribute("selection", "any"); copyBothMenuItem.setAttribute("closemenu", "single"); copyBothMenuItem.addEventListener("command", function () { ExportHTMLFolder.onMenuItemCommand(event); }); contextMenu.insertBefore(copyBothMenuItem, document.getElementById("placesContext_newSeparator") ); var SMenuItem = document.createElement("menuseparator"); SMenuItem.id = "placesContext_ExportHTMLFolderSep"; contextMenu.insertBefore(SMenuItem, document.getElementById("placesContext_ExportHTMLFolder") ); })();Нет, вот с этого, премного извиняюсь, уволь.
Может подойдёт только с папок закладок и только экспортскрытый текстВыделить кодКод:
(popup => addEventListener("popupshowing", { handleEvent() { if (this.shouldHide()) return; var before = document.getElementById("placesContext_openSeparator"); var menuitem = popup.insertBefore(document.createElement("menuitem"), before); menuitem.setAttribute("label", "Экспорт папки в HTML"); menuitem.setAttribute("oncommand", "exportFolder();"); menuitem.exportFolder = this.pick.bind(this); addDestructor(() => menuitem.remove()); (this.handleEvent = () => menuitem.hidden = menuitem.disabled = this.shouldHide())(); }, shouldHide() { var node = popup.triggerNode._placesNode; var hide = !node || node.type != node.RESULT_TYPE_FOLDER; if (!hide) this.guid = node.bookmarkGuid, this.title = node.title; return hide; }, pick() { var fp = makeFilePicker(); fp.init(window, PlacesUIUtils.getString("EnterExport"), fp.modeSave); fp.appendFilters(fp.filterHTML); fp.defaultString = (this.title ? DownloadPaths.sanitize(this.title) : "untitled") + ".html"; fp.open(res => res == fp.returnCancel || this.export(fp.file.path)); }, async export(path) { var tree = await PlacesUtils.promiseBookmarksTree( this.guid, {includeItemIds: true} ); var bookmarks = {children: [ {root: "toolbarFolder"}, {root: "unfiledBookmarksFolder"}, {root: "bookmarksMenuFolder", children: [tree], guid: PlacesUtils.bookmarks.menuGuid} ]}; new this.nsvo.BookmarkExporter(bookmarks).exportToFile(path); }, get nsvo() { delete this.nsvo; return this.nsvo = Cu.import("resource://gre/modules/BookmarkHTMLUtils.jsm", {}); } }, false, popup))(document.getElementById("placesContext") || 1);
У меня менюитем появляется, но когда я на него кликаю, никакого диалога не вызывается.
Может требуется ещё что-то кроме этого кода?
Может 52.0 слишком старая?
Отредактировано difabor (31-05-2018 18:25:04)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
firefox 56.0.2 (и другие верси пробовал, 52 к примеру.) - чистый профиль.
Если установить и включить Custom Buttons, то прокручивается сайт рывками, как будто что-то тормозит браузер.
Выключаю Custom Buttons - все летает. Помогите, как исправить.
Отредактировано firepox (31-05-2018 22:12:34)
Отсутствует
firepox
Видимо, дело в мультипроцессности.
Можно включить в about:config вот так (создать – логическое):
browser.tabs.remote.force-enable = true
Но не все кнопки могут после этого работать.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Может
52.0 слишком старая?
установил кнопку с неправленным кодом в 52.0
/*Initialization Code*/ //-------------------- Экспорт в HTML файл в контекстном меню закладок //Источник - https://github.com/ardiman/userChrome.js/blob/master/exporthtmlfolder/ExportHTMLFolder.uc.xul (function () { function ImageConverter(imageURL) { this.imageURL = imageURL; this.channel = Services.io.newChannel(imageURL, null, null); this.channel.asyncOpen(this, null); } ImageConverter.prototype = { imageURL : "", channel : null, bytes : [], stream : null, Database64 : null, iscompleted : false, QueryInterface : function (iid) { if (!iid.equals(Components.interfaces.nsISupports) && !iid.equals(Components.interfaces.nsIRequestObserver) && !iid.equals(Components.interfaces.nsIStreamListener)) { throw Components.results.NS_ERROR_NO_INTERFACE; } return this; }, onStartRequest : function (aRequest, aContext) { this.stream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream); this.iscompleted = false; }, onStopRequest : function (aRequest, aContext, aStatusCode) { this.Database64 = 'data:' + this.channel.contentType + ';base64,' + btoa(String.fromCharCode.apply(null, this.bytes)); this.iscompleted = true; }, onDataAvailable : function (aRequest, aContext, aInputStream, aOffset, aCount) { this.stream.setInputStream(aInputStream); var chunk = this.stream.readByteArray(aCount); this.bytes = this.bytes.concat(chunk); } }; var ExportHTMLFolder = { escapeHTML: function(str) { return str.replace(/[&"<>]/g, function (m) ({ "&": "&", '"': """, "<": "<", ">": ">" })[m]); }, onMenuItemCommand: function(event) { var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService); var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService); var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); var MPMenu = PlacesUtils.getString("BookmarksMenuFolderTitle"); var NodeID = document.popupNode._placesNode || document.popupNode.parentNode.selectedNode; fp.init(window, PlacesUIUtils.getString("EnterExport"),Ci.nsIFilePicker.modeSave); fp.appendFilters(Ci.nsIFilePicker.filterHTML); fp.defaultString = NodeID.title+".html"; fp.open(res => { if (res == fp.returnCancel || !fp.file) return; var file = fp.file; var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance(Components.interfaces.nsIFileOutputStream); var charset = "UTF-8"; foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0); var os = Components.classes["@mozilla.org/intl/converter-output-stream;1"] .createInstance(Components.interfaces.nsIConverterOutputStream); os.init(foStream, charset, 0, 0x0000); var nbTab = 5; var data = '<!DOCTYPE NETSCAPE-Bookmark-file-1>\n'; data = data + '<!-- This is an automatically generated file.\n'; data = data + '\tIt will be read and overwritten.\n'; data = data + '\tDO NOT EDIT! -->\n'; data = data + '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">\n'; data = data + '<TITLE>Bookmarks</TITLE>\n'; data = data + '<H1>'+ExportHTMLFolder.escapeHTML(MPMenu)+'</H1>\n'; data = data + '\n'; data = data + '<DL><p>\n'; os.writeString(data); var options = historyService.getNewQueryOptions(); var query = historyService.getNewQuery(); if( NodeID.type != 0 ) { query.setFolders([NodeID.itemId], 1); var result = historyService.executeQuery(query, options); node = result.root; } else { query.setFolders([NodeID.parent.itemId], 1); var result = historyService.executeQuery(query, options); var rootNode = result.root; rootNode.containerOpen = true; inc = 0; var node = rootNode.getChild(inc); while(( inc < rootNode.childCount )&&( node.itemId != NodeID.itemId )) { inc++; var node = rootNode.getChild(inc); } rootNode.containerOpen = false; } this.ecrireUnMP( os, node, nbTab ); data = '</DL></p>\n'; os.writeString(data); os.close(); }); }, ecrireUnMP: function( flux, elem, nbTab ) { var resultTypes = Ci.nsINavHistoryResultNode; if( elem.type == resultTypes.RESULT_TYPE_SEPARATOR ) { var chaine = new Array(nbTab).join(' ') + "<HR>\n"; flux.writeString(chaine); } else if( elem.type == resultTypes.RESULT_TYPE_URI ) { var Description= PlacesUIUtils.getItemDescription(elem.itemId); var chaine = new Array(nbTab).join(' ') + '<DT><A HREF="' + this.escapeHTML(elem.uri); if ( elem.icon.indexOf('moz-anno:favicon:http') >= 0 ) { if ( elem.icon.indexOf('http://www.mozilla.org/2005/made-up-favicon/') < 0 ){ chaine = chaine + '" ICON_URI="' + elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http') + 'moz-anno:favicon:'.length); } var Image = new ImageConverter( elem.icon.slice(elem.icon.indexOf('moz-anno:favicon:http')) ); var thread = Cc['@mozilla.org/thread-manager;1'].getService().mainThread; while ( !Image.iscompleted ) { thread.processNextEvent(true); } chaine = chaine + '" ICON="' + Image.Database64; } else if ( elem.icon.indexOf('moz-anno:favicon:data:image') >= 0 ) { chaine = chaine + '" ICON="' +elem.icon.slice(elem.icon.indexOf('data:image')); } var chaine = chaine + '">' + this.escapeHTML(elem.title) + '</A>\n' + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n'; flux.writeString(chaine); } else if(( elem.type == resultTypes.RESULT_TYPE_FOLDER )||( elem.type == resultTypes.RESULT_TYPE_FOLDER_SHORTCUT )) { var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService); var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService); var Description= PlacesUIUtils.getItemDescription(elem.itemId); this.escapeHTML(elem.title) + '</H3>\n'; var chaine = new Array(nbTab).join(' ') + '<DT><H3>' + this.escapeHTML(elem.title) + '</H3>\n'; var chaine = chaine + new Array(nbTab).join(' ') + '<DD>' + this.escapeHTML(Description) + '\n'; chaine = chaine + new Array(nbTab).join(' ') + '<DL><p>\n'; flux.writeString(chaine); nbTab = nbTab + 4; var options = historyService.getNewQueryOptions(); var query = historyService.getNewQuery(); query.setFolders([elem.itemId], 1); var result = historyService.executeQuery(query, options); var rootNode = result.root; rootNode.containerOpen = true; for (var inc = 0; inc < rootNode.childCount; inc ++) { var node = rootNode.getChild(inc); this.ecrireUnMP( flux, node, nbTab ); } rootNode.containerOpen = false; nbTab = nbTab - 4; chaine = new Array(nbTab).join(' ') + '</DL></p>\n'; flux.writeString(chaine); } }, init: function() { var contextMenu = document.getElementById("placesContext"); if (contextMenu) contextMenu.addEventListener("popupshowing", this.ExportHTMLFolderShowHideItem, false); }, ExportHTMLFolderShowHideItem: function(event) { var show = document.getElementById("placesContext_ExportHTMLFolder"); show.hidden = (document.popupNode.localName == "menuseparator")||( document.popupNode.className == "openintabs-menuitem"); document.getElementById("placesContext_ExportHTMLFolderSep").hidden = show.hidden; }, }; window.addEventListener("load", function load(event) { window.removeEventListener("load", load, false); //remove listener, no longer needed ExportHTMLFolder.init(); }, false); if ( document.getElementById("placesContext_ExportHTMLFolder") ) return; var contextMenu = document.getElementById("placesContext"); var copyBothMenuItem = document.createElement("menuitem"); copyBothMenuItem.id = "placesContext_ExportHTMLFolder"; copyBothMenuItem.setAttribute("label", "Экспорт в HTML"); copyBothMenuItem.setAttribute("selection", "any"); copyBothMenuItem.setAttribute("closemenu", "single"); copyBothMenuItem.addEventListener("command", function () { ExportHTMLFolder.onMenuItemCommand(event); }); contextMenu.insertBefore(copyBothMenuItem, document.getElementById("placesContext_newSeparator") ); var SMenuItem = document.createElement("menuseparator"); SMenuItem.id = "placesContext_ExportHTMLFolderSep"; contextMenu.insertBefore(SMenuItem, document.getElementById("placesContext_ExportHTMLFolder") ); })();
Отредактировано Garalf (01-06-2018 21:04:22)
Отсутствует
Infocatcher
Большое спасибо!
browser.tabs.remote.force-enable = true - решил проблему торможения прокрутки, но перестал работать Dragit
Может быть еще есть способ?)
Добавлено 01-06-2018 21:22:26
и в целом, браузер иногда стал зависать(
возможно сам Custom Buttons исправить, чтобы он не влиял на прокрутку?
спасибо.
Отредактировано firepox (01-06-2018 21:22:26)
Отсутствует
возможно сам Custom Buttons исправить, чтобы он не влиял на прокрутку?
Может попробовать другие версии СВ установить?
Например эту: custom_buttons-0.0.5.8.9-fixed6-signed.xpi (с подписью).
Или эту: custom_buttons-0.0.5.8.9-fixed7.1.xpi (без подписи).
Отсутствует
unter_officer
установил - custom_buttons-0.0.5.8.9-fixed6-signed.xpi (с подписью).
прокрутка дергается
установил - custom_buttons-0.0.5.8.9-fixed7.1.xpi (без подписи).
прокрутка дергается
помоему, как то не правильно Custom Buttons работает. Зачем он тормозит прокрутку? Помогите, как исправить.
Отредактировано firepox (02-06-2018 09:54:56)
Отсутствует
помоему, как то не правильно Custom Buttons работает. Зачем он тормозит прокрутку?
Помогите, как исправить.
Я скачал портабельный 56.0.2. Установил только custom_buttons-0.0.5.8.9-fixed6-signed.xpi, никаких других дополнений не устанавливал.
Всё прекрасно работает, никаких тормозов прокрутки нет. Все нужные мне кнопки работают нормально.
Похоже, что это ваша локальная проблема.
Отсутствует
unter_officer
И я сейчас скачал портабельный 56.0.2.
проверил прокрутку на сайте, все плавно и отлично!
Отредактировано firepox (02-06-2018 14:40:59)
Отсутствует
firepox
На appleinsider.ru у меня и на чистом 56.0.2, без дополнений, прокрутка дёргается.
Отсутствует