1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. bege

Beiträge von bege

  • Wie ein unsigniertes, nicht mehr gewartetes Add-on retten?

    • bege
    • 11. Dezember 2015 um 09:46

    Hallo,
    ich nutze mit Classic Theme Restorer das alte Suchfenster und dafür das Add-on Organise Search Engines. Es ist nicht signiert und wird nicht mehr gewartet (ist ganz aus AMO verschwunden).
    Beim Versuch, es für den Eigengebrauch selbst signieren zu lassen, wird es mit folgenden Warnungen abgelehnt:

    • on* attribute being set using setAttribute
    • Access to the `eval` global
    • Access to the `Function` global
    • Assignment of unwrapped JS Object's properties


    Da ich nicht JS programmieren kann, habe ich selbst keine Chance. Gibt es noch irgend eine Chance, das Add-on für den Eigengebrauch signieren zu lassen? Oder weiß jemand ein entsprechendes Add-on? Ich habe keines gefunden.
    Danke.
    Gruß
    bege

  • userChrome.js Scripte für den Fuchs (Diskussion)

    • bege
    • 5. September 2015 um 15:26
    Zitat von Mithrandir

    Hallo Endor, Hallo aborix,

    alle Updates sind jetzt auf Github, auch das neueste "openbookModoki".

    Vielen Dank an euch drei!

  • userChrome.js Scripte für den Fuchs (Diskussion)

    • bege
    • 2. September 2015 um 19:07

    OpenBookModoki geht bei mir seit FF 40 nicht mehr. Beim Klick auf den Stern-Button passiert nichts. Ist das Skript deaktiviert, öffnet sich das Standard-Fenster zum Editieren. Ist das bei euch auch so?

  • Add-ons müssen signiert sein

    • bege
    • 29. Mai 2015 um 17:51

    Danke für die Hinweise zur Signierung der Add-ons. Ich habe mich schon lange gefragt, wie ich mich vor unsicheren Add-ons schützen kann. Bisher nur nach dem Prinzip Hoffnung. Dass alte oder geänderte Add-ons mit der Signierung über einen eigenen AMO-Account weiter genutzt werden können, beruhigt mich und ist für mich zumutbar. In diesem Falle halte ich die Änderung für sinnvoll und akzeptabel, anders als die Änderungen, die nur durch CTR wieder rückgängig gemacht werden können. Da habe ich mich als User, der sich auch hier öfter tummelt, schikaniert und gemaßregelt gefühlt.

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 7. Mai 2015 um 16:48
    Zitat von Endor

    Hallo bege.
    Bitte mal testen:
    http://dl.dropbox.com/u/15467633/Fir…panel_1.3.uc.js

    Diese Version funktioniert bei mir.
    Wenn sie bei Dir auch funktioniert, bitte ich Mithrandir diese Version hoch zu laden.
    Habe gerade gesehen, das ist ja genau die selbe Version wie bei Github. :-??
    Wie gesagt, die funktioniert hier einwandfrei.
    Mfg.
    Endor

    Alles anzeigen

    Jetzt weiß ich auch, warum das Panel für dieses Skript bei mir nicht angezeigt wurde. Was ist denn "base64_Btn" in Zeile 44? Das gibt es in meiner Adressleiste nicht. Setze ich dort ein existierendes Icon ein, wird das Zoom-Panel angezeigt.

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 7. Mai 2015 um 16:30

    Klappt wunderbar, Endor. Da das Panel in den Addon-Leisten, wenn die Zuordnung "insert.Before" nicht passt, einfach am Ende platziert wird, dachte ich, das müsste in der Adressleiste auch so sein. Ist wohl nicht so. Jetzt wird es bei mir an allen Positionen korrekt angezeigt.
    Danke für die Anpassung.
    Gruß
    bege

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 7. Mai 2015 um 15:13

    Hallo,

    kleiner Fehler in MemoryMonitorMod Zeile 28:
    Die ID für die CTR-Addon-bar heißt schon lange "ctraddon_addon-bar"

    Kleine Fußangel in den Zeilen 27 und 28:
    Wenn man eine Zeile einkommentiert und den Kommentar am Zeilenende übersieht, geht's nicht. Deshalb besser, wie in Zeile 25, den Kommentar auch hier auskommentieren.

    (Die Position in der Adressleiste wird bei mir nicht angezeigt, aber da verschwindet bei mir noch anderes, deshalb kann es an meinem Profil liegen.)

    Gruß
    bege

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 5. Mai 2015 um 18:26
    Zitat von Endor

    Hallo bege.
    Bitte mal testen:
    http://dl.dropbox.com/u/15467633/Fir…panel_1.3.uc.js

    Diese Version funktioniert bei mir.
    Wenn sie bei Dir auch funktioniert, bitte ich Mithrandir diese Version hoch zu laden.
    Habe gerade gesehen, das ist ja genau die selbe Version wie bei Github. :-??
    Wie gesagt, die funktioniert hier einwandfrei.
    Mfg.
    Endor

    Alles anzeigen


    Danke Endor. Ich hatte vorsichtshalber nochmal die Version von Github heruntergeladen. Dann liegt es also an etwas anderem und die Sucherei beginnt :traurig:

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 5. Mai 2015 um 11:07

    Das Skript statusbarzoompanel tut bei mir schon länger nichts mehr. Kann das jemand bestätigen, oder läuft es bei euch?

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 4. Mai 2015 um 15:48

    Da das Forum keinen Danke-Button hat, auch von mir ein großes Dankeschön per Post.
    :):D:klasse:

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 26. April 2015 um 17:08
    Zitat von Endor

    Hallo zusammen.
    Technisches Update für das Script UserScriptloader.uc.js.
    Es wurden einige Anpassungen gemacht, damit es wieder geschmeidig funktioniert. :wink:


    Vielen Dank für die Aktualisierung.
    Bitte, könntet ihr noch die Option einfügen, dass der Button in der Toolbar landet? Ich hatte das bei mir mit aborix' Hilfe eingebaut. Dann bräuchte ich das bei Updates nicht wieder einfügen und müsste nur die Auskommentierung ändern. Der Abschnitt sieht dann so aus (die Auskommentierung ist hier für den Toolbar-Button gesetzt).

    Code
    USL.init = function(){
    	USL.loadSetting();
    	USL.style = addStyle(css);
    
    
    	   USL.icon = document.createElement('toolbarbutton');
           USL.icon.id = 'UserScriptLoader-icon';
           USL.icon.className = 'toolbarbutton-1 chromeclass-toolbar-additional';
           USL.icon.setAttribute('context', 'UserScriptLoader-popup');
           USL.icon.setAttribute('onclick', 'USL.iconClick(event)');
    	   USL.icon.setAttribute('label', '    UserScriptLoader');
    	   USL.icon.style.padding = '0px 2px';
    
    
           document.getElementById('navigator-toolbox').palette.appendChild(USL.icon);
    
    
           var toolbars = Array.slice(document.querySelectorAll('toolbar'));
           for (var i=0; i<toolbars.length; i++) {         
              var currentset = toolbars[i].getAttribute('currentset');     
              if (currentset.split(',').indexOf(USL.icon.id) >= 0) {     
                 var j;
                 if (i == 0) j = 1
                 else j = 0;         
                 toolbars[j].currentSet += ',' + USL.icon.id;         
                 toolbars[i].currentSet = currentset;     
              };     
           };
    
    /*
    	USL.icon = $('status-bar').appendChild($C("statusbarpanel", {
    		id: "UserScriptLoader-icon",
    		class: "statusbarpanel-iconic",
    		context: "UserScriptLoader-popup",
    		onclick: "USL.iconClick(event);"
    	}));
    
    
    	USL.icon = $('urlbar-icons').appendChild($C("image", {
    		id: "UserScriptLoader-icon",
    		context: "UserScriptLoader-popup",
    		onclick: "USL.iconClick(event);",
    		style: "padding: 0px 2px;",
    	}));
    */
    Alles anzeigen


    Oder lässt sich die Auswahl, welcher Button verwendet wird, vielleicht mit einer Variable am Anfang setzen?

    Außerdem habe ich diese Tooltip-Texte:

    Code
    var DISABLED = true;
    USL.__defineGetter__("disabled", function() DISABLED);
    USL.__defineSetter__("disabled", function(bool){
    	if (bool) {
    		this.icon.setAttribute("state", "disable");
    	  // gBrowser.mPanelContainer.removeEventListener("DOMWindowCreated", this, false);
    		this.icon.setAttribute("tooltiptext", "inaktiv: Linksclick aktiviert, Rechtsclick Menü");
    	} else {
    		this.icon.setAttribute("state", "enable");
    	  // gBrowser.mPanelContainer.addEventListener("DOMWindowCreated", this, false);
    		this.icon.setAttribute("tooltiptext", "aktiv: Linksclick deaktiviert, Rechtsclick Menü");
    	}
    	return DISABLED = bool;
    });
    Alles anzeigen


    Könntet ihr die mit ins Skript aufnehmen?

    Mit diesen Änderungen funktioniert das Skript bei mir, sollte also keine Fehler enthalten.
    Vielen Dank.

    Hier ist die ganze Datei zum Download
    UserScriptLoader.uc.js.txt

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 12. März 2015 um 19:25
    Zitat von Mithrandir

    SaveUserChromeJS.uc.js wurde aktualisiert mit Übersetzung hochgeladen. Ich habe noch ein bis vier Änderungen vorgenommen, s. z.B. Access-Keys in showInstallMessage und Kommentar in Zeile 212.

    Linksklick auf "Installieren" geht bei mir nicht. Geht das bei jemand anders?

    Hier noch Übersetzungsvorschläge für die Einstellungsoptionen:
    Zeile 14:

    Code
    Standard: "true". Nach dem Speichern wird gefragt, ob ein Neustart durchgeführt werden soll.


    Zeile 17:

    Code
    Standard: "false". Die erfolgreiche Speicherung wird angezeigt und gefragt, ob ein Neustart durchgeführt werden soll. Wird diese Option auf "true" gesetzt, werden nach dem Speichern zwei Möglichkeiten angezeigt: Neustart oder Weitermachen ohne Neustart (nur bei uc.js-Skripten). Ohne Neustart können Skripte unter Umständen nicht funktionieren.


    Zitat von Mithrandir


    BTW: die Codes hier im Forum sind doof, um sie ins GitHub zu übernehmen. Die führenden Leerzeichen in jeder Zeile würden zu schlechten Ergebnissen in den diff-Ansichten führen (jede Zeile wäre geändert). Deshalb bitte immer irgendwo hochladen, sodass die Dateien nicht aufgebläht werden.

    Ich nehme mir vor, dran zu denken.

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 10. März 2015 um 18:09
    Zitat von aborix

    http://www.xup.in/dl,15722903/SaveUserChromeJS_0.4.uc.js/

    Übersetzung ins Deutsche ist noch nicht enthalten.

    Funktioniert mit Rechtsklick auf die Buttons (Kontextmenü) und über "Raw". Sogar der Neustart geht, der bei mir seit einer Weile nicht mehr ging.
    Danke, aborix :)

    Mit Linksklick auf den Installieren-Button ging es bei mir nur ein mal, nach Neustart nicht mehr.

    Hier mit Übersetzung.
    In der alten Übersetzung war ein Fehler "(mit Neustart)". Die Meldung wird aber angezeigt, wenn am Anfang des Skripts "runWithoutRestart" auf "true" gesetzt wird. Im Japanischen ist dann noch eine Erklärung, dass ein Neustart ausgeführt werden soll, falls das Skript nicht richtig funktioniert. Das passt im Deutschen aber nicht in die Schaltfläche, ist viel zu lang. Deshalb habe ich nur "(ohne Neustart)" übersetzt.
    Diese Option sollte auf der github-Seite vielleicht noch erklärt werden.

    Code
    // ==UserScript==
    // @name           SaveUserChromeJS.uc.js
    // @author         ywzhaiqi
    // @description    像 Greasemonkey 一样保存 uc脚本
    // @include        main
    // @charset        UTF-8
    // @version        0.4
    // @homepageURL    https://github.com/ywzhaiqi/userChromeJS/tree/master/SaveUserChromeJS
    // @reviewURL      http://bbs.kafan.cn/thread-1590873-1-1.html
    // ==/UserScript==
    
    
    (function() {
    
    
    // 保存完毕是否启用通知?
    var notificationsAfterInstall = true;
    
    
    // 保存完毕是否加载脚本(无需启动)?仅支持 .uc.js,一些脚本有问题。
    var runWithoutRestart = false;
    
    
    
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    if (!window.Services) Cu.import("resource://gre/modules/Services.jsm");
    
    
    if(typeof window.saveUserChromeJS != "undefined"){
    	window.saveUserChromeJS.uninit();
    	delete window.saveUserChromeJS;
    }
    
    
    const RE_USERCHROME_JS = /\.uc(?:-\d+)?\.(?:js|xul)$|userChrome\.js$/i;
    const RE_CONTENTTYPE = /text\/html/i;
    
    
    var ns = window.saveUserChromeJS = {
    	_menuitem: null,
    	get SCRIPTS_FOLDER() {
    		delete this.SCRIPTS_FOLDER;
    		return this.SCRIPTS_FOLDER = Services.dirsvc.get("UChrm", Ci.nsILocalFile);
    	},
    
    
    	init: function() {
    		Services.obs.addObserver(this, "content-document-global-created", false);
    
    
            // add contentAreaContextMenu
            var contextMenu = $("contentAreaContextMenu");
            var menuitem = this.createMenuitem();
    		contextMenu.insertBefore(menuitem, contextMenu.firstChild);
    		contextMenu.addEventListener("popupshowing", this, false);
    
    
            this._menuitem = menuitem;
    	},
    	uninit: function(){
    		Services.obs.removeObserver(this, "content-document-global-created");
    
    
            if(this._menuitem){
                this._menuitem.parentNode.removeChild(this._menuitem);
            }
    
    
            $("contentAreaContextMenu").removeEventListener("popupshowing", this, false);
    	},
    	handleEvent: function(event){
    		switch(event.type){
    			case "popupshowing":
    				if (event.target != event.currentTarget) return;
    				if(gContextMenu.onLink){
    					this._menuitem.hidden = !RE_USERCHROME_JS.test(gContextMenu.linkURL);
    				}else{
    					this._menuitem.hidden = true;
    				}
    				break;
    		}
    	},
    	observe: function(aSubject, aTopic, aData) {
    		switch (aTopic) {
    			case "content-document-global-created":
    				let safeWin = aSubject;
    				let chromeWin = this.getBrowserForContentWindow(safeWin).wrappedJSObject;
    				if (!chromeWin) return;
    
    
    				let gBrowser = chromeWin.gBrowser;
    				if (!gBrowser) return;
    
    
                    let lhref = safeWin.location.href;
                    if(lhref.startsWith("view-source")) return;
    
    
    				// Show the scriptish install banner if the user is navigating to a .user.js
    				// file in a top-level tab.
    				if (safeWin === safeWin.top && RE_USERCHROME_JS.test(lhref) && !RE_CONTENTTYPE.test(safeWin.document.contentType)) {
                        safeWin.setTimeout(function(){
    						ns.showInstallBanner(gBrowser.getBrowserForDocument(safeWin.document));
    					}, 500);
    				}
    
    
                    if(safeWin.location.hostname == 'github.com'){
                        safeWin.addEventListener("DOMContentLoaded", function(){
                            ns.github_addButton(safeWin.document);
    
    
                            // github 用了 history.pushstate, 需要加载页面后重新添加按钮
                            // 2014-7-15:firefox 33(nightly)如果引用了 unsafeWindow.$ 就会崩溃
                            // 详见 http://tieba.baidu.com/f?ct=335675392&tn=baiduPostBrowser&z=3162087505&sc=53663075812#53663075812
                            if (Services.appinfo.version < 33) {
                                ns.github_addListener(safeWin);
                            }
                        }, false);
                    }
    
    
    				break;
    		}
    	},
    	createMenuitem: function(){
    		var menuitem = $C("menuitem", {
    			id: "uc-install-menu",
    			label: "Installieren für userChromeJS...",
    			accessKey: "I",
    			oncommand: "saveUserChromeJS.saveScript(gContextMenu.linkURL)"
    		});
    
    
    		return menuitem;
    	},
    	showInstallBanner: function(browser) {
    		var notificationBox = gBrowser.getNotificationBox(browser);
    		var greeting = "Das ist ein userChrome Script. Klicken Sie auf Installieren, um es zu verwenden. Nach dem Speichern im Chrome Ordner bitte einen Neustart durchführen.";
    		var btnLabel = "Installieren";
    
    
    		// Remove existing notifications. Notifications get removed
    		// automatically onclick and on page navigation, but we need to remove
    		// them ourselves in the case of reload, or they stack up.
    		for (var i = 0, child; child = notificationBox.childNodes[i]; i++)
    			if (child.getAttribute("value") == "install-userChromeJS")
    				notificationBox.removeNotification(child);
    
    
    		var notification = notificationBox.appendNotification(
    			greeting,
    			"install-userChromeJS",
    			null,
    			notificationBox.PRIORITY_WARNING_MEDIUM, [{
    				label: btnLabel,
    				accessKey: "I",
    				popup: null,
    				callback: this.saveCurrentScript
    			}
    		]);
    	},
    	github_addButton: function(doc){
    		if(doc.getElementById("uc-install-button")) return;
    
    
    		var rawBtn = doc.getElementById("raw-url");
    		if(!rawBtn) return;
    
    
    		var downURL = rawBtn.href;
    		if(!RE_USERCHROME_JS.test(downURL)) return;
    
    
    		var installBtn = doc.createElement("a");
    		installBtn.setAttribute("id", "uc-install-button");
    		installBtn.setAttribute("class", "minibutton");
    		installBtn.setAttribute("href", downURL);
    		installBtn.innerHTML = "Installieren";
    		installBtn.addEventListener("click", function(event){
    			event.preventDefault();
    			ns.saveScript(downURL);
    		}, false);
    
    
    		rawBtn.parentNode.insertBefore(installBtn, rawBtn);
    	},
        github_addListener: function(win){
            var script = '\
                (function(){\
                    var $ = unsafeWindow.jQuery;\
                    if(!$) return;\
                    $(document).on("pjax:success", function(){\
                        github_addButton(document);\
                    });\
                })();\
            ';
            let sandbox = new Cu.Sandbox(win, {sandboxPrototype: win});
            sandbox.unsafeWindow = win.wrappedJSObject;
            sandbox.document     = win.document;
            sandbox.window       = win;
            sandbox.github_addButton = ns.github_addButton;
            Cu.evalInSandbox(script, sandbox);
        },
    	saveCurrentScript: function(event){
    		ns.saveScript();
    	},
    	saveScript: function(url) {
            var win = ns.getFocusedWindow();
    
    
    		var doc, name, fileName, fileExt, charset;
    		if(!url){
    			url = win.location.href;
    			doc = win.document;
    			name = doc.body.textContent.match(/\/\/\s*@name\s+(.*)/i);
    			charset = doc.body.textContent.match(/\/\/\s*@charset\s+(.*)/i);
    		}else{
                if(url.match(/^https?:\/\/github\.com\/\w+\/\w+\/blob\//)){
                    url = url.replace("/blob/", "/raw/");
                }
            }
    
    
    		name = name && name[1] ? name[1] : decodeURIComponent(url.split("/").pop());
            fileName = name.replace(/\.uc\.(js|xul)$|$/i, ".uc.$1").replace(/\s/g, '_');
            if (fileName.match(/\.uc\.$/i)) {  // 对名字进行修正
                var m = url.match(/\.(js|xul)$/);
                if (m)
                    fileName += m[1];
            }
    		fileExt = name.match(/\.uc\.(js|xul)$/i);
            fileExt = fileExt && fileExt[1] ? fileExt[1] : "js";
            charset = charset && charset[1] ? charset[1] : "UTF-8";
    
    
    		// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Tutorial/Open_and_Save_Dialogs
    		var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
    		fp.init(window, "", Ci.nsIFilePicker.modeSave);
    		fp.appendFilter("*." + fileExt, "*.uc.js;*.uc.xul");
    		fp.appendFilters(Ci.nsIFilePicker.filterAll);
    		fp.displayDirectory = ns.SCRIPTS_FOLDER; // nsILocalFile
    		fp.defaultExtension = fileExt;
    		fp.defaultString = fileName;
    		var callbackObj = {
    			done: function(res) {
    				if (res != fp.returnOK && res != fp.returnReplace) return;
    
    
                    var persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Ci.nsIWebBrowserPersist);
                    persist.persistFlags = persist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
    
    
                    var obj_URI;
                    if(doc && fileExt != 'xul'){
                        obj_URI = doc.documentURIObject;
                    }else{
                        obj_URI = Services.io.newURI(url, null, null);
                    }
    
    
                    if(notificationsAfterInstall){
                        persist.progressListener = {
                            onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {
                                if(aCurSelfProgress == aMaxSelfProgress){
                                    setTimeout(function(){
                                        ns.showInstallMessage({
                                            fileExt: fileExt,
                                            fileName: fileName,
                                            file: fp.file,
                                            charset: charset
                                        });
                                    }, 100);
                                }
                            },
                            onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) { }
                        };
                    }
    
    
                    persist.saveURI(obj_URI, null, null, null, null, "", fp.file, null);
    			}
    		};
    		fp.open(callbackObj);
    	},
        showInstallMessage: function(info){
            var isRun = (info.fileExt == "js");
    
    
            var mainAction, secondActions;
            if(runWithoutRestart && isRun){
                mainAction = {
                    label: "Sofort ausführen (ohne Neustart).",
                    accessKey: "R",
                    callback: function(){
                        ns.runScript(info.file, info.charset);
                    }
                };
                secondActions = [{
                    label: "Jetzt neu starten",
                    accessKey: "R",
                    callback: ns.restartApp
                }];
            }else{
                mainAction = {
                    label: "Jetzt neu starten",
                    accessKey: "R",
                    callback: ns.restartApp
                };
                secondActions = null;
            }
    
    
            var showedMsg = ns.popupNotification({
                id: "userchromejs-install-popup-notification",
                message: "'" + info.fileName + "' Die Installation ist abgeschlossen.",
                mainAction: mainAction,
                secondActions: secondActions,
                options: {
                    removeOnDismissal: true,
                    persistWhileVisible: true
                }
            });
        },
        popupNotification: function(details){
            var win = ns.getMostRecentWindow();
            if (win && win.PopupNotifications) {
                win.PopupNotifications.show(
                    win.gBrowser.selectedBrowser,
                    details.id,
                    details.message,
                    "",
                    details.mainAction,
                    details.secondActions,
                    details.options);
                return true;
            }
    
    
            return false;
        },
        // 只支持 us.js
        runScript: function(file, charset){
            window.userChrome_js.getScripts();
            if(window.userChromeManager){
                window.userChromeManager.rebuildScripts();
            }
    
    
            var dir = file.parent.leafName;
            if(dir.toLowerCase() == 'chrome' || (dir in window.userChrome_js.arrSubdir)){
    
    
                let context = {};
                Services.scriptloader.loadSubScript( "file:" + file.path, context, charset || "UTF-8");
            }
        },
        flushCache: function (file) {
            if (file)
                 Services.obs.notifyObservers(file, "flush-cache-entry", "");
            else
                 Services.obs.notifyObservers(null, "startupcache-invalidate", "");
        },
    	getFocusedWindow: function() {
    		var win = document.commandDispatcher.focusedWindow;
    		return (!win || win == window) ? content : win;
    	},
    	getMostRecentWindow: function(){
    		return Services.wm.getMostRecentWindow("navigator:browser")
    	},
    	getBrowserForContentWindow: function(aContentWindow) {
    	  return aContentWindow
    	      .QueryInterface(Ci.nsIInterfaceRequestor)
    	      .getInterface(Ci.nsIWebNavigation)
    	      .QueryInterface(Ci.nsIDocShellTreeItem)
    	      .rootTreeItem
    	      .QueryInterface(Ci.nsIInterfaceRequestor)
    	      .getInterface(Ci.nsIDOMWindow)
    	      .QueryInterface(Ci.nsIDOMChromeWindow);
    	},
        restartApp: function() {
            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);
        }
    };
    
    
    
    
    function $(id) document.getElementById(id);
    function $C(name, attr) {
    	var el = document.createElement(name);
    	if (attr) Object.keys(attr).forEach(function(n) el.setAttribute(n, attr[n]));
    	return el;
    }
    
    
    function log(arg) Application.console.log("[SaveUserChromeJS]" + arg);
    
    
    function checkDoc(doc) {
    	if (!(doc instanceof HTMLDocument)) return false;
    	if (!window.mimeTypeIsTextBased(doc.contentType)) return false;
    	if (!doc.body || !doc.body.hasChildNodes()) return false;
    	if (doc.body instanceof HTMLFrameSetElement) return false;
    	return true;
    }
    
    
    
    
    })();
    
    
    
    
    window.saveUserChromeJS.init();
    Alles anzeigen
  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 7. März 2015 um 13:39

    Hallo,
    das Skript Save UserChromeJS funktionierte lange gut. Jetzt speichert es bei mir das angezeigte Skript nicht mehr. Es wird die Hinweiszeile am oberen Seitenrand angezeigt, beim klicken auf den Button öffnet sich auch das Windows-Fenster zum Speichern der Datei, aber das Skript wird nicht gespeichert - nix und nirgendwo.

    (Fx 36.0.1)

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 7. März 2015 um 13:32
    Zitat von Endor

    Da ist nicht die neueste Version.
    Aktuelle wäre Version 0.0.9

    Hier das Script mit integrierter Änderung von aborix:
    ...

    Diese Version hat auch einen frei plazierbaren Button.

    Mfg.
    Endor

    Hallo,
    diese Version aus #2680, jetzt auch auf Github, zeigt bei mir überhaupt keinen Button, weder fest noch verschiebbar. Wie ist das bei euch?
    Die von mir gepostete Version aus #2679 funktioniert problemlos.
    Weiß jemand, woran das liegt?

    (Fx 36.0.1)

  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 2. März 2015 um 16:23
    Zitat von aborix

    In Word Highlight Toolbar ist in Fx 36 der Button im deaktivierten Zustand unsichtbar.

    Ändert man Zeile 1062 wie folgt, ist er wieder sichtbar: ...

    Hallo,
    die Skript-Version, die aktuell auf Github ist, funktioniert bei mir gar nicht. Ich habe diesen Code, bei dem der Button verschiebbar ist. Ich weiß nicht mehr, woher ich den habe, vermutlich irgendwann mit aborix' Hilfe zusammengebastelt.
    Die neueste Änderung ist eingebaut.
    Bei mir (Fx 36.0) funktioniert er. Mag es noch jemand testen?
    (Versionsnummer, Name eventuell noch ändern)

    CSS
    // ==UserScript==
    // @name           WordHighlightToolbar.uc.js
    // @description    word highlight toolbar.
    // @namespace      http://d.hatena.ne.jp/Griever/
    // @author         Griever
    // @license        MIT License
    // @compatibility  Firefox 17
    // @charset        UTF-8
    // @include        main
    // @version        0.0.8
    // @note           0.0.8 Firefox 25 でエラーが出ていたのを修正
    // @note           0.0.7 ツールバーが自動で消えないことがあったのを修正
    // @note           0.0.6 アイコンを作って検索時の強調を ON/OFF できるようにした
    // @note           0.0.6 背面のタブを複数開いた際の引き継ぎを修正
    // @note           0.0.5 大幅に変更(変更し過ぎてどこを変更したのかすら忘れた)
    // @note           0.0.5 外部からイベントでハイライトできるようにした
    // @note           0.0.5 "戻る"動作にツールバーが連動するようにした
    // @note           0.0.5 色を選んで強調できるようにしてみた
    // @note           0.0.5 ツールバーが無駄にスペースをとる場合があるのを修正
    // @note           0.0.5
    // ==/UserScript==
    
    
    (function(CSS){
    "use strict";
    
    
    if (window.gWHT) {
    	window.gWHT.destroy();
    	delete window.gWHT;
    }
    
    
    
    
    const UID = Math.random().toString(36).slice(-8);
    const PREFIX = 'wordhighlight-toolbar-';
    const CLASS_ICON  = PREFIX + 'icon';
    const CLASS_ITEM  = PREFIX + 'item';
    const CLASS_SPAN  = PREFIX + 'span';
    const CLASS_INDEX = PREFIX + 'index';
    const EVENT_RESPONSE = 'RESPONSE_' + UID;
    
    
    var GET_KEYWORD = true;
    var wmap = new WeakMap();
    
    
    window.gWHT = {
    	DEBUG: false,
    	SITEINFO: [
    		/**
    			url     URL。正規表現。keyword, input が無い場合は $1 がキーワードになる。
    			keyword キーワード。スペース区切り。省略可。
    			input   検索ボックスの CSS Selector。
    		**/
    		{
    			url: '.*\\btbm=isch\\b.*',
    			keyword: ' '
    		},
    		{
    			url: '^https?://\\w+\\.google\\.[a-z.]+/search',
    			input: 'input[name="q"]'
    		},
    		{
    			url: '^http?://[\\w.]+\\.yahoo\\.co\\.jp/search',
    			input: 'input[name="p"]'
    		},
    		{
    			url: '^https?://\\w+\\.bing\\.com/search',
    			input: 'input[name="q"]'
    		},
    		{
    			url: '^http://[\\w.]+\\.nicovideo\\.jp/(?:search|tag)/.*',
    			input: '#search_united, #bar_search'
    		},
    //		{// MICROFORMAT
    //			url: '^https?://.*[?&](?:q|word|keyword|search|query|search_query)=([^&]+)',
    //			input: 'input[type="text"]:-moz-any([name="q"],[name="word"],[name="keyword"],[name="search"],[name="query"],[name="search_query"]), input[type="search"]'
    //		},
    	],
    
    
    	FIND_FOUND   : 0,
    	FIND_NOTFOUND: 1,
    	FIND_WRAPPED : 2,
    	sound: Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound),
    	getWins: getWins,
    	checkDoc: checkDoc,
    	getFocusedWindow: getFocusedWindow,
    	getRangeAll: getRangeAll,
    	wmap:wmap,
    	tabhistory: {},
    	get prefs() {
    		delete this.prefs;
    		return this.prefs = Services.prefs.getBranch("WordHighlightToolbar.");
    	},
    	get GET_KEYWORD() GET_KEYWORD,
    	set GET_KEYWORD(bool) {
    		bool = !!bool;
    		var icon = $(PREFIX + "icon");
    		if (icon) {
    			icon.setAttribute("state", bool ? "Aktiviert" : "Deaktiviert");
    			icon.setAttribute("tooltiptext", bool ? "Aktiviert" : "Deaktiviert");
    		}
    		return GET_KEYWORD = bool;
    	},
    
    
    	init: function() {
    		this.xulstyle = addStyle(CSS);
    
    
    		var icon = document.createElement('toolbarbutton');
           icon.id = 'wordhighlight-toolbar-icon';
           icon.className = 'toolbarbutton-1 chromeclass-toolbar-additional';
           icon.setAttribute('context', '');
           icon.setAttribute('onclick', 'gWHT.GET_KEYWORD = !gWHT.GET_KEYWORD');
           icon.style.padding = '0px 2px';
    
    
           document.getElementById('navigator-toolbox').palette.appendChild(icon);
    
    
           var toolbars = Array.slice(document.querySelectorAll('toolbar'));
           for (var i=0; i<toolbars.length; i++) {         
              var currentset = toolbars[i].getAttribute('currentset');     
              if (currentset.split(',').indexOf(icon.id) >= 0) {     
                 var j;
                 if (i == 0) j = 1
                 else j = 0;         
                 toolbars[j].currentSet += ',' + icon.id;         
                 toolbars[i].currentSet = currentset;     
              };     
           };
    
    
    		var bb = document.getElementById("appcontent");
    		var container = bb.appendChild(document.createElement("hbox"));
    		container.setAttribute("id", PREFIX + "box");
    		container.setAttribute("style", "max-height: 23px;");
    		//container.setAttribute("ordinal", "0");
    		this.container = container;
    
    
    		var sep = document.getElementById("context-viewpartialsource-selection");
    		var menu = sep.parentNode.insertBefore(document.createElement("menu"), sep);
    		menu.setAttribute("label", "Hervorheben");
    		menu.setAttribute("id", PREFIX + "highlight");
    		menu.setAttribute("class", CLASS_ICON + " menu-iconic");
    		menu.setAttribute("accesskey", "H");
    		menu.setAttribute("onclick", "\
    			if (event.target != this) return;\
    			closeMenus(this);\
    			if (event.button === 0) gWHT.highlightWord();\
    			else if (event.button === 1) gWHT.highlightWordAuto();\
    		");
    		var menupopup = menu.appendChild(document.createElement("menupopup"));
    
    
    		var menuitem = menupopup.appendChild(document.createElement("menuitem"));
    		menuitem.setAttribute("class", CLASS_ICON + " menuitem-iconic");
    		menuitem.setAttribute("label", "Hervorheben");
    		menuitem.setAttribute("accesskey", "H");
    		menuitem.setAttribute("oncommand", "gWHT.highlightWord();");
    		var menuitem = menupopup.appendChild(document.createElement("menuitem"));
    		menuitem.setAttribute("class", CLASS_ICON + " menuitem-iconic");
    		menuitem.setAttribute("label", "Getrennt Hervorheben");
    		menuitem.setAttribute("oncommand", "gWHT.highlightWordAuto();");
    
    
    		var cp = menupopup.appendChild(document.createElement("colorpicker"));
    		cp.setAttribute("onclick", "\
    			closeMenus(this);\
    			var word = getBrowserSelection();\
    			setTimeout(function(){\
    				gWHT.addWord({ word: word, bgcolor: this.color, bold: true });\
    			}.bind(this), 10);\
    		");
    
    
    		try {
    			this.GET_KEYWORD = this.prefs.getBoolPref("GET_KEYWORD");
    		} catch (e) {
    			this.GET_KEYWORD = GET_KEYWORD;
    		}
    
    
    		gBrowser.mPanelContainer.addEventListener("DOMContentLoaded", this, false);
    		// gBrowser.mPanelContainer.addEventListener("click", this, false);
    		// gBrowser.mPanelContainer.addEventListener("dragend", this, false);
    		gBrowser.mPanelContainer.addEventListener("pageshow", this, false);
    		gBrowser.mPanelContainer.addEventListener(EVENT_RESPONSE, this, true);
    		gBrowser.mPanelContainer.addEventListener("WordHighlightToolbarAddWord", this, false, true);
    		gBrowser.mPanelContainer.addEventListener("WordHighlightToolbarRemoveWord", this, false, true);
    		gBrowser.mTabContainer.addEventListener("TabOpen", this, false);
    		gBrowser.mTabContainer.addEventListener("TabSelect", this, false);
    		gBrowser.mTabContainer.addEventListener("TabClose", this, false);
    		document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", this, false);
    		window.addEventListener("unload", this, false);
    	},
    	uninit: function() {
    		gBrowser.mPanelContainer.removeEventListener("DOMContentLoaded", this, false);
    		// gBrowser.mPanelContainer.removeEventListener("click", this, false);
    		// gBrowser.mPanelContainer.removeEventListener("dragend", this, false);
    		gBrowser.mPanelContainer.removeEventListener("pageshow", this, false);
    		gBrowser.mPanelContainer.removeEventListener(EVENT_RESPONSE, this, true);
    		gBrowser.mPanelContainer.removeEventListener("WordHighlightToolbarAddWord", this, false);
    		gBrowser.mPanelContainer.removeEventListener("WordHighlightToolbarRemoveWord", this, false);
    		gBrowser.mTabContainer.removeEventListener("TabOpen", this, false);
    		gBrowser.mTabContainer.removeEventListener("TabSelect", this, false);
    		gBrowser.mTabContainer.removeEventListener("TabClose", this, false);
    		document.getElementById("contentAreaContextMenu").removeEventListener("popupshowing", this, false);
    		window.removeEventListener("unload", this, false);
    		this.prefs.setBoolPref("GET_KEYWORD", this.GET_KEYWORD);
    	},
    	destroy: function() {
    		[PREFIX + "icon", PREFIX + "box", PREFIX + "highlight"].forEach(function(id){
    			var elem = $(id);
    			if (elem) elem.parentNode.removeChild(elem);
    		}, this);
    		this.uninit();
    		if (this.xulstyle) this.xulstyle.parentNode.removeChild(this.xulstyle);
    	},
    
    
    	handleEvent: function(event) {
    		switch(event.type) {
    			case "click":
    				this.lastClickedTime = new Date().getTime();
    				break;
    			case "dragend":
    				var dt = event.dataTransfer;
    				if (dt) {
    					if (dt.types.contains("text/x-moz-place")) return;
    					if (!dt.types.contains("text/x-moz-url")) return;
    				}
    				this.lastClickedTime = new Date().getTime();
    				break;
    			case "DOMContentLoaded":
    				if (!this.GET_KEYWORD) return;
    				var doc = event.target;
    				var win = doc.defaultView;
    				// frame 内では動作しない
    				if (win != win.parent) return;
    				// HTMLDocument じゃない場合
    				if (!checkDoc(doc)) return;
    
    
    				var keywords = this.GET_KEYWORD ? this.getKeyword(this.SITEINFO, doc) : [];
    				this.launch(doc, keywords);
    				break;
    			case "pageshow":
    				var doc = event.target;
    				var win = doc.defaultView;
    				if (win != win.parent) return;
    				this.updateToolbar( wmap.get(doc) );
    				break;
    			case EVENT_RESPONSE:
    				event.stopPropagation();
    				this.onResponse(event);
    				break;
    			case "WordHighlightToolbarAddWord":
    				var { target, type, detail } = event;
    				debug(type, detail);
    				if (!detail) return;
    				var doc = target.ownerDocument || target;
    				var range;
    				if (doc != target) {
    					range = doc.createRange();
    					range.selectNode(target);
    				}
    				this.addWord(detail, false, range);
    				break;
    			case "WordHighlightToolbarRemoveWord":
    				var { target, type, detail } = event;
    				debug(type, detail);
    				var doc = target.ownerDocument || target;
    				if (!doc.wht) return;
    				var words = Array.isArray(detail) ? detail : [detail];
    				words.forEach(function(word) doc.wht.removeWord(word));
    				break;
    			case "TabSelect":
    				var doc = event.target.linkedBrowser.contentDocument;
    				var toolbar = wmap.get(doc);
    				this.updateToolbar(toolbar);
    				break;
    			case "TabOpen":
    				var tab = event.target;
    				tab.whtOwner = gBrowser.mCurrentTab;
    				tab.whtTime = new Date().getTime();
    				break;
    			case "TabClose":
    				delete this.tabhistory[event.target.linkedPanel];
    				break;
    			case "popupshowing":
    				if (event.target != event.currentTarget) return;
    				var {isTextSelected, onTextInput, target} = gContextMenu;
    				gContextMenu.showItem(PREFIX + "highlight", isTextSelected && !onTextInput);
    				break;
    			case "unload":
    				this.uninit();
    				break;
    		}
    	},
    	onResponse: function(event) {
    		var { target, detail: { name, args } } = event;
    		debug(name, args, target);
    		var doc = target.ownerDocument || target;
    		var win = doc.defaultView;
    		var topWin = win.top;
    
    
    		if ('initialized' === name) {
    			doc.addEventListener("dragend", this, false);
    			doc.addEventListener("click", this, false);
    			var tab = gBrowser._getTabForContentWindow(topWin);
    			var linkedPanel = tab.linkedPanel;
    			var { index, count } = tab.linkedBrowser.docShell.sessionHistory;
    			this.tabhistory[linkedPanel][index] = doc.wht.items;
    			return;
    		}
    
    
    		var toolbar = wmap.get(topWin.document);
    		if (!toolbar) {
    			toolbar = this.addToolbar();
    			wmap.set(doc, toolbar);
    			wmap.set(topWin.document, toolbar);
    		}
    		if ('highlight' === name || 'highlightAll' === name) {
    			var itemArr = args.length > 0 ? args : Object.keys(doc.wht.items).map(function(key) doc.wht.items[key]);
    			itemArr.forEach(function(item) {
    				var button = toolbar.querySelector('.' + CLASS_ITEM + '[index="'+ item.index +'"]');
    				button = this.addButton(toolbar, item, button);
    			}, this);
    			this.updateToolbar(toolbar);
    			return;
    		}
    		if ('lowlight' === name) {
    			var item = args[0];
    			var button = toolbar.querySelector('.' + CLASS_ITEM + '[index="'+ item.index +'"]');
    			if (button) {
    				button.parentNode.removeChild(button);
    			}
    			return;
    		}
    		if ('lowlightAll' === name) {
    			var range = document.createRange();
    			range.selectNodeContents(toolbar.getElementsByTagName('arrowscrollbox')[0]);
    			range.deleteContents();
    			//delete this.tabhistory[linkedPanel][index];
    			return;
    		}
    	},
    	_launch: function(doc, tab) {
    		if (!tab) {
    			tab = gBrowser._getTabForContentWindow(doc.defaultView.top);
    		}
    		var linkedPanel = tab.linkedPanel;
    		var { count, index } = tab.linkedBrowser.docShell.sessionHistory;
    		var tabhis = this.tabhistory[linkedPanel] || (this.tabhistory[linkedPanel] = []);
    		if (!doc.wht) {
    			doc.wht = new this.ContentClass(doc);
    			tabhis[index] = doc.wht.items;
    			if (tabhis.length > count) {
    				tabhis.splice(count);
    			}
    		}
    	},
    	launch: function(doc, keywords) {
    		var win = doc.defaultView;
    		var tab = gBrowser._getTabForContentWindow(win.top);
    		var linkedPanel = tab.linkedPanel;
    
    
    		// loadType 1=Bookmark, 2=Reload, 4=History, 4>other
    		var { loadType, sessionHistory: { count, index } } = tab.linkedBrowser.docShell;
    		var tabhis = this.tabhistory[linkedPanel] || (this.tabhistory[linkedPanel] = []);
    
    
    		var newtabflag = (tab.whtTime || Infinity) - this.lastClickedTime < 250; // newtab from user.
    		tab.whtTime = Infinity;
    		keywords || (keywords = []);
    
    
    		let hikitugi = [];
    		let hiki_for_items = function(items, boldOnly) {
    			Object.keys(items).map(function(key) {
    				var item = items[key];
    				if (boldOnly && !item.bold) return;
    				hikitugi.push({
    					word: item.word,
    					//index: item.index,
    					bgcolor: item.bgcolor,
    					fgcolor: item.fgcolor,
    					bold: item.bold,
    				});
    			})
    		}
    		if (newtabflag) { // newtab from user.
    			if (tab.whtOwner) {
    				let ownhis = this.tabhistory[tab.whtOwner.linkedPanel];
    				if (ownhis) {
    					let items = ownhis[tab.whtOwner.linkedBrowser.docShell.sessionHistory.index];
    					if (items) {
    						hiki_for_items(items, keywords.length > 0);
    					}
    				}
    			}
    			tab.whtOwner = null;
    		} else if (loadType === 2) { // reload
    			var items = tabhis[index];
    			if (items) {
    				hiki_for_items(items, keywords.length > 0);
    			}
    		} else if (loadType > 1) { // currenttab for user
    			var items = tabhis[index-1] || tabhis[index];
    			if (items) {
    				hiki_for_items(items, keywords.length > 0);
    			}
    		}
    
    
    		// debug([doc.URL + '\n'
    		// ,'loadType:' + loadType,'newtabflag:' + newtabflag
    		// ,'keywords:[' + keywords + ']'
    		// ,'hikitugi:[' + hikitugi.map(function(o) o.word) + ']'
    		// ].join(', '));
    
    
    		if (keywords.length || hikitugi.length) {
    			this._launch(doc, tab);
    			doc.wht.addWord(keywords.concat(hikitugi));
    		}
    	},
    	launchFrame: function(doc) {
    
    
    	},
    	updateToolbar: function(toolbar) {
    		if (this.updateTimer) clearTimeout(this.updateTimer);
    		this.updateTimer = setTimeout(function() {
    			var toolbar = toolbar || wmap.get(content.document);
    			if (toolbar && toolbar.parentNode) {
    				return;
    			}
    			var range = document.createRange();
    			range.selectNodeContents(this.container);
    			if (toolbar) {
    				range.collapse(true);
    				range.insertNode(toolbar);
    				range.selectNodeContents(this.container);
    				range.setStartAfter(toolbar);
    			}
    			range.deleteContents();
    		}.bind(this), 150);
    	},
    	updateToolbar_: function(toolbar) {
    		if (toolbar && toolbar.parentNode) {
    			return;
    		}
    		var range = document.createRange();
    		range.selectNodeContents(this.container);
    		range.deleteContents();
    		if (toolbar)
    			range.insertNode(toolbar);
    	},
    	addToolbar: function() {
    		var toolbar = document.createElement("hbox");
    		toolbar.setAttribute("class", PREFIX + "toolbar");
    		toolbar.setAttribute("flex", "1");
    
    
    		var box = toolbar.appendChild(document.createElement("arrowscrollbox"));
    		box.setAttribute("class", PREFIX + "arrowscrollbox");
    		box.setAttribute("flex", "1");
    		box.setAttribute("orient", "horizontal");
    		box.setAttribute("ordinal", "5");
    
    
    		var closebutton = toolbar.appendChild(document.createElement("toolbarbutton"));
    		closebutton.setAttribute("class", PREFIX + "closebutton tabs-closebutton");
    		closebutton.setAttribute("oncommand", "gWHT.destroyToolbar();");
    		closebutton.setAttribute("ordinal", "1");
    
    
    		var reloadbutton = toolbar.appendChild(document.createElement("toolbarbutton"));
    		reloadbutton.setAttribute("class", PREFIX + "reloadbutton");
    		reloadbutton.setAttribute("tooltiptext", "Markierte Wörter nachladen");
    		reloadbutton.setAttribute("ordinal", "10");
    		reloadbutton.setAttribute("oncommand", "gWHT.recoveryToolbar();");
    
    
    		var addbutton = toolbar.appendChild(document.createElement("toolbarbutton"));
    		addbutton.setAttribute("class", PREFIX + "addbutton");
    		addbutton.setAttribute("tooltiptext", "Wort hinzufügen");
    		addbutton.setAttribute("ordinal", "10");
    		addbutton.setAttribute("oncommand", "gWHT.addWord();");
    		return toolbar;
    	},
    	destroyToolbar: function() {
    		var win = getFocusedWindow();
    		var doc = win.document;
    		if (doc.wht) {
    			doc.wht.lowlightAll();
    		}
    		this.updateToolbar();
    	},
    	recoveryToolbar: function() {
    		var win = getFocusedWindow();
    		var doc = win.document;
    		if (doc.wht) {
    			doc.wht.highlightAll();
    			// マッチしなかったワードを削除
    			Object.keys(doc.wht.items).forEach(function(key){
    				var item = doc.wht.items[key];
    				if (item.length === 0)
    					doc.wht.removeWord(item.word);
    			}, this);
    		}
    	},
    	addButton: function(toolbar, aItem, aButton) {
    		var button = aButton;
    		if (!button) {
    			button = document.createElement('toolbarbutton');
    			button.style.setProperty('-moz-appearance', 'none', 'important');
    			button.setAttribute('oncommand', 'gWHT.find(this.getAttribute("word"), event.shiftKey);');
    			button.setAttribute('onDOMMouseScroll', 'event.stopPropagation(); gWHT.find(this.getAttribute("word"), event.detail < 0);');
    			button.setAttribute('onclick', 'if (event.button != 1) return; this.hidden = true; gWHT.removeWord(this.getAttribute("word"));');
    			button.setAttribute('class', CLASS_ITEM);
    			button.setAttribute('tooltiptext', [
    				'Mausrad runter, oder Linksklick zum Weitersuchen',
    				'Shift + Linksklick, oder Mausrad zum vorherigen Wort',
    				'Mittelklick auf Mausrad zum Löschen'].join('\n'));
    			toolbar.getElementsByTagName('arrowscrollbox')[0].appendChild(button);
    		}
    		button.style.setProperty('color', aItem.fgcolor, 'important');
    		button.style.setProperty('background-color', aItem.bgcolor, 'important');
    		button.setAttribute('word', aItem.word);
    		button.setAttribute('index', aItem.index);
    		button.setAttribute('bgcolor', aItem.bgcolor);
    		button.setAttribute('fgcolor', aItem.fgcolor);
    		button.setAttribute('length', aItem.length);
    		button.setAttribute('label', aItem.word + '(' + aItem.length + ')');
    		button.setAttribute('hidden', 'false');
    		if (aItem.bold) {
    			button.setAttribute('bold', aItem.bold);
    			button.style.setProperty('font-weight', 'bold', 'important');
    		} else {
    			button.style.removeProperty('font-weight');
    		}
    		return button;
    	},
    	highlightWord: function() {
    		var keywords = getRangeAll().map(function(r) r.toString());
    		if (keywords.length)
    			this.addWord(keywords, true);
    	},
    	highlightWordAuto: function() {
    		var keywords = getRangeAll().join(' ').match(this.tangoReg) || [];
    		if (keywords.length)
    			this.addWord(keywords, true);
    	},
    	addWord: function(aWord, aBold, aRange) {
    		if (!aWord) {
    			aWord = prompt('Bitte geben Sie den gewünschten Text zum Hervorheben', getBrowserSelection());
    			aBold = true;
    		}
    		if (!aWord) return;
    
    
    		var keywords = Array.isArray(aWord) ? aWord : [aWord];
    		var doc, win;
    		if (aRange) {
    			doc = aRange.startContainer.ownerDocument;
    			win = doc.defaultView;
    		} else {
    			win = getFocusedWindow();
    			doc = win.document;
    		}
    		if (!doc.wht) {
    			win.getSelection().removeAllRanges();
    			this._launch(doc);
    		}
    		keywords = keywords.map(function(str){
    			return typeof str === "string" ? str.trim() : str;
    		});
    		doc.wht.addWord(keywords, aBold, aRange);
    	},
    	removeWord: function(aWord) {
    		if (!aWord) return;
    		var doc = getFocusedWindow().document;
    		if (!doc.wht) return;
    		doc.wht.removeWord(aWord);
    	},
    	getLength: function(aWord, aWin) {
    		var w = aWord.toLowerCase();
    		var len = 0;
    		getWins(aWin).forEach(function(win) {
    			var doc = win.document;
    			if (!doc.wht) return;
    			var item = doc.wht.items[w];
    			if (item)
    				len += item.length;
    		}, this);
    		return len;
    	},
    	get tangoReg() {
    		if (this._tangoReg) return this._tangoReg;
    		var arr = [
    			"[\\u4E00-\\u9FA0]{2,}" // 漢字
    			,"[\\u4E00-\\u9FA0][\\u3040-\\u309F]+" // 漢字1文字+ひらがな
    			,"[\\u30A0-\\u30FA\\u30FC]{2,}" // カタカナ
    			,"[\\uFF41-\\uFF5A\\uFF21-\\uFF3A\\uFF10-\\uFF19]{2,}" // 全角英数数字(小文字、大文字、数字)
    			,"[\\w%$\\@#+]{5,}"
    			,"\\d[\\d.,]+"
    			,"\\w[\\w.]+"
    		];
    		return this._tangoReg = new RegExp(arr.join('|'), 'g');
    	},
    	get kukuriReg() {
    		if (this._kukuriReg) return this._kukuriReg;
    		var obj = {
    			'"': '"',
    			"'": "'",
    			'\uFF3B': '\uFF3D',//[]
    			'\u3010': '\u3011',//【】
    			'\u300E': '\u300F',//『』
    			'\uFF08': '\uFF09',//()
    			'\u201D': '\u201D',// ””
    			'\u2019': '\u2019',// ’’
    		};
    		var arr = Object.keys(obj).map(function(key) '\\' + key + '[^\\n\\'+ obj[key] +']{2,}\\' + obj[key]);
    		return this._kukuriReg = new RegExp(arr.join('|'), 'g');
    	},
    	getKeyword: function (list, aDoc) {
    		if (!list) list = this.SITEINFO;
    		var locationHref = aDoc.location.href;
    
    
    		for (let [index, info] in Iterator(list)) {
    			try {
    				var exp = info.url_regexp || (info.url_regexp = new RegExp(info.url));
    				if ( !exp.test(locationHref) ) continue;
    				if (info.keyword)
    					return Array.isArray(info.keyword) ? info.keyword : info.keyword.split(/\s+/);
    				if (info.input) {
    					var input = aDoc.querySelector(info.input);
    					if (input && input.value && /\S/.test(input.value))
    						return this.clean(input.value);
    				} else if (RegExp.$1) {
    					try {
    						return this.clean(decodeURIComponent(RegExp.$1));
    					} catch (e) {}
    					return this.clean(RegExp.$1);
    				}
    			} catch(e) {
    				log('error at ' + e);
    			}
    		}
    		return [];
    	},
    	clean: function clean(str) {
    		var res = [];
    		var kukuri = str.match(this.kukuriReg);
    		if (kukuri) {
    			[].push.apply(res, kukuri.map(function(w) w.slice(1,-1)));
    			str = str.replace(this.kukuriReg, ' ');
    		}
    
    
    		str = str.replace(/\b(?:(?:all)?(?:inurl|inanchor)|link|cache|related|info|site|filetype|daterange|movie|weather|blogurl):\S*/g, "");
    		str = str.replace(/\b(?:AND|OR)\b|\s\-\S+/g, " ")
    		str = str.replace(/(?:all)?(?:intitle|intext):/g, " ");
    		//str = (' ' + str + ' ').replace(/\s\-\S+|(?:(?:all)?(?:inurl|intitle|intext|inanchor)|link|cache|related|info|site|filetype|daterange|movie|weather|blogurl)\:\S*|\s(?:AND|OR)\s/g, ' ');
    		// \x20-\x29  !"#$%&'()*+,-./    \x3A-\x40 :;<=>?@    \x5B-\x60 [\]^_`    x7B-\x7E {|}~
    		var tango = str.match(/[^\x20-\x29\x3B-\x3F\x5B-\x5E\x60\x7B-\x7E\s]{2,}/g);
    		if (tango) {
    			[].push.apply(res, tango/*.sort(function(a,b) b.length - a.length)*/);
    		}
    		return res.filter(function(e,i,a) e && a.indexOf(e) === i);
    	},
    	find: function(aWord, isBack) {
    		var res;
    		var fastFind = gBrowser.mCurrentBrowser.fastFind;
    		if (fastFind.searchString != aWord) {
    			res = fastFind.find(aWord, false);
    			if (isBack) {
    				res = fastFind.findAgain(isBack, false);
    			}
    		} else {
    			res = fastFind.findAgain(isBack, false);
    		}
    		if (res === this.FIND_NOTFOUND)
    			return this.sound.beep();
    		if (res === this.FIND_WRAPPED)
    			this.sound.beep();
    		var win = fastFind.currentWindow;
    		if (!win) return;
    		var sel = win.getSelection();
    		var node = sel.getRangeAt(0).startContainer;
    		var span = node.parentNode;
    		if (!span.classList.contains(CLASS_SPAN)) return;
    		isBack ? sel.collapseToStart() : sel.collapseToEnd();
    //		sel.collapse(node, 1);
    		span.style.setProperty('outline', '4px solid #36F', 'important');
    		win.setTimeout(function () {
    			span.style.removeProperty('outline');
    		}, 400);
    	},
    };
    
    
    
    
    window.gWHT.ContentClass = function(){ this.init.apply(this, arguments) };
    window.gWHT.ContentClass.prototype = {
    	finder: Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind),
    	styles: [
    		 ['hsl( 60, 100%, 80%)','#000'] // bgcolor, textcolor
    		,['hsl(120, 100%, 80%)','#000']
    		,['hsl(180, 100%, 80%)','#000']
    		,['hsl(240, 100%, 80%)','#000']
    		,['hsl(300, 100%, 80%)','#000']
    		,['hsl(360, 100%, 80%)','#000']
    		,['hsl( 30, 100%, 80%)','#000']
    		,['hsl( 90, 100%, 80%)','#000']
    		,['hsl(150, 100%, 80%)','#000']
    		,['hsl(210, 100%, 80%)','#000']
    		,['hsl(270, 100%, 80%)','#000']
    		,['hsl(330, 100%, 80%)','#000']
    	],
    	css: [
    		'font: inherit !important;'
    		,'margin: 0px !important;'
    		,'padding: 0px !important;'
    		,'border: none !important;'
    		,'text-shadow: none !important;'
    	].join(' '),
    	throughSelector: ['textarea', 'input', '.' + CLASS_SPAN].map(function(w) w+', '+w+' *').join(','),
    
    
    	init: function(doc, keywords) {
    		this.doc = doc;
    		this.win = doc.defaultView;
    		this.body = doc.body,
    		this.items = {};
    		this.finder.findBackwards = false; /* 後ろから前に向かって検索するか */
    		this.finder.caseSensitive = false; /* 大文字小文字を区別するか */
    		this.isEmpty = true; // TreeWalker で無駄に探さない為のフラグ
    
    
    		if (keywords) {
    			this.initItems(keywords);
    		}
    		this.doc.addEventListener("keypress", this, false);
    		this.doc.addEventListener("GM_AutoPagerizeNextPageLoaded", this, false);
    		this.win.setTimeout(function() {
    			this.fireEvent('initialized', this.doc);
    		}.bind(this), 100);
    	},
    	handleEvent: function(event) {
    		switch (event.type) {
    			case "keypress":
    				if (event.target instanceof HTMLTextAreaElement ||
    				    event.target instanceof HTMLSelectElement ||
    				    event.target instanceof HTMLInputElement && (event.target.mozIsTextField(false)))
    					return;
    				var {charCode, ctrlKey, shiftKey, altKey} = event;
    				if ((charCode === 78 || charCode === 110) && !ctrlKey && !altKey) {
    					this.find(shiftKey);
    					event.preventDefault();
    					event.stopPropagation();
    				}
    				break;
    			case "GM_AutoPagerizeNextPageLoaded":
    				// AutoPagerizeの最後の区切り以降のRangeを取得
    				var sep = this.doc.querySelectorAll('.autopagerize_page_separator, .autopagerize_page_info');
    				sep = sep[sep.length-1];
    				if (!sep) return;
    				var range = this.doc.createRange();
    				if (sep.parentNode.localName == 'td') {
    					range.setStartAfter(sep.parentNode.parentNode);
    					range.setEndAfter(sep.parentNode.parentNode.parentNode);
    				} else {
    					range.setStartAfter(sep);
    					range.setEndAfter(sep.parentNode.lastChild);
    				}
    				this.highlightAll(range);
    				break;
    		}
    	},
    	initItem: function(aWord, aBold, aBG, aFG, aIndex) {
    		if (!aWord) return null;
    		if (typeof aWord === 'object') {
    			aBold = aWord.bold;
    			aBG = aWord.bgcolor;
    			aFG = aWord.fgcolor;
    			aIndex = aWord.index;
    			aWord = aWord.word;
    			if (!aWord) return null;
    		}
    		var w = aWord.toLowerCase();
    		if (this.items[w]) return null;
    
    
    		var index = typeof aIndex == 'number' && aIndex != NaN ? aIndex : this.newIndexOf();
    		var [bg, fg] = this.styles[index % this.styles.length];
    		if (aBG) {
    			bg = aBG;
    			fg = aFG || rgb2bw(aBG);
    		}
    		var obj = this.items[w] = {
    			word: aWord,
    			index: index,
    			bgcolor: bg,
    			fgcolor: fg,
    			bold: !!aBold,
    			length: 0,
    		};
    		Object.defineProperty(obj, 'toString', {
    			enumerable: false,
    			value: function() {
    				return '[' + this.index + ':' + this.length + ':' + this.word + ']';
    			}
    		});
    		return obj;
    	},
    	initItems: function(array, aBold) {
    		return array.map(function(aWord, index) {
    			return this.initItem(aWord, aBold);
    		}, this);
    	},
    	_highlight: function(aItem, aRange) {
    		this.finder.findBackwards = false; /* 後ろから前に向かって検索するか */
    		var doc = this.doc;
    		var range = aRange;
    		if (!range) {
    			range = doc.createRange();
    			range.selectNodeContents(this.body);
    		}
    		var sRange = range.cloneRange();
    		sRange.collapse(true);
    		var eRange = range.cloneRange();
    		eRange.collapse(false);
    
    
    		// タイマーを使わなくて良いおまじない
    		// http://piro.sakura.ne.jp/latest/blosxom/mozilla/xul/2010-07-06_dynamic.htm
    		doc.documentElement.clientHeight;
    
    
    		var rangeArr = [];
    		var len = 0;
    		for (var retRange = null;
    		     retRange = this.finder.Find(aItem.word, range, sRange, eRange);
    		     sRange = retRange.cloneRange(), sRange.collapse(false)) {
    			rangeArr[++len] = retRange;
    		}
    
    
    		if (len > 0) {
    			var temp = doc.createElementNS("http://www.w3.org/1999/xhtml", "font");
    			temp.setAttribute("style", this.css +
    				'background-color: ' + aItem.bgcolor + ' !important;' +
    				'color: ' + aItem.fgcolor + ' !important;');
    			temp.setAttribute("class", CLASS_SPAN + ' ' + CLASS_INDEX + aItem.index);
    
    
    			len = 0;
    			rangeArr.forEach(function(range){
    				var node = range.startContainer;
    				if (node.nodeType != 1)
    					node = node.parentNode;
    				if (node.mozMatchesSelector(this.throughSelector)) {
    					if (node.classList.contains( CLASS_INDEX + aItem.index ))
    						++len;
    					return;
    				}
    
    
    				node = range.endContainer;
    				if (node.nodeType != 1)
    					node = node.parentNode;
    				if (node.mozMatchesSelector(this.throughSelector)) {
    					if (node.classList.contains( CLASS_INDEX + aItem.index ))
    						++len;
    					return;
    				}
    
    
    				var span = temp.cloneNode(false);
    				try {
    					range.surroundContents(span);
    					++len;
    					return;
    				} catch (e) {}
    				try {// 範囲内の要素を細切れにしてでも強調する。行儀が悪い
    					span.appendChild(range.extractContents());
    					range.insertNode(span);
    					++len;
    					return;
    				} catch (e) {}
    			}, this);
    		}
    		if (aRange)
    			aItem.length += len;
    		else
    			aItem.length = len;
    		if (aItem.length)
    			this.isEmpty = false;
    	},
    	_lowlight: function(aItem) {
    		var doc = this.doc;
    		$A(doc.getElementsByClassName(CLASS_INDEX + aItem.index)).forEach(function(elem){
    			var range = doc.createRange();
    			range.selectNodeContents(elem);
    			var df = range.extractContents();
    			range.setStartBefore(elem);
    			range.insertNode(df);
    			range.selectNode(elem);
    			range.deleteContents();
    		}, this);
    		aItem.length = 0;
    		if (Object.keys(this.items).length === 0)
    			this.isEmpty = true;
    	},
    	highlightAll: function(aRange) {
    		Object.keys(this.items).forEach(function(key){
    			this._highlight(this.items[key], aRange);
    		}, this);
    		this.fireEvent('highlightAll', this.doc);
    	},
    	lowlightAll: function() {
    		var doc = this.doc;
    		$A(doc.getElementsByClassName(CLASS_SPAN)).forEach(function(elem){
    			var range = doc.createRange();
    			range.selectNodeContents(elem);
    			var df = range.extractContents();
    			range.setStartBefore(elem);
    			range.insertNode(df);
    			range.selectNode(elem);
    			range.deleteContents();
    		}, this);
    		Object.keys(this.items).forEach(function(key){
    			delete this.items[key];
    		}, this);
    		this.isEmpty = true;
    		this.fireEvent('lowlightAll', this.doc);
    	},
    	addWord: function(aWord, aBold, aRange) {
    		var itemArr = Array.isArray(aWord) ? this.initItems(aWord, aBold) : [this.initItem(aWord, aBold)];
    		itemArr = itemArr.filter(function(item) {
    			if (item) {
    				this._highlight(item, aRange);
    				return true;
    			}
    		}, this);
    		if (itemArr.length) {
    			var args = ['highlight', this.doc].concat(itemArr);
    			this.fireEvent.apply(this, args);
    		}
    	},
    	removeWord: function(aWord) {
    		var w = aWord.toLowerCase();
    		var obj = this.items[w];
    		if (obj) {
    			this._lowlight(obj);
    			this.fireEvent('lowlight', this.doc, obj);
    		}
    		delete this.items[w];
    	},
    	newIndexOf: function() {
    		// index プロパティの欠番を探す
    		var arr = [];
    		Object.keys(this.items).forEach(function(key) arr[this.items[key].index] = true, this);
    
    
    		for (var i = 0, len = arr.length; i < len; i++) {
    			if (!arr[i]) return i;
    		};
    		return arr.length;
    	},
    	find: function(isPrev) {
    		if (this.isEmpty) {
    			debug('強調されていないようなので検索しません');
    			return;
    		}
    		var tw = this.tw;
    		if (!tw) {
    			let fn = function(node) {
    				if (node.classList.contains(CLASS_SPAN)) {
    					return NodeFilter.FILTER_ACCEPT;
    				}
    				return NodeFilter.FILTER_SKIP;
    			}
    			tw = this.tw = this.doc.createTreeWalker(this.doc.body, NodeFilter.SHOW_ELEMENT, fn, false);
    		}
    		// ツリーの現在地を最後にクリックした位置に合わせる
    		var sel = this.win.getSelection();
    		if (sel.focusNode) {
    			var n = isPrev ? sel.anchorNode : sel.focusNode;
    			var o = isPrev ? sel.anchorOffset : sel.focusOffset;
    			tw.currentNode = o ? (n.childNodes[o] || n) : n;
    		}
    		sel.removeAllRanges();
    
    
    		var node;
    		if (isPrev) {
    			node = tw.previousNode();
    			if (!node) {
    				node = Array.pop(this.doc.getElementsByClassName(CLASS_SPAN));
    				tw.currentNode = node || this.doc.body.lastChild;
    				if (node)
    					gWHT.sound.beep();
    			}
    		} else {
    			node = tw.nextNode();
    			if (!node) {
    				node = this.doc.getElementsByClassName(CLASS_SPAN)[0];
    				tw.currentNode = node || this.doc.body;
    				if (node)
    					gWHT.sound.beep();
    			}
    		}
    		if (!node) {
    			gWHT.sound.beep();
    			this.isEmpty = true;
    			return;
    		}
    		this.isEmpty = false;
    
    
    		sel.selectAllChildren(node);
    		try {
    			sel.QueryInterface(Ci.nsISelectionPrivate)
    				.scrollIntoView(Ci.nsISelectionController.SELECTION_ANCHOR_REGION, true, 50, 50);
    		} catch (e) {}
    
    
    		var anchor = this.doc.evaluate('descendant-or-self::a[@href]|ancestor-or-self::a[@href]',
    			node, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    		if (anchor && !/^mailto/.test(anchor.href)) {
    			anchor.focus();
    			sel.selectAllChildren(node);
    		}
    		isPrev ? sel.collapseToStart() : sel.collapseToEnd();
    		node.style.setProperty('outline', '3px solid #36F', 'important');
    		this.win.setTimeout(function() {
    			node.style.removeProperty('outline');
    		}, 400);
    	},
    	fireEvent: function (aName, aTarget) {
    		var evt = new CustomEvent(EVENT_RESPONSE, { bubbles: true, cancelable: true, detail: {
    			name: aName,
    			args: $A(arguments).slice(2),
    		} });
    		aTarget.dispatchEvent(evt);
    	},
    };
    
    
    function rgb2bw(code) {
    	if (!code) return "#000";
    	var m = code.match(/^#?([0-9a-f]{1,2})([0-9a-f]{1,2})([0-9a-f]{1,2})$/i);
    	if (!m || !m[1]) return "#000";
    	m = m.slice(1, 4).map(function(c){
    		return parseInt(!c[1] ? c[0] + c[0] : c, 16);
    	});
    	return (m[0] + m[1] + m[2]) > 128*3 ? "#000" : "#fff";
    }
    
    
    function getWins(win) {
    	var wins = win.frames.length ? [win].concat(Array.slice(win.frames)) : [win];
    	return wins.filter(function(win) checkDoc(win.document));
    }
    function checkDoc(doc) {
    	if (!(doc instanceof HTMLDocument)) return false;
    	if (!window.mimeTypeIsTextBased(doc.contentType)) return false;
    	if (!doc.body || !doc.body.hasChildNodes()) return false;
    	if (doc.body instanceof HTMLFrameSetElement) return false;
    	return true;
    }
    function getFocusedWindow() {
    	var win = document.commandDispatcher.focusedWindow;
    	return (!win || win == window) ? content : win;
    }
    function getRangeAll(win) {
    	var sel = (win || getFocusedWindow()).getSelection();
    	var res = [];
    	if (sel.isCollapsed) return res;
    
    
    	for(var i = 0, l = sel.rangeCount; i < l; i++) {
    		res.push(sel.getRangeAt(i));
    	}
    	return res;
    }
    
    
    function $(id) { return document.getElementById(id); }
    function $$(exp, doc) { return Array.prototype.slice.call((doc || document).querySelectorAll(exp)); }
    function $A(args) { return Array.prototype.slice.call(args); }
    function log() { Services.console.logStringMessage($A(arguments).join(', ')); }
    function debug() { if (gWHT.DEBUG) log("wht debug: " + $A(arguments).join(', ')); }
    function addStyle(css) {
    	var pi = document.createProcessingInstruction(
    		'xml-stylesheet',
    		'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
    	);
    	return document.insertBefore(pi, document.documentElement);
    }
    
    
    window.gWHT.init();
    
    
    })('\
    #wordhighlight-toolbar-icon, .wordhighlight-toolbar-icon {\
      list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAANUlEQVQ4jWNgGBTg6dOi/6RgrAb8/19PFB7EBlAUBoMDFD0t+k8qxjCgngQ4SA2gKAwGDAAAM3SE/usVkKQAAAAASUVORK5CYII=");\
    }\
    #wordhighlight-toolbar-icon[state="Deaktiviert"] {\
            filter: '
           + (Number(Application.version.substring(0,2))>=36 ? 'grayscale(1)' : 'url("chrome://mozapps/skin/extensions/extensions.svg#greyscale")')
           + ';\
    }\
    .wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-up,\
    .wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-down {\
      list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-left.png");\
    }\
    .wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-down {\
      transform: scaleX(-1);\
    }\
    .wordhighlight-toolbar-item {\
      text-shadow: none;\
    }\
    .wordhighlight-toolbar-item > .toolbarbutton-icon { visibility: collapse; }\
    \
    .wordhighlight-toolbar-reloadbutton,\
    .wordhighlight-toolbar-addbutton {\
      list-style-image: url("chrome://browser/skin/Toolbar.png");\
    }\
    .wordhighlight-toolbar-reloadbutton { -moz-image-region: rect(0pt, 72px, 18px, 54px); }\
    .wordhighlight-toolbar-addbutton    { -moz-image-region: rect(0pt, 306px, 18px, 288px); }\
    \
    #wordhighlight-toolbar-box:empty,\
    .wordhighlight-toolbar-arrowscrollbox:empty,\
    .wordhighlight-toolbar-arrowscrollbox:empty ~ * { visibility: collapse; }\
    \
    \
    /*.wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-up:-moz-lwtheme-brighttext,\
    .wordhighlight-toolbar-arrowscrollbox > .autorepeatbutton-down:-moz-lwtheme-brighttext {\
      list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-left-inverted.png");\
    }\
    .wordhighlight-toolbar-reloadbutton:-moz-lwtheme-brighttext,\
    .wordhighlight-toolbar-addbutton:-moz-lwtheme-brighttext {\
      list-style-image: url("chrome://browser/skin/Toolbar-inverted.png");\
    }*/\
    \
    ');
    Alles anzeigen
  • WordHighlightToolbar deaktivierter Button unsichtbar

    • bege
    • 27. Februar 2015 um 18:17

    Tausend Dank, aborix :)

  • WordHighlightToolbar deaktivierter Button unsichtbar

    • bege
    • 27. Februar 2015 um 15:53

    Hallo,
    seit dem Update auf FF 36 ist der Button des Skriptes WordHighlightToolbar im deaktivierten Zustand unsichtbar. Er funktioniert ansonsten einwandfrei, lässt sich umschalten, der Tooltip ist da, nur der Button ist im deaktivierten Zustand nicht zu sehen. Weiß jemand eine Lösung?

  • Duckduckgo !bangs/Schlüsselwörter einfügen

    • bege
    • 24. Januar 2015 um 18:27

    Hallo,
    ich habe in der Suchleiste eine ganze Reihe von Suchmaschinen eingerichtet, einige mit Schlüsselwörtern, so dass ich damit in der Adressleiste suchen kann. Inzwischen bietet die Suchmaschine Duckduckgo eine riesige Auswahl an Schlüsselwörtern, sogenannte "!bangs", mit denen in anderen Suchmaschinen gesucht werden kann: Duckduckgo als Standardsuchmaschine einrichten, "!bang" und Suchbegriff eingeben, und schon wird in der entsprechenden Suchmaschine gesucht. Die "!bangs" kann ich mir aber nicht merken. Deshalb habe ich mir aus dem Skript "Locationbar Characters" ein Skript gebastelt, mit dem ich die Schlüsselwörter per Rechtsklick in die Adressleiste einfügen kann. Das geht natürlich nicht nur für die "!bangs", sondern auch für alle eigenen Schlüsselwörter.
    Vielleicht kann noch jemand das Skript gebrauchen.

    [Blockierte Grafik: http://abload.de/img/screenshot_022hvdc7.png]

    Code
    /* DuckduckgoBangs.uc.js
    verändert aus LocationbarCharacters.uc.js
    die !bangs können ab Zeile 16 geändert werden,
    die maximale Länge der !bangs wird bei "var sym = label.slice(0, 15),""
    eingestellt (z.Zt. max. 15 Stellen) */
    
    
    function initLocationBarCharacters() {
        var urlbar = window.document.getElementById("urlbar"),
            textBox = window.document.getAnonymousElementByAttribute(urlbar, "anonid", "textbox-input-box"),
            cxmenu = window.document.getAnonymousElementByAttribute(textBox, "anonid", "input-box-contextmenu"),
            separator = document.createElement("menuseparator"),
            menu = document.createElement("menu"),
            popup = document.createElement("menupopup"),
            i,
            labelArray = [
    		"!sp             Startpage",
    		"!ge             Google SSL",
    		"!gi             Google Bilder",
    		"!spi            Startpage Bilder",
    		"!gm             Google Maps",
    		"!wde            Wikipedia",
    		"!leo            LEO",
    		"!gtde           Google Übersetzer ->de",
    		"!ade            Amazon",
    		"!ebde           ebay",
    ],
    		insertCharacters = function(sym) {
    		    var urlbar = window.document.getElementById("urlbar"),
    		        urlbarText = urlbar.value,
    		        pos,
    		        urlbarFocus = window.document.getElementById("Browser:OpenLocation");
    
    
    		    urlbarFocus.doCommand();
    
    
    		    if (urlbarText.length === 0) {
    		        urlbarText = sym + " ";
    		    } else if (urlbarText.slice(-1) === " ") {
    		        urlbarText = urlbarText + sym + " ";
    		    } else {
    		        urlbarText = urlbarText + " " + sym + " ";
    		    }
    		    urlbar.value = urlbarText;
    
    
    		    pos = urlbarText.length;
    		    urlbar.setSelectionRange(pos, pos);
    		},
            makeMenuItem = function(label) {
    	        var sym = label.slice(0, 15),
    		        node = document.createElement("menuitem");
    		    node.setAttribute("label", label);
    		    node.addEventListener("command", function() { insertCharacters(sym); }, false);
    		    popup.appendChild(node);
            };
    
    
        menu.setAttribute("label", "!bangs" );
        menu.appendChild(popup);
        for (i = 0; i < labelArray.length; i += 1) {
    	    makeMenuItem(labelArray[i]);
    	}
        cxmenu.appendChild(separator);
        cxmenu.appendChild(menu);
    }
    
    
    initLocationBarCharacters();
    Alles anzeigen
  • userChrome.js Scripte für den Fuchs (Zusammenstellung)

    • bege
    • 24. November 2014 um 19:13
    Zitat von aborix

    Löschbutton links:

    Ersetze in Zeile 180 'find-next' durch 'find-previous' .

    Danke für den Tipp, aborix. Und für gaaaanz links durch 'findbar-textbox'.

    [attachment=0]screenshot_014.png[/attachment]

    Bilder

    • screenshot_014.png
      • 4,18 kB
      • 517 × 38

Unterstütze uns!

Jährlich (2025)

101,9 %

101,9% (662,48 von 650 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon