В 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);
«The Truth Is Out There»
Отсутствует
просто добавь в инициализацию строчку 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 (без подписи).
«The Truth Is Out There»
Отсутствует
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, никаких других дополнений не устанавливал.
Всё прекрасно работает, никаких тормозов прокрутки нет. Все нужные мне кнопки работают нормально.
Похоже, что это ваша локальная проблема.
«The Truth Is Out There»
Отсутствует
unter_officer
И я сейчас скачал портабельный 56.0.2.
проверил прокрутку на сайте, все плавно и отлично!
Отредактировано firepox (02-06-2018 14:40:59)
Отсутствует
firepox
На appleinsider.ru у меня и на чистом 56.0.2, без дополнений, прокрутка дёргается.
«The Truth Is Out There»
Отсутствует