lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
15楼#
发布于:2019-05-22 15:28
333ywb:按照你改的脚本试了下,还是加载不了,在控制台也出现chrome://browser/content/browser.xhtml 说明成功了,但是浏览器还是不出现脚本操作界面回到原帖
12 楼的代码,本论坛 代码语法高亮插件的锅,
代码被加料了一些 html 代码进去,我重新编辑了下。
或者按照 11 楼你自己改的,并按照 13 楼的提示修改就可以了。
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
16楼#
发布于:2019-05-22 15:31
lonely_8:12楼的代码,本论坛 代码语法高亮插件的锅,
代码被加料了一些html代码进去,我重新编辑了下。
或者按照你11楼自己修改的,并按照13楼的提示修该就可以了。
回到原帖
好了好了,现在可以加载成功了,万谢万谢。真的是太感谢大神了。我自己尝试改下其他需要改的脚本
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
17楼#
发布于:2019-05-22 15:54
lonely_8:12 楼的代码,本论坛 代码语法高亮插件的锅,
代码被加料了一些 html 代码进去,我重新编辑了下。
或者按照 11 楼你自己改的,并按照 13 楼的提示修改就可以了。
回到原帖
在麻烦下大神。下面的代码改了下这5个功能还是都不起作用。
// ==UserScript==
// @name           Tabplus.uc.js
// @description    设置标签的打开方式
// @update         2018-04-20
// @license          MIT License
// @compatibility  Firefox 57+
// @charset         UTF-8
// @include      chrome://browser/content/browser.xul
// ==/UserScript==
 
 
// 01. 空白标签处双击新建标签
 
 
gBrowser.tabContainer.addEventListener('dblclick', function(event) {
  if (event.target.localName != 'tabs' && event.target.localName != 'toolbarbutton') {
    return;
  }
  gBrowser.selectedTab = gBrowser.addWebTab('about:newtab');
  event.preventDefault();
  event.stopPropagation();
});
 
 
 
// 02. 历史记录在新标签打开
 
(function() {
 
if (location.href.startsWith('chrome://browser/content/browser.x'))
    return;
 
  eval('PlacesUIUtils.openNodeWithEvent = '  + PlacesUIUtils.openNodeWithEvent.toString()
    .replace(' && PlacesUtils.nodeIsBookmark(aNode)', '')
    .replace('getBrowserWindow(window)', 
      '(window && window.document.documentElement.getAttribute("windowtype") == "navigator:browser") ? window : BrowserWindowTracker.getTopWindow()')
  );
 
  let onPopupshowing = function() {
    let historyMenu = document.getElementById('history-menu');
    if (!historyMenu._placesView) {
      new HistoryMenu(event);
      historyMenu._placesView._onCommand = function HM__onCommand(aEvent) {
        let placesNode = aEvent.target._placesNode;
        if (placesNode) {
          PlacesUIUtils.openNodeWithEvent(placesNode, aEvent);
        };
      };
    };
  };
 
  let historyPopup = document.getElementById('goPopup');
  historyPopup.setAttribute('onpopupshowing', '(' + onPopupshowing.toString() + ')()');
 
})();
 
// 03. 主页按钮在新标签打开
 
