333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2025-03-19
  • 发帖数124
  • 经验141枚
  • 威望0点
  • 贡献值148点
  • 好评度4点
  • 社区居民
  • 忠实会员
阅读:281回复:5

[已修复] OpenWith.uc脚本在136.0a1版本中失效了,有请大神修复

楼主#
更多 发布于:2025-02-03 21:16
OpenWith.uc脚本在136.0a1版本中失效了,有请大神修复
// ==UserScript==
// <a href="home.php?mod=space&uid=467097">@Name</a>           OpenWith.uc.js
// @description    用其他浏览器打开页面、链接、书签及标签
// <a href="home.php?mod=space&uid=321866">@author</a>         ding
// <a href="home.php?mod=space&uid=713796">@include</a>        main
// <a href="home.php?mod=space&uid=570682">@version</a>        2018.2.3.1
// @homepageURL    https://bbs.kafan.cn/thread-2114879-1-1.html
// @startup        window.OpenWithManager.init();
// <a href="home.php?mod=space&uid=748274">@Shutdown</a>       window.OpenWithManager.destroy();
// <a href="home.php?mod=space&uid=356229">@Note</a>           适配Firefox57+
// ==/UserScript==
location.href.startsWith('chrome://browser/content/browser.x') && (function () {
  
    const MENU_NAME = "用其它浏览器打开";
  
    //是否使用二级菜单
    const USE_MENU_AREA = true; //页面
    const USE_MENU_TAB = false; //标签
    const USE_MENU_PLACE = false; //书签
  
    function getFirefoxPath(){//firefox.exe所在路径
        return OS.Constants.Path.libDir;
    }
    function getRootPath() {//firefox所在盘路径
        var path = getFirefoxPath();
        var index = path.indexOf(":");
        return path.substring(0,index+1);
    }
    //修改内容后请将脚本改名来保证加载的是最新,或使用无缓存的userChrome.js
    var browsers = {
         
                Edge: {
            enable: true,
            name: "Edge",
            path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
            image: "data:image/png;base64,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"
        },
                Chrome: {
            enable: true,
            name: "Chrome",
            path: "D:\\GoogleChromePortable64\\GoogleChromePortable.exe",
            image: "data:image/png;base64,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"
        },
          
        Slimjet: {
            enable: true,
            name: "Slimjet",
            path: "D:\\Slimjet\\slimjet.exe",
            image: "data:image/png;base64,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"
        },
        FireFox: {
            enable: true,
            name: "Firefox Nightly",
            path: "D:\\FirefoxNightly\\FirefoxPortable.exe",
            image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE5ElEQVRIx8WVW4hd5RXHf+vb93Oby5nO5FJlopKQ4qVSpQk+zB4otZVWBUHwTQRHEAVBCvWlM2OhUOhLoX2RFiuBgnlKKfUChTkVSm2tU1p0hIxOLibGZDKZOefsfc6+fd/Xh2OGBFuVltIFH+y1H9Zv/9f69n/BfxFPbP4s5n8Z7Y1nrZz8/mdC5IsUum/h+NIrb22CXx8dN2LPc725iwdW40A89roH5k/NLnQ+F3Dih0l87oyNn/pFcwkgOviDJe0GiwUehE3wGxA0IRpDPX8BO74GgCsh1dsPd77T2rv82/ua14Gca5O79z394o6XPfrlO47IpezwSpKXcTg5zYFvzOFMj5FeSsCLwA/hXo0VDTbCWAMz67Mfps3Z6tgLL/1bBc99833rReMM2y3SGThjr6BunuJ87xyrv34dwvFRi6ImzvMNdLQKVIC7W+P24q7lf9x559LVXF19+PPP83hfuY9a1MYJXUzg0JqZQQcOG385CaYCXYA1YAxyuYaUN4BtgA3BNMA0WHNPLz6zcTb+FGDjhLPoeBFGgfnkg7QDRkFwx1GmHvk2k/ffBjqHKsf8/jJ+MYtrG2BdsC5iQ7QOODG8sHgd4PXHirjqqxjACqAs1hn1zwiI69C8+UbGboygzKAYYN7uYlYHBMmteGYMMXVE1xA8zpbmegW9dXZfiB1VFT3K3QrGVcLmseOc+vErUA6gSKFIKY+to9/s0+reTrP6EqgmYiaQssb03z5Y2gU09tk5AEcsyoCqQGkwSYoZZBTv/Z3k3XXQ5ScKEij6UA3JX36L9GKdsL+fMN2DlC3EROy/YOa4On6bEysskgvKgKOFjdNrdMOStReOUwU+VNVIktGjQZcZKBerS6qts/QHB2nfNKDv9EkpuNy18S7Ac8yoHVpwCyiHORJETLRmGJ/ay/bFj/AVVGWOqYrRbRIHlANG4+oulR9gtyva/hjF2A7SHP1iLsDwvFp2sYu6snj5CDIdTaH9kCMPLrD+zgrbvSv4X5mlaIZcevOvpCfPQ6lRtiJqNrETMEhrtMmYSEL2RnD2KiCYMJTbispaggwmagGFdsgKRR4Kh77+LQZNGNagGxaE4zVOvfsrjAhSd5g8eJhhagGIcqFdKFJXlncVtI+WneJVtVhZIciFYAiTgUviWrYG2+TnN9F1h+2dM1z40xvkSUZDORhdMfnw/TQyD7VjQStqmeAoj3umTeeda63itbnBSpp78QCHPID+uJC0IGlZVtd+w+mTf0RZhwILIpjIZ+Kh79I6cheVGIrS4hQw0xcilXZeXhib51oT8Rvlsi6cuLKCFIIdgBXBivC1ww9wy23zXNp6n0QPoT1G7dAhTM3HbkMpCmMhGli8riY7N/zDvzS7lQd7K/2PgzjFpRQhb0CvIQzrMKxDFlqKuqUIRnaS+QqrQItFtCUcCnma8dVb9Pz3Hh/Z9qcWzqv39FYyHcYZDqUIRc2S1BR5bTTkIoAyMhSuYF2LVmCt4GiIlMGImf/Jj/zOZ2603917ZaXsNuIcRYGi9KCKIKkJZQCFD8aByht5lzGaoJ51Fn/amP/CK/PE0X7sNNXKoBdgEEoRSg9MYMlcReVDX4ZsD7YYv6HbWfzlrfP/0U5+bWFzSffqc1lCnO/46EpBZAj3aC5v+st2/1bnyZemOvy/4p94BjsVGJyURAAAAABJRU5ErkJggg=="
        },
  
        others: {
            enable: false,
            name: "",
            path: "",
            image: ""
        },
  
        all: {
            enable: true,
            name: "所有浏览器",
            image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACjElEQVQ4T21TXUgUURT+zswuZZruTBRRFJHOvgRR0EMRCQkVQWUEai9WD+LWjtpDQfVQLRQYPUSFd0xSCMJ+pCIMC1+rh+itzMC964MIRRYzu2WitjsnZqZ1t637cOGce8937ved7xJKli5SawA0MfE+AJvAnAXoPYhfECsPbLNmsriEFgIxVaFR5i6AegIK+eBCo7cx4yII0uGqZpgrpr1ccPGmXKSF+C2BNpa+iMGvnCmjDgnKgpkiluxQiJrtLLajw5jzATQr2UOg1tJivyvQ7cSNePFZRCSPEWGbE4/GqFKkalTwGBGUUgAX6IWrXlZCuXL7uPGx+FyzkvdzrJwnTchOIpz9X/d8LsdoyJjGo3wcsVLtBD4NoJ90IYeZ2CZWvoD45D8aMEYc0yho0/NpiZadHgawFYRR0kXyiW1GDy3tGo+GFXfsj9qjv3LYqYa5VnHJdEyjLg+sCfmQyJ/KjD8FTcinjmkcRICcIaJQsXCRrmRtui36cgHAkhMErPVjxnefgm0ae7w4YqWOKuyeADANoueuqz5Ot62fKKali5Rnsn4CVAa/I3+ECt3Iq1zZO6mH5mY7mHABjHmALjlfqzuRIDcPpIvUdRDvYuAZRbrlZmJqdeI1XudgXZss0xfP+hyDl/IQcuo5p716pAAi+7KqciUwkkjeYsa9v7gKOUiE/fkCF6hPx41BL64ScrcKNNqm0RJYuYfDek7ehkJXFwwzwKr2LeVxbWLm144Z3RHoJA8Q8yknVLEXsVUzhU+T4JC2fPwMK+6PdHllH46s/KlbsgHAAAgJAG/gogUKPtjL5jvRuGHeH2Opccq6x1aXuephJncLQE1gZDzDABiaU8N3ZmLrPhfX/AYp2hIKQjp+9wAAAABJRU5ErkJggg=="
        }
    };
  
    if (window.OpenWithManager) {
        window.OpenWithManager.destroy();
        delete window.OpenWithManager;
    }
  
    function $(id) {
        return document.getElementById(id);
    }
  
    window.OpenWithManager = {
        useMenu: false,
        getTypeDesc: function (type) {
            switch (type) {
                case "page":
                    return "本页";
                case "link":
                    return "链接";
                //case "tab": return "标签";
                //case "bm": return "书签";
            }
            return "";
        },
        buildMenuName: function (label, type) {
            return "用 " + label + " 打开" + this.getTypeDesc(type);
        },
        attachNode: function (anchorNode, node) {
            if (this.useMenu) {
                anchorNode.appendChild(node);
            } else {
                anchorNode.parentNode.insertBefore(node, anchorNode);
            }
        },
        createMenuPopup: function (anchorNode, type) {
            let menu = document.createXULElement("menu");
            menu.setAttribute("label", MENU_NAME);
            menu.setAttribute("id", "openwith-menu-" + type);
            menu.setAttribute("class", "menu-iconic openwith-menu open-" + type);
            menu.setAttribute("image", browsers.all.image);
            anchorNode.parentNode.insertBefore(menu, anchorNode);
  
            let popup = document.createXULElement("menupopup");
            popup.id = "openwith-popup-" + type;
            menu.appendChild(popup);
            return popup;
        },
        createMenuItem: function (anchorNode, id, browser, type) {
            let menuitem = document.createXULElement("menuitem");
            menuitem.id = "openwith-m-" + type + "-" + id;
            menuitem.setAttribute("label", this.buildMenuName(browser.name, type));
            menuitem.setAttribute("oncommand", "OpenWithManager.openWithOtherBrowser(this,'" + id + "','" + type + "')");
            menuitem.setAttribute("class", "menuitem-iconic openwith-menuitem open-" + type);
            if (browser.image) {
                menuitem.setAttribute("image", browser.image);
            }
            this.attachNode(anchorNode, menuitem);
        },
        createBrowserMenu: function (anchorNode, type) {
            for (let key in browsers) {
                try {
                    if (browsers[key].enable) {
                        this.createMenuItem(anchorNode, key, browsers[key], type);
                    }
                } catch (e) {
                    alert(e.message);
                }
            }
        },
        //contentAreaContextMenu
        initContentAreaMenu: function () {
            var inspos = $("inspect-separator");
            let sep = document.createXULElement("menuseparator");
            sep.setAttribute("class", "openwith-menuitem");
            inspos.parentNode.insertBefore(sep, inspos);
            this.useMenu = USE_MENU_AREA;
  
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(inspos, "area");
            } else {
                anchorNode = inspos;
            }
            //链接部分
            this.createBrowserMenu(anchorNode, "link");
  
            let sepLink = document.createXULElement("menuseparator");
            sepLink.setAttribute("class", "open-link openwith-menuitem");
            this.attachNode(anchorNode, sepLink);
  
            //控制链接菜单的显示
            inspos.parentNode.addEventListener("popupshowing", this, false);
  
            //页面部分
            this.createBrowserMenu(anchorNode, "page");
        },
        //tabContextMenu
        initTabContextMenu: function () {
  
            var inspos = $("context_closeTabOptions") || $("context_closeTabOptions") 
            let sep = document.createXULElement("menuseparator");
            sep.setAttribute("class", "openwith-menuitem");
            inspos.parentNode.insertBefore(sep, inspos.nextSibling);
  
            this.useMenu = USE_MENU_TAB;
  
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(sep.nextSibling, "tab");
            } else {
                anchorNode = sep.nextSibling;
            }
            this.createBrowserMenu(anchorNode, "tab");
  
        },
        //placesContext
        initPlacesContextMenu: function () {
  
            var inspos = $("placesContext_openSeparator");
            //let sep = document.createXULElement("menuseparator");
            //inspos.parentNode.insertBefore(sep, inspos);
  
            this.useMenu = USE_MENU_PLACE;
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(inspos, "place");
            } else {
                anchorNode = inspos;
            }
            this.createBrowserMenu(anchorNode, "place");
  
            //文件夹显示
            inspos.parentNode.addEventListener("popupshowing",this, false);
        },
        handleEvent: function (event) {
            if(event.target.id=="placesContext"){
                var isFloder = false;
                try {
                    let selectedNode = PlacesUIUtils.getViewForNode(event.target.ownerDocument.popupNode).selectedNode;
                    isFloder = !selectedNode || selectedNode.hasChildren;
                } catch (e) {
                }
                let menus = $("placesContext").querySelectorAll(".open-place");
                for (let menu of menus) {
                    if (isFloder) {
                        menu.hidden = true;
                    } else {
                        menu.hidden = false;
                        menu.disabled = false;
                    }
                }
            }
            if(event.target.id=="contentAreaContextMenu"){
                let menus = $("contentAreaContextMenu").querySelectorAll(".open-link");
                for (let menu of menus) {
                    if (gContextMenu.onLink) {
                        menu.hidden = false;
                    } else {
                        menu.hidden = true;
                    }
                }
            }
  
        },
        init: function () {
  
            //contentAreaContextMenu
            this.initContentAreaMenu();
  
            //tabContextMenu
            this.initTabContextMenu();
  
            //placesContext
            this.initPlacesContextMenu();
  
        },
        destroy:function () {
            $("contentAreaContextMenu").removeEventListener("popupshowing", this, false);
            $("placesContext_openSeparator").removeEventListener("popupshowing", this, false);
  
            let menus = document.querySelectorAll(".openwith-menu"),
                menuitems = document.querySelectorAll(".openwith-menuitem");
            for(let menuitem of menuitems){
                menuitem.parentNode.removeChild(menuitem);
            }
            for(let menu of menus){
                menu.parentNode.removeChild(menu);
            }
        },
        openWithBrowser: function (url, path) {
            if (!path) {
                alert("浏览器路径未设置 ");
                return;
            }
            if (path == "microsoft-edge") {
                //edge用url打开
                var cmdUrl = path + ":" + url;
                let win = window.openDialog(cmdUrl, "", "chrome");
                win.close();
                return;
            }
  
            let clientApp = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            clientApp.initWithPath(path);
            if (!clientApp.exists()) {
                alert("浏览器路径错误: " + path);
                return;
            }
            try {
                let ss = Cc["@mozilla.org/browser/shell-service;1"]
                    .getService(Ci.nsIShellService);
                ss.openApplicationWithURI(clientApp, url);
            } catch (e) {
                let p = Cc["@mozilla.org/process/util;1"]
                    .createInstance(Ci.nsIProcess);
                p.init(clientApp);
                p.run(false, [url], 1);
            }
        },
        openWithOtherBrowser : function (obj, id, type) {
            var url;
            switch (type) {
                case "page":
                    url = gBrowser.currentURI.spec;
                    break;
                case "link":
                    url = gContextMenu.linkURL;
                    break;
                case "tab": {
                    let tab = TabContextMenu.contextTab;
                    let bw = tab && tab.linkedBrowser;
                    url = bw && bw.currentURI.spec;
                }
                    break;
                case "place":
                    url = PlacesUIUtils.getViewForNode(PlacesUIUtils.lastContextMenuTriggerNode).selectedNode.uri;
                    break;
            }
            if (url) {
                if (id == "all") {
                    for (let key in browsers) {
                        let browser = browsers[key];
                        if (browser.enable && key != "all" && browser.path) {
                            this.openWithBrowser(url, browser.path);
                        }
                    }
                } else {
                    let browser = browsers[id];
                    this.openWithBrowser(url, browser.path);
                }
            }
        }
  
    };
    OpenWithManager.init();
})();
viewtheard
千年狐狸
千年狐狸
  • UID2383
  • 注册日期2005-01-20
  • 最后登录2025-03-15
  • 发帖数2042
  • 经验558枚
  • 威望1点
  • 贡献值428点
  • 好评度23点
  • 社区居民
  • 忠实会员
