Dumby
Заметил такую шнягу , иконка плеера на панели больших размеров , чем 16х16 , а в контексте норм
Пришлось это убрать, может дорихтовать надо?
var menu = self.appendChild(document.createXULElement("menupopup")); self.image = "moz-icon://file://" + path; var playerName = path.split("\\").pop().replace(".exe","");
Отсутствует
похоже, исчезнет в Firefox 78
Nightly 79 - глюк как был так и есть,
в linux по другому воспроизводится, при переключении обратно на страницу в которой был mousedown но не было mouseup и click,
к курсору прикрепляется страница, как при перетаскивании
Отредактировано Vitaliy V. (24-06-2020 14:07:07)
Отсутствует
Nightly 79 - глюк как был так и есть
Поставил 78.0esr-candidates build2 (32-bit).
Всё работает как надо, глюка нет.
P.S. Посмотрим, что будет в релизной версии.
Отредактировано unter_officer (24-06-2020 14:33:46)
«The Truth Is Out There»
Отсутствует
Всё работает как надо, глюка нет.
Всё это когда на всех платформах работает как надо, а не только на .
А ну да для юзеров только одна винда и существует...
Отсутствует
А ну да для
юзеров только одна винда и существует...
Ну, извини. Вот такие мы, виндузятники.
«The Truth Is Out There»
Отсутствует
может дорихтовать надо?
Может быть, но это же надо на чём-то конкретном смотреть.
Попробуй прописать каких-нибудь подгоночных значений для CSS-свойств (типа width, height, padding)
self.icon.style.cssText = "…: … !important; …: … !important;";
в linux по другому воспроизводится, при переключении обратно на страницу в которой был mousedown но не было mouseup и click,
к курсору прикрепляется страница, как при перетаскивании
Проверил на 79 и Mint. Действительно, возвращаешься обратно, и указатель мыши
цепляет ссылку, и не отпускает, пока не кликнешь где-нибудь, или пока не нажмёшь Esc.
Наблюдается, даже если всё в родительском процессе, например самоссылки на странице about:license
Отсутствует
Всем привет, ищу кнопку добавляющую поиск в гугле(например) в контекстное меню
Чтобы выделил слово - открыл контекстное меню - нажал кнопку - открылась вкладка с поиском
Киньте пожалуйста у кого есть
Отсутствует
Все что нашел, это вот код добавляющий ссылку на любой сайт в контекстное меню
((contextMenu) => { var array = [ { lab: "Новая вкладка", url: "about:newtab", img: "https://addons.cdn.mozilla.net/user-media/collection_icons/5574/5574260.png?m=1426540508"}, { lab: "Google", url: "https://www.google.com", img: "https://www.google.lv/favicon.ico"}, { lab: "Youtube", url: "https://www.youtube.com/", img: "https://www.youtube.com/favicon.ico"} ] array.forEach(function(m,i) { var mItem = document.createElement("menuitem"); mItem.setAttribute("label", m.lab ); mItem.setAttribute("id", "link"+i ); mItem.setAttribute("url", m.url ); mItem.setAttribute("class", "menuitem-iconic"); mItem.setAttribute("image", m.img ); mItem.addEventListener("click", openLink ); contextMenu.appendChild( mItem ); }); function openLink(e) { var url = e.target.getAttribute("url"); e.button ? gBrowser.selectedTab = gBrowser.addTab(url) : loadURI(url); }; addDestructor(()=> array.forEach(function(m,i) contextMenu.removeChild(document.getElementById('link'+i)) )); })(document.getElementById("contentAreaContextMenu") );
Если кто может помогите пожалуйста сделать чтобы искало выделеное на странице слово
Отсутствует
Dumby, ну подправьте пожалуйста этот код для работы в user_chrome_files, для актуальных версий firefox.
А то подключил к комплекту, скрипт работает, да только при каждом клике, помимо того, что открывается новая вкладка, так ещё и окно разворачивается/сворачивается.
Юзерскрипты подключаю по этому методу, хотя наверное не столь важно. Спасибо.
Отсутствует
Есть код взятый отсюда.
Сразу оговорюсь, код правил под себя, т.е. выкинул из него всё то, что мне не нужно.
Код прекрасно работает на крайней версии .
/*Initialization Code*/ // Simple Session Manager (https://forum.mozilla-russia.org/viewtopic.php?pid=744023#p744023) .......... // Подсказки для кнопки ..... this.tooltipText = "Simple Session Manager\n\ ------------------------------\n\ Л: Меню сессий\n\ дЛ: Сохранить сессию\n\ П: CB меню"; // Настройка функций кликов мыши ..... this.onmousedown =e=> { this.onmouseup =e=> { // левый клик if ( e.button ) return; clearTimeout(self.timer); self._handleClick =()=> menupopup.openPopup(this, "after_start"); } if ( e.button == 0 ) { // длинный левый клик self.timer = setTimeout(()=> { self.onmouseup = ''; saveCurrentSession(); }, 500); } if ( e.button == 2 ) { // правый клик gShowPopup(this); } } self.onclick =e=> e.preventDefault(); var menupopup = self.appendChild(document.createXULElement("menupopup")); menupopup.id = "ssm_menupopup"; var scs = document.createXULElement("menuitem"); scs.setAttribute("label", "Сохранить сессию"); scs.setAttribute("class", "menuitem-iconic"); scs.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKVSURBVHjajFNNTBNREJ6+7na73bLbQn8I0BKNCYWKGr0oYoiJPxeNh6oHozcOxgSVi4le1JNHQRPigRsewURNPKiJMQicSISUACelRVJ2tz/bdktpy9adBzT8xTjJ5L35ezNv5hsLHEAv7noEntguChx7EuV8oTydKRhfno8kCnt9LTuFZ7f87mAz/8rnl86GOoOBBq+LQX1S1ioLs0txWdEmsulS38Phlcy+BwZ6W0L+JsfolcjpsFDnBKNcgQ193bRUwSrwQFgr6Dkd3o9NzilqMdI/FF+sPYCZ245I4zdunw9DtQr6LxlK6bVdpdrcPAiHfGBYLDD69ltUXsmfw0oIGoPNjkHMjMHa3J9asDyRpoyEOrQR0+dq5MxR0c29Rj3Bhvn8YjeWjZmN9cpWcApSkzpkptYg8T1FdWjTfysg1Ang9YtdT+80OogTbJc7OlsD+OftzOqsBrMflqHe6QKXIEL00zLV0UpSBbM/G9DeEQy6OXKJsfPsCbdXYjb0Yu2/nmMS9LSGYGlYpXLPkxCwkq1mR98Gn8Q4XexxYhhgYKf3TPTfRDaPqklkvViaSSpaxSpw/x1v5e0UG8W10k+iW8qfF2ZiccIydFQ7ScsXKO8ep4NiYj4ai6k5+Eoev1F1Wcn8QJDgnAnHbGYRWTh800cZ77Ryzmr6eCGXzYGiZCcQ2vQ32XT5PiIMTJBI4Waw1ZtZzLu7XaSMd1s9b9paKJA+vpuKqols3y4ov7wXaPN67GPXIl1hnDOOansyVicHhGHMzHkzeDKqqPnr/UOJxX3LNNDb5BJd3KC3Uexu7wgEGxq3limRqcxH47FVWRtPreYePBpJagdu4zYhwjx1cMFus59CuVgqTmPDDlrnvwIMAGS8IFCLagHpAAAAAElFTkSuQmCC"); scs.addEventListener("command", saveCurrentSession, false); menupopup.appendChild(scs); var menusep = document.createXULElement("menuseparator"); // Сепаратор ..... menupopup.appendChild(menusep); var savedSessions = loadFile(); // Сохраненный список ..... for (name in savedSessions) { makeitems(name); } // overwrite = 1 - Открыть сессию в текущем окне (все открытые вкладки будут закрыты) ..... // overwrite = 0 - Добавить вкладки в текущее окно (сессия будет добавлена к уже открытым вкладкам) ..... var overwrite = 1, Cc = Components.classes, Ci = Components.interfaces, Cu = Components.utils, SS = "nsISessionStore" in Components.interfaces ? ( Components.classes["@mozilla.org/browser/sessionstore;1"] || Components.classes["@mozilla.org/suite/sessionstore;1"] ) .getService(Components.interfaces.nsISessionStore) : SessionStore; if (!window.Services) { Cu.import("resource://gre/modules/Services.jsm"); } // Функции работы с файлами ..... function saveFile(data) { var file = Services.dirsvc.get('UChrm', Ci.nsIFile); file.append("simple_session_manager.json"); var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); suConverter.charset = 'UTF-8'; data = suConverter.ConvertFromUnicode(data); var foStream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream); foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0); foStream.write(data, data.length); foStream.close(); } function loadFile() { var file = Services.dirsvc.get('UChrm', Ci.nsIFile); file.append("simple_session_manager.json"); if (file.exists() === false) return false; var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); fstream.init(file, -1, 0, 0); sstream.init(fstream); var data = sstream.read(sstream.available()); try { data = decodeURIComponent(escape(data)); } catch(e) {} sstream.close(); fstream.close(); if (data === "undefined") return false; data = JSON.parse(data); return data; } // Получить текущее время ..... function getTime() { var d = new Date(); function addzero(t) { (t < 10) ? t = '0' + t : t; return t; } var t = addzero(d.getFullYear()) + '.' + addzero(d.getMonth()+1) + '.' + addzero(d.getDate()) + '-' + addzero(d.getHours()) + ':' + addzero(d.getMinutes()) + ':' + addzero(d.getSeconds()); return t; } // Получить название вкладки ..... function getTabLabel() { var label = gBrowser.selectedTab.label; return label.substring(0, 70); } // Сохранение сессий ..... function saveSession(ssdata) { var name = prompt('Сохранить:', getTabLabel() + ', ' + gBrowser.tabs.length + ' (B) ' + '[' + getTime() + ']' ); if (name != null) { if (loadFile() === false) { var data = {}; } else { var data = loadFile(); } if (data[name]) { alert('Сессия с тем же именем уже существует!'); return; } data[name] = JSON.parse(ssdata); saveFile(JSON.stringify(data)); makeitems(name); } } // Сохранить текущую сессию ..... function saveCurrentSession() { var ssdata = SS.getBrowserState(); saveSession(ssdata); } // Удалить сессию ..... function remove() { var node = this.parentNode.parentNode; var name = node.getAttribute("label"); var cf = confirm('Вы уверены, что хотите удалить ' + name + ' ?'); if (cf === true) { node.style.display = "none"; var data = loadFile(); delete data[name]; saveFile(JSON.stringify(data)); } } // Переименовать сессию ..... function rename() { var node = this.parentNode.parentNode; var name = node.getAttribute("label"); var newname = prompt('Переименовать ' + '"' + name + '"' + ' в:', 'введите новое имя'); if (!newname) return; this.parentNode.parentNode.setAttribute("label", newname); var data = loadFile(); var value = data[name]; data[newname] = value; delete data[name]; saveFile(JSON.stringify(data)); } // Восстановить сессию ..... function restoreSession(stateString) { if (typeof stateString === "string") { var state = stateString; } else { var name = this.parentNode.parentNode.getAttribute("label"); var data = loadFile(); var state = JSON.stringify(data[name]); } switch (overwrite) { case 0: SS.setWindowState(window, state, false); break; case 1: SS.setBrowserState(state); break; } } // Создаем меню ..... function makeitems(name) { var ss = document.createXULElement("menu"); ss.setAttribute("label", name); ss.setAttribute("class", "savedSessions"); ss.className = "menu-iconic"; ss.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAEnQAABJ0BfDRroQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGxSURBVDiNnZE/T1NRGMZ/7zn3lmKLkIKpaUxZFINEJZ0YHXRwcnBxMQ6aOJi4+FH8Dm5OOjA4+AEYGCTRook1JlVIVUrbW/rnPg63UtReIr7bOXmf5/ye59jDlanHS3O+wn/Mu+/DF8HFeVe5f+vaPTdfPpF4UNvk6frmhwAvXOEsvrR0IoN47xM4CHCADmDQBkAHbdTrTBRZdgYLs6NTD/MiMC+gC8MO6ke8ffWsXv3S3JpksHouv7Z4/UEeM8z6IwKfEGjYRt0G1d3m1p3n0Y1JBi/vTtfKw1Yec2CHBDFmXYjboAgL4tTc5pXsmcNcDxIDUFQHuqgfYT69OAuE9qqAoX4jIcAL7b9H+0deOYYg3tkYXxx2EAo7dQYEBF/TEULD5oow7KHut18RhGVD3GwxMZ36YWn6IJd37vQCSMSNBpYQCMs43PQMAJXlwtr6k7CGfo9iznN1ebGY7Ak1NSJwYERYJgM+Q+nClVzp/OXc3wWMwdT+jAVKCMwLC2PUeoMrrEI4m94BQq0a6mxjoca/YKFgUCfeqR8jPhoHcIAHe3ST2+UFLv2T8o/5uMvrnx9Wn65p5nMEAAAAAElFTkSuQmCC"); var ss_popup = document.createXULElement("menupopup"); var rs = document.createXULElement("menuitem"); rs.setAttribute("label", "Восстановить"); rs.setAttribute("class", "menuitem-iconic"); rs.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAACzElEQVQ4jX2QPWwbZRjHf+/5vfPdObZjO3Ga2pVpGtxCP4QIDKgqDCDUNQwgJCS2qFI3hBCRCvXSCcTAAu0GY0Fi4kuq+IjUCpWAgCTq4IpS3Di2G8c+x/bZ57t7mSJFMfBf/3p+z+95BPvy3pufxqKmcVY3ZFFKmQtFGIReuNnrDze6lv5TqfSyx4EIgA/e+fzkZML6MDmVnD80mz1kxW3DMAxQCs/z6Hb6g3q1Xt1ttdfa7dbFN668vrkHkADJhPntufNnc0LTDi7AjFkkUknzcGF2LvCDuZVvfiwCj+/1GoAmhL3x6x2cZhsVqjFIGIZs15ts/LJOJCLt/Z0EiE3Y9eLpR1ONaoMH9zbHAGiC9FSKkwunWF1Z3RoDABhRg/zRPPmj+XHA/0QDaLectFLj6gcT+AHdTm9mzMC27e766lrWtCwy2Qz2hIUeNVDAaDCku9ujWW/ij3wsO9oaMzCiunf66TMU5gt4wyGbf1Upr5W5u15mq1JDhYqZQo6HIuqtueLw4vLXzwC89NZXeQFw/ePv7zx5buHEf6nf3qgMVipOGE0ko6EKhoQi3NnZ+c51BwsaQLOxM9N1uv86vNtz+aHSDn0pH9S2tl6r/Pn3s/VG/WYunzs/NZ2OSID0dKpRrzZS98v3kYbEsi1004BQcbtc9Q07bdYb229/dvmFL5aWVvVts9mq1Wo/e54vJIAQqGOPzQHgj3zcvos39BAIBshRqJQYjYZ/AFy79tQIeHVx+ctiIDRTA+g43Xud9q4PIHVJPBknk82QzqY5VZg2UUrEYhOX9s5aXL5RnMykb8Rj9kcC4OrSVZ1Hpt+PJ5PPz+SzR5KpyYRpGgRKMei7fHLr7lBmZ1XHcX4LgsCxLPt4JBLRm82Hr4j9DyuVSprdO/ZELGafkXpkXtPA94OK03Vv/R4/csEw5XOGbuieN6y6bv/S9XdfvPkPTgcoDlpQJpwAAAAASUVORK5CYII="); rs.addEventListener("command", restoreSession, false); var rn = document.createXULElement("menuitem"); rn.setAttribute("label", "Переименовать"); rn.setAttribute("class", "menuitem-iconic"); rn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPFJREFUeNrEU0sOgkAMbc1IIHoQT+KeY7hkBW5ccwLdsOICxI2X8peIGhggI21gggpCwsImM01f+tpOO0WlFIwR0efgeR5nsG0boihizPd91A5UwZDjuq5qwycwUkQYhttSr4Y4l76fDdtBEAQqz3OVZdnPQ09o2sQhrpBSQgnAen/qzLxZzljHcawxy7KAuCJNUyiKAm53SS0FBGQNlUW3lFO2iVCLYRhAXJEkCQPn65NGAswpL/4fWAebt1ZGXB3geHlw9maXsKqjS94CHNxF7xRM0/wKgI7jDBojvbnZAz3Gv/9E7NvGvmXCsev8EmAAWocA9ofpaRIAAAAASUVORK5CYII="); rn.addEventListener("command", rename, false); var rm = document.createXULElement("menuitem"); rm.setAttribute("label", "Удалить"); rm.setAttribute("class", "menuitem-iconic"); rm.setAttribute("image", "data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABt0lEQVQ4ja2RT2sTURTFz8tk0nntFAQrVLBQxIUg/tkkMoLyIEVECHZhNrrxI+hOP5Mb6eBCcEipYIjZ2LpvhFasUtBSkwzOve+6mE6YSScuxLt67753fudyLvA/a7T+qCHmiTfrfWCMd3j9diPfq2SHX+uPnzJx71gP33w3bX9avBcE2j+SkK30Di7ffJ71VebMxD1hC2GGEEfH41prpftynIm92A0t2aYQQYgBThrndz/2KwCgf9Z2LNtImFOAtc356ijcCwJdJrZEUWzPfJpMAAAStPWR/h2Ktc10CoIQRUKEabFNvNbKfndcAKSjtrVfHW5YorWTzxDKYAxLtOWM+P7yt51hIYPpsDTNTyB/EwNAtWxdMuV8GCfbgxjxIviUYSV/SQOrbVjitbx4N8alBeXcdZR+3Tl3xS8FlIkt0dbnWH3xlbPgKgUo3HEq+tX7C4EuAAbGeOmqCuLIJt69s3PeQ1epKGfapCQJO6vGmwAWf/C1Wau6td8dV123BaAAUfHw6gSwtP3ugxA/y6X9INszAOQgbwFAIC/MQb9/Kv2vF2/UByejlVVn1Xiby/X6rPd/qj/1ak71UYKuwQAAAABJRU5ErkJggg=="); rm.addEventListener("command", remove, false); ss_popup.appendChild(rs); ss_popup.appendChild(rn); ss_popup.appendChild(rm); ss.appendChild(ss_popup); menupopup.appendChild(ss); }
Решил я потестировать будущую версию ESR, поставил 78 ESR RC2 (x86) - https://archive.mozilla.org/pub/firefox … es/build2/
На ней этот код тоже работает, но при вызове функции prompt, в консоли появляется ошибка:
Prompter: Browser not available or tab modal prompts disabled. Falling back to window prompt. Prompter.jsm:1051
В принципе эта ошибка ни на что не влияет, код работает нормально, но хотелось бы от неё избавиться. Не подскажите как?
Отредактировано unter_officer (26-06-2020 02:11:53)
«The Truth Is Out There»
Отсутствует
ну подправьте пожалуйста этот код для работы в user_chrome_files, для актуальных версий firefox.
А то подключил к комплекту, скрипт работает, да только при каждом клике, помимо того, что открывается новая вкладка, так ещё и окно разворачивается/сворачивается.
(sel => { var bot = e => !(e.button || e.ctrlKey || e.shiftKey || e.altKey) && e.target.matches(sel) && BrowserOpenTab(e.preventDefault()); var bar = document.getElementById("TabsToolbar"); bar.addEventListener("dblclick", bot, false); addEventListener("unload", () => bar.removeEventListener("dblclick", bot, false) , {once: true}); })("#tabbrowser-arrowscrollbox,toolbarspring,#TabsToolbar");
при вызове функции prompt, в консоли появляется ошибка
Увы, дело здесь не в коде.
Можешь просто alert(); запустить и полюбоваться на эту же ошибку.
Видимо, когда затеяли баг,
идея гадить пользователю в консоль показалась им хорошей.
Конкретно prompt в кнопке можно свой попробовать запилить, примерно как-то так
var prompt = (msg, value) => { var res = {value}; var ok = Services.prompt.wrappedJSObject .pickPrompter({domWin: window, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW}) .nsIPrompt_prompt(null, msg, res, null, {}); return ok ? res.value : null; }
Отредактировано Dumby (26-06-2020 09:42:57)
Отсутствует
Конкретно prompt в кнопке можно свой попробовать запилить, примерно как-то так
Dumby, спасибо! Теперь всё нормально, ошибки нет.
Там ещё такая же история с confirm, но это я решил путем замены confirm на custombuttons.confirmBox.
«The Truth Is Out There»
Отсутствует
как создать Windows-ярлык (.lnk)?
Имеется файл, к примеру,
"C:\Мой файл.txt"
на который необходимо создать Windows-ярлык, к примеру,
"Тест.lnk"
в папке "D:\Мое хранилище"
как создать кнопку, которая при нажатии реализовала такую операцию
(это конечно шаблон для более сложных построений).
Что-то читал про объект XPInstall file.windowsShortcut но не могу увязать в единое целое те скупые сведения почти без примеров, которе нашел через Гугл
Отсутствует
Конкретно prompt в кнопке можно свой попробовать запилить, примерно как-то так
скрытый текстВыделить кодКод:
var prompt = (msg, value) => { var res = {value}; var ok = Services.prompt.wrappedJSObject .pickPrompter({domWin: window, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW}) .nsIPrompt_prompt(null, msg, res, null, {}); return ok ? res.value : null; }
Dumby, если не сложно, набросайте такие же свои функции для alert(); и confirm();
Думаю, пригодятся в будущем.
«The Truth Is Out There»
Отсутствует
как создать Windows-ярлык (.lnk)?
Имеется файл, к примеру,
"C:\Мой файл.txt"
на который необходимо создать Windows-ярлык, к примеру,
"Тест.lnk"
в папке "D:\Мое хранилище"
как создать кнопку, которая при нажатии реализовала такую операцию
var shortcut = FileUtils.File("D:\\Мое хранилище") .QueryInterface(Ci.nsILocalFileWin); shortcut.append("Тест.lnk"); var trg = FileUtils.File("C:\\Мой файл.txt"); shortcut.setShortcut(trg);
если не сложно, набросайте такие же свои функции для alert(); и confirm();
Так всё то же самое
var alert = msg => Services.prompt.wrappedJSObject .pickPrompter({domWin: window, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW}) .alert(null, msg); var confirm = msg => Services.prompt.wrappedJSObject .pickPrompter({domWin: window, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW}) .confirm(null, msg);
Отсутствует
Так всё то же самое
скрытый текстВыделить кодКод:
var alert = msg => Services.prompt.wrappedJSObject .pickPrompter({domWin: window, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW}) .alert(null, msg); var confirm = msg => Services.prompt.wrappedJSObject .pickPrompter({domWin: window, modalType: Ci.nsIPrompt.MODAL_TYPE_WINDOW}) .confirm(null, msg);
Dumby, спасибо большое!
«The Truth Is Out There»
Отсутствует
И все-таки продолжу еще:
1) как добавить путь к иконке, напр. "D:\\temp\\ico.dll" iconId=3 ?
2) как будет выглядеть код кнопки копирующей, перемещающей и удаляющей файл
Отредактировано ruslaw (27-06-2020 01:19:57)
Отсутствует
Dumby
Возможно ли сделать для 68+ "в виде кнопки CB или скрипта для...", очистку хвостов -> (Profile/extensions/staged, trash; Profile/browser-extension-data; Profile/storage/default) после удаления расширения ?
Win7
Отсутствует
И все-таки продолжу еще:
1) как добавить путь к иконке, напр. "D:\\temp\\ico.dll" iconId=3 ?
А что, по ссылке что-то непонятное написано?
И «напр.» какой-то странный, у меня такой dll'ки нет.
var shortcut = FileUtils.File("D:\\Мое хранилище\\Тест.lnk") .QueryInterface(Ci.nsILocalFileWin); var trg = FileUtils.File("C:\\Мой файл.txt"); var icon = Services.dirsvc.get("SysD", Ci.nsIFile); icon.append("imageres.dll"); shortcut.setShortcut(trg, null, null, null, icon, 102);
2) как будет выглядеть код кнопки копирующей, перемещающей и удаляющей файл
Если внимательно прочитать про nsIFile, и вдумчиво применить,
то код кнопки, скорее всего, будет выглядеть хорошо.
Возможно ли сделать для
68+ "в виде кнопки CB или скрипта для...", очистку хвостов -> (Profile/extensions/staged, trash; Profile/browser-extension-data; Profile/storage/default) после удаления расширения ?
Звучит как малополезная и небезопасная затея.
Но если хочешь нахлобучить какой-нибудь тестовый
неповседневный браузер, тогда попробуй в custom_script.js
(trash не вписал, не знаю что надо сделать,
чтобы эта папка в extensions нарисовалась).
try {(g => g.AddonManager.addAddonListener({ get staged() { var prof = this.storage = Services.dirsvc.get("ProfD", Ci.nsIFile); var staged = prof.clone(); ["extensions", "staged"].forEach(staged.append); (this.data = prof.clone()).append("browser-extension-data"); ["storage", "default"].forEach(prof.append); delete this.staged; return this.staged = staged; }, onUninstalling(addon) { if (addon.type == "extension" && addon.isWebExtension) try { this.uuids = JSON.parse(Services.prefs.getStringPref( "extensions.webextensions.uuids", "{}" )); } catch {this.uuids = {};} }, onUninstalled(addon) { if (addon.type != "extension") return; var {id} = addon; this.remove(this.staged, id, true); if (!Array.from(this.staged.directoryEntries).length) try {this.staged.remove(false);} catch {} if (!addon.isWebExtension) return; this.remove(this.data, id, true); var uuid = this.uuids[id]; uuid && this.remove(this.storage, "moz-extension+++" + uuid); }, remove(dir, str, once) { if (!dir.exists()) return; var trg = once ? this.eq : this.sw; for(var entry of dir.directoryEntries) if (trg(entry.leafName, str)) try {entry.remove(true);} finally {if (once) break;} }, eq: (str1, str2) => str1 == str2, sw: (str1, str2) => str1.startsWith(str2) }))(Cu.import("resource://gre/modules/AddonManager.jsm", {}));} catch (ex) {Cu.reportError(ex);}
Отсутствует
«Merge Day»
custom_buttons-0.0.7.0.0.15-fx-paxmod.xpi
custom_buttons-0.0.7.0.0.15-fx-bootstrap.xpi
[?] Custom Buttons для Thunderbird 78
Только для TB, и только для 78.
custom_buttons-78.0-tb.xpi
Да, и DOMi 7.0.7 тоже можно
попробовать поставить (paxmod, разумеется).
Отсутствует