lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
阅读:37627回复:98

[Nightly] Nightly 69.0a1(2019-05-21) 将主界面由 xul 改为 xhtml

楼主#
更多 发布于:2019-05-22 00:29
如题。由原来的
chrome://browser/content/browser.xul 改为 chrome://browser/content/browser.xhtml
相关bug Bug 1534407 - Enable browser.xhtml by default

预计一大波 uc 脚本将要失效。


以下提供一些针对本次更新的导致脚本失效的修改参考。
首先如果使用了alice 的引导脚本(userChrome.js)的话,
大部分针对主界面的脚本将会失效。需要暂时如下修改或者等作者更新(作者已更新。版本 v3.0.58mod,同样不向下兼容)
注意本修改不作向下兼容。
var BROWSERCHROME = "chrome://browser/content/browser.xul"; //Firfox
//改为
   var BROWSERCHROME = "chrome://browser/content/browser.xhtml"; //Firfox
if(/.html?$/i.test(location.href)) return;
//改为
   if(/\.html?$/i.test(location.href)) return;
//两处地方的
        if (!(doc instanceof XULDocument))
          return 0;
//改为
        //if (!(doc instanceof XULDocument))
        //  return 0;
注意更新或修改 userchrome.js 引导文件后,
需要退出 FF 并删除配置目录下的 startupCache 文件夹才能生效。


uc 脚本部分
1、
//如果脚本中有(无论单双引号)
location.href == 'chrome://browser/content/browser.xul' /*或*/ location == 'chrome://browser/content/browser.xul'
//替换为
location.href.startsWith('chrome://browser/content/browser.x')
//如果是
location.href != 'chrome://browser/content/browser.xul' /*或*/ location != 'chrome://browser/content/browser.xul'
//则替换为
!location.href.startsWith('chrome://browser/content/browser.x')
// 脚本文件头如果存在下面一行
// @include      chrome://browser/content/browser.xul
//则改为
// @include      chrome://browser/content/browser.xhtml
//或者
// @include      main


2、
由于 Firefox 的主文档由 browser.xul 变为 browser.xhtml
所以通过 document.createElement 方法创建的元素的命名空间
http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
自动变为 http://www.w3.org/1999/xhtml默认创建为 html 命名空间的元素

因为目前大部分控件如:菜单、按钮还是由 xul 元素实现的
所以如果 uc 脚本中使用了该方法创建 xul 元素(注意区分 xul 元素和 html 元素)可能会导致一些异常。




要用 document.createXULElement 或者 document.createElementNS 方法创建 xul 元素,
例如创建的菜单元素:
//由原来的
document.createElement('menu') 
//改为
document.createXULElement('menu') 
//或者 
document.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul','menu')


其它的一些 xul 元素通常为 menu、menuitem、menupopup、toolbarbutton、box、textbox、hbox、vbox、label ......
参考XUL Reference - Mozilla | MDN

3、
一些针对主界面的 css 样式代码失效,可能限定了针对 browser.xul 文档路径。
@-moz-document url("chrome://browser/content/browser.xul")
/*上一行无论单引号或者双引号,或者没有引号,都可以改为*/
@-moz-document url("chrome://browser/content/browser.xul"), url("chrome://browser/content/browser.xhtml")




另外版本 70.0a1(2019-07-19) 某些脚本可能导致 FF 崩溃。
这是由于Bug 1560915 - Hardcode minimal eval()-whitelist for test files into eval()-assertion
禁止了 eval/new Funtion 等计算字符串函数,使用这些需要计算函数脚本就会导致崩溃。
可以通过设置 about:config 中的 security.allow_eval_with_system_principal 的值为 true 来跳过。
等 Moz 解决了这些 bug(Bug 1473549 - [meta] Assert we do not use eval() when executing with SystemPrincipal) 也不清楚会不会移除这个 flag。



