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. Endor

Beiträge von Endor

  • TabMix Plus Meldethread bis einschließlich Firefox 56.0.2

    • Endor
    • 3. März 2015 um 16:28

    Hallo Zusammen
    News from Texas!

    Tab Mix Plus Dev-Build 0.4.1.8pre.150303a1 veröffentlicht (Ältere Versionen)

    Sie können jederzeit den aktuellen Quellen Code oder die letzte funktionierende Version runter laden.

    Changelog: 0.4.1.8pre.150303a1

    • Fixed: 5404ef7 When loading tab from bookmark and "titlefrombookmark" preference is on set its label early.
    • Fixed: cf1901f Update maxVersion to 39.0a1.
    • Fixed: 1da146b Follow up bug 1031264 - <a rel="noreferrer"> does not work if open in new tab and bug 1133201 -
      part 2 - don't send referrer information when opening new windows via context menu.
    • Fixed: e4520c9 Timestamps hyperlinks in Youtube open in new tab when "force to open in new tab"
      links to other sites (or all sites) is on.
    • Fixed: 7829177 Use Tabmix drag & drop functions when dragging tabs between windows to allow
      positioning of the drag indicator in case the tabbar is not in the default location.
    • Fixed: [e10s] Stop using unsafe CPOW's.
    • Fixed: 57d7dbd RecentWindow.jsm is no longer exist in resource://app/.
    • Fixed: 5e5aaee Calling setItem with value of undefined should remove the attribute if exist (regressed by changeset af7e71e).
    • Fixed: 133f3f8 Typo in changeset 683ebd1 Prevents tabs from resizing properly after tab closed by clicking on it's close button.

    Quelle: http://tmp.garyr.net/forum/viewtopic.php?p=67763#p67763

    Achtung direkte Installation:
    https://addons.mozilla.org/firefox/downlo…150303a1-fx.xpi

    Ich habe wieder eine Version mit Änderung gemacht, damit beim
    Neustart kein neuer Tab, bzw. neues Fenster, mit der Tmp Update Seite geöffnet wird.
    Die Übersetzung ist aktuell!

    Download oder direkte Installation: Tab Mix Plus-0.4.1.8pre.150303a1-fx.xpi

    Verwendung wie immer auf eigene Gefahr.
    Und nun viel Spaß!
    Mfg.
    Endor

    [Blockierte Grafik: http://i.imgur.com/eMktuIs.png]

    [Blockierte Grafik: http://db.tt/iaNtST9y] Bei Fragen oder Problemen zu - mit Tabmixplus, bitte immer in diesem Thread schreiben:
    :arrow: https://www.camp-firefox.de/forum/viewtopic.php?f=4&t=98563
    :!: Dies hier ist nur ein Meldethread für neue Versionen! Danke!

  • TabMix Plus Meldethread bis einschließlich Firefox 56.0.2

    • Endor
    • 3. März 2015 um 16:25

    Hallo Zusammen
    News from Texas!

    Neue Finale Version

    Tab Mix Plus 0.4.1.7 veröffentlicht
    Changelog siehe: http://tmp.garyr.net/support/viewpage.php?t=1&p=0.4.1.7

    Achtung direkte Installation:
    https://addons.mozilla.org/firefox/downlo…version-history

    Ich habe wieder eine Version mit Änderung gemacht, damit beim
    Neustart kein neuer Tab, bzw. neues Fenster, mit der Tmp Update Seite geöffnet wird.

    Download oder direkte Installation: Tab Mix Plus-0.4.1.7.xpi

    Verwendung wie immer auf eigene Gefahr.
    Und nun viel Spaß!

    Mfg.
    Endor

    [Blockierte Grafik: http://i.imgur.com/eMktuIs.png]

    [Blockierte Grafik: http://db.tt/iaNtST9y] Bei Fragen oder Problemen zu - mit Tabmixplus, bitte immer in diesem Thread schreiben:
    :arrow: https://www.camp-firefox.de/forum/viewtopic.php?f=4&t=98563
    Dies hier ist nur ein Meldethread für neue Versionen! Danke!

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

    • Endor
    • 2. März 2015 um 20:35

    Die Änderung von aborix ist bei meinen Versionen schon drinnen.
    Die Änderung, damit der Button frei verschiebbar ist, ist auch von aborix.
    Vielen Dank an dieser Stelle an aborix.
    :klasse:
    Mfg.
    Endor

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

    • Endor
    • 2. März 2015 um 20:24

    Hallo Mithrandir
    Das ist jetzt schwer.

    Die Version aus Beitrag 2680 hat einen verschiebbaren frei platzierbaren Button.
    Die Version aus Betrag 2682 hingegen einen fixen, nur einen über das Script selbst platzierbaren Button.

    Ich weiß jetzt auch nicht was da besser ist.
    Vielleicht mal loshombre fragen.
    Eventuell könnte man auch beide hoch laden, den aus Betrag 2682 müsste man dann noch mit dem Hinweis
    das er für die Adressleiste ist, versehen.
    Was meinst Du?
    Mfg.
    Endor

  • Classic Theme Restorer customize Australis

    • Endor
    • 2. März 2015 um 19:32

    Classic Theme Restorer Version 1.3.0beta6
    https://addons.mozilla.org/de/firefox/add…torer/versions/

    Direkte Installation oder Download:
    https://addons.mozilla.org/firefox/downlo…version-history

    v1.3.0beta6 Changelog:

    • [fix] TMP + Windows Aero + squared tabs: gap on tab toolbars end
    • [new] sub-option to keep/hide Fx titlebar for 'hide tab bar with one tab' option
    • [change] tweaked the option "reduce nav-bar height"
    • [change] prefwindow: additional descriptions and minor tweaks

    [Blockierte Grafik: http://i.imgur.com/eMktuIs.png]

    [Blockierte Grafik: http://db.tt/iaNtST9y] Bei Fragen oder Problemen zur - Classic Theme Restorer Erweiterung, bitte immer im
    :arrow: Classic Theme Restorer Diskussionsthread [Blockierte Grafik: http://i39.tinypic.com/s1kgb4.png] schreiben!
    :!: Dies hier ist nur ein Meldethread für neue Versionen! Danke!

    Mfg.
    Endor

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

    • Endor
    • 2. März 2015 um 18:01

    Hallo edvoldi
    Bitte testen:

    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.9
    // @note           0.0.9 細部を修正
    // @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 = $("urlbar-icons").appendChild(document.createElement("image"));
    		icon.setAttribute("id", PREFIX + "icon");
    		icon.setAttribute("class", PREFIX + "icon");
    		icon.setAttribute("onclick", "gWHT.GET_KEYWORD = !gWHT.GET_KEYWORD");
    		icon.setAttribute("context", "");
    		icon.setAttribute("style", "padding: 0px 2px;");
    
    
    		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) : [];
    				setTimeout(function() {
    					this.launch(doc, keywords);
    				}.bind(this), 500);
    				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 close-icon");
    		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('Gewünschten Text zum Hervorheben angeben', 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;'
    		,'float: none !important;'
    		,'display: inline !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 {\
      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, 270px, 18px, 252px); }\
    .wordhighlight-toolbar-addbutton    { -moz-image-region: rect(0px, 576px, 18px, 558px); }\
    \
    #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

    Müsste damit in der Adressleiste auftauchen.
    Mfg.
    Endor

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

    • Endor
    • 2. März 2015 um 16:52

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

    Hier das Script mit integrierter Änderung von aborix:

    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.9
    // @note           0.0.9 細部を修正
    // @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) : [];
    				setTimeout(function() {
    					this.launch(doc, keywords);
    				}.bind(this), 500);
    				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 close-icon");
    		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('Gewünschten Text zum Hervorheben angeben', 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;'
    		,'float: none !important;'
    		,'display: inline !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 {\
      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, 270px, 18px, 252px); }\
    .wordhighlight-toolbar-addbutton    { -moz-image-region: rect(0px, 576px, 18px, 558px); }\
    \
    #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

    Diese Version hat auch einen frei plazierbaren Button.

    Mfg.
    Endor

  • NoScript - News und Info

    • Endor
    • 2. März 2015 um 15:18

    Hallo zusammen
    Giorgio hat wieder nach gelegt:

    Neue Finale Version 2.6.9.16

    Beim Autor selber
    http://noscript.net/getit

    Bei Amo:
    https://addons.mozilla.org/en-US/firefox/addon/722/versions/

    Achtung, Direktinstallation!

    Finale
    Vom Autor: https://secure.informaction.com/download/relea…pt-2.6.9.16.xpi

    Von AMO https://addons.mozilla.org/firefox/downlo…version-history

    v. 2.6.9.16 identisch mit dev. Version 2.6.9.16rc1
    =========================================================================
    + [Surrogate] Updated Gravatar surrogate (thanks barbaz)
    + Additional HTML sanitization when pasting rich text into
    content-editable elements (thanks .mario for RFE)
    + Introduced framework for E10s migration, starting with new
    features and fixes
    x Removed deprecated let () expressions from the code base

    [Blockierte Grafik: http://i.imgur.com/eMktuIs.png]

    [Blockierte Grafik: http://db.tt/iaNtST9y] Bei Fragen oder Problemen zu - mit NoScript, bitte immer in diesem Thread schreiben:
    :arrow: https://www.camp-firefox.de/forum/viewtopi…=733033#p733033
    :!: Dies hier ist nur ein Meldethread für neue Versionen! Danke!

    Mfg.
    Endor

  • NoScript - News und Info

    • Endor
    • 2. März 2015 um 15:17

    Hallo zusammen

    Giorgio hat wieder nach gelegt:
    Neue Dev. Version 2.6.9.16rc1

    Nur für Firefox 3 und neuer:

    Beim Autor selber
    http://noscript.net/getit

    Bei Amo:
    https://addons.mozilla.org/en-US/firefox/addon/722/versions/

    Achtung, Direktinstallation!

    Vom Autor https://secure.informaction.com/download/betas…2.6.9.16rc1.xpi

    changelog: v 2.6.9.16rc1
    =============================================================
    + [Surrogate] Updated Gravatar surrogate (thanks barbaz)
    + Additional HTML sanitization when pasting rich text into
    content-editable elements (thanks .mario for RFE)
    + Introduced framework for E10s migration, starting with new
    features and fixes
    x Removed deprecated let () expressions from the code base

    [Blockierte Grafik: http://i.imgur.com/eMktuIs.png]

    [Blockierte Grafik: http://db.tt/iaNtST9y] Bei Fragen oder Problemen zu - mit NoScript, bitte immer in diesem Thread schreiben:
    :arrow: https://www.camp-firefox.de/forum/viewtopi…=733033#p733033
    :!: Dies hier ist nur ein Meldethread für neue Versionen! Danke!

    Mfg.
    Endor

  • [erledigt] Anzeige bei Einstellungen

    • Endor
    • 1. März 2015 um 18:59

    Wie immer gern geschehen.
    :D
    Mfg.
    Endor

  • Favicons in anderes Profil übertragen.

    • Endor
    • 1. März 2015 um 10:40

    Keine Sorge, die wir auch automatisch aktualisiert wie andere Erweiterungen.
    Nur eben nicht von AMO sonder direkt vom Server des Autors.

    Mfg.
    Endor

  • Fx anpassen via user.js und about:config

    • Endor
    • 28. Februar 2015 um 19:23

    // Neue Tab Seite Vorschaubilder Spaltenanzahl
    user_pref("browser.newtabpage.rows", 3);

    // Neue Tab Seite Vorschaubilder Zeilenanzahl
    user_pref("browser.newtabpage.columns", 3);

    Mfg.
    Endor

  • Viele Sprachen in der Rechtschreibprüfung

    • Endor
    • 28. Februar 2015 um 12:12

    Hallo u.kirchgraber.
    Heute hat es wieder ein Update für das Französische Wörterbuch Version 5.3 gegeben.
    Hier wieder eine Version mit nur einem Wörterbuch:
    http://dl.dropbox.com/u/15467633/Fir…x%2Bsm%2Btb.xpi
    Viel Spaß damit.
    Mfg.
    Endor

  • Classic Theme Restorer customize Australis

    • Endor
    • 27. Februar 2015 um 20:21

    Classic Theme Restorer Version 1.3.0beta5
    https://addons.mozilla.org/de/firefox/add…torer/versions/

    Direkte Installation oder Download:
    https://addons.mozilla.org/firefox/downlo…version-history

    v1.3.0beta5 Changelog:

    • [locale] Ukrainian (uk) translation updated (thanks to Sacredwheels)
    • [locale] Chinese (zh-CN) translation updated (thanks to Cye3s)
    • [locale] Polish (pl-PL) translation updated (thanks to Mrere)
    • [fix] hide tab bar with one tab + Windows: all tab variations supported
    • [fix] small button view + Windows + Fx36+: toggle/action button size

    [Blockierte Grafik: http://i.imgur.com/eMktuIs.png]

    [Blockierte Grafik: http://db.tt/iaNtST9y] Bei Fragen oder Problemen zur - Classic Theme Restorer Erweiterung, bitte immer im
    :arrow: Classic Theme Restorer Diskussionsthread [Blockierte Grafik: http://i39.tinypic.com/s1kgb4.png] schreiben!
    :!: Dies hier ist nur ein Meldethread für neue Versionen! Danke!

    Mfg.
    Endor

  • In memoriam

    • Endor
    • 27. Februar 2015 um 18:44

    Leonard Nimoy ist tot.
    http://www.focus.de/kultur/kino_tv…id_4508532.html
    LLAP.

    R.I.P.
    Mfg.
    Endor

  • Übersetzungswünsche oder -Probleme?

    • Endor
    • 27. Februar 2015 um 15:58

    Hallo zusammen

    Dafizilla ViewSourceWith 0.9.4.3 ist verfügbar.
    https://addons.mozilla.org/de/firefox/add…ith/?src=search

    Hier wieder die Deutsche Version:
    Download oder direkte Installation: Dafizilla ViewSourceWith 0.9.4.3

    Verwendung wie immer auf eigene Gefahr.
    Und nun viel Spaß.
    Mfg.
    Endor

  • infolister

    • Endor
    • 27. Februar 2015 um 14:06

    Alles klar, ist eben Geschmackssache, der eine mag dies, der eine etwas anderes.
    Die Prefbar hat viele Funktionen, wenn man das alles braucht, sehr praktisch.
    Viele Einstellungen und Funktionen unter einem Hut.
    Eben nur für mich etwas zu viele nicht benötigte Sachen.
    Trotzdem danke für den Hinweis.
    :D
    Mfg.
    Endor

  • infolister

    • Endor
    • 27. Februar 2015 um 13:44

    Gibts auch für Windows.
    https://addons.mozilla.org/de/firefox/add…bar/?src=search
    Nur um die Addons aufzulisten, finde ich das aber etwas übertrieben.
    Gleich eine ganze zusätzliche Symbolleiste, na ich weiß nicht.
    Mfg.
    Endor

  • Firefox-39.0a1

    • Endor
    • 27. Februar 2015 um 12:18

    @Sören
    Vielen Dank!
    Mfg.
    Endor

  • Firefox-39.0a1

    • Endor
    • 27. Februar 2015 um 12:01

    Adblockplus hat er jetzt trotz klick auf ignorieren schon drei mal gefragt.
    Irgendwie muss man das ja auch ganz deaktivieren können. Geht einem ja auf die Nerven.
    Mal wieder typisch Mozilla.....

    Mfg.
    Endor

Unterstütze uns!

Jährlich (2026)

29 %

29% (188,31 von 650 EUR)

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