(function() {
       
    // 新标签打开:主页按钮(排除about:blank和about:newtab)
    try {
        eval("BrowserHome = " + BrowserHome.toString()
            .replace(/switch \(where\) {/, "where = (gBrowser.currentURI.spec!="+"'about:blank' && gBrowser.currentURI.spec!="+"'about:newtab' || gBrowser.webProgress.isLoadingDocument"+") ? 'tab' : 'current'; $&"));
    }catch(e){}
})();
 
 
// 04. 在新标签页查看图片
 
if (location.href.startsWith('chrome://browser/content/browser.x')) && (function () {
    document.querySelector("#context-viewimage").setAttribute("oncommand", 'openTrustedLinkIn(gContextMenu.imageURL,"tab")');
})();
 
 
// 05. 重新载入全部标签页
 
if (location.href.startsWith('chrome://browser/content/browser.x')) && (() => {
    const reloadTab = document.getElementById('context_reloadTab');
    if(!reloadTab) return;
    const menuitem = document.createXULElement('menuitem');
    menuitem.setAttribute('accesskey', 'A');
    menuitem.setAttribute('label', reloadTab.getAttribute('label')
        .startsWith('Reload') ? 'Reload All Tabs' : '重新载入全部标签页'
    );
    menuitem.addEventListener('command', () => {
        gBrowser.visibleTabs.forEach(tab => {
            try {
                gBrowser.getBrowserForTab(tab).reload();
            } catch (e) {}
        });
    });
    reloadTab.after(menuitem);
})();
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
18楼#
发布于:2019-05-22 15:57
333ywb:在麻烦下大神。下面的代码改了下这5个功能还是都不起作用。
// ==UserScript==
// @name           Tabplus.uc.js
// @description    设置标签的打开方式
// @update ...
回到原帖
第8行的
chrome://browser/content/browser.xul 改为
 chrome://browser/content/browser.xhtml
或者
main

感谢提醒,我会在顶楼补充一下这种情况。
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
19楼#
发布于:2019-05-22 16:05
lonely_8:第8行的
chrome://browser/content/browser.xul 改为
 chrome://browser/content/browser.xhtml
或者
main

感谢提醒,我会在顶楼补充一下这种情况。
回到原帖
改了第8行还是不行,5个功能还是不起作用
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
20楼#
发布于:2019-05-22 16:09
333ywb:改了第8行还是不行,5个功能还是不起作用回到原帖
71、78行的
if (location.href.startsWith('chrome://browser/content/browser.x')) &&
应该为
location.href.startsWith('chrome://browser/content/browser.x') &&
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
21楼#
发布于:2019-05-22 16:20
lonely_8:71、78行的
if (location.href.startsWith('chrome://browser/content/browser.x')) &&
应该为
location.href.startsWith('chrome://br...
回到原帖
再次万分感谢,已经恢复了4个功能
还有一个功能// 02. 历史记录在新标签打开  不起作用
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
22楼#
发布于:2019-05-22 16:29
333ywb:再次万分感谢,已经恢复了4个功能

还有一个功能// 02. 历史记录在新标签打开  不起作用
回到原帖
。。。原来30行if ( 左括号后是不是有 英文感叹号(!)的,替换时不要把这个也去掉。

uc脚本修改建议 1 中:
location.href == 'chrome://browser/content/browser.xul'(红色字体的可能不存在,单引号的可能为双引号,两个等于号前面或后面可能有空格)
只替换这个,不要替换这句所在同一行的其它符号或字符。
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
23楼#
发布于:2019-05-22 16:38
lonely_8:。。。原来30行if ( 左括号后是不是有 英文感叹号(!)的,替换时不要把这个也去掉。

uc脚本修改建议 1 中:
location.href == 'chrome://browser/content/browser.xul'(红...
回到原帖
原来的这一句是:
  if (location != 'chrome://browser/content/browser.xul')
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
24楼#
发布于:2019-05-22 16:41
333ywb:原来的这一句是:
  if (location != 'chrome://browser/content/browser.xul')
回到原帖
好吧,我也乱了,30行整行改为

if (!location.href.startsWith('chrome://browser/content/browser.x'))


顶楼补充了这一修改建议。
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
25楼#
发布于:2019-05-22 16:47
lonely_8:好吧,我也乱了,30行整行改为

if (!location.href.startsWith('chrome://browser/content/browser.x'))


顶楼补充了这一修改建议。
回到原帖
呵呵 ,谢谢!完美问题解决了,5个功能全部回来了。现在按照这贴办法,我的UC脚本已经回来了80%了,再次感谢
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
26楼#
发布于:2019-05-22 16:56
lonely_8:好吧,我也乱了,30行整行改为

if (!location.href.startsWith('chrome://browser/content/browser.x'))


顶楼补充了这一修改建议。
回到原帖
麻烦了你下午,真的是太感谢了,现在我自己修改了好多,基本就剩下两个脚本了,在麻烦帮我看看这是第一个
这个脚本可以加载,但是功能不完整了,右键点击图标不起作用了。在麻烦看看
// ==UserScript==
// @Name                 UndoCloseTabBtn.uc.js
// @namespace         UndoCloseTab@gmail.com
// @description         可移动恢复已关闭标签按钮
// @author               defpt
// @charset              UTF-8
// @Compatibility        FF57+
// @version              v2018.04.04 更新兼容57+ by runningcheese
// @version              v2014.09.15
// ==/UserScript==
(function() {
    if(document.getElementById('undoclosetab-button')) return;
  
    CustomizableUI.createWidget({
        id: 'undoclosetab-button',
        label: '恢复最后关闭的标签',
        tooltiptext: '左键:恢复最后关闭的标签\n右键:显示关闭标签菜单',
        defaultArea : CustomizableUI.AREA_NAVBAR,
        onCreated: (uCTBtn) => {
            uCTBtn.setAttribute('context', '_child'); //点击按钮恢复最后一次关闭的标签
                               //如果想左键恢复最后一次关闭的标签,右键打开已关闭标签列表,那么改为(context: "_child",)
                               //如果想改成菜单形式的,那么改为(type: "menu-button",)
            uCTBtn.setAttribute('command', 'History:UndoCloseTab');
  
            uCTBtn.appendChild($C('menupopup', {
                oncommand: 'event.stopPropagation();',
                onpopupshowing: 'this.parentNode.populateUndoSubmenu();',
                context: '',
                tooltip: 'bhTooltip',
                popupsinherittooltip: 'true'
            }));
            uCTBtn._getClosedTabCount = HistoryMenu.prototype._getClosedTabCount;
            uCTBtn.populateUndoSubmenu = eval('(' + HistoryMenu.prototype.populateUndoSubmenu.toString().replace(/\.undoTabMenu/g, '') + ')');
        }
    });
  
  
    document.insertBefore(document.createProcessingInstruction(
        'xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent('\
            #undoclosetab-button menuitem {max-width: 240px;}\
            #undoclosetab-button .toolbarbutton-icon {list-style-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABuUlEQVRIib2VL08DQRDFKxANqahErijJte/N5pI2oQlNuA+AqEBUkHAJAkMIAhJERYNBICr4ABUIFKlEIBA4DAJRgUBUIJpgKioqitkry8H9CxcmmeQutzu/eTO5mULhP4xkA0Ar6ruIOCR3SZ4A6JrnRhaAR3JqQ5RSRQDHJMckFxE+JtlzXbccCwDQMRemAFpaa5J8jQkc9ncRaccBfOvw1HjwPhORvjnTAFAB0BGRfkjdXEQOo2rs/5YZgIGIbEUlJiKOAc3MnQ8Ae0kKlvUFsBZb2y9Qm+Tc3Jv86AnJo4ja3lar1fU0EJKXlvLz8MdeTAOHnuetJAFc1y1bPZlkASwAXKVU0bPuuN/ojuOoOE+jAsCOBfDTJJXJarXahqX8NHeA+UEDBd3cASJyYCnYzx0AYBAAtNbNvINvknwxgKd6vb6aK4DkfZB95EyysimJyBmAUprgZkcEwe+SDq8FUgG8kfSizppF9Gg1dpI4vwBUSI7sMUzy2YzsjvELkkNrwAVjfjuN4mCu3GRYOCOtNVMFD6lpkbwOLaDlIiL5AMBPM0ZiTSlVNPX2SHpa66ZSqvinoHnZJ3jLDwknYoRNAAAAAElFTkSuQmCC")}\
    ') + '"'), document.documentElement);
                
    function $C(name, attr) {
        var el = document.createElement(name);
        if (attr) Object.keys(attr).forEach(function(n) { return el.setAttribute(n, attr[n]);});
        return el;
    }
})();
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
27楼#
发布于:2019-05-22 17:00
还有最后要改的脚本,改了以后,还是不起作用,再麻烦看看,万谢!
// ==UserScript==
// @name           rebuild_userChrome.uc.js
// @namespace      http://space.geocities.yahoo.co.jp/gl/alice0775
// @description    UC脚本管理器
// @charset        utf-8
// @include        main
// @compatibility  Firefox 61
// @author         Alice0775
// @version        2018/04/14 00:00 de XUL
// @version        2017/11/23 23:00 Services :(
// @version        2017/11/14 21:00 use nsIFile instead nsILocalFile
// @version        2017/11/14 21:00 use Services.jsm
// @version        2016/11/28 21:00 remove "for each"
// @version        2015/12/04 24:00 Bug 1177310 [e10s] Stop using CPOWs on application shutdow
// @version        2013/03/20 24:00 force cancel default right click action for unknown modification
// @version        2013/03/22 08:02 Added "use strict"
// @version        2013/03/22 08:01 Fixed commands to work properly, even if menus had been moved into other place
// @version        2013/03/22 08:00 Fixed dragdrop target
// @version        2013/03/20 24:00 autocheck=false for script menu
// @version        2012/11/30 22:00 ubuntu12.04.1 "chromeフォルダを開く" に失敗することがあるのを修正
// ==/UserScript==
// @version        2012/09/30 09:00 ubuntu12.04.1 "chromeフォルダを開く" に失敗することがあるのを修正
// @version        2012/02/25 23:00 restart
// @version        2010/10/25 22:00 Bug 574688 adon bar
// @version        2010/07/04 00:00 nsDragAndDrop
// @version        2009/11/14 00:00 Seamonkeyに対応
// @version        2009/08/24 00:00 Namoroka3.6a2pre で右クリックでのスクリプト編集時にコンテキストメニューが表示されるのを修正
// @version        2009/04/10 00:00 Minefield3.6a1pre での動作改善
// @version        2009/03/27 00:00 nsIProcess変更
// @version        2008/02/25 00:00 reuseのデフォルト値trueに変更
// @version        2008/01/09 02:00 スクリプト保存ファイルピッカーをキャンセル時のエラー処理追加
// @version        2008/01/04 16:00 スクリプトのドロップをstatusbar-display上に変更
// @version        2007/12/15 18:00 base64データスキームの保存に対応
// @version        2007/12/15 02:00 ttp://の保存に対応
// @version        2007/12/15 01:00 メニューが表示されない場合があるのを修正
// @version        2007/12/14 23:00 saveFolderModokiがある時スクリプトのリンクをステータスバーの左1/3にドロップすることで, chrmeホルダに保存するようにした
// @version        2007/12/14 19:00 日本語のファイル名のスクリプトの有効/無効が機能していなかったのを修正
// @version        2007/12/14 17:00 スクリプトの有効/無効/編集を設定できるようにした
// @Note           使用するエディタを編集しておくこと
// @Note           Required Sub-Script/Overlay Loader v3.0.38mod( https://github.com/alice0775/userChrome.js/blob/master/userChrome.js )
 
 
  Components.utils.import('resource://gre/modules/Services.jsm');
 
  // 要移动的菜单列表,移动到一起统一管理。
  var movedMenus = [
        "anoBtn_set", // AnotherButton按钮菜单
        "addMenu-rebuild", // addMenu 的重新载入配置   
        "toolsbar_KeyChanger_rebuild", //KeyChanger 
        "FloatingScrollbar", //浮动滚动条        
        "ucjs_getUCJS_toolmenu",//更新userChrome.js
        //"AwesomeBookmarkbar_set", //智能书签栏配置
        //"ucjsMouseGestures_menues",//鼠标手势配置
        //"RefererChanger",
        //"wordhighlight-toolbar-menuitem",    // WordHighlightToolbar.uc.js
        //"sw-menuitem",    // siteinfo_write
        // "easydragMODOption",    // easydrag_customMOD.uc.js
        // "JSCSS-menuitem",    // js、css、ahk 代码着色
        // "uSuper_preloader-menuitem",
        // "GrabScroll_optionsMenu",
        // "Patch_XULrubySupportMenu",
        // "menutabTooltip",
        // "PipeliningToggle",
        // "linkInNewTabForSpecifiedPageToolMenu",
        // "ieviewModokiTool",
        // "linkloadInBackgroundToolMenu",
        // "SaveFolderToolsMenu",
        // "ucjs_copysysinfo-menu"
  ];
  var userChromejs = {
// --- config ---
    editor: "\\Local\\Notepad2\\Notepad2.exe",
    // editor: "/usr/bin/gedit",
// --- config ---
    _statusDisplay: null,
 
    get statusDisplay() {
      if (!this._statusDisplay)
        this._statusDisplay = document.getElementById('status-bar') ||
                              document.getElementById('statusbar-display');
      return this._statusDisplay;
    },
 
    _addonbar: null,
    get addonbar() {
      if (!this._addonbar)
        this._addonbar = document.getElementById('addon-bar');
      return this._addonbar;
    },
 
    handleEvent: function(event) {
      switch(event.type) {
        case 'dragover':
          this.dragover(event);
          break;
        case 'drop':
          this.drop(event);
          break;
        case 'unload':
          this.uninit();
          break;
      }
    },
 
    createElement: function(localName, arryAttribute) {
      let elm = document.createXULElement(localName);
      for(let i = 0; i < arryAttribute.length; i++) {
        elm.setAttribute(arryAttribute[i].attr, arryAttribute[i].value);
      }
      return elm;
    },
 
    init: function(){
      window.addEventListener("unload",this , false);
 
      let ref = document.getElementById("menu_preferences");
 
      let menu = ref.parentNode.insertBefore(
        this.createElement("menu",
          [{attr: "id", value:"userChrome.js_menu"},
           {attr: "label", value:"UC脚本管理"},
           {attr: "accesskey", value:"u"}
          ]), ref);
 
      let popup = menu.appendChild(this.createElement("menupopup",
        [{attr: "id", value:"userChromejs_options"},
         {attr: "onpopupshowing", value:"userChromejs.onpopup()"},
         {attr: "context", value:""}
        ]));
      popup.appendChild(this.createElement("menuitem",
        [{attr: "id", value:"userChrome_setting"},
         {attr: "label", value:"每个新窗口都重载脚本"},
         {attr: "accesskey", value:"u"},
         {attr: "oncommand", value:"userChromejs.setting();"},
         {attr: "type", value:"checkbox"}
        ]));
      popup.appendChild(this.createElement("menuitem",
        [{attr: "label", value:"打开新窗口并重载脚本"},
         {attr: "accesskey", value:"x"},
         {attr: "oncommand", value:"userChromejs.rebuild();"}
        ]));
      /*
      popup.appendChild(this.createElement("menuitem",
        [{attr: "label", value:"重新启动浏览器"},
         {attr: "accesskey", value:"r"},
         {attr: "oncommand", value:"userChromejs.restartApp();"}
        ]));
      */
      popup.appendChild(this.createElement("menuitem",
        [{attr: "label", value:"打开Chrome文件夹"},
         {attr: "accesskey", value:"h"},
         {attr: "oncommand", value:'new Components.Constructor("@mozilla.org/file/local;1","nsIFile", "initWithPath")(Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("UChrm", Components.interfaces.nsIFile).path).reveal();'}
        ]));
     popup.appendChild(this.createElement("menuseparator",
        [{attr: "label", value:""},
         {attr: "accesskey", value:""},
         {attr: "oncommand", value:""}
        ]));
     let menuu = popup.appendChild(this.createElement("menu",
        [{attr: "id", value:"userChromejs_script_options_Menu"},
           {attr: "label", value:"用户脚本设置"},
           {attr: "accesskey", value:"s"}
        ]));
     let popupp = menuu.appendChild(this.createElement("menupopup",
        [{attr: "id", value:"userChromejs_script_options"}
        ]));
 
      if ("nsDragAndDrop" in window && this.statusDisplay) {
        this.statusDisplay.addEventListener('dragover',function(event){nsDragAndDrop.dragOver(event,userChromejs.dndObserver);},true);
        this.statusDisplay.addEventListener('dragdrop',function(event){nsDragAndDrop.drop(event,userChromejs.dndObserver);},true);
      } else if(this.addonbar) {
        this.addonbar.addEventListener('dragover', this ,true);
        this.addonbar.addEventListener('drop', this ,true);
      }
      this.addPrefListener(userChromejs.readLaterPrefListener); // 登録処理
    },
    uninit: function(){
      if ("nsDragAndDrop" in window && this.statusDisplay) {
        this.statusDisplay.removeEventListener('dragover',function(event){nsDragAndDrop.dragOver(event,userChromejs.dndObserver);},true);
        this.statusDisplay.removeEventListener('dragdrop',function(event){nsDragAndDrop.drop(event,userChromejs.dndObserver);},true);
      } else if(this.addonbar) {
        this.addonbar.removeEventListener('dragover', this ,true);
        this.addonbar.removeEventListener('drop', this ,true);
      }
      this.removePrefListener(userChromejs.readLaterPrefListener); // 登録解除
    },
 
    dragover: function(event) {
      var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                        .getService(Ci.nsIDragService);
      var dragSession = dragService.getCurrentSession();
      var supportedTypes = ["text/x-moz-url", "text/unicode", "application/x-moz-file"];
      for (let type of supportedTypes) {
        if (event.dataTransfer.types.contains(type)) {
          var data = event.dataTransfer.getData(type);
          var url = (/^\s*(.*?)\s*$/m.test(data))
                     ? RegExp.$1 : null;
          if (/(\.uc\.js|\.uc\.xul|\.uc\.xul\.txt)$/.test(url)) {
            dragSession.canDrop = true;
            event.preventDefault();
            return;
          }
        }
      }
    },
 
    drop: function(event) {
      var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                        .getService(Ci.nsIDragService);
      var dragSession = dragService.getCurrentSession();
      var supportedTypes = ["text/x-moz-url", "text/unicode", "application/x-moz-file"];
      for (let type of supportedTypes) {
        if (event.dataTransfer.types.contains(type)) {
          var data = event.dataTransfer.getData(type);
          this.dndObserver.onDrop(event, {data: data}, dragSession);
          return;
        }
      }
    },
 
    dragDropSecurityCheck: function dragDropSecurityCheck(event, dragSession, url) {
      if (!url)
        return false;
 
      // need to do a security check to make
      // sure the source document can load the dropped URI.
      url = url.replace(/^\s*|\s*$/g, '');
 
      if (url.indexOf('chrome://') == 0 || url.indexOf('file://') == 0)
        return url;
 
      // urlSecurityCheck
      try {
        urlSecurityCheck(url, gBrowser.contentPrincipal, Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
      }
      catch(e) {
        event.stopPropagation();
        //throw 'Drop of ' + url + ' denied.';
        return false;
      }
      return url;
    },
 
    dndObserver: {
      getSupportedFlavours : function () {
        var flavours = new FlavourSet();
        flavours.appendFlavour("text/x-moz-url");
        flavours.appendFlavour("text/unicode");
        flavours.appendFlavour("application/x-moz-file");
        return flavours;
      },
      onDragOver: function (evt,flavour,session){},
      onDrop: function (evt,dropdata,session){
        var fname;
        evt.stopPropagation();
        evt.preventDefault();
        if (dropdata.data!=""){
          //ステータスバーの左1/3にドロップしたか
          var target = evt.target;
          while(target){
            if(target == userChromejs.statusDisplay ||
               target == userChromejs.addonbar)
              break;
            target = target.parentNode;
          }
          if(!target) return;
          if(evt.screenX > target.boxObject.screenX + target.boxObject.width/3) return;
 
          //saveFolderModokiが必要
          if(!saveFolderModoki) return;
          //ドロップしたurl
          var url = (/^\s*(.*?)\s*$/m.test(dropdata.data))?RegExp.$1:null;
          //保存ホルダ nsIFile
          var folder = Components.classes["@mozilla.org/file/directory_service;1"]
                             .getService(Components.interfaces.nsIProperties)
                             .get("UChrm", Components.interfaces.nsIFile);
          //デフォルトのファイル名
          if(/(.*)\n?(.*)?/m.test(dropdata.data) )
            fname = RegExp.$2?RegExp.$2:"";
          //データスキームか
          if(/(^data:text\/javascript(;.*)?,?)|(^data:application\/x-javascript(;.*)?,?)/.test(url)){
            // urlSecurityCheck は saveFolderModoki.directSaveLinkで実施している
            saveScript(url, fname, folder);
          }else{
            //リンクか
            if(!/(^h?ttps?:\/\/)|(^ftp:\/\/)/.test(url)) return;
            if (/^h?.?.p(s?):(.+)$/i.test(url)){
              url = "http" + RegExp.$1 + ':' + RegExp.$2;
              if(!RegExp.$2) return null;
              fname = url.match(/.+\/(.+)$/)[1];
            }
            fname = fname.replace(/\.uc\.xul\.txt$/,'.uc.xul');
            //スクリプトファイルか?
            if(/(\.uc\.js|\.uc\.xul|\.uc\.xul\.txt)$/.test(url)){
              if (typeof gBrowser.dragDropSecurityCheck == 'function')
                gBrowser.dragDropSecurityCheck(evt, session, url);
              else {
                userChromejs.dragDropSecurityCheck(evt, session, url)
              }
              saveScript(url, fname, folder);
            }
          }
        }
        function saveScript(url, fname, folder){
          //ファイルピッカによりnsIFile決定
          var aFile = getFolderPath(fname, folder)
          if(!aFile) return;
          //フォルダパス
          folder = aFile.path.replace(aFile.leafName,'');
          //nsILocalFileのフォルダ
          var aFolder = saveFolderModoki.initFileWithPath(folder);
          if(!aFolder) return;
          //リンクを保存
          saveFolderModoki.directSaveLink(null, url, aFile.leafName, gBrowser.currentURI, aFolder);
        }
        function getFolderPath(fname, folder){
          //ファイルピッカにより保存先決定
          var fp = Components.classes['@mozilla.org/filepicker;1']
                    .createInstance(Components.interfaces.nsIFilePicker);
            fp.init(window, "Save script As", fp.modeSave);
            fp.appendFilter("Script Files","*.uc.js; *.uc.xul");
          if(/\.uc\.js$/.test(fname)){
            fp.defaultExtension = "uc.js";
            fp.defaultString = fname;
          }else if(/\.uc\.xul$/.test(fname)){
            fp.defaultExtension = "uc.xul";
            fp.defaultString = fname;
          }else{
            fp.defaultExtension = "uc.js";
            fp.defaultString = fname + ".uc.js";
          }
          fp.displayDirectory = folder;
          if ( fp.show() == fp.returnCancel || !fp.file ) return;
          //nsIFile
          return fp.file;
        }
      }
    },
 
    rebuild: function(){
      var flag = this.getPref("userChrome.enable.reuse",'bool',true);
      this.setPref("userChrome.enable.reuse",'bool',false);
      setTimeout(function(){OpenBrowserWindow();},  0);
      setTimeout(function(self,flag){self.setPref("userChrome.enable.reuse",'bool',flag);},2000,this,flag);
    },
    setting: function(){
      var flag = this.getPref("userChrome.enable.reuse",'bool',true);
      this.setPref("userChrome.enable.reuse",'bool',!flag);
    },
    onpopup: function(){
      var menu;
      var flag = this.getPref("userChrome.enable.reuse",'bool',true);
      var menuitem = document.getElementById('userChrome_setting');
      menuitem.setAttribute('checked', !flag);
 
      var menupopup = document.getElementById("userChromejs_options");
      for(var i = 5, len = menupopup.childNodes.length; i < len; i++){
        menupopup.removeChild(menupopup.lastChild);
      }
 
      var menuseparator = document.createXULElement('menuseparator');
      menupopup.appendChild(menuseparator);
 
      menuitem = document.createXULElement('menuitem');
      menuitem.setAttribute('label','启用/禁用 UC脚本');
      menuitem.setAttribute('oncommand','userChromejs.chgDirStat("*");');
      menuitem.setAttribute('onclick','userChromejs.clickDirMenuitem(event,true);');
      menuitem.setAttribute('type','checkbox');
      menuitem.setAttribute('checked', !userChrome_js.dirDisable['*']);
      menuitem.dirName = '*';
      menupopup.appendChild(menuitem);
 
      for(var j = 0, lenj = userChrome_js.arrSubdir.length; j < lenj; j++){
        var dirName = userChrome_js.arrSubdir[j] == "" ? "root" : userChrome_js.arrSubdir[j];
        var flg = false;
        for(var i = 0, len = userChrome_js.scripts.length; i < len; i++){
          var script = userChrome_js.scripts[i];
          if(script.dir != dirName) continue;
          flg = true;
          break;
        }
        if(!flg){
          for(var i = 0, len = userChrome_js.overlays.length; i < len; i++){
            var script = userChrome_js.overlays[i];
            if(script.dir != dirName) continue;
            flg = true;
            break;
          }
        }
        if(!flg) continue;
 
 
        menu = document.createXULElement('menu');
        menu.setAttribute('label','chrome/' + (dirName=="root"?"":dirName) );
        menu.setAttribute('onclick','userChromejs.clickDirMenu(event);');
        if(userChrome_js.dirDisable[dirName])
          menu.setAttribute('style', 'font-style:italic;');
        menu.dirName = dirName;
 
        menupopup = document.createXULElement('menupopup');
        menupopup.setAttribute('onpopupshowing','event.stopPropagation();');
 
        menuitem = document.createXULElement('menuitem');
        menuitem.setAttribute('label','启用/禁用 ' + (dirName=="root"?"":dirName) + ' 下所有脚本');
        menuitem.setAttribute('oncommand', 'userChromejs.chgDirStat(this.dirName);');
        menuitem.setAttribute('onclick','userChromejs.clickDirMenuitem(event);');
        menuitem.setAttribute('type', 'checkbox');
        menuitem.setAttribute('checked', !userChrome_js.dirDisable[dirName]);
        menuitem.dirName = dirName;
        menupopup.appendChild(menuitem);
 
        menuseparator = document.createXULElement('menuseparator');
        menupopup.appendChild(menuseparator);
 
        var flg = false;
        for(var i = 0, len = userChrome_js.scripts.length; i < len; i++){
          var script = userChrome_js.scripts[i];
          if(script.dir != dirName) continue;
            flg = true;
            menuitem = document.createXULElement('menuitem');
            menuitem.setAttribute('label',script.filename);
            menuitem.setAttribute('oncommand','userChromejs.chgScriptStat(this.script.filename);');
            menuitem.setAttribute('onclick','userChromejs.clickScriptMenu(event);');
            menuitem.setAttribute('type','checkbox');
            menuitem.setAttribute('autocheck','false');
            menuitem.setAttribute('checked',!userChrome_js.scriptDisable[script.filename] );
            if(script.description)
              menuitem.setAttribute('tooltiptext',script.description);
            menuitem.script = script;
            menupopup.appendChild(menuitem);
        }
        for(var i = 0, len = userChrome_js.overlays.length; i < len; i++){
          var script = userChrome_js.overlays[i];
          if(script.dir != dirName) continue;
            if(flg){
              menuseparator = document.createXULElement('menuseparator');
              menupopup.appendChild(menuseparator);
            }
            flg = false;
            menuitem = document.createXULElement('menuitem');
            menuitem.setAttribute('label',script.filename);
            menuitem.setAttribute('oncommand','userChromejs.chgScriptStat(this.script.filename);');
            menuitem.setAttribute('onclick','userChromejs.clickScriptMenu(event);');
            menuitem.setAttribute('type','checkbox');
            menuitem.setAttribute('autocheck','false');
            menuitem.setAttribute('checked',!userChrome_js.scriptDisable[script.filename] );
            if(script.description)
              menuitem.setAttribute('tooltiptext',script.description);
            menuitem.script = script;
            menupopup.appendChild(menuitem);
        }
        menu.appendChild(menupopup);
        menupopup = document.getElementById("userChromejs_options");
        menupopup.appendChild(menu);
      }
    },
 
    clickDirMenu: function(event){
      if(event.button == 1 || event.button == 2){
        event.stopPropagation();
        event.preventDefault();
        userChromejs.chgDirStat(event.target.dirName);
        if(event.target.firstChild && event.target.firstChild.firstChild)
          event.target.firstChild.firstChild.setAttribute('checked',!userChrome_js.dirDisable[event.target.dirName] );
        if(!!userChrome_js.dirDisable[event.target.dirName])
          event.target.setAttribute('style', 'font-style:italic;');
        else
          event.target.removeAttribute('style');
      }
    },
 
    clickDirMenuitem: function(event,stop){
      if(event.button == 1 || event.button == 2){
        event.stopPropagation();
        event.preventDefault();
        userChromejs.chgDirStat(event.target.dirName);
        event.target.setAttribute('checked',!userChrome_js.dirDisable[event.target.dirName] );
        if(!stop && !!userChrome_js.dirDisable[event.target.dirName])
          event.target.parentNode.parentNode.setAttribute('style', 'font-style:italic;');
        else
          event.target.parentNode.parentNode.removeAttribute('style');
      }
    },
 
    clickScriptMenu: function(event){
      if(event.button==1){
        event.stopPropagation();
        event.preventDefault();
        userChromejs.chgScriptStat(event.target.script.filename);
        event.target.setAttribute('checked',!userChrome_js.scriptDisable[event.target.script.filename] );
      }else if(event.button==2){
        event.stopPropagation();
        event.preventDefault();
        this.launchEditor(event.target.script);
      }
    },
 
    launchEditor: function(aScript){
      var editor = this.editor;
      var UI = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
 
      var platform = window.navigator.platform.toLowerCase();
      if(platform.indexOf('win') > -1){
        UI.charset = 'GB2312';
      }else{
        UI.charset = 'UTF-8';
      }
 
      var path = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService).getProtocolHandler('file').QueryInterface(Components.interfaces.nsIFileProtocolHandler).getFileFromURLSpec(aScript.url).path
      path = UI.ConvertFromUnicode(path);
 
      var appfile = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsIFile);
      appfile.initWithPath(editor);
      var process = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
      process.init(appfile);
      process.run(false, [path], 1, {});
    },
 
    chgDirStat: function(adirName){
      var s = userChromejs.getPref("userChrome.disable.directory", "str", "");
      if(!userChrome_js.dirDisable[adirName]){
        s = (s+',').replace(adirName+',','') + adirName+',';
      }else{
        s = (s+',').replace(adirName+',','');
      }
      s = s.replace(/,,/g,',').replace(/^,/,'');
      userChromejs.setPref("userChrome.disable.directory", "str", s);
      userChrome_js.dirDisable = this.restoreState(s.split(','));
    },
 
    chgScriptStat: function(afilename){
      var s = userChromejs.getPref("userChrome.disable.script", "str", "");
      if(!userChrome_js.scriptDisable[afilename]){
        s = (s+',').replace(afilename+',','') + afilename+',';
      }else{
        s = (s+',').replace(afilename+',','');
      }
      s = s.replace(/,,/g,',').replace(/^,/,'');
      userChromejs.setPref("userChrome.disable.script", "str", s);
      userChrome_js.scriptDisable = this.restoreState(s.split(','));
    },
 
    restoreState: function (arr){
      var disable = [];
      for(var i = 0,len = arr.length; i < len; i++)
        disable[arr[i]] = true;
      return disable;
    },
 
 
    //prefを読み込み
    getPref: function(aPrefString, aPrefType, aDefault){
      var xpPref = Services.prefs;
      try {
        switch (aPrefType){
          case 'complex':
            return xpPref.getComplexValue(aPrefString, Components.interfaces.nsIFile); break;
          case 'str':
            return unescape(xpPref.getCharPref(aPrefString).toString()); break;
          case 'int':
            return xpPref.getIntPref(aPrefString); break;
          case 'bool':
          default:
            return xpPref.getBoolPref(aPrefString); break;
        }
        } catch(e) {}
      return aDefault;
    },
    //prefを書き込み
    setPref: function(aPrefString, aPrefType, aValue){
      var xpPref = Services.prefs;
      try {
        switch (aPrefType){
          case 'complex':
            return xpPref.setComplexValue(aPrefString, Components.interfaces.nsIFile, aValue); break;
          case 'str':
            return xpPref.setCharPref(aPrefString, escape(aValue)); break;
          case 'int':
            aValue = parseInt(aValue);
            return xpPref.setIntPref(aPrefString, aValue);  break;
          case 'bool':
          default:
            return xpPref.setBoolPref(aPrefString, aValue); break;
        }
        } catch(e) {}
      return null;
    },
    // 監視を開始する
    addPrefListener: function(aObserver) {
        try {
            var pbi = Services.prefs;
            pbi.addObserver(aObserver.domain, aObserver, false);
        } catch(e) {}
    },
 
    // 監視を終了する
    removePrefListener: function(aObserver) {
        try {
            var pbi =  Services.prefs;
            pbi.removeObserver(aObserver.domain, aObserver);
        } catch(e) {}
    },
 
    readLaterPrefListener:{
        domain  : 'userChrome.disable',
            //"userChrome.disable"という名前の設定が変更された場合全てで処理を行う
 
        observe : function(aSubject, aTopic, aPrefstring) {
            if (aTopic == 'nsPref:changed') {
                // 設定が変更された時の処理
                setTimeout(function(){
                  var s = userChromejs.getPref("userChrome.disable.directory", "str", "");
                  userChrome_js.dirDisable = userChromejs.restoreState(s.split(','));
                  s = userChromejs.getPref("userChrome.disable.script", "str", "");
                  userChrome_js.scriptDisable = userChromejs.restoreState(s.split(','));
                }, 0);
            }
        }
    },
 
    restartApp: function() {
      if ("BrowserUtils" in window && typeof BrowserUtils.restartApplication == "function") {
        Components.classes["@mozilla.org/xre/app-info;1"]
                  .getService(Components.interfaces.nsIXULRuntime).invalidateCachesOnRestart();
        BrowserUtils.restartApplication();
        return;
      }
 
      const appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
                        .getService(Components.interfaces.nsIAppStartup);
 
      // Notify all windows that an application quit has been requested.
      var os = Components.classes["@mozilla.org/observer-service;1"]
                         .getService(Components.interfaces.nsIObserverService);
      var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"]
                                 .createInstance(Components.interfaces.nsISupportsPRBool);
      os.notifyObservers(cancelQuit, "quit-application-requested", null);
 
      // Something aborted the quit process.
      if (cancelQuit.data)
        return;
 
      // Notify all windows that an application quit has been granted.
      os.notifyObservers(null, "quit-application-granted", null);
 
      // Enumerate all windows and call shutdown handlers
      var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                         .getService(Components.interfaces.nsIWindowMediator);
      var windows = wm.getEnumerator(null);
      var win;
      while (windows.hasMoreElements()) {
        win = windows.getNext();
        if (("tryToClose" in win) && !win.tryToClose())
          return;
      }
      let XRE = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
      if (typeof XRE.invalidateCachesOnRestart == "function")
        XRE.invalidateCachesOnRestart();
      appStartup.quit(appStartup.eRestart | appStartup.eAttemptQuit);
    }
  }
  userChromejs.init();
 
  //メニューが長くなりすぎるので, あまり使わないメニューを"userChrome.jsの各スクリプトの設定"の下に移動させる
  var userChromejsScriptOptionsMenu = {
    //あまり使わないメニューのリスト
    menues: movedMenus,
    interval: 500, //0.5秒間隔
    maxcount: 50,   //最大50回までトライ
    count: 0,
    timer: null,
 
    run: function() {
      //DOMの構築が完了するのを待ってからメニューを移動させる(5秒間隔で最大50回までトライ)
      this.timer = setInterval(function(self){
        if (++self.count > self.maxcount || self.moveMenu())
          clearInterval(self.timer);
      }, this.interval, this);
    },
 
    moveMenu: function(){
      var menupopup = document.getElementById('userChromejs_script_options');
      if (!menupopup)
        return false;
      var i = 0;
      while (i < this.menues.length) {
        var menu = document.getElementById(this.menues[i])
        if (menu) {
          setTimeout(function(menupopup, menu){menupopup.appendChild(menu);}, 100, menupopup, menu);
          this.menues.splice(i, 1);
          continue;
        }
        i++;
      }
      return this.menues.length == 0 ? true : false;
    },
  }
  userChromejsScriptOptionsMenu.run();
lonely_8
非常火狐
非常火狐
  • UID30273
  • 注册日期2009-09-03
  • 最后登录2022-08-09
  • 发帖数733
  • 经验469枚
  • 威望0点
  • 贡献值86点
  • 好评度147点
  • 社区居民
  • 忠实会员
28楼#
发布于:2019-05-22 17:05
333ywb:麻烦了你下午,真的是太感谢了,现在我自己修改了好多,基本就剩下两个脚本了,在麻烦帮我看看这是第一个
这个脚本可以加载,但是功能不完整了,右键点击图标不起作用了。在麻烦看看
// ==UserScript==
// @Name        ...
回到原帖
1、createElement 改为 createXULElement
2、31-32行间加上一行 uCTBtn.menupopup = uCTBtn.firstElementChild;
333ywb
火狐狸
火狐狸
  • UID27284
  • 注册日期2008-12-03
  • 最后登录2024-05-11
  • 发帖数119
  • 经验134枚
  • 威望0点
  • 贡献值140点
  • 好评度4点
  • 社区居民
  • 忠实会员
29楼#
发布于:2019-05-22 17:10
lonely_8:1、createElement 改为 createXULElement
2、31-32行间加上一行 uCTBtn.menupopup = uCTBtn.firstElementChild;
回到原帖
谢谢大神,这个脚本可以用了。
游客

返回顶部