版本 70.0a1(2019-08-10) uc 引导脚本可能失效。
如果使用了alice 的引导脚本(userChrome.js 版本 v3.0.58mod)的话。
将 doc instanceof XULDocument 改为 doc.constructor.name === 'XULDocument'
或等待原作者更新。(已更新 https://github.com/alice0775/userChrome.js/blob/master/70/userChrome.js)
liuxb
非常火狐
非常火狐
  • UID26160
  • 注册日期2008-09-05
  • 最后登录2021-12-02
  • 发帖数659
  • 经验324枚
  • 威望0点
  • 贡献值184点
  • 好评度16点
1楼#
发布于:2020-05-27 16:03
lonely_8:showImageInit = function(){
    mItem = document.createXULElement("menuitem");
    mItem.setAttribute("label", "Reload...
回到原帖
修好了, 多谢!
我的...
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
2楼#
发布于:2020-05-27 13:36
liuxb:求楼主出手帮忙,谢谢!
下面脚本作用是在没有加载完成的图片占位符红叉上增加一个菜单项,点击后会重新加载所有未加载的图片。
现在功能失效了,在正常图片上右键菜单中也显示,而且即使在红叉图片上点击,也完全不起作用。1showImageIni...
回到原帖
showImageInit = function(){
    mItem = document.createXULElement("menuitem");
    mItem.setAttribute("label", "Reload Missing Images");
    //mItem.setAttribute("accesskey", "C");
        
    document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function(){
        onPopupShowing(this);
    }, false);
}
     
     
onPopupShowing = function(aPopup){
    aPopup.insertBefore(mItem, document.getElementById("context-copyimage"));
    mItem.setAttribute("oncommand", "BrowserReloadWithFlags(Ci.nsIWebNavigation.LOAD_FLAGS_CHARSET_CHANGE);");
    mItem.hidden = !(gContextMenu.onImage && !gContextMenu.onCompletedImage);
    mItem.setAttribute("disabled", mItem.hidden);
}
     
     
showImageInit();
我也不知道有没有修复。
liuxb
非常火狐
非常火狐
  • UID26160
  • 注册日期2008-09-05
  • 最后登录2021-12-02
  • 发帖数659
  • 经验324枚
  • 威望0点
  • 贡献值184点
  • 好评度16点
3楼#
发布于:2020-05-27 06:53
求楼主出手帮忙,谢谢!
下面脚本作用是在没有加载完成的图片占位符红叉上增加一个菜单项,点击后会重新加载所有未加载的图片。
现在功能失效了,在正常图片上右键菜单中也显示,而且即使在红叉图片上点击,也完全不起作用。1
showImageInit = function(){
    mItem = document.createXULElement("menuitem");
    mItem.setAttribute("label", "Reload Missing Images");
    //mItem.setAttribute("accesskey", "C");
      
    document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function(){
        onPopupShowing(this);
    }, false);
}
   
   
onPopupShowing = function(aPopup){
    aPopup.insertBefore(mItem, document.getElementById("context-copyimage"));
    mItem.setAttribute("oncommand", "gBrowser.selectedTab.reloadWithFlags(nsIWebNavigation.LOAD_FLAGS_CHARSET_CHANGE);");
    mItem.hidden = !(gContextMenu.onImage && (!gContextMenu.target.naturalWidth || !gContextMenu.target.complete));
    mItem.setAttribute("disabled", mItem.hidden);
}
   
   
showImageInit();
我的...
shinco20
小狐狸
小狐狸
  • UID16208
  • 注册日期2006-12-13
  • 最后登录2024-05-20
  • 发帖数19
  • 经验28枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
  • 忠实会员
4楼#
发布于:2019-10-16 15:57
编辑掉
找到解决方法了
Tianwenw
小狐狸
小狐狸
  • UID56833
  • 注册日期2019-01-16
  • 最后登录2019-11-11
  • 发帖数3
  • 经验3枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
5楼#
发布于:2019-09-12 09:29
@333ywb  你好,我也有你的那几个脚本,能把你改好的脚本共享下么?谢谢
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
6楼#
发布于:2019-09-10 11:59
zhouhuajdsh:请问下

location == 'chrome://browser/content/browser.xul'是不是只能替换成

location.href.startsWith('chrome://browser/content/...
回到原帖
都可以,只是前者这么做是为了向下兼容。
zhouhuajdsh
小狐狸
小狐狸
  • UID49842
  • 注册日期2015-04-27
  • 最后登录2020-12-25
  • 发帖数19
  • 经验18枚
  • 威望0点
  • 贡献值4点
  • 好评度0点
  • 社区居民
  • 忠实会员
7楼#
发布于:2019-09-10 02:13
请问下

location == 'chrome://browser/content/browser.xul'
是不是只能替换成

location.href.startsWith('chrome://browser/content/browser.x')
我看有的人写的脚本里是就只把xul改成了xhtml
location == 'chrome://browser/content/browser.xhtml'
kidzgy
火狐狸
火狐狸
  • UID35190
  • 注册日期2011-02-03
  • 最后登录2024-03-28
  • 发帖数248
  • 经验196枚
  • 威望0点
  • 贡献值122点
  • 好评度17点
8楼#
发布于:2019-09-09 17:38
lonely_8:看第一个参考链接的5楼回到原帖
感谢!已解决!再次感谢大佬!
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
9楼#
发布于:2019-09-09 14:31
kidzgy:第一个参考86楼已经解决。
第二个参考87楼,尚有部分BUG,【复制当前标签标题】、【复制当前标签地址】、【复制当前标签标题和地址】、【复制当前标签源代码】无效果,其他有效。
谢谢!
回到原帖
看第一个参考链接的5楼
kidzgy
火狐狸
火狐狸
  • UID35190
  • 注册日期2011-02-03
  • 最后登录2024-03-28
  • 发帖数248
  • 经验196枚
  • 威望0点
  • 贡献值122点
  • 好评度17点
10楼#
发布于:2019-09-09 14:25
lonely_8:86、87 楼分别参考这两贴
https://www.firefox.net.cn/read-121131#read_368568
https://www.firefox.net.cn/read-121198
回到原帖
第一个参考86楼已经解决。
第二个参考87楼,尚有部分BUG,【复制当前标签标题】、【复制当前标签地址】、【复制当前标签标题和地址】、【复制当前标签源代码】无效果,其他有效。
谢谢!
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
11楼#
发布于:2019-09-09 13:10
kidzgy:AddMenuPlus.uc存在问题,就是对着标签右键,复制当前标签标题和地址等项下所有功能均失效。感觉小弟提出的问题有点多了,真不好意思,有劳大佬,谢谢!回到原帖
86、87 楼分别参考这两贴
https://www.firefox.net.cn/read-121131#read_368568
https://www.firefox.net.cn/read-121198
kidzgy
火狐狸
火狐狸
  • UID35190
  • 注册日期2011-02-03
  • 最后登录2024-03-28
  • 发帖数248
  • 经验196枚
  • 威望0点
  • 贡献值122点
  • 好评度17点
12楼#
发布于:2019-09-09 12:34
AddMenuPlus.uc存在问题,就是对着标签右键,复制当前标签标题和地址等项下所有功能均失效。

图片:微信截图_20190909123239.png

感觉小弟提出的问题有点多了,真不好意思,有劳大佬,谢谢!
附件名称/大小 下载次数 最后更新
AddMenuPlus.uc.rar (34KB)  2 2019-09-09 12:31
kidzgy
火狐狸
火狐狸
  • UID35190
  • 注册日期2011-02-03
  • 最后登录2024-03-28
  • 发帖数248
  • 经验196枚
  • 威望0点
  • 贡献值122点
  • 好评度17点
13楼#
发布于:2019-09-09 02:08
这个脚本部分功能无法使用,即在标签右键,“用IE打开标签”,没有效果。除此之外,其他都能正常使用。不知能否修复,谢谢!

// ==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 = false; //页面
    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
    //相对路径:path: OS.Constants.Path.libDir+ "\\..\\..\\..\\Program Files\\Internet Explorer\\iexplore.exe"
    var browsers = {
        IE: {
            enable: true,
            name: "IE",
            path: "C:\\Program Files\\Internet Explorer\\iexplore.exe",
            image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABDlBMVEUAAAAAf39VVao/f78zZpkqf6okbbY/f784cakqf6o6dbAvb68teLQzcrI4cbM0eLQydK4xeLE2c7A1dbAzdrMzdLEzd7Myd7E0dLAydLIzdbMydbEzdrM0drAydrI0dbI0drI0dbAzdrEydbIydrEzdrEzdbI0dbEzdbI0dbI0drI0drE0dbE0drIzdbI0dbEzdbEzdrA0dbI0dbE0drE0dbIzdbI0dbE0drIzdbI0drIzdLI0dbI0dbIydbA0dLEydrI0drIzdrI0dbE0drAydbIydrEzdLAydrIzdrA0dLIzdLI0drA0dbIydrA0dLAydLI0dLA0dLI0drA0dLAydrI0drA0dLI0dLI0drJFyzboAAAAWXRSTlMAAgMEBQYHCAkMDRARFBsiIyQqNDY7QEJERkpMVFhaXWFiY2RpbHF6fH5/g4SMj5GUlZaYm5yjpaapqq2wtLa4u77LzM3Oz9DY2tvf4Obn6uzu8PT19vj5/YY/MsoAAAC1SURBVBgZTcGJOgIBGIbRN0RmhmRQJEKTLbTZUpIi+67pu/8b8efJk3MYmSvfX+4xFPOThbDkkZ5lIH7Sk/RVcIjNY1Y+3097Mg8JpoCF8CL5pl+PHhDpHiZe1di/lSkCS+funSoQvZH0PQ05tyaVgiBoyqTAy+ifLDgvkrb8oRnYllkD1g+Mw/izzJM/kQkldWBRNY0sw0YneqU/u0C6HZk86mvgYxMzdnxdza/u1FtnORfzA76xL0zsUvxRAAAAAElFTkSuQmCC"
        },
        Chrome:{
            enable:false,
            name:"Chrome",
            path:"",
            image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACSklEQVQ4jX2QT0jUcRDF35ufbq5pEiVRUGSUFYIV7hpCoQsiq0YUdSvBwFCoUDqU9G8LPAR1rhYEUY+ZBK6hIatLoRVmFCQdOiTZIbwklbnib6aDf3bdjR58YRjevPnOh0jRTFmZ31VtErJCzXYAgABTJjIsZDh/dHQ82c+V4nt5eQ7j8Qcg61JDk2VA+5zHc6kgFptfDfhWUpKd6fFEARz+33CShvJnZ2s5ObkgAODNytoMoDjVpYCpqvuPF5jJy2sDANb0VAUU4u26/8MH8g4AmFnUHOf6dFHRW184vAjSAMCGyzPWbKiIuQz2BrsI+M8N/fFXTMTfA/jcerThdP9W/z0SZ1VBEt1NBdHWm7ueDwqkNMHDHgoNRwjs66hcV0+ghWRzZJvvLolGAOtFkE2iMfwl0CZ0WtYCtUqhYfvSwXK74eqWF/ljY58EPJOGTVknxZExVfuVaMpOWSkp2LRg87eW3ZI6D4Et77VEqJoY8XU1BLxY21O5R8HutABDp36o9olIblLoVAaJEQAFy61ME+fRxoXxE7Men0FZB4HB0JnjeK+YyVMmZRISZW1vValBXq+9V2NCXo6cGpwIhUICAKGTb2pA6UtYYCL0EQCqnwQ7SNSncVP9KSKv+gtzj7mLvz8KuTtxEcLOgf4mAQAnM+MCVF+mc5Mcc3nN3LmWlOFhet3mJQ+AyPHIXLa7oQpAOxSrlI3ofLaf06p6Y+XbBoTpdaulcCC+xCFFwcfBQyJ2Xg1lok51316ETBmgYITmhuXgwLtk/198KfCC5H3+pQAAAABJRU5ErkJggg=="
        },
        Edge:{
            enable:false,
            name:"Edge",
            path:"microsoft-edge",
            image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACGUlEQVRIibVWr28TcRR/4kQX2vW+7yoQiMoJBAKBqKhATCD4ExATkxMENfFNJknWZL33vkGQCgQJE4glTCAqJiYqlqwp1/u+bzKxBASiAlExUQS90vau15aVT/Lc+34+7/cdwBIoimuK7Ftke6lIBopkgMZ10NhTDOO90ru4sowjEz7HLxW7G2QZLbGhH8rB6szUKwZsz1YgnrGA7dnybKhXVOQu1iWfmLG3leP+08VlMdLMeqjY/vRZ2mhcS5GcI8mPxSKuA1p7afJGVJ+LJkJ2R4riWspZay8g+wpZhlkiZe7vpwVY2sgyUmTvsBlp0NoDrT0/lIPMiACgzP39zIxJBjP92DqRR2PyK5/sk6QfyO4rsm3ktQ2Nvc1semgPJ05BaA8VuQugXhEA4AH1HqJxHWQZbZ/IszyBgOIPCxp+OuXkTEIOAOCTfJ44ktv1G1F9kSmS8+zBkO7fMKbIFcW1fx7TOctMOWn2fxGovOmX0LjvmxKovO+XZgRKzXhnU+TIMkyXZ37ZWEZV3S7kTdFaKJpvj1Np5t2WdVHV7UJ63NzHjQkAACiWbtbSrFKqqm4XlIle5DqNj1jGfbFX2LSvJ6ckgdZewPY5GtdCsr8Wzn+CMl8rxfLlXvN//GkrVwTJ7Sqydxvd4Hn4jaie+2G5rwDA+KqyvVxnuZDd0coC0yVD41qKpavY3Uzbn18Y18Iw3ps+mgl+A9E4JERQR7sXAAAAAElFTkSuQmCC"
        },
        Opera:{
            enable:false,
            name:"Opera",
            path:"",
            image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAABxklEQVQokYWTQWtTQRSFv3sTA0oV3FRKS4MighQRrKBYRJeCdqN5Biy4cJH/4KpL8Te4qWBtEyOCtCoILhJQlCBSRXChpAlU3AgKtaX0zXFR83xPHnhXM/d+58wZmDFS9S2KhjZ9o2boMsGO4ewj8BMPK5I9LJW27ozce74+4G2wWK1ePCtswWEUgEAbU0uyKXPOA4QQ+kV5day59CoR969On44tfuH4bgBJ98uN5ZmBca96qQFEO57hl5nOlRefdvxDFJWE5gfCACrKbqavI7aTveN7FBfmO7XJXb7XN69hHEqGQe9GHyz10uJy/dlnoU8J4xwZ/jESuUmVNIjbe3LKsJVMmsAVB05kKGktT4z0NWNmTHqwMJw9wjZyxWbrmb044A5xLvyfChB7kK9m02koDxZk+k7ouhntf7jRPLGJkWzDWw6ay0I6nptTTGRza87L9eW24MnfPD7Rq0wfTnPdyvRBnKOJj3g03lx+4wDbZjcI6iZD0239eboCc49vpRJ8KRaoQepj9GcujMVbxaY7pwBC4LWZWiabwjmzE5WXKnhUXny8lhEDaHbW+x/fVoPpOgoncfaDf7egDm53x+tLDQMN+N9FzrK3IXGG5QAAAABJRU5ErkJggg=="
        },
        FireFox:{
            enable:false,
            name:"FireFox",
            path:"",
            image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAMAAADarb8dAAABHVBMVEUAAAD/f38/f7/akUjni0Xpfz/riTrsf0jyjD/Tg08jlL0hk7rpij/liULrhj7qiT7rh0HqiD/kiUbkh0EilLwjlLsrkLjdiEbhh0nfikfeh0jdiEbfiUffh0fghkbTh014jYavi2PhiEXhh0UjlLwklLvQiU7dh0jeiEXjh0Lfh0bhiUXjiUTqh0DmiEPih0Qhkrroh0LoiEHoiEIjkrq0imEjlLwolLkolLouk7Yxk7Mzk7I9k6xEkqhIkqVKkqRPkaFQkaBhkJZlkJRukI5yj4t9joR9j4WTjXeZjXOdjXGjjG6sjGiyi2S3i2C4i2C6i1+8i17Ci1rOilLRiVHSilDTiU/Xik3diUnfiEjmiUTpiELqiEDriEHsiEBADhTDAAAANnRSTlMAAgQHCwwNDhQdKy0wMjU9QlhiaY2XmJ+kqK2usrO4wsXN1dja2t3l5unr7O7v9/j6+vv7/v6MjNp+AAAAsElEQVQIHQXBA2IDAAAEwa1t27YuNdKmtrn/f0ZnAGjomlxdnequB4C28s7Nwl6So62xOqBsafT07LaQZOf8a6UJalWvkyTZ/5ivoF3Vh+MkyaUdzKl6kSTJsyNMq7/vxSTJ9p3rLKuvhSRJim+us6j6dHp1f5iUdIFBVf0s7ebgRgdoVf0ubScnLz/aAsOqf49Xd7/qEFAzoaqq49UAVf2qqn2VAEBz7+zG2kxPI8A/m2E1d8xSFegAAAAASUVORK5CYII="
        },
         
        others:{
            enable:false,
            name:"360极速",
            path:"D:\\Program Files\\360Chrome\\Chrome\\Application\\360chrome.exe",
            image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADBElEQVQ4jXWTb0zUdRzHP7FylLPMGLOF5M5MRjGmRMj946yjQZ4e4EDJWWba1oZOZz3xQbtkaxeQRiSxUbb1Z7e5zK3WKDdxi/UARJ2eBzmyc3LccbuRccfd/f7c/V49AIRovrfXs+/79dln+3xFluTdHxL5TT61fftX2pe/dqhFI/XqoH+bmrzhViKje9T3g3uDuUs799L0neJ09uoRe4/O1l5tbNit3Lz+qop/EYE65ebw2+FH/lfe9Y2y3dGjp6u6dWzdOm+2qtP91iS/b0kx/Eqaa7XKgsitRBckHk/O0Z/iec4ePWI/pWP/bJb39iQ5Uxrnx/I4580zDDhSDFWnuVozJ3JrFz3iyZGD3/Lo7q+zh21dOrbOBVrq45wqnOL0+rv4SqY5V5bgl8oZfqtKqJddsQvXG8J2ERFxeC4+uOO0dsh6Usd6Usd6YpaGA0mOL4/Slhfj04Ipzq3tJ7K6QlVWi6oW50/oNRWdHK5bKVvCJ85W3/7c91L3TMzSoWOew+LVOPRElGO5IQLLnaQeENK5gpovaOuXkXnhSWiy+eTlyY+D1kgb1mAX5i/C2UqvRqVXY7NX4/aEwfiISvJZmRWsENSnBL14BdkXC8BVFpOa6Cfj1kgb81Re8lH+cx8bv+/jyt8hQvEA2QFBfUdIPyZohUKm5HEMy9Pg3nRXXJOd1xYLKu58QOnYUTb491F4qYrjVx7CCAjZQUE/IGimHDIb8zFsJthpHpW6ya6u+bJ54kPKgsd4brQF09Vm1g2VEvlT4JZgjAnZAUErntvf8Qy8VdMq+0O9BVXh9vGl09cMuTlyowiiORAWCAncETKND8/uv3XTrekjjatERMQW6Si2hbxTi6cf/KM6TaIc4iXwzwaYWguxPIx2k9+wrZtmb+3m/5yyI+hZaf7L02kZaTl7JtrsJ+MCrRY0JygOSFkgUU6m3/66al7z/H0/lKruKMJoSGDUc4+sGzIu0Ov7AoHGZfctzwdln4ns7o8wmgcwdvkxXhsk+0ZrKrW/YOnbfwGaHza07T0rkAAAAABJRU5ErkJggg=="
        },
         
        all:{
            enable:false,
            name:"所有浏览器",
            image:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABfVBMVEUAAAAcjbwijMIimM8nm9UnoNkooNonoN4loOLurVS+snG/xYOUtZgloN381GJEREDrrFLzvlfcynK7vn7Dv3Y1n82AsqWTup/gznL81GFEREBEREDsrVHtslP40mHoyWK0u4FfrLpBps7rz2jw0WbvzmjMrFZEREDsrlL2yVzty2AvntN0sqo1pNUqoNtKqMY9o9Fdp7d2rKTtrFPuymCvuoGYtpC8xIb30mLkyGbox2LgyWo2i7OyvYPEwHeXuZtfrr80pNX30mP40WAgiL0on9hWrL/y0mfuy2H50mAgiL0mndeCuKj302FDn8JDoMN2s6771GIgi78klMmSuZ6iv5JosLn71GEdicQhir8kntz30mPv0GYrm9NIqMn50mL+0mMfi78gj8Qnn9zRyHknot3Kx3wgjsJYprVKob0nod8nouApd5wkiLgmlMoknNUnoN8not8spt1EREAontkon9onot4not8nod7yzWDwy2D71GL602IpndcpnNWyKzl3AAAAdHRSTlMAG3+r3PXXiRtbrbzE9FsBXcbGw8by3NjHWQEEHNz04MPb59LWzSAFi8Hw+N/4/N7q1nrW18TEwPHW3bjnw8XC1PHq+Pj419nr+NTbxujm5crSh7/DwNCFGt305Nb84fEXWMT+w/1OvdHg8FMgf6zX0IIXCfpjDT4AAADLSURBVBgZXcGxK0QBHMDx7ze5Uq+ewfSyKHJ1SREWkwy6UtcNItNl8dfYGCxMSgYpdZMy4wpdBmHFovAG9Yafd5fJ5yP/SMk/P4DAkLqt7vlFKgzbsxUH9jGqm0e6xol9VG2cqXXalt5lVl0K4NJSVxbtmYfrBePqQpZ1jpu3FW9nYqDTlrpOw31t8E5rD6fSdPx5kseqUbxMPB3LunandCyKeNVDoaV2VqMIPtxPBVoVHSmCb3czBbKmWlR0J9s4F9IkyfNPSmmS5L+9fjn4t8/zTwAAAABJRU5ErkJggg=="
        }
    };
 
    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("accesskey", "O");
            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");
            sep.setAttribute("hidden", "true");
            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");
 
 
 
            //控制链接菜单的显示
            inspos.parentNode.addEventListener("popupshowing", this, false);
 
            //页面部分
            this.createBrowserMenu(anchorNode, "page");
 
        },
        //tabContextMenu
        initTabContextMenu: function () {
 
            var inspos = $("context_closeOtherTabs");
            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");
                let menuspage = $("contentAreaContextMenu").querySelectorAll(".open-page");
                for (let menu of menus) {
                    if (gContextMenu.onLink) {
                        menu.hidden = false;
                    } else {
                        menu.hidden = true;
                    }
                }
                for (let menu of menuspage) {
                    if (gContextMenu.onLink) {
                        menu.hidden = true;
                    } else {
                        menu.hidden = false;
                    }
                }
            }
 
        },
        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 = document.popupNode && document.popupNode.localName == "tab" ? document.popupNode : null;
                    let bw = tab && tab.linkedBrowser;
                    url = bw && bw.documentURI.spec;
                }
                    break;
                case "place":
                    url = PlacesUIUtils.getViewForNode(document.popupNode).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();
})();
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
14楼#
发布于:2019-09-08 21:01
kidzgy:文件名是显示了,但是有新的问题,就是在下载面板改了名后,按确定选择保存路径时,文件名还是改之前的。回到原帖
47 楼已修复
上一页
游客

返回顶部