本家サブスクリプトローダを試してみた
本家Sub-Script/Overlay Loader v3.0を試してみた*1。chromeフォルダに入れたらuserChrome.jsにリネームする。
本家を試してみた感想
- Firefox起動時にchromeフォルダにあるファイルをアルファベット順にすべて読み込むのだが、その中にバグったスクリプトファイルが混じっていると、それ以降のスクリプトファイルが適用されなくなる。alice0775氏、nanto_vi氏のサブスクリプトローダはこの点は問題なかった。
あと最近のサブスクリプトローダはGreasemonkey風のメタデータの読み込みに対応する流れで
便利だなぁと。
// ==UserScript== // @name Test // @namespace http://d.hatena.ne.jp/Cherenkov/ // @description Test script, pops an alert in the Options window. // @include chrome://browser/content/browser.xul // @include chrome://browser/content/preferences/preferences.xul // ==/UserScript== alert("Hello from the Firefox Options!"); //http://forums.mozillazine.org/viewtopic.php?p=2921360#2921360
感想
- alice0775氏のサブスクリプトローダを使っておけばいいかなと思った。
- Gomitaさんのプレゼン資料を読んでStylishがuserChrome.cssの管理用の拡張機能だということを初めて知った。
*1:ログインしないとソースが見られない。ユーザ名とパスワードを決めるだけ。
超簡単にuserChrome.jsのインストールを説明する
userChrome.js自体の説明
userChrome.jsは主にFirefox自体の機能を拡張するためのアドオンです。機能を追加するには○○.uc.jsというファイルをuserChrome.jsと同じ場所に置くだけです。
Gomitaさんのプレゼン資料:「userChrome.js 〜拡張機能の解体再構築〜」がおすすめ。via しげふみメモ。
インストール方法
- まずuserChrome.js本体をインストール (配布元)
- alice0775さんのSub-Script Loaderをダウンロード (配布元)
- Firefoxのプロファイル(プロファイルの探し方)にあるchomeフォルダを開き、2でダウンロードしたuserChrome.jsとchomeフォルダにあるuserChrome.jsを置き換える。
以上でインストールは終わり。
その他
- フォルダなどは作らなくても動く。凝ったことをやりたかったら、alice0775さんのページとSub-Script Loaderのコードを読む。
- id:nanto_viさんのUCJS LoaderというSub-Script Loaderもある。シンプルに作られている。alice0775さんのものとどっちがいいかはわからない。
ホイールクリックでクリップボードの内容を貼り付け(範囲選択していた場合は上書きする)
ミドルマウス(middle mouse)、ミドルクリック(middle click)、中クリック、ホイールクリック(wheel click)に関するエントリー。
Firefoxの機能に「ホイールクリックでペースト」がある。便利なので最近使い始めた。about:configでmiddlemouse.pasteをtrueにすると利用できる。再起動しなくてもOK。
でも、この機能には欠点がある。範囲選択をしてからホイールクリックをしても上書きされずに挿入されてしまう。
これをuserChrome.jsを用いて修正する。
ザックリ確認したところFirefox 3.0.8と3.1 Beta3とFirefox 2は上記の残念な仕様。
ソースコード
// ==UserScript== // @name middleMousePaste // @namespace http://d.hatena.ne.jp/Cherenkov/ // @description enable overwrite. // @include chrome://browser/content/browser.xul // ==/UserScript== (function(){ if (gPrefService.getBoolPref("middlemouse.paste")) return alert("Please set a value.\nabout:config -> middlemouse.paste -> false"); window.addEventListener("click", function(event) { if (event.button == 1) { var target = event.target; var tagName = target.tagName; if (tagName) tagName = tagName.toLowerCase(); var type = target.type; if (type) type = type.toLowerCase(); if ((tagName == "input" && (type == "" || type == "text" || type == "password")) || tagName == "textarea" || tagName == "textbox" || tagName == "searchbar") { var front = target.value.substr(0,target.selectionStart); var back = target.value.substr(target.selectionEnd); var select = target.value.substring(target.selectionStart, target.selectionEnd); var clipbrd = readFromClipboard(); if(!clipbrd) clipbrd = ""; target.value = front + clipbrd + back; //modify caret position. target.selectionStart = target.selectionEnd = (front.length + clipbrd.length); } } }, true); //stop a scroll event. window.addEventListener("mousedown", function(event) { if (event.button == 1) { var target = event.target; var tagName = target.tagName; if (tagName) tagName = tagName.toLowerCase(); var type = target.type; if (type) type = type.toLowerCase(); if ((tagName == "input" && (type == "" || type == "text" || type == "password")) || tagName == "textarea" || tagName == "textbox") { event.stopPropagation(); } } }, true); })();
解説
- tagNameは小文字にするのが定石らしい。HTMLのtextareaやXULのtextbox上でのみ実行されるようにしておく。
- クリップボードが画像データのみの場合はundefinedが返ってくるので空白をいれることにした。
- カーソルのことをキャレットというらしい。上書きペーストするとキャレットが終端に移動してしまうのを修正した。
- ホイールボタンをmousedownした時に起こるスクロールイベントをstopPropagation()で停止させる。
ダウンロード
使い方
- userChrome.jsをインストール。→簡単なインストール方法
- about:configでmiddlemouse.pasteをfalseにしておく。
- サブスクリプトローダーを使用しているなら、middleMousePaste.uc.jsをダウンロードしてuserChrome.jsと同じ場所に入れるだけ。
感想
- middle mouseをmousedownしたときのスクロールイベントを封印するときにpreventDefault()とpreventBubble()は効果が無かった。
- このスクリプトの場合、preventDefault()とかremoveEventListenerする必要ある?
- この人にも伝えたい。
firefox userChrome.js greasemonkeyスレ 5
45 :名無しさん@お腹いっぱい。:sage :2008/06/21(土) 14:12:42 id:ZwbS2zYX0
テキスト領域でミドルクリックしたとき, クリップボードの内容を貼り付ける
user_pref("middlemouse.paste", true);というやつなんですが、範囲選択したあと貼り付けで挿入ではなく上書きにしてくれるスクリプトってないですかね?
よろしくお願いします。
参考資料
- Middlemouse.paste - mozillaZine about:configのmiddlemouse.pasteの基本情報
- middlemouse.pasteをtrueにした場合これが動作してるっぽい。
UCJS Loader書き換え
FirebugコンソールにuserChrome.jsのCcが無いというエラーがでた。動作に問題ないようにみえたけど、適当に追加してみた。
追記 やっぱやめた。
追加した後にhttp://www.hatena.ne.jp/ などでユーザスクリプトの管理画面を出したときにuc.jsスクリプトの文法まちがってるエラーがでるようになった。
やめてから同じ作業をするとなにもエラーがでない。さっぱりわからない。
//const Cc = Components.classes; //const Ci = Components.interfaces; var fileProtocolHandler = Cc["@mozilla.org/network/io-service;1"] :
ホイールでタブ切り替え
Tab Mix Plusからの脱却(卒業)プロジェクト。Firefox 3.0.8から3.1beta3へ移行中。
タブバーでホイールを回すとタブを切り替える。userChrome.js用スクリプト。
// ==UserScript== // @name Tab Wheel Scroll // @namespace http://d.hatena.ne.jp/Cherenkov/ // @description ホイールでタブ切り替え // @include chrome://browser/content/browser.xul // ==/UserScript== (function(){ gBrowser.mTabContainer.addEventListener("DOMMouseScroll", function(event){ this.advanceSelectedTab(event.detail > 0 ? +1 : -1, true); }, true); })();
参考にさせて頂いた。http://d.hatena.ne.jp/faminote/20070216/1171635775
ツールバーのコンテキストメニューをuserChrome.jsを使って無効にする
下の画像のピンク色で囲んだ部分を右クリックすると表示されるコンテキストメニュー*1を表示させないようにしたい。アドレスバーにURLをペーストしようとして失敗したときによく出る。
Firefoxの部品(XUL)の調べ方
Firebugでアドオンや Firefoxの XULを覗く - Yaks を参考にして調べる。
じっくり観察してみると、
userChrome.jsを使えるように準備する
- おすすめuserChrome.jsスクリプトまとめ ここをよく読めばできる。
userChrome.js用スクリプト
超簡単。
// ==UserScript== // @name DisableToolbarContextMenu // @namespace http://d.hatena.ne.jp/Cherenkov/ // @description ツールバーのコンテキストメニュー(右クリックメニュー)を非表示にする。 // @include chrome://browser/content/browser.xul // ==/UserScript== (function(){ document.getElementById('nav-bar').removeAttribute('context'); document.getElementById('toolbar-menubar').removeAttribute('context'); })();
これをDisableToolbarContextMenu.uc.jsとか好きな名前を付けて、userChrome.jsと同じフォルダに保存する。
Firefoxを再起動してからコンテキストメニューがでないか確認。
感想
だいぶ前にDOM Inspector使ったときは分らなかったけどFirebugで調査したらすぐわかった。
エンジョイコピペライフ。