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

Пользователи не любят читать документацию. Станьте оригинальным, будьте не как все. Ознакомьтесь с нашей базой знаний.

№1260128-05-2018 16:25:51

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1160
UA: Firefox 60.0

Re: Custom Buttons

В [firefox] 59.0.3 стояла неподписанная версия отсюда http://custombuttons.sourceforge.net/fo … 3&start=90  и прекрасно работала. После обновления [firefox] на версию 60.0.1 отвалилась.

скрытый текст
95tBVRL.png

Попробовал установить подписанную версию из того же поста, но получаю такое:
скрытый текст
Mp5uH3G.png

Можно как-то победить ситуацию?

Отсутствует

 

№1260228-05-2018 18:20:51

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Firefox 60.0

Re: Custom Buttons

xrun1
Попробуй эти http://my-files.ru/9sckz0 костыли

Отсутствует

 

№1260329-05-2018 01:38:23

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1160
UA: Firefox 60.0

Re: Custom Buttons

Garalf
Спасибо, посмотрел. Не мой случай, к сожалению.:(

Отсутствует

 

№1260430-05-2018 08:26:46

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 52.0

Re: Custom Buttons

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) ({ "&": "&amp;", '"': "&quot", "<": "&lt;", ">": "&gt;" })[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)

Отсутствует

 

№1260530-05-2018 09:08:55

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Firefox 60.0

Re: Custom Buttons

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 ) });


Нужно, чтобы она при запуске FF (или при закрытии) переключалась в состояние "включена"

Отсутствует

 

№1260630-05-2018 10:03:15

drage2
Забанен
 
Группа: Members
Откуда: Донецк
Зарегистрирован: 23-11-2017
Сообщений: 392
UA: Firefox 57.0

Re: Custom Buttons

Garalf
Во-первых, это не возможно, во-вторых- это ничего не даст, и в- третьих - к чертям все расширения, требующие лок.хранилище.KeepPass, тем более, это стрёмно...
Как можно доверять пароли каким-то фраерам, требующих авторизацию?

Отсутствует

 

№1260730-05-2018 13:00:48

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 47.0

Re: Custom Buttons

Garalf пишет

Еще одна маленькая просьба. Есть простая кнопка

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

Выделить код

Код:

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»

Отсутствует

 

№1260830-05-2018 13:50:42

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Firefox 57.0

Re: Custom Buttons

unter_officer
Попробовал. К сожалению, не включает кнопку

Отсутствует

 

№1260930-05-2018 14:16:59

okkamas_knife
We are the Borg.       Resistance is futile.
 
Группа: Members
Зарегистрирован: 21-10-2009
Сообщений: 9558
UA: Seamonkey 2.14

Re: Custom Buttons

просто добавь в инициализацию строчку  cbu.setPrefs("dom.indexedDB.enabled", true);
возможно придется обернуть её в таймаут


я помню те времена когда обновления программ убирали проблемы и исправляли баги, а не добавляли их.
toxID:05AB9B827D896AACEE7FF4573A02FB8F025F46ADC856B98F65BC1BA9BD21A81DC98BA9C36CE3

Отсутствует

 

№1261030-05-2018 15:18:09

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Firefox 57.0

Re: Custom Buttons

okkamas_knife
Благодарю за помощь. Теперь переключение работает.

Отсутствует

 

№1261130-05-2018 15:44:11

momo2000
Участник
 
Группа: Members
Зарегистрирован: 03-09-2015
Сообщений: 228
UA: Firefox 59.0

Re: Custom Buttons

А может кто поправить [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());


С версии 60+ не работает и замены никакой найти не могу. Как вы можете работать без нормального findbara не могу понять.

Отредактировано momo2000 (30-05-2018 15:45:21)

Отсутствует

 

№1261230-05-2018 16:05:07

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Firefox 60.0

Re: Custom Buttons

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)

Отсутствует

 

№1261331-05-2018 07:56:17

momo2000
Участник
 
Группа: Members
Зарегистрирован: 03-09-2015
Сообщений: 228
UA: Firefox 59.0

Re: Custom Buttons

Garalf
так то и обычный findbar норм, главное в том что стандартный, что со стилем - не закрывается по Ctrl+F и отображается только на той вкладке на какой был вызван

Отсутствует

 

№1261431-05-2018 13:34:06

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 60.0

Re: Custom Buttons

momo2000, Где ctrl+f я вырезал его с другого кода... так что может в плане кода он кривоват но работает.
Вообще было-бы лучше если знающие люди подправят, и приведут в норм.вид. Ставить в кнопку.

