// ==UserScript== // @name OpenWith // @description Fügt dem Kontextmenü ein Menü hinzu, zum Öffnen der aktuelle Seite und eines ausgewählten Links in einem anderen Browser. // @description und eines ausgewählten Links in einem anderen Browser. // @version 1.2.1a 63+ // @author y2k // @include main // @charset UTF-8 // @namespace http://tabunfirefox.web.fc2.com/ // @note Anwendungssymbol anzeigen // @note als .uc.js Script umgeschrieben // ==/UserScript== (function() { "use strict"; /* Vor Verwendung, Pfad auf eigene Umgebung ändern(\ wird durch \\ ersetzt) Zum Übergeben von Argumenten, wie folgt vorgehen: C:\\Program Files\\Internet Explorer\\iexplore.exe<>$1 Argument Argument ※ $1 wird in URL umgewandelt */ const BrowserPath = { "Mypal68": "H:\\Browsers\\mypal-68.12.4.en-US.win32\\mypal\\mypal.exe", "Iceweasel 101.0": "E:\\Portable\\Browsers\\Iceweasel-v101.0.en_US_64\\App\\Iceweasel.exe", "Firefox 102.0esr": "E:\\Portable\\Browsers\\Firefox Setup 102.0esr\\FirefoxPortable.exe", "Firefox 103.0.2": "E:\\Portable\\Browsers\\Firefox Setup 103.0.2\\Firefox\\firefox.exe", "Firefox 105.0b5": "H:\\Browsers\\Firefox dev 105.0b5\\core\\firefox.exe", "Floorp 10.3.0": "E:\\Portable\\Browsers\\floorp-10.3.0win64\\Floorp\\Floorp.exe", "catsxp 103.2.7.3.2": "E:\\Portable\\Browsers\\catsxp_portable_x64_beta_103_2_7_3_2\\catsxp.exe", "CentBrowser 5.0": "E:\\Portable\\Browsers\\CentBrowser 5.0\\X-Cent.exe", "Waterfox G3.2.6": "E:\\Portable\\Browsers\\Waterfox G3.2.6 Setup\\Waterfox\\Waterfox.exe", "Waterfox G5.0b2": "E:\\Portable\\Browsers\\Waterfox G5.0b2 Setup\\Waterfox\\Waterfox.exe", "Librewolf 101.0.1": "E:\\Portable\\Browsers\\librewolf-101.0.1-1.en-US_64\\LibreWolf\\LibreWolf.exe", }; const FlatMenu = false; const OpenWith = { start: function() { const cm = document.getElementById("contentAreaContextMenu"); cm.addEventListener("popupshowing", function(e) { if (e.target == this) { OpenWith.onpopup(e); } }, false); }, createMenu: function() { if (this.pageItem || this.linkItem) { return; } const contextMenu = document.getElementById("contentAreaContextMenu"); const pageMenu = this.$C("menu", { id: "context-open-with-page", label: "Открыть в:", class: "menu-iconic", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADLElEQVQ4jW2T20+bdQCGv79lcxx6HN9HYZhl2cyuNEQTvTBZTIyHWxe9MYveaGKi0RtJyDY2FGo/l8G2MkCElhZaoO2go6OTcuhaWoRCSw+jLS0dX3+PN5vJCM/1+1697yNJx7iUtCtt4RG1Nfh3SvG7hTzjFWb3o5RpLKS2TySV4/nXsMTudrfHhmmLuVFCDuQ5Fy2eaSyeEHpXBONoFNke7z6x3L5p87ZrLuT1Bxgf38McGEGem8Q0NU2nb4nvI1voR9bQuSro72x6Xyu3bvd0fVCf59fcMudWhsWHUQ9frIcweCdocXtoGp3hp7UtIsUjYRmKIU9VMNh2uiRJkqTLZZtRzvXxaXEKhBDJahkhBN/Gn2KecyB7PBjG/TTaH5GoHIIQ4jN/njN9eZSBmlHqyPb2t5at2CvPGNqPYXyicjW+gBCCOzvb6CcnMTn9nL4X4KPZONTr9K09540/Shh+K/RLbZkbqfN7NnZrFS7F7JjDf/KklGO1VKJl1olpysVZZwDDaJC3nKsIrY66XuTUrTS6nnxKsuxdF2+nB0nUnmNcsfLldoCVUhGdb4gm9yh61ySGCR+64QXG/s0jtCOC+SqKmqKhpyAkJXNdvL93n2fVAsaVPq5sTIMm+CGxgprewpnNYnb4OT3oYzazD9oR1OvIaoozN/NCsmRupi7nBkjXyrRFB5HDAyAEQtP4cSPKlaUlGoY9nHc9pVI7Ak3jQazEqd4Mut58SurI9vZbyirLhxmu7QTQPb7N1Y1FModVvlr9h/cWgny3miBXfcHtaJZDrcbn3jSN6gH6W/l+6ULZZlRyfXz8csaLa6M0+610hmcYye4yXygytLvHRXcEWzwHQohvFos09Ocx/l4zSpIkSW/uWrtatYf8XAiDEOLrRIiWhb9onh5DPzmN7JznWjgJQohflnM0jVXRWV8e6RUdSatXeTHOJztzRA4KZA5rxCtlogcVdg9qeLL7vDu3SaOjis527MqvOJe4221ev8/ZqIMLYQ+doQDvLARp8y7S7IrQ9HAVkz12skz/S5W0K0poSDX7RlJGn0MYpjzCMO5LmcaCqnyCzv8BRmmCMzO3S40AAAAASUVORK5CYII=" }); contextMenu.insertBefore(pageMenu, contextMenu.querySelector(":scope > #context-bookmarkpage, :scope > #context-savepage")); const linkMenu = this.$C("menu", { id: "context-open-with-link", label: "Открыть ссылку в:", class: "menu-iconic", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADLElEQVQ4jW2T20+bdQCGv79lcxx6HN9HYZhl2cyuNEQTvTBZTIyHWxe9MYveaGKi0RtJyDY2FGo/l8G2MkCElhZaoO2go6OTcuhaWoRCSw+jLS0dX3+PN5vJCM/1+1697yNJx7iUtCtt4RG1Nfh3SvG7hTzjFWb3o5RpLKS2TySV4/nXsMTudrfHhmmLuVFCDuQ5Fy2eaSyeEHpXBONoFNke7z6x3L5p87ZrLuT1Bxgf38McGEGem8Q0NU2nb4nvI1voR9bQuSro72x6Xyu3bvd0fVCf59fcMudWhsWHUQ9frIcweCdocXtoGp3hp7UtIsUjYRmKIU9VMNh2uiRJkqTLZZtRzvXxaXEKhBDJahkhBN/Gn2KecyB7PBjG/TTaH5GoHIIQ4jN/njN9eZSBmlHqyPb2t5at2CvPGNqPYXyicjW+gBCCOzvb6CcnMTn9nL4X4KPZONTr9K09540/Shh+K/RLbZkbqfN7NnZrFS7F7JjDf/KklGO1VKJl1olpysVZZwDDaJC3nKsIrY66XuTUrTS6nnxKsuxdF2+nB0nUnmNcsfLldoCVUhGdb4gm9yh61ySGCR+64QXG/s0jtCOC+SqKmqKhpyAkJXNdvL93n2fVAsaVPq5sTIMm+CGxgprewpnNYnb4OT3oYzazD9oR1OvIaoozN/NCsmRupi7nBkjXyrRFB5HDAyAEQtP4cSPKlaUlGoY9nHc9pVI7Ak3jQazEqd4Mut58SurI9vZbyirLhxmu7QTQPb7N1Y1FModVvlr9h/cWgny3miBXfcHtaJZDrcbn3jSN6gH6W/l+6ULZZlRyfXz8csaLa6M0+610hmcYye4yXygytLvHRXcEWzwHQohvFos09Ocx/l4zSpIkSW/uWrtatYf8XAiDEOLrRIiWhb9onh5DPzmN7JznWjgJQohflnM0jVXRWV8e6RUdSatXeTHOJztzRA4KZA5rxCtlogcVdg9qeLL7vDu3SaOjis527MqvOJe4221ev8/ZqIMLYQ+doQDvLARp8y7S7IrQ9HAVkz12skz/S5W0K0poSDX7RlJGn0MYpjzCMO5LmcaCqnyCzv8BRmmCMzO3S40AAAAASUVORK5CYII=" }); contextMenu.insertBefore(linkMenu, contextMenu.querySelector(":scope > #context-sep-open")); this.pageItem = this.createMenuItem(pageMenu, "openPage", FlatMenu? "Открыть в $1 ":" $1"); this.linkItem = this.createMenuItem(linkMenu, "openLink", FlatMenu? "Открыть ссылку в $1 ":" $1"); }, createMenuItem: function(menu, method, format) { const frag = document.createDocumentFragment(); let menuitem = []; for (let i of Object.keys(BrowserPath)) { const item = this.$C("menuitem", { label: format.replace("$1", i), class: "menuitem-iconic", image: "moz-icon:file:///" + BrowserPath[i].split("<>")[0] + "?size=16", value: JSON.stringify([ method, i ]), }); item.addEventListener("command", this, false); frag.appendChild(item); menuitem[menuitem.length] = item; } if (!FlatMenu) { const menupopup = this.$C("menupopup"); menupopup.appendChild(frag); menu.appendChild(menupopup); menuitem = [ menu ]; } else { const parent = menu.parentNode; parent.insertBefore(frag, menu); parent.removeChild(menu); } return menuitem; }, $C: function(tag, attrs) { const elem = document.createXULElement(tag); if (attrs) { for (let key of Object.keys(attrs)) elem.setAttribute(key, attrs[key]); } return elem; }, onpopup: function(e) { this.createMenu(); const isHtml = /^(https?|file):/.test(gBrowser.currentURI.spec); const pageItemHidden = !isHtml || gContextMenu.onLink || gContextMenu.onTextInput; const linkItemHidden = !isHtml || !gContextMenu.onLink || gContextMenu.onTextInput; const pageItem = this.pageItem; for (let i = 0, l = pageItem.length; i < l; i++) { pageItem[i].hidden = pageItemHidden; } const linkItem = this.linkItem; for (let i = 0, l = linkItem.length; i < l; i++) { linkItem[i].hidden = linkItemHidden; } }, handleEvent: function(event) { if (event.type === "command") { const [ method, key ] = JSON.parse(event.originalTarget.getAttribute("value")); const url = method === "openPage"? gBrowser.currentURI.spec: gContextMenu.linkURL; this.launch(BrowserPath[key], url); } }, launch: function(browserPath, openURL) { let [ path, args ] = browserPath.split("<>"); if (args) { args = args.split("^^").map(a => a.replace("$1", openURL)); } else { args = [ openURL ]; } const file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); file.initWithPath(path); const process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(file); process.run(false, args, args.length, {}); }, }; OpenWith.start(); })(); |