1楼#
发布于:2025-02-05 09:36


Mapping out compatibilityI thought through the compatibility issues with Firefox 136.0a1, noting that older XUL methods like "document.createXULElement" are deprecated. This script needs adapting or updating for the latest Firefox.
Updating XUL elementsI’m moving forward with replacing deprecated XUL methods with "document.createElementNS" for Firefox 136.0a1, ensuring tags like "menu", "menupopup", and "menuitem" align with the XUL namespace.
Addressing global objectsI'm considering updating gContextMenu references to "gBrowser.selectedBrowser" in the script. This adjustment is crucial to ensure compatibility with the latest Firefox updates.
Confirming compatibilityChecking that gContextMenu and gBrowser.currentURI.spec function as expected in Firefox 136.0a1. Also, I’m thinking about the existence and potential changes to "placesContext" and other element IDs.
Analyzing context menu changesOK, let me see. I’m gathering info on the availability of "contentAreaContextMenu" and "placesContext" in Firefox 136, considering updates to tab context menus like "context_closeTabOptions."
Tracking menu ID shiftsOK, let me see. If "context_closeTabOptions" is outdated in Firefox 136, updating the script to use "tabContextMenu" seems crucial for maintaining compatibility.
Tracking ID changesI'm looking into tab context menu IDs to ensure compatibility. In Firefox, element IDs like "context_closeTabOptions" are updated, so "tabContextMenu" might be the current identifier to use.
Transitioning to "tabContextMenu"OK, attaching the separator to "tabContextMenu" instead of "context_closeTabOptions" in Firefox 136. This aligns better with the recent ID changes.
Upgrading element creationI'm noting the switch to document.createElementNS for defining XUL elements. This change should streamline element creation throughout the codebase.
Maintaining contextI’m noting that "Cc" and "Ci" are likely legacy definitions from Components.classes and Components.interfaces. Their use in Chrome context scripts should remain stable, but we'll keep an eye on their status.
Advancing the scriptI’m wrapping up the script by defining createXULElement and updating all document.createXULElement calls to maintain XUL element creation. This introduces tabContextMenu updates.



