本家サブスクリプトローダを試してみた

本家Sub-Script/Overlay Loader v3.0を試してみた*1chromeフォルダに入れたら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

感想

*1:ログインしないとソースが見られない。ユーザ名とパスワードを決めるだけ。

超簡単にuserChrome.jsのインストールを説明する

userChrome.js自体の説明

userChrome.jsは主にFirefox自体の機能を拡張するためのアドオンです。機能を追加するには○○.uc.jsというファイルをuserChrome.jsと同じ場所に置くだけです。

Gomitaさんのプレゼン資料:「userChrome.js 〜拡張機能の解体再構築〜」がおすすめ。via しげふみメモ

インストール方法

  1. まずuserChrome.js本体をインストール (配布元)
  2. alice0775さんのSub-Script Loaderをダウンロード (配布元
  3. Firefoxのプロファイル(プロファイルの探し方)にあるchomeフォルダを開き、2でダウンロードしたuserChrome.jsとchomeフォルダにあるuserChrome.jsを置き換える。

以上でインストールは終わり。

ucスクリプトの導入方法

  • userChrome.jsと同じ場所(chromeフォルダ)に置いておけばOK。
  • us.jsの文字コードUTF-8かUTF-8Nで保存。

その他

  • フォルダなどは作らなくても動く。凝ったことをやりたかったら、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()で停止させる。

ダウンロード

middleMousePaste.uc.js (gist:90746

使い方

  1. userChrome.jsをインストール。→簡単なインストール方法
  2. about:configでmiddlemouse.pasteをfalseにしておく。
  3. サブスクリプトローダーを使用しているなら、middleMousePaste.uc.jsをダウンロードしてuserChrome.jsと同じ場所に入れるだけ。
注意点

searchbar(Firefoxメニュー - 表示 - ツールバー - カスタマイズ - 検索のやつ)は、このスクリプトが利かず上書きペーストができない。挿入は可能。


感想

  • 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);というやつなんですが、範囲選択したあと貼り付けで挿入ではなく上書きにしてくれるスクリプトってないですかね?
よろしくお願いします。

参考資料

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 を参考にして調べる。
じっくり観察してみると、がピンクで囲んだ部分にあたり、context="toolbar-context-menu"がコンテキストメニューを表示させる属性だということがわかった。

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で調査したらすぐわかった。
エンジョイコピペライフ。

*1:検索用:ナビゲーションツールバー、ブックマークツールバー、カスタマイズ