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

  • Der Glückwunsch-Thread

    • Endor
    • 7. März 2015 um 19:00

    Hallo zusammen.
    Vielen vielen Dank, für die ganzen Geburtstags Grüße und Wünsche.
    Toll dass Ihr alle an mich gedacht habt.
    Wow.
    Nochmals vielen Dank und ein schönes Wochenende Euch allen.
    Mfg.
    Endor

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

    • Endor
    • 7. März 2015 um 18:09

    Hallo aborix.
    Also die Änderung funktioniert hier nur mit dem RAW Button, dort links klick und dann installieren
    oder rechts klick dann lässt sich das Script speichern.
    Aber über diese Schaltfläche tut sich hier gar nichts mehr. Keinerlei Reaktion.
    [Blockierte Grafik: http://i.imgur.com/OntOwAe.png]
    Mfg.
    Endor

  • Classic Theme Restorer customize Australis

    • Endor
    • 7. März 2015 um 14:02

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

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

    v1.3.0beta10 Changelog:

    • [locale] Spanish (es) translation updated (thanks to strel)
    • [locale] Upper Sorbian (hsb) translation updated (thanks to milupo)
    • [locale] Lower Sorbian (dsb) translation updated (thanks to milupo)
    • [change] prefwindow: info for 'Hide Caption Titlebar Plus' add-on

    [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
    • 7. März 2015 um 13:49

    Ja das kann ich bestätigen, das Script Save UserChromeJS speichert nicht mehr.
    Leider. Keine Ahnung warum das so ist.
    Mfg.
    Endor

  • NoScript - News und Info

    • Endor
    • 7. März 2015 um 10:02

    Hallo zusammen

    Giorgio hat wieder nach gelegt:
    Neue Dev. Version 2.6.9.17rc2

    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.17rc2.xpi

    changelog: v 2.6.9.17rc2
    =============================================================
    x Fixed cascadePermissions/globalHTTPSWhitelist interaction
    issue with IFRAMEs (thanks Tor Project for report)

    [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

  • Downloadhelper funktioniert nicht mehr

    • Endor
    • 6. März 2015 um 10:25

    Ich habe in Beitrag 89 nur auf die neue Version hingewiesen.
    Habe diese Erweiterung selber aber noch nie benutzt oder installiert gehabt.
    Mfg.
    Endor

  • NoScript - News und Info

    • Endor
    • 6. März 2015 um 09:43

    Hallo zusammen

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

    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.17rc1.xpi

    changelog: v 2.6.9.17rc1
    =============================================================
    + Fixed cascadePermissions being enforced also if the top
    document is implicitly allowed by the globalHTTPSWhitelist
    policy, rather than explicitly whitelisted, causing HTTP
    subdocument and scripts to be unintendendly allowed when
    the top document is HTTPS (thanks Tor Project for report)
    x [Surrogate] Update Google Analytics replacement (thanks
    barbaz)

    [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

  • Classic Theme Restorer customize Australis

    • Endor
    • 5. März 2015 um 20:25

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

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

    v1.3.0beta9 Changelog:

    • [locale] Upper Sorbian (hsb) translation updated (thanks to milupo)
    • [locale] Lower Sorbian (dsb) translation updated (thanks to milupo)
    • [fix] squared tabs: pinned tabs glitch
    • [change] improved "The Fox, only better" support (thanks to Luis M.)
    • [change] squared tabs: removed unused code (needs testing)
    • [change] squared tabs: tweaks for TabMixPlus (needs testing)
    • [change] Windows/Linux + context menu entries option: access keys

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

    [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

  • [Erledigt] Probleme mit Adwcleaner

    • Endor
    • 5. März 2015 um 19:25

    // Hallo Boersenfeger.
    Auch von mir die besten Wünsche für einen erholsamen Urlaub.
    Ansonsten schließe ich mich ganz bigpen an.
    :wink:
    Mfg.
    Endor

  • Downloadhelper funktioniert nicht mehr

    • Endor
    • 5. März 2015 um 19:00

    Hallo zusammen.
    Version 5.0.0a4 steht zur Verfügung.
    https://groups.google.com/forum/#!forum/…ownloadhelper-5

    Installationsseite:
    http://www.downloadhelper.net/install-beta.php?version=5.0.0a4

    Mfg.
    Endor

  • Kontextmenü in Eingabefeldern

    • Endor
    • 4. März 2015 um 20:44

    Hallo zusammen
    Hier ein wieder ein Update für die aktuelle Beta Version von Classic Theme Restorer Version 1.3.0beta8.

    Kleine Korrektur am Code, da sich ein paar Sachen verändert haben, ein Symbole nicht mehr richtig
    angezeigt wurden, und ein paar neue dazu gekommen sind.
    Wie immer, vielen Dank an edvoldi . :klasse:

    Code für die aktuelle Version 1.3.0beta8:
    Downloads:
    Standard: https://dl.dropboxusercontent.com/u/15467633/Fir…pte/CSS/CTR.css

    Spezial: https://dl.dropboxusercontent.com/u/15467633/Fir…CTR-Spezial.css

    Mfg.
    Endor

  • Classic Theme Restorer customize Australis

    • Endor
    • 4. März 2015 um 18:45

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

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

    v1.3.0beta8 Changelog:

    • [locale] Polish (pl-PL) translation updated (thanks to Mrere)
    • [fix] compact nav-bar option: seperator size
    • [new] option to hide bookmark buttons label on bookmarks toolbar
    • [new] option to transform bookmarks popup menu into a panel menu

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

    [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

  • Classic Theme Restorer customize Australis

    • Endor
    • 4. März 2015 um 09:30

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

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

    v1.3.0beta7 Changelog:

    • [locale] Polish (pl-PL) translation updated (thanks to Mrere)
    • [change] added 'ColorfulTabs not fully compatible' info to prefwindow
    • [change] 'inv. icon options' also affect loop/call button
    • [change] improved support for Tangofox and Tangerinefox themes

    [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

  • 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

Unterstütze uns!

Jährlich (2025)

107,3 %

107,3% (697,41 von 650 EUR)

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