下面给出一个修正后的脚本版本,主要修改内容是将所有对



document.createXULElement(...)
My Technical Blog: http://art-technical.blogspot.com/
viewtheard
千年狐狸
千年狐狸
  • UID2383
  • 注册日期2005-01-20
  • 最后登录2025-03-15
  • 发帖数2042
  • 经验558枚
  • 威望1点
  • 贡献值428点
  • 好评度23点
  • 社区居民
  • 忠实会员
2楼#
发布于:2025-02-05 09:36
的调用替换为使用 XUL 命名空间创建元素的方法,同时针对新版 Firefox(136+)的标签右键菜单做了适配(原来用 “context_closeTabOptions” 的做法可能已失效,现在改为直接在 “tabContextMenu” 内追加菜单项)。

请将下面代码保存为 OpenWith.uc.js 并在 Firefox 的 userChrome.js 配置中加载使用:
My Technical Blog: http://art-technical.blogspot.com/
viewtheard
千年狐狸
千年狐狸
  • UID2383
  • 注册日期2005-01-20
  • 最后登录2025-03-15
  • 发帖数2042
  • 经验558枚
  • 威望1点
  • 贡献值428点
  • 好评度23点
  • 社区居民
  • 忠实会员
3楼#
发布于:2025-02-05 09:37
// ==UserScript== 
// [url=home.php?mod=space&uid=467097]@Name[/url]           OpenWith.uc.js
// @description    用其他浏览器打开页面、链接、书签及标签
// [url=home.php?mod=space&uid=321866]@author[/url]         ding
// [url=home.php?mod=space&uid=713796]@include[/url]        main
// [url=home.php?mod=space&uid=570682]@version[/url]        2018.2.3.1 (修正新版Firefox)
// @homepageURL    https://bbs.kafan.cn/thread-2114879-1-1.html
// @startup        window.OpenWithManager.init();
// [url=home.php?mod=space&uid=748274]@Shutdown[/url]       window.OpenWithManager.destroy();
// [url=home.php?mod=space&uid=356229]@Note[/url]           适配Firefox57+及136+
   