Button

Выделить код

Код:

//(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();}});


Есть еще такой стиль.
css

Выделить код

Код:

/*Задаем положение панели поиска наверху*/
@-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)

Отсутствует

 

№1261531-05-2018 18:10:05

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

Dumby пишет
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) ({ "&": "&amp;", '"': "&quot", "<": "&lt;", ">": "&gt;" })[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);

У меня менюитем появляется, но когда я на него кликаю, никакого диалога не вызывается.
Может требуется ещё что-то кроме этого кода?
Может [firefox] 52.0 слишком старая?

Отредактировано difabor (31-05-2018 18:25:04)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1261631-05-2018 21:06:42

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

firefox 56.0.2 (и другие верси пробовал, 52 к примеру.) - чистый профиль.
Если установить и включить Custom Buttons, то прокручивается сайт рывками, как будто что-то тормозит браузер.
Выключаю Custom Buttons - все летает.
:whiteflag: Помогите, как исправить.

Отредактировано firepox (31-05-2018 22:12:34)

Отсутствует

 

№1261701-06-2018 19:43:15

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 56.0

Re: Custom Buttons

firepox
Видимо, дело в мультипроцессности.
Можно включить в about:config вот так (создать – логическое):
browser.tabs.remote.force-enable = true
Но не все кнопки могут после этого работать.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1261801-06-2018 20:44:33

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Firefox 60.0

Re: Custom Buttons

difabor пишет

Может [firefox] 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) ({ "&": "&amp;", '"': "&quot", "<": "&lt;", ">": "&gt;" })[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)

Отсутствует

 

№1261901-06-2018 21:13:31

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

Infocatcher
Большое спасибо!
browser.tabs.remote.force-enable = true - решил проблему торможения прокрутки, но перестал работать Dragit :(
Может быть еще есть способ?)

Добавлено 01-06-2018 21:22:26
и в целом, браузер иногда стал зависать(
возможно сам Custom Buttons исправить, чтобы он не влиял на прокрутку?
спасибо.

Отредактировано firepox (01-06-2018 21:22:26)

Отсутствует

 

№1262001-06-2018 21:46:57

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 47.0

Re: Custom Buttons

firepox пишет

возможно сам 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»

Отсутствует

 

№1262101-06-2018 22:04:24

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

unter_officer
установил - custom_buttons-0.0.5.8.9-fixed6-signed.xpi (с подписью).
прокрутка дергается :(

установил - custom_buttons-0.0.5.8.9-fixed7.1.xpi (без подписи).
прокрутка дергается :(

помоему, как то не правильно Custom Buttons работает. Зачем он тормозит прокрутку?
:whiteflag: Помогите, как исправить.

Отредактировано firepox (02-06-2018 09:54:56)

Отсутствует

 

№1262202-06-2018 08:56:00

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

Garalf пишет

установил кнопку с неправленным кодом в 52.0

все работает

Большущее спасибо!


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1262302-06-2018 14:13:00

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 47.0

Re: Custom Buttons

firepox пишет

помоему, как то не правильно Custom Buttons работает. Зачем он тормозит прокрутку?
:whiteflag: Помогите, как исправить.

Я скачал портабельный [firefox] 56.0.2. Установил только custom_buttons-0.0.5.8.9-fixed6-signed.xpi, никаких других дополнений не устанавливал.
Всё прекрасно работает, никаких тормозов прокрутки нет. Все нужные мне кнопки работают нормально.
Похоже, что это ваша локальная проблема.


«The Truth Is Out There»

Отсутствует

 

№1262402-06-2018 14:30:44

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 56.0

Re: Custom Buttons

unter_officer
И я сейчас  скачал портабельный [firefox] 56.0.2.
проверил прокрутку на сайте, все плавно и отлично!

скрытый текст
appleinsider.ru

Установил только custom_buttons-0.0.5.8.9-fixed6-signed.xpi, никаких других дополнений не устанавливал.
проверил прокрутку на сайте, прокрутка дергается, плавности нет!
скрытый текст
appleinsider.ru

Отредактировано firepox (02-06-2018 14:40:59)

Отсутствует

 

№1262502-06-2018 14:51:07

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 47.0

Re: Custom Buttons

firepox
На appleinsider.ru у меня и на чистом [firefox] 56.0.2, без дополнений, прокрутка дёргается.


«The Truth Is Out There»

Отсутствует

 

Board footer

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