Ultima2m пишет: У кого-нибудь есть рабочая Save+ ?№10227
Спасибо. Работает.
Из старой перенес еще такие пункты:
"Сохранить всю страницу как PDF"
"Копировать ссылки (выделенные или все)"
{ separator: ''}, { label: "Сохранить всю страницу как PDF", func: "savePageToPDF", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYUw4pJt3V/+Rb1D8lnFP/55zTf+VcVH/lXJS/5VyUv+VclL/lXJS/5VyUv+VclL/k3BR/J56Wv9cRzSkAAAAAJNvUKTto2L/4ppe/uehZf/Pmmr/noZv/9Scav/Wl17/1plh/9eZYf/XmWH/15lh/9eZYf/WmGD/2Jlg/suRXP9mRiuk8rWA/397dP1akKn/rqqi/3LF3f8Mntj/4dLJ///+9f/48u3/9e7n//bt5v/47+f/+O/n//jv5//rvZP/1ZJX/a9/VP9+lrD8AIvz/xOt+f8Douv/ALb6/wC28/9tmar/z8jJ//Lq5/////7//v////n9///6/P3//////+Ta0P/PjVP/pnpT/IWds/+aiXj/5efl/8Px//951/3/LMz//wCx8/8GltL/NIu3/4ycqf/l29L////+//n6+//8/v//3tXM/8+OVP+oe1P/6K57/86QWP/r6Ob////////++v/r9/z/oOb9/zDL//8Arf//AI/r/ydysv+hpqr//PTr///////d1Mz/0I5U/6h7U//osH//wo5g/+fm5P/7/f//9vf5//z7+////vv/9/r8/5Dc/P8Oqv7/AJf//wF02v9ffZ7/8Ojh/+Ha1P/NjFL/qHtT/+ewf//Ej1//7O3r///////+/v7//v7+//f5+v/6+vv////8/8Tq/f8hp/7/AJH//wB18/8/bqj/1MGu/9mXXv+leVH/569+/8iSYv+/tKn/wLew/8O5sf/P0M////////7+/v/3+fv////7/9Hv/v8hoP3/AIn//wB4/v84ZqL/w4NH/619VP/nsYD/x45c/9W5of/bv6j/0Jxt/6J/YP+spqD/2N3i//7////6+/3///76/8vr/v8Slv7/AIb+/wBz//83VH7/nW1B/+ewfv/Fjl7/7Ozr///////9+/r/9d7K/9Ghdv+jd1D/pJ6Y/+jt8f/9///////7/6fb/v8Ahv7/AYD//wRp6f95YlT/57B//8SOXv/n5uT//v7///r7/P/8/v////////XRsv/DhEv/loBu/9DX3P/9/v/////7/2O6/f8Afv//FnTU/5JtTf/nsH//xY9e/+jn5f/+/f//+fj5//n4+P/5+Pn/+/////Xbxf/Wj1D/nX1h/+Ll6P////7/3+/3/w+V//8tcbP/qHJB/+WuffzCjV7/5efn///////+/v7//////////////v7///////XRsP/TnW3/8fT3//////////z/ddD//0Nxl/+zdkH88LmH/9CRWP2+qJT/0M7N/8/Jxv/Pysf/z8rH/8/Kxv/Py8n/zsO6/7+pmP/PzMv/zsnG/9bNyP+nsK7/h4R3/b2BT/+Sb1Ck7qxw/9GSW/69hlb/wYhX/8CIV//AiFf/wIhX/8CIVv/BiVj/xI1d/8CIVv/BiFf/vYZW/9STW/7ppmv/bE80pAAAAACUd16k+sui/+7AmPzwwpr/8MKa//DCmv/wwpr/8MKa//DCmf/vwZj/8MKa//DCmv/uwJj8+cui/5N3XaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="}, { label: "Копировать ссылки (выделенные или все)", func: "CopyAllLinks", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABgUlEQVQ4jYWSyytEYRyGv7/GX2BjayU1ZWeKMGWhhDFSp9mMU8qlNAgzUnMoQ2JBY8PCigVKIeOa29BczK3BOHNGPRaTifGd46139/ue3qc+ISSpb+3XfMEt/Evbvyq7/ZOmnkHN5lBIprP8zIQW+h/Q5ZnSdg9PsTkUIokMGf2TRP4TgBH/mjXA413UDo4vAbA5FG6iaeLvRZ5eiwC0uoYx1RrXNjV1cgmn6qOldwibQyH8lCKSM7jNGswGQ1hqdQ9M8/gcJ3wfxbuwyWhgncG5VTz+ZWZWtvlXq8PtBSD2ViSSM7jLGlylC8yHdrHSGhgPlgBtrmEAHnJGecFYYAMrLQBlJFAC2DtVAK4zBc5TOicvOlZaF6kCAE7VVwI0tLsBOEvq5WMzrXBS5zihA9Dh9pYAdc19VEam9b3gMPZRvhFCCFHb2E1lZVpH8Q/2o3n2nvMA2DtVhBCiSghRU1mZ1veCncd3ABra3ea/U6ZVmbrmPnOATEtWs/dSLUmrvwBcDEvWhp2gUgAAAABJRU5ErkJggg=="}, {
в конец кода:
// Сохраняет страницу как PDF файл через сервис 'pdfmyurl.com' ................................ function savePageToPDF() { // разрешить страницу для расширения NoScript .... if ( "noscriptUtil" in window ) { var autoReload = custombuttons.getPrefs("noscript.autoReload"); if ( autoReload ) custombuttons.setPrefs("noscript.autoReload", false); noscriptOverlay.allowPage(); if ( autoReload ) setTimeout(function() { custombuttons.setPrefs("noscript.autoReload", true) }, 10) } // сохранить .... var loc = content.location; if (loc.protocol.slice(0, 4) == "http") loadURI("http://pdfmyurl.com?url=" + loc); }; // Копировать ссылки function CopyAllLinks() { var win = document.commandDispatcher.focusedWindow, doc = win.document; var sel = doc, winSel = win.getSelection(); if(winSel.toString()){ sel = doc.createElement('div'); sel.appendChild(winSel.getRangeAt(0).cloneContents()); }; var str = '', links = sel.getElementsByTagName('a'); for(var i = 0, lnk; lnk = links[i]; i++){if(lnk.href)str += lnk.href + '\r\n'}; gClipboard.write(str); };
Отсутствует
Еще заметил такой баг. Если на одной странице несколько раз использовать пункт " Добавить url и сохранить...",
то с каждым разом строк с url в файле становится больше.
Ага, подтверждаю.
Отсутствует
Добрый день. Есть кнопка открывающая любой указанный в ней файл по тапу:
/*CODE*/ var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile); file.initWithPath( "d:\\123\\_profbak.bat" ); file.launch();
Подскажите пожалуйста такую же, но открывающую файл в папке активного профиля, без указания путей, только по имени, не зависимо от пути профиля. Другими словами, чтобы было достаточно вбить в кнопку имя, а не указывать ей путь. Надо для портативного профиля.
Отсутствует
var file = Services.dirsvc.get('ProfD', Ci.nsIFile); file.append("_profbak.bat"); file.launch();
Отсутствует
У вас там затесалось:
Спасибо уберу. Но может получится как нибуть оставить один клик ПКМ и було бы то что нужно.
Добавлено 26-08-2016 21:15:17
У вас там затесалось:
Убрал, не помогает.Что то я накрутил с кодами.
Отредактировано Duche (26-08-2016 21:16:12)
Отсутствует
Спасибо уберу.
Забудьте. Я перепутал со строкой menuPopup.setAttribute("context", "placesContext"); А тут никак не может повлиять.
Я вообще не понял, что за проблема появилась (все как и раньше работает (если не считать отсутствия контекстного меню у папок)). И что нужно.
Отсутствует
Я вообще не понял
Пропало контекстное меню, при длинном клике на папке из под Right Links как было раньше. Появился вызов контекстного меню при двойном клике по папке ПКМ . Включен Right Links или нет, теперь значение не имеет. Может поможет в поиске вызова контекстного меню на папке при одном клике ПКМ. Может получится как нибуть оставить один клик ПКМ и було бы то что нужно.
Отредактировано Duche (26-08-2016 21:24:07)
Отсутствует
Duche
С кодом, что вы привели тут, не вижу такой проблемы.
Кстати, что-то не сообразил раньше, вот так контекстное меню у папок будет (у закладок по-прежнему, только с Right Links):
menuPopup.setAttribute("onclick", "if (!PlacesUtils.nodeIsFolder(event.target._placesNode)) {event.preventDefault(); event.stopPropagation()}; BookmarksEventHandler.onClick(event, this.parentNode._placesView);")
Отсутствует
Кстати, что-то не сообразил раньше,
Добавил, для папок работает, у закладок по-прежнему, только с Right Links. Подождём, может что у Вас придёт в голову.
Спасибо.
Отредактировано Duche (26-08-2016 21:39:30)
Отсутствует
turbot
Что вы там с Duche залипли с кнопкой
var context = document.getElementById("placesContext"); menuPopup.setAttribute("onclick", "clickHandler(event);"); menuPopup.clickHandler = e => { if (e.button == 2) { e.preventDefault(); context.state == "open" && context.hidePopup(); e.target.dispatchEvent(new MouseEvent("contextmenu", e)); } else BookmarksEventHandler.onClick(e, menu._placesView); }
Не помешает, наверно
Всплывающая подсказка справа сверху
((url, icon) => PlacesUtils.promiseFaviconLinkUrl(gBrowser.currentURI).then( uri => icon = uri.spec, () => icon = "chrome://global/skin/icons/Portrait.png" ).then(() => document.getElementById("contentAreaContextMenu").hidePopup() || openDialog( url, "", "popup=yes", icon, "Добавил в папку " + folderTitle + ":", docTitle, false, null, 4 )))("chrome://global/content/alerts/alert.xul");
Отредактировано Dumby (27-08-2016 02:00:49)
Отсутствует
Что вы там с Duche залипли с кнопкой
Угусь, не без этого. Спасибо.
Duche
(contextMenu=> { var menu = contextMenu.insertBefore(document.createElement("menu"), contextMenu.children[0]); menu.setAttribute("id", "context_bookmarksToolbarPopup"); menu.setAttribute("class", "menu-iconic bookmark-item"); menu.setAttribute("label", "Открыть | Добавить как закладку в"); menu.setAttribute("image", "chrome://browser/skin/places/bookmarksToolbar.png"); addDestructor(()=> { menu._placesView && menu._placesView.uninit(); menu.remove(); }); var menuPopup = menu.appendChild(document.createElement("menupopup")); var context = document.getElementById("placesContext"); menuPopup.setAttribute("id", "context_bookmarksPopup"); menuPopup.setAttribute("placespopup", "true"); menuPopup.setAttribute("context", "placesContext"); menuPopup.setAttribute("onclick", "clickHandler(event);"); menuPopup.clickHandler = e => { if (e.button == 2) { e.preventDefault(); context.state == "open" && context.hidePopup(); e.target.dispatchEvent(new MouseEvent("contextmenu", e)); } else BookmarksEventHandler.onClick(e, menu._placesView); } menuPopup.setAttribute("openInTabs", "children"); menuPopup.setAttribute("tooltip", "bhTooltip"); menuPopup.setAttribute("popupsinherittooltip", "true"); menuPopup.setAttribute("onpopupshowing", "if (!this.parentNode._placesView) new PlacesMenu(event, 'place:folder=TOOLBAR')"); //Попадать из контекстного не в "Меню закладок"............ menuPopup.setAttribute("oncommand", "BookmarksEventHandler.onCommand(event, this.parentNode._placesView);"); })(document.getElementById("contentAreaContextMenu")); // Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 09.05.2014. ................................ addEventListener("dblclick", function(e) { var target = e.originalTarget; if ( e.button !== 0 || !target._placesNode || !PlacesUtils.nodeIsFolder( target._placesNode ) ) return; var docTitle = ( content.document.title || gBrowser.mCurrentTab.label).substr(0, 50); var folderId = PlacesUtils.getConcreteItemId( target._placesNode ); var folderTitle = PlacesUtils.bookmarks.getItemTitle( folderId ); var currentURI = Services.io.newURI( content.location, null, null ); PlacesUtils.bookmarks.insertBookmark( folderId, currentURI, 0, docTitle ); // всплывающая подсказка .... ((url, icon) => PlacesUtils.promiseFaviconLinkUrl(gBrowser.currentURI).then( uri => icon = uri.spec, () => icon = "chrome://global/skin/icons/Portrait.png" ).then(() => document.getElementById("contentAreaContextMenu").hidePopup() || openDialog( url, "", "popup=yes", icon, "Добавил в папку " + folderTitle + ":", docTitle, false, null, 4 )))("chrome://global/content/alerts/alert.xul"); });
Отсутствует
Что вы там с Duche залипли с кнопкой
Dumby , Тurbot .
Примите искреннюю благодарность за Вашу работу.
Уважаемый Dumby, посмотрите тут , нужна Ваша помощь.
https://forum.mozilla-russia.org/viewto … 52#p721552
Отредактировано Duche (27-08-2016 07:40:20)
Отсутствует
Duche
// try { (({Services, Preferences}, prefs) => { var [disk] = Services.dirsvc.get("GreD", Components.interfaces.nsIFile).path; for(var pref of prefs) { var dir = Preferences.get(pref, undefined); dir && dir[0] != disk && Preferences.set(pref, disk + dir.slice(1)); } })(Components.utils.import("resource://gre/modules/Preferences.jsm", {}), [ "browser.download.dir", "extensions.downloadbar.audioplayerpath" ]); } catch(ex) {}
Отсутствует
Пути не перепутал?
Давай попробуем проверить.
Добавь код в начало вкладки Код любой кнопки,
затем нажми кнопку, и скриншот алерта в студию.
var func = file => OS.File.read(file.path).then(arr => res.push( file.path + "\n" + "—".repeat(20) + "\n" + new TextDecoder("utf-8").decode(arr) ), ex => res.push(ex)); var file = Services.dirsvc.get("GreD", Ci.nsIFile), res = []; file.append("config.js"); func(file).then(() => { file = Services.dirsvc.get("PrfDef", Ci.nsIFile); file.append("config-prefs.js"); func(file).then(() => alert(res.join("\n\n\n"))); }); if (true) return;
Отсутствует
Если положить в кнопку, закомментированную первую строку надо убрать?
В кнопке - без разницы.
Dumby
Не подскажете, где я туплю:
this.onclick = e => { if (e.button == 0) popup.openPopup(this, "after_start"); if (e.button == 1) muteTab(); if (e.button == 2 && !e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) { e.preventDefault(); e.stopPropagation(); muteAllTabs(); } } var pref = "media.default_volume"; var o = {// https://github.com/Infocatcher/Private_Tab/issues/228#issuecomment-238963363 get windows() { return (function*() { var ws = Services.wm.getEnumerator("navigator:browser"); while(ws.hasMoreElements()) yield ws.getNext(); })(); } } this.onmouseover = () => this.tooltipText = 'LMB: Open menu\nMMB: Toggle sound for active tab\nRMB: Mute all tabs in all windows\n' + (cbu.isPref(pref) && 'Mouse Scroll: Set default volume level for media (current: ' + cbu.getPrefs(pref) * 100 + '%)\n') + 'Ctrl + Mouse Scroll: Change volume level for all tabs'; this.onwheel = e => { if (!e.ctrlKey && cbu.isPref(pref)) { var i = Services.prefs.getCharPref(pref) * 100, i = e.deltaY < 0 ? i + 10 : i - 10; if ( 0 <= i && i <= 100 ) Services.prefs.setCharPref(pref, (i/100).toFixed(1)); return; } for(var w of o.windows) { [...w.gBrowser.tabs].forEach(tab => { var vol = tab.linkedBrowser._contentWindow.content.document.defaultView .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindowUtils).audioVolume.toFixed(1) * 100, vol = e.deltaY < 0 ? vol + 10 : vol - 10; if (0 <= vol && vol <= 100) tab.linkedBrowser._contentWindow.content.document.defaultView .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindowUtils).audioVolume = (vol/100).toFixed(1); }); } }; var popup = self.appendChild(document.createElement("menupopup")); // [ // {pref: '', lbl: '', cmd: ''} // ].forEach(m => { // var mItem = popup.appendChild(document.createElement("menuitem")); // mItem.oncommand = () => eval(m.cmd); // mItem.label = m.pref ? m.lbl + '(about:config prefrences (current:' + cbu.getPrefs(m.pref) + '))' : m.lbl; // }) function muteTab() window.gBrowser.selectedTab.toggleMuteAudio(); function muteAllTabs() { for(var w of o.windows) [...w.gBrowser.tabs].filter(tab => tab.hasAttribute("soundplaying") && !tab.hasAttribute("muted") && tab.toggleMuteAudio()); } addEventListener('keydown', e => { // Alt + Shift + T - toggle audio for active tab in active window // Alt + Shift + B - mute all tabs with sound playing in all windows // See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#Constants_for_keyCode_value if (e.altKey && e.shiftKey && !e.ctrlKey && !e.metaKey) { switch (e.keyCode) { case 84: muteTab(); break; case 65: muteAllTabs(); break; default: return; } e.preventDefault(); e.stopPropagation(); } }, false, window);
В this.onwheel, устанавливаемые значения периодически становится вида 0.20000000298023224. Откуда, ну откуда это берется?! Если с параметром конфига удалось справиться, то с audioVolume - никак. А главное, audioVolume почему-то меняется только на активной вкладке. Я, наверное (то есть, не наверное, а точно, чего уж там), сам дурак, но это мне уже мозг выело.
P.S.: И еще вопросик: как сделать, чтобы текст в тултипе кнопки обновлялся при вращение колесика? Если сделать с e.preventDefault(); e.stopPropagation();, чтобы он не скрывался, и менять tooltiptext, либо label тултипа, то атрибут хоть и меняется, а отображаемый текст в видимом тултипе - нет.
Отредактировано turbot (28-08-2016 17:10:02)
Отсутствует
audioVolume почему-то меняется только на активной вкладке
Даже разбираться не стал почему. Просто переписал. Проверь.
var step = .05; for(var w of o.windows) for(var {contentWindow: win} of w.gBrowser.browsers) { var dwu = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); dwu.audioVolume = e.deltaY < 0 ? Math.min(1, dwu.audioVolume + step) : Math.max(0, dwu.audioVolume - step); }
Отсутствует
как сделать, чтобы текст в тултипе кнопки обновлялся при вращение колесика?
Так что ли
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3Etest%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tv///wAAZv8AAAD/AAAA/wAAAP8AAAD/25A6/wBmtv+2ZgD/////////////////AGa2/7ZmAP///////////7b///86AGb//9uQ///////////////////////b////OjqQ///bkP//////kNv//2YAOv///7b///////////+2////OgBm///bkP///////////////////////////2a2//+QOgD/2//b/wA6kP//tmb/////////////////tv///zoAZv//25D/////////////////////////////////AGa2/2ZmZv+QOgD////b/////////////////7b///8AAGb/AAAA/wAAAP8AAAD/ZgAA////tv///////////7b///86AGb//9uQ//////////////////////+2////OgBm///bkP////////////////////////////////86kNv/Ojo6/7ZmAP//////////////////////tv///zoAZv//25D///////////////////////////+Q2///kDo6////2/8AZrb//7Zm/////////////////7b///86AGb//9uQ////////////////////////////AGa2//+2Zv//////kNv//5A6Ov///9v///////////+2////AABm/wAAAP8AAAD/AAAA/wAAAP//tmb/Zrb//5A6AP///9v///////////8AZrb/25A6//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxB//+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.tooltipText%20%3D%20%22Scroll%20me%22%3B%0Avar%20du%20%3D%20Cc%5B%22@mozilla.org/inspector/dom-utils%3B1%22%5D.getService%28Ci.inIDOMUtils%29%3B%0Athis.onwheel%20%3D%20e%20%3D%3E%20%7B%0A%09e.preventDefault%28%29%3B%0A%09var%20tooltip%20%3D%20%5B...du.getChildrenForNode%28document.documentElement%2C%20true%29%5D%0A%09%09.find%28child%20%3D%3E%20%22triggerNode%22%20in%20child%20%26%26%20child.triggerNode%20%3D%3D%20this%29%3B%0A%09if%20%28tooltip%29%20tooltip.label%20%3D%20Math.random%28%29%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отсутствует