location.href.startsWith('chrome://browser/content/browser.x') && (function () {
   
    const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    // 用于创建 XUL 元素
    function createXULElement(tag) {
        return document.createElementNS(XUL_NS, tag);
    }
   
    const MENU_NAME = "用其它浏览器打开";
   
    // 是否使用二级菜单
    const USE_MENU_AREA = true; // 页面
    const USE_MENU_TAB = false; // 标签(新版下直接追加到 tabContextMenu 中,建议关闭二级菜单)
    const USE_MENU_PLACE = false; // 书签
   
    function getFirefoxPath(){ // firefox.exe 所在路径
        return OS.Constants.Path.libDir;
    }
    function getRootPath() { // firefox 所在盘路径
        var path = getFirefoxPath();
        var index = path.indexOf(":");
        return path.substring(0,index+1);
    }
   
    // 修改内容后请将脚本改名来保证加载的是最新版本,或使用无缓存的 userChrome.js
    var browsers = {
        Edge: {
            enable: true,
            name: "Edge",
            path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
            image: "data:image/png;base64,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"
        },
        Chrome: {
            enable: true,
            name: "Chrome",
            path: "D:\\GoogleChromePortable64\\GoogleChromePortable.exe",
            image: "data:image/png;base64,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"
        },
        Slimjet: {
            enable: true,
            name: "Slimjet",
            path: "D:\\Slimjet\\slimjet.exe",
            image: "data:image/png;base64,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"
        },
        FireFox: {
            enable: true,
            name: "Firefox Nightly",
            path: "D:\\FirefoxNightly\\FirefoxPortable.exe",
            image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE5ElEQVRIx8WVW4hd5RXHf+vb93Oby5nO5FJlopKQ4qVSpQk+zB4otZVWBUHwTQRHEAVBCvWlM2OhUOhLoX2RFiuBgnlKKfUChTkVSm2tU1p0hIxOLibGZDKZOefsfc6+fd/Xh2OGBFuVltIFH+y1H9Zv/9f69n/BfxFPbP4s5n8Z7Y1nrZz8/mdC5IsUum/h+NIrb22CXx8dN2LPc725iwdW40A89roH5k/NLnQ+F3Dih0l87oyNn/pFcwkgOviDJe0GiwUehE3wGxA0IRpDPX8BO74GgCsh1dsPd77T2rv82/ua14Gca5O79z394o6XPfrlO47IpezwSpKXcTg5zYFvzOFMj5FeSsCLwA/hXo0VDTbCWAMz67Mfps3Z6tgLL/1bBc99833rReMM2y3SGThjr6BunuJ87xyrv34dwvFRi6ImzvMNdLQKVIC7W+P24q7lf9x559LVXF19+PPP83hfuY9a1MYJXUzg0JqZQQcOG385CaYCXYA1YAxyuYaUN4BtgA3BNMA0WHNPLz6zcTb+FGDjhLPoeBFGgfnkg7QDRkFwx1GmHvk2k/ffBjqHKsf8/jJ+MYtrG2BdsC5iQ7QOODG8sHgd4PXHirjqqxjACqAs1hn1zwiI69C8+UbGboygzKAYYN7uYlYHBMmteGYMMXVE1xA8zpbmegW9dXZfiB1VFT3K3QrGVcLmseOc+vErUA6gSKFIKY+to9/s0+reTrP6EqgmYiaQssb03z5Y2gU09tk5AEcsyoCqQGkwSYoZZBTv/Z3k3XXQ5ScKEij6UA3JX36L9GKdsL+fMN2DlC3EROy/YOa4On6bEysskgvKgKOFjdNrdMOStReOUwU+VNVIktGjQZcZKBerS6qts/QHB2nfNKDv9EkpuNy18S7Ac8yoHVpwCyiHORJETLRmGJ/ay/bFj/AVVGWOqYrRbRIHlANG4+oulR9gtyva/hjF2A7SHP1iLsDwvFp2sYu6snj5CDIdTaH9kCMPLrD+zgrbvSv4X5mlaIZcevOvpCfPQ6lRtiJqNrETMEhrtMmYSEL2RnD2KiCYMJTbispaggwmagGFdsgKRR4Kh77+LQZNGNagGxaE4zVOvfsrjAhSd5g8eJhhagGIcqFdKFJXlncVtI+WneJVtVhZIciFYAiTgUviWrYG2+TnN9F1h+2dM1z40xvkSUZDORhdMfnw/TQyD7VjQStqmeAoj3umTeeda63itbnBSpp78QCHPID+uJC0IGlZVtd+w+mTf0RZhwILIpjIZ+Kh79I6cheVGIrS4hQw0xcilXZeXhib51oT8Rvlsi6cuLKCFIIdgBXBivC1ww9wy23zXNp6n0QPoT1G7dAhTM3HbkMpCmMhGli8riY7N/zDvzS7lQd7K/2PgzjFpRQhb0CvIQzrMKxDFlqKuqUIRnaS+QqrQItFtCUcCnma8dVb9Pz3Hh/Z9qcWzqv39FYyHcYZDqUIRc2S1BR5bTTkIoAyMhSuYF2LVmCt4GiIlMGImf/Jj/zOZ2603917ZaXsNuIcRYGi9KCKIKkJZQCFD8aByht5lzGaoJ51Fn/amP/CK/PE0X7sNNXKoBdgEEoRSg9MYMlcReVDX4ZsD7YYv6HbWfzlrfP/0U5+bWFzSffqc1lCnO/46EpBZAj3aC5v+st2/1bnyZemOvy/4p94BjsVGJyURAAAAABJRU5ErkJggg=="
        },
        others: {
            enable: false,
            name: "",
            path: "",
            image: ""
        },
        all: {
            enable: true,
            name: "所有浏览器",
            image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACjElEQVQ4T21TXUgUURT+zswuZZruTBRRFJHOvgRR0EMRCQkVQWUEai9WD+LWjtpDQfVQLRQYPUSFd0xSCMJ+pCIMC1+rh+itzMC964MIRRYzu2WitjsnZqZ1t637cOGce8937ved7xJKli5SawA0MfE+AJvAnAXoPYhfECsPbLNmsriEFgIxVaFR5i6AegIK+eBCo7cx4yII0uGqZpgrpr1ccPGmXKSF+C2BNpa+iMGvnCmjDgnKgpkiluxQiJrtLLajw5jzATQr2UOg1tJivyvQ7cSNePFZRCSPEWGbE4/GqFKkalTwGBGUUgAX6IWrXlZCuXL7uPGx+FyzkvdzrJwnTchOIpz9X/d8LsdoyJjGo3wcsVLtBD4NoJ90IYeZ2CZWvoD45D8aMEYc0yho0/NpiZadHgawFYRR0kXyiW1GDy3tGo+GFXfsj9qjv3LYqYa5VnHJdEyjLg+sCfmQyJ/KjD8FTcinjmkcRICcIaJQsXCRrmRtui36cgHAkhMErPVjxnefgm0ae7w4YqWOKuyeADANoueuqz5Ot62fKKali5Rnsn4CVAa/I3+ECt3Iq1zZO6mH5mY7mHABjHmALjlfqzuRIDcPpIvUdRDvYuAZRbrlZmJqdeI1XudgXZss0xfP+hyDl/IQcuo5p716pAAi+7KqciUwkkjeYsa9v7gKOUiE/fkCF6hPx41BL64ScrcKNNqm0RJYuYfDek7ehkJXFwwzwKr2LeVxbWLm144Z3RHoJA8Q8yknVLEXsVUzhU+T4JC2fPwMK+6PdHllH46s/KlbsgHAAAgJAG/gogUKPtjL5jvRuGHeH2Opccq6x1aXuephJncLQE1gZDzDABiaU8N3ZmLrPhfX/AYp2hIKQjp+9wAAAABJRU5ErkJggg=="
        }
    };
   
    // 如果已存在旧的实例,则先清理
    if (window.OpenWithManager) {
        window.OpenWithManager.destroy();
        delete window.OpenWithManager;
    }
   
    function $(id) {
        return document.getElementById(id);
    }
   
    window.OpenWithManager = {
        useMenu: false,
        getTypeDesc: function (type) {
            switch (type) {
                case "page":
                    return "本页";
                case "link":
                    return "链接";
                // case "tab": return "标签";
                // case "bm": return "书签";
            }
            return "";
        },
        buildMenuName: function (label, type) {
            return "用 " + label + " 打开" + this.getTypeDesc(type);
        },
        attachNode: function (anchorNode, node) {
            if (this.useMenu) {
                anchorNode.appendChild(node);
            } else {
                anchorNode.parentNode.insertBefore(node, anchorNode);
            }
        },
        createMenuPopup: function (anchorNode, type) {
            let menu = createXULElement("menu");
            menu.setAttribute("label", MENU_NAME);
            menu.setAttribute("id", "openwith-menu-" + type);
            menu.setAttribute("class", "menu-iconic openwith-menu open-" + type);
            menu.setAttribute("image", browsers.all.image);
            anchorNode.parentNode.insertBefore(menu, anchorNode);
   
            let popup = createXULElement("menupopup");
            popup.id = "openwith-popup-" + type;
            menu.appendChild(popup);
            return popup;
        },
        createMenuItem: function (anchorNode, id, browser, type) {
            let menuitem = createXULElement("menuitem");
            menuitem.id = "openwith-m-" + type + "-" + id;
            menuitem.setAttribute("label", this.buildMenuName(browser.name, type));
            menuitem.setAttribute("oncommand", "OpenWithManager.openWithOtherBrowser(this, '" + id + "', '" + type + "')");
            menuitem.setAttribute("class", "menuitem-iconic openwith-menuitem open-" + type);
            if (browser.image) {
                menuitem.setAttribute("image", browser.image);
            }
            this.attachNode(anchorNode, menuitem);
        },
        createBrowserMenu: function (anchorNode, type) {
            for (let key in browsers) {
                try {
                    if (browsers[key].enable) {
                        this.createMenuItem(anchorNode, key, browsers[key], type);
                    }
                } catch (e) {
                    alert(e.message);
                }
            }
        },
        // contentAreaContextMenu(页面右键菜单)
        initContentAreaMenu: function () {
            var inspos = $("inspect-separator");
            let sep = createXULElement("menuseparator");
            sep.setAttribute("class", "openwith-menuitem");
            inspos.parentNode.insertBefore(sep, inspos);
            this.useMenu = USE_MENU_AREA;
   
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(inspos, "area");
            } else {
                anchorNode = inspos;
            }
            // 添加“链接”相关菜单项
            this.createBrowserMenu(anchorNode, "link");
   
            let sepLink = createXULElement("menuseparator");
            sepLink.setAttribute("class", "open-link openwith-menuitem");
            this.attachNode(anchorNode, sepLink);
   
            // 根据当前右键环境控制链接菜单显示
            inspos.parentNode.addEventListener("popupshowing", this, false);
   
            // 添加“本页”菜单项
            this.createBrowserMenu(anchorNode, "page");
        },
        // tabContextMenu(标签右键菜单)
        initTabContextMenu: function () {
            // 在新版 Firefox 下,标签右键菜单的 id 为 "tabContextMenu"
            var tabContext = $("tabContextMenu");
            if (!tabContext) {
                return;
            }
            let sep = createXULElement("menuseparator");
            sep.setAttribute("class", "openwith-menuitem");
            // 直接追加到菜单末尾
            tabContext.appendChild(sep);
   
            this.useMenu = USE_MENU_TAB;
   
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(sep, "tab");
            } else {
                anchorNode = sep;
            }
            this.createBrowserMenu(anchorNode, "tab");
        },
        // placesContext(书签/历史右键菜单)
        initPlacesContextMenu: function () {
            var inspos = $("placesContext_openSeparator");
            if (!inspos) {
                return;
            }
            this.useMenu = USE_MENU_PLACE;
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(inspos, "place");
            } else {
                anchorNode = inspos;
            }
            this.createBrowserMenu(anchorNode, "place");
   
            // 针对文件夹项控制显示
            inspos.parentNode.addEventListener("popupshowing", this, false);
        },
        handleEvent: function (event) {
            if (event.target.id == "placesContext") {
                var isFolder = false;
                try {
                    let selectedNode = PlacesUIUtils.getViewForNode(event.target.ownerDocument.popupNode).selectedNode;
                    isFolder = !selectedNode || selectedNode.hasChildren;
                } catch (e) { }
                let menus = $("placesContext").querySelectorAll(".open-place");
                for (let menu of menus) {
                    menu.hidden = isFolder;
                    if (!isFolder) {
                        menu.disabled = false;
                    }
                }
            }
            if (event.target.id == "contentAreaContextMenu") {
                let menus = $("contentAreaContextMenu").querySelectorAll(".open-link");
                for (let menu of menus) {
                    menu.hidden = !gContextMenu.onLink;
                }
            }
        },
        init: function () {
            // 初始化页面右键菜单
            this.initContentAreaMenu();
            // 初始化标签右键菜单
            this.initTabContextMenu();
            // 初始化书签/历史右键菜单
            this.initPlacesContextMenu();
        },
        destroy: function () {
            $("contentAreaContextMenu").removeEventListener("popupshowing", this, false);
            let placesSep = $("placesContext_openSeparator");
            if (placesSep)
                placesSep.removeEventListener("popupshowing", this, false);
   
            let menus = document.querySelectorAll(".openwith-menu"),
                menuitems = document.querySelectorAll(".openwith-menuitem");
            for (let menuitem of menuitems) {
                if (menuitem.parentNode)
                    menuitem.parentNode.removeChild(menuitem);
            }
            for (let menu of menus) {
                if (menu.parentNode)
                    menu.parentNode.removeChild(menu);
            }
        },
        openWithBrowser: function (url, path) {
            if (!path) {
                alert("浏览器路径未设置");
                return;
            }
            if (path == "microsoft-edge") {
                // Edge 使用 URL 打开
                var cmdUrl = path + ":" + url;
                let win = window.openDialog(cmdUrl, "", "chrome");
                win.close();
                return;
            }
   
            let clientApp = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            clientApp.initWithPath(path);
            if (!clientApp.exists()) {
                alert("浏览器路径错误: " + path);
                return;
            }
            try {
                let ss = Cc["@mozilla.org/browser/shell-service;1"]
                    .getService(Ci.nsIShellService);
                ss.openApplicationWithURI(clientApp, url);
            } catch (e) {
                let p = Cc["@mozilla.org/process/util;1"]
                    .createInstance(Ci.nsIProcess);
                p.init(clientApp);
                p.run(false, [url], 1);
            }
        },
        openWithOtherBrowser: function (obj, id, type) {
            var url;
            switch (type) {
                case "page":
                    url = gBrowser.currentURI.spec;
                    break;
                case "link":
                    url = gContextMenu.linkURL;
                    break;
                case "tab": {
                    let tab = TabContextMenu.contextTab;
                    let bw = tab && tab.linkedBrowser;
                    url = bw && bw.currentURI.spec;
                }
                    break;
                case "place":
                    url = PlacesUIUtils.getViewForNode(PlacesUIUtils.lastContextMenuTriggerNode).selectedNode.uri;
                    break;
            }
            if (url) {
                if (id == "all") {
                    for (let key in browsers) {
                        let browser = browsers[key];
                        if (browser.enable && key != "all" && browser.path) {
                            this.openWithBrowser(url, browser.path);
                        }
                    }
                } else {
                    let browser = browsers[id];
                    this.openWithBrowser(url, browser.path);
                }
            }
        }
   
    };
    OpenWithManager.init();
})();
My Technical Blog: http://art-technical.blogspot.com/
viewtheard
千年狐狸
千年狐狸
  • UID2383
  • 注册日期2005-01-20
  • 最后登录2025-03-15
  • 发帖数2042
  • 经验558枚
  • 威望1点
  • 贡献值428点
  • 好评度23点
  • 社区居民
  • 忠实会员
4楼#
发布于:2025-02-05 09:41
说明
XUL 元素创建
为了适应 Firefox 136 及以后的版本,原脚本中直接调用 document.createXULElement 的方式已不可用,故增加了辅助函数 createXULElement(tag),该函数通过命名空间 http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul 创建 XUL 元素。

标签右键菜单适配
原脚本中查找 “context_closeTabOptions” 已不适用,新版本中标签右键菜单的容器 id 为 tabContextMenu,故在 initTabContextMenu() 中做了相应调整(你也可以根据需要调整是否使用二级菜单)。

其他部分
其他部分大体保持不变,仅做了少量兼容性处理。若仍有部分失效,请检查当前 Firefox UI 结构是否有进一步调整,可通过“检查元素”工具确认对应 id 和结构。

保存并重启 Firefox 后,即可在页面、链接、标签及书签右键菜单中看到“用其它浏览器打开”的相关菜单项。
My Technical Blog: http://art-technical.blogspot.com/
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2025-03-19
  • 发帖数124
  • 经验141枚
  • 威望0点
  • 贡献值148点
  • 好评度4点
  • 社区居民
  • 忠实会员
5楼#
发布于:2025-02-05 12:06
已修复,可以正常使用
// ==UserScript==
// @name           OpenWith.uc.js
// @description    用其他浏览器打开页面、链接、书签及标签
// @author         ding
// @include        main
// @version        2018.2.3.1
// @homepageURL    https://bbs.kafan.cn/thread-2114879-1-1.html
// @startup        window.OpenWithManager.init();
// @shutdown       window.OpenWithManager.destroy();
// @note           适配Firefox57+
// ==/UserScript==
location.href.startsWith('chrome://browser/content/browser.x') && (function () {
  
    const MENU_NAME = "用其它浏览器打开";
  
    //是否使用二级菜单
    const USE_MENU_AREA = true; //页面
    const USE_MENU_TAB = false; //标签
    const USE_MENU_PLACE = false; //书签
  
    function getFirefoxPath(){//firefox.exe所在路径
        return OS.Constants.Path.libDir;
    }
    function getRootPath() {//firefox所在盘路径
        var path = getFirefoxPath();
        var index = path.indexOf(":");
        return path.substring(0,index+1);
    }
    //修改内容后请将脚本改名来保证加载的是最新,或使用无缓存的userChrome.js
    var browsers = {
         
        Edge: {
            enable: true,
            name: "Edge",
            path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
            image: "data:image/png;base64,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"
        },
        Chrome: {
            enable: true,
            name: "Chrome",
            path: "D:\\GoogleChromePortable64\\GoogleChromePortable.exe",
            image: "data:image/png;base64,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"
        },
          
        Slimjet: {
            enable: true,
            name: "Slimjet",
            path: "D:\\Slimjet\\slimjet.exe",
            image: "data:image/png;base64,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"
        },
        FireFox: {
            enable: true,
            name: "Firefox Nightly",
            path: "D:\\FirefoxNightly\\FirefoxPortable.exe",
            image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE5ElEQVRIx8WVW4hd5RXHf+vb93Oby5nO5FJlopKQ4qVSpQk+zB4otZVWBUHwTQRHEAVBCvWlM2OhUOhLoX2RFiuBgnlKKfUChTkVSm2tU1p0hIxOLibGZDKZOefsfc6+fd/Xh2OGBFuVltIFH+y1H9Zv/9f69n/BfxFPbP4s5n8Z7Y1nrZz8/mdC5IsUum/h+NIrb22CXx8dN2LPc725iwdW40A89roH5k/NLnQ+F3Dih0l87oyNn/pFcwkgOviDJe0GiwUehE3wGxA0IRpDPX8BO74GgCsh1dsPd77T2rv82/ua14Gca5O79z394o6XPfrlO47IpezwSpKXcTg5zYFvzOFMj5FeSsCLwA/hXo0VDTbCWAMz67Mfps3Z6tgLL/1bBc99833rReMM2y3SGThjr6BunuJ87xyrv34dwvFRi6ImzvMNdLQKVIC7W+P24q7lf9x559LVXF19+PPP83hfuY9a1MYJXUzg0JqZQQcOG385CaYCXYA1YAxyuYaUN4BtgA3BNMA0WHNPLz6zcTb+FGDjhLPoeBFGgfnkg7QDRkFwx1GmHvk2k/ffBjqHKsf8/jJ+MYtrG2BdsC5iQ7QOODG8sHgd4PXHirjqqxjACqAs1hn1zwiI69C8+UbGboygzKAYYN7uYlYHBMmteGYMMXVE1xA8zpbmegW9dXZfiB1VFT3K3QrGVcLmseOc+vErUA6gSKFIKY+to9/s0+reTrP6EqgmYiaQssb03z5Y2gU09tk5AEcsyoCqQGkwSYoZZBTv/Z3k3XXQ5ScKEij6UA3JX36L9GKdsL+fMN2DlC3EROy/YOa4On6bEysskgvKgKOFjdNrdMOStReOUwU+VNVIktGjQZcZKBerS6qts/QHB2nfNKDv9EkpuNy18S7Ac8yoHVpwCyiHORJETLRmGJ/ay/bFj/AVVGWOqYrRbRIHlANG4+oulR9gtyva/hjF2A7SHP1iLsDwvFp2sYu6snj5CDIdTaH9kCMPLrD+zgrbvSv4X5mlaIZcevOvpCfPQ6lRtiJqNrETMEhrtMmYSEL2RnD2KiCYMJTbispaggwmagGFdsgKRR4Kh77+LQZNGNagGxaE4zVOvfsrjAhSd5g8eJhhagGIcqFdKFJXlncVtI+WneJVtVhZIciFYAiTgUviWrYG2+TnN9F1h+2dM1z40xvkSUZDORhdMfnw/TQyD7VjQStqmeAoj3umTeeda63itbnBSpp78QCHPID+uJC0IGlZVtd+w+mTf0RZhwILIpjIZ+Kh79I6cheVGIrS4hQw0xcilXZeXhib51oT8Rvlsi6cuLKCFIIdgBXBivC1ww9wy23zXNp6n0QPoT1G7dAhTM3HbkMpCmMhGli8riY7N/zDvzS7lQd7K/2PgzjFpRQhb0CvIQzrMKxDFlqKuqUIRnaS+QqrQItFtCUcCnma8dVb9Pz3Hh/Z9qcWzqv39FYyHcYZDqUIRc2S1BR5bTTkIoAyMhSuYF2LVmCt4GiIlMGImf/Jj/zOZ2603917ZaXsNuIcRYGi9KCKIKkJZQCFD8aByht5lzGaoJ51Fn/amP/CK/PE0X7sNNXKoBdgEEoRSg9MYMlcReVDX4ZsD7YYv6HbWfzlrfP/0U5+bWFzSffqc1lCnO/46EpBZAj3aC5v+st2/1bnyZemOvy/4p94BjsVGJyURAAAAABJRU5ErkJggg=="
        },
  
        others: {
            enable: false,
            name: "",
            path: "",
            image: ""
        },
  
        all: {
            enable: true,
            name: "所有浏览器",
            image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACjElEQVQ4T21TXUgUURT+zswuZZruTBRRFJHOvgRR0EMRCQkVQWUEai9WD+LWjtpDQfVQLRQYPUSFd0xSCMJ+pCIMC1+rh+itzMC964MIRRYzu2WitjsnZqZ1t637cOGce8937ved7xJKli5SawA0MfE+AJvAnAXoPYhfECsPbLNmsriEFgIxVaFR5i6AegIK+eBCo7cx4yII0uGqZpgrpr1ccPGmXKSF+C2BNpa+iMGvnCmjDgnKgpkiluxQiJrtLLajw5jzATQr2UOg1tJivyvQ7cSNePFZRCSPEWGbE4/GqFKkalTwGBGUUgAX6IWrXlZCuXL7uPGx+FyzkvdzrJwnTchOIpz9X/d8LsdoyJjGo3wcsVLtBD4NoJ90IYeZ2CZWvoD45D8aMEYc0yho0/NpiZadHgawFYRR0kXyiW1GDy3tGo+GFXfsj9qjv3LYqYa5VnHJdEyjLg+sCfmQyJ/KjD8FTcinjmkcRICcIaJQsXCRrmRtui36cgHAkhMErPVjxnefgm0ae7w4YqWOKuyeADANoueuqz5Ot62fKKali5Rnsn4CVAa/I3+ECt3Iq1zZO6mH5mY7mHABjHmALjlfqzuRIDcPpIvUdRDvYuAZRbrlZmJqdeI1XudgXZss0xfP+hyDl/IQcuo5p716pAAi+7KqciUwkkjeYsa9v7gKOUiE/fkCF6hPx41BL64ScrcKNNqm0RJYuYfDek7ehkJXFwwzwKr2LeVxbWLm144Z3RHoJA8Q8yknVLEXsVUzhU+T4JC2fPwMK+6PdHllH46s/KlbsgHAAAgJAG/gogUKPtjL5jvRuGHeH2Opccq6x1aXuephJncLQE1gZDzDABiaU8N3ZmLrPhfX/AYp2hIKQjp+9wAAAABJRU5ErkJggg=="
        }
    };
  
    if (window.OpenWithManager) {
        window.OpenWithManager.destroy();
        delete window.OpenWithManager;
    }
  
    function $(id) {
        return document.getElementById(id);
    }
  
    window.OpenWithManager = {
        useMenu: false,
        getTypeDesc: function (type) {
            switch (type) {
                case "page":
                    return "本页";
                case "link":
                    return "链接";
                //case "tab": return "标签";
                //case "bm": return "书签";
            }
            return "";
        },
        buildMenuName: function (label, type) {
            return "用 " + label + " 打开" + this.getTypeDesc(type);
        },
        attachNode: function (anchorNode, node) {
            if (this.useMenu) {
                anchorNode.appendChild(node);
            } else {
                anchorNode.parentNode.insertBefore(node, anchorNode);
            }
        },
        createMenuPopup: function (anchorNode, type) {
            let menu = document.createXULElement("menu");
            menu.setAttribute("label", MENU_NAME);
            menu.setAttribute("id", "openwith-menu-" + type);
            menu.setAttribute("class", "menu-iconic openwith-menu open-" + type);
            menu.setAttribute("image", browsers.all.image);
            anchorNode.parentNode.insertBefore(menu, anchorNode);
  
            let popup = document.createXULElement("menupopup");
            popup.id = "openwith-popup-" + type;
            menu.appendChild(popup);
            return popup;
        },
        createMenuItem: function (anchorNode, id, browser, type) {
            let menuitem = document.createXULElement("menuitem");
            menuitem.id = "openwith-m-" + type + "-" + id;
            menuitem.setAttribute("label", this.buildMenuName(browser.name, type));
              menuitem.addEventListener("command", function() {
              OpenWithManager.openWithOtherBrowser(this, id, type);
          });
            menuitem.setAttribute("class", "menuitem-iconic openwith-menuitem open-" + type);
            if (browser.image) {
                menuitem.setAttribute("image", browser.image);
            }
            this.attachNode(anchorNode, menuitem);
        },
        createBrowserMenu: function (anchorNode, type) {
            for (let key in browsers) {
                try {
                    if (browsers[key].enable) {
                        this.createMenuItem(anchorNode, key, browsers[key], type);
                    }
                } catch (e) {
                    alert(e.message);
                }
            }
        },
        //contentAreaContextMenu
        initContentAreaMenu: function () {
            var inspos = $("inspect-separator");
            let sep = document.createXULElement("menuseparator");
            sep.setAttribute("class", "openwith-menuitem");
            inspos.parentNode.insertBefore(sep, inspos);
            this.useMenu = USE_MENU_AREA;
  
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(inspos, "area");
            } else {
                anchorNode = inspos;
            }
            //链接部分
            this.createBrowserMenu(anchorNode, "link");
  
            let sepLink = document.createXULElement("menuseparator");
            sepLink.setAttribute("class", "open-link openwith-menuitem");
            this.attachNode(anchorNode, sepLink);
  
            //控制链接菜单的显示
            inspos.parentNode.addEventListener("popupshowing", this, false);
  
            //页面部分
            this.createBrowserMenu(anchorNode, "page");
        },
        //tabContextMenu
        initTabContextMenu: function () {
  
            var inspos = $("context_closeTabOptions") || $("context_closeTabOptions") 
            let sep = document.createXULElement("menuseparator");
            sep.setAttribute("class", "openwith-menuitem");
            inspos.parentNode.insertBefore(sep, inspos.nextSibling);
  
            this.useMenu = USE_MENU_TAB;
  
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(sep.nextSibling, "tab");
            } else {
                anchorNode = sep.nextSibling;
            }
            this.createBrowserMenu(anchorNode, "tab");
  
        },
        //placesContext
        initPlacesContextMenu: function () {
  
            var inspos = $("placesContext_openSeparator");
            //let sep = document.createXULElement("menuseparator");
            //inspos.parentNode.insertBefore(sep, inspos);
  
            this.useMenu = USE_MENU_PLACE;
            var anchorNode;
            if (this.useMenu) {
                anchorNode = this.createMenuPopup(inspos, "place");
            } else {
                anchorNode = inspos;
            }
            this.createBrowserMenu(anchorNode, "place");
  
            //文件夹显示
            inspos.parentNode.addEventListener("popupshowing",this, false);
        },
        handleEvent: function (event) {
            if(event.target.id=="placesContext"){
                var isFloder = false;
                try {
                    let selectedNode = PlacesUIUtils.getViewForNode(event.target.ownerDocument.popupNode).selectedNode;
                    isFloder = !selectedNode || selectedNode.hasChildren;
                } catch (e) {
                }
                let menus = $("placesContext").querySelectorAll(".open-place");
                for (let menu of menus) {
                    if (isFloder) {
                        menu.hidden = true;
                    } else {
                        menu.hidden = false;
                        menu.disabled = false;
                    }
                }
            }
            if(event.target.id=="contentAreaContextMenu"){
                let menus = $("contentAreaContextMenu").querySelectorAll(".open-link");
                for (let menu of menus) {
                    if (gContextMenu.onLink) {
                        menu.hidden = false;
                    } else {
                        menu.hidden = true;
                    }
                }
            }
  
        },
        init: function () {
  
            //contentAreaContextMenu
            this.initContentAreaMenu();
  
            //tabContextMenu
            this.initTabContextMenu();
  
            //placesContext
            this.initPlacesContextMenu();
  
        },
        destroy:function () {
            $("contentAreaContextMenu").removeEventListener("popupshowing", this, false);
            $("placesContext_openSeparator").removeEventListener("popupshowing", this, false);
  
            let menus = document.querySelectorAll(".openwith-menu"),
                menuitems = document.querySelectorAll(".openwith-menuitem");
            for(let menuitem of menuitems){
                menuitem.parentNode.removeChild(menuitem);
            }
            for(let menu of menus){
                menu.parentNode.removeChild(menu);
            }
        },
        openWithBrowser: function (url, path) {
            if (!path) {
                alert("浏览器路径未设置 ");
                return;
            }
            if (path == "microsoft-edge") {
                //edge用url打开
                var cmdUrl = path + ":" + url;
                let win = window.openDialog(cmdUrl, "", "chrome");
                win.close();
                return;
            }
  
            let clientApp = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
            clientApp.initWithPath(path);
            if (!clientApp.exists()) {
                alert("浏览器路径错误: " + path);
                return;
            }
            try {
                let ss = Cc["@mozilla.org/browser/shell-service;1"]
                    .getService(Ci.nsIShellService);
                ss.openApplicationWithURI(clientApp, url);
            } catch (e) {
                let p = Cc["@mozilla.org/process/util;1"]
                    .createInstance(Ci.nsIProcess);
                p.init(clientApp);
                p.run(false, [url], 1);
            }
        },
        openWithOtherBrowser : function (obj, id, type) {
            var url;
            switch (type) {
                case "page":
                    url = gBrowser.currentURI.spec;
                    break;
                case "link":
                    url = gContextMenu.linkURL;
                    break;
                case "tab": {
                    let tab = TabContextMenu.contextTab;
                    let bw = tab && tab.linkedBrowser;
                    url = bw && bw.currentURI.spec;
                }
                    break;
                case "place":
                    url = PlacesUIUtils.getViewForNode(PlacesUIUtils.lastContextMenuTriggerNode).selectedNode.uri;
                    break;
            }
            if (url) {
                if (id == "all") {
                    for (let key in browsers) {
                        let browser = browsers[key];
                        if (browser.enable && key != "all" && browser.path) {
                            this.openWithBrowser(url, browser.path);
                        }
                    }
                } else {
                    let browser = browsers[id];
                    this.openWithBrowser(url, browser.path);
                }
            }
        }
  
    };
    OpenWithManager.init();
})();
游客

返回顶部