Now browsing the archives for the 'userChrome.js' category.

[userChrome.js] 軽量マウスジェスチャで利用可能なスクリプト集

[userChrome.js] 軽量マウスジェスチャで利用可能なスクリプト

「○○をジェスチャにしたいんだけど、userChrome.jsには何て書けばいいの」といった話題はこちらでコメントお願いします。

ナビゲーション

// 戻る
document.getElementById("Browser:Back").doCommand();
// 進む
document.getElementById("Browser:Forward").doCommand();
// 更新
document.getElementById("Browser:Reload").doCommand();
// 更新(キャッシュを無視)
document.getElementById("Browser:ReloadSkipCache").doCommand();
// ホーム
document.getElementById("Browser:Home").doCommand();
// 中止
document.getElementById("Browser:Stop").doCommand();
// 巻き戻し(履歴の先頭へ戻る)
if (gBrowser.sessionHistory.index > 0)
    gBrowser.gotoIndex(0);
// 早送り(履歴の末尾へ進む)
var nav = gBrowser.webNavigation;
var hist = nav.sessionHistory;
nav.gotoIndex(hist.count - 1);

ウィンドウ

// 新しいウィンドウ
document.getElementById("cmd_newNavigator").doCommand();
// ウィンドウを閉じる
document.getElementById("cmd_closeWindow").doCommand();
// ウィンドウの最小化
window.minimize();
// ウィンドウの最大化/元のサイズに戻す
window.windowState == window.STATE_MAXIMIZED ? window.restore() : window.maximize();
// 全画面表示
document.getElementById("View:FullScreen").doCommand();

タブ

// 新しいタブ
document.getElementById("cmd_newNavigatorTab").doCommand();
// タブを閉じる
document.getElementById("cmd_close").doCommand();
// 閉じたタブを元に戻す
document.getElementById("History:UndoCloseTab").doCommand();
// [Tab Mix Plus] 最後に閉じたタブを復元(TMP独自のセッションマネージャを利用している場合)
gBrowser.undoRemoveTab();
// 前のタブへ
gBrowser.mTabContainer.advanceSelectedTab(-1, true);
// 次のタブへ
gBrowser.mTabContainer.advanceSelectedTab(+1, true);
// 文字を小さくする
document.getElementById("cmd_textZoomReduce").doCommand();
// 文字を大きくする
document.getElementById("cmd_textZoomEnlarge").doCommand();
// 標準の文字サイズ
document.getElementById("cmd_textZoomReset").doCommand();
// タブの複製
openNewTabWith(gBrowser.currentURI.spec, null, null, null, false);
// 他のタブをすべて閉じる
var browser = getBrowser(); browser.removeAllTabsBut(browser.mCurrentTab);
// すべてのタブを閉じる
var browser = getBrowser(); var ctab = browser.addTab("about:blank"); browser.removeAllTabsBut(ctab);
// 左のタブをすべて閉じる
var tabs = gBrowser.mTabContainer.childNodes;
for (var i = tabs.length - 1; tabs[i] != gBrowser.mCurrentTab; i--){}
for (i--; i >=0 ; i--){
    gBrowser.removeTab(tabs[i]);
}
// 右のタブをすべて閉じる
var tabs = gBrowser.mTabContainer.childNodes;
for (var i = tabs.length - 1; tabs[i] != gBrowser.selectedTab; i--)
{
    gBrowser.removeTab(tabs[i]);
}
// [Tab Mix Plus] タブを凍結
gBrowser.freezeTab(gBrowser.mCurrentTab);
// [Tab Mix Plus] タブを保護
gBrowser.protectTab(gBrowser.mCurrentTab);
// [Tab Mix Plus] タブをロック
gBrowser.lockTab(gBrowser.mCurrentTab);

ページ

// 先頭へスクロール
goDoCommand("cmd_scrollTop");
// 末尾へスクロール
goDoCommand("cmd_scrollBottom");
// ページアップ
goDoCommand("cmd_scrollPageUp");
// ページダウン
goDoCommand("cmd_scrollPageDown");
// このページをブックマーク
document.getElementById("Browser:AddBookmarkAs").doCommand();
// 名前を付けてページを保存
document.getElementById("Browser:SavePage").doCommand();
// ページのソースを表示
document.getElementById("View:PageSource").doCommand();
// ページの情報を表示
document.getElementById("View:PageInfo").doCommand();
// 印刷プレビュー
document.getElementById("cmd_printPreview").doCommand();
// 印刷
document.getElementById("cmd_print").doCommand();

ツール

// ダウンロード
document.getElementById("Tools:Downloads").doCommand();
// アドオン
document.getElementById("Tools:Addons").doCommand();
// プライバシー情報の消去
setTimeout(function(){ document.getElementById("Tools:Sanitize").doCommand(); }, 0);
// エラーコンソール
toJavaScriptConsole();
// オプション
setTimeout(function(){ openPreferences(); }, 0);
// DOM Inspector
inspectDOMDocument(content.document);
// 検索バーを開く/閉じる
if ("isFindBarVisible" in gFindBar)
    gFindBar.isFindBarVisible() ? gFindBar.closeFindBar() : gFindBar.onFindCmd();
else
    gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
// Web 検索ボックスのクリア
document.getElementById("searchbar").value = "";

サイドバー

// ブックマークサイドバー
toggleSidebar("viewBookmarksSidebar");
// 履歴サイドバー
toggleSidebar("viewHistorySidebar");
// [Sage] サイドバー
toggleSidebar("viewSageSidebar");
// [ScrapBook] サイドバー
toggleSidebar("viewScrapBookSidebar");
// [Foxage2ch] サイドバー
toggleSidebar("viewFoxage2chSidebar");
// サイドバーを閉じる
var sidebarBox = document.getElementById("sidebar-box");
if (!sidebarBox.hidden)
    toggleSidebar(sidebarBox.getAttribute("sidebarcommand"));

特殊操作

// ひとつ上の階層へ移動
var uri = gBrowser.currentURI;
if (uri.path == "/")
    return;
var pathList = uri.path.split("/");
if (!pathList.pop())
    pathList.pop();
loadURI(uri.prePath + pathList.join("/") + "/");
// 再起動
Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci.nsIAppStartup)
.quit(Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit);
// [ScrapBook] ページの取り込み
sbBrowserOverlay.execCapture(0, null, false , "urn:scrapbook:root");
// [ScrapBook] ページの詳細な取り込み
sbBrowserOverlay.execCapture(0, null, true , "urn:scrapbook:root");

TOP

[userChrome.js] 軽量マウスジェスチャ(改良バージョン)

[userChrome.js] 軽量マウスジェスチャを少し改良しました。先日のバージョンでは、右クリックによる mousedown イベントが発生した後に続けて mousemove イベントが発生して初めてジェスチャが開始されたとみなすロジックであった。

  • mousedown→mousemove(ジェスチャ開始)→mousemove(ジェスチャ継続)…→mouseup(ジェスチャ終了)

しかし、このロジックですと mousedown から1回目の mousemove までにどれだけ大きくマウスポインタの位置を動かしたとしてもそれはジェスチャとして認識されないという問題があります。実際のところ mousedown から1回目の mousemove までの時間は一瞬ですので、その間に大きくマウスを動かすことはかなり難しいですが、読み込み中のタブがあって動作が鈍くなっているときに↓のジェスチャでタブを閉じようとすると、なぜか認識されずにコンテキストメニューが出てしまうといったケースが時々見られました。

今回のバージョンでは mousedown をした時点でジェスチャ開始とみなすというシンプルなロジックにしています。これによって上記の問題は解決され、今のところ快調に動いているように感じられます。

  • mousedown(ジェスチャ開始)→mousemove(ジェスチャ継続)…→mouseup(ジェスチャ終了)

TOP

[userChrome.js] 軽量マウスジェスチャ

マウスジェスチャ機能は欲しいけど、All-in-One Gestures や Optimoz Mouse Gestures は余計な機能が多すぎる。AiOGから不要な機能を取っ払ってスリム化させようと試みたが、ソースコードが複雑すぎてやる気が失せた。そこで自分で一から考えて作ってみた結果、200行にも満たない userChrome.js 用スクリプトとして実装することができた。

xuldev.org :: userChrome.js scripts » Mouse Gestures

特徴

  1. マウストレイル(軌跡の描画)は重くなる原因なのであきらめた。とはいえ AiOG から trails.js を借りてきて一工夫すれば実装可能です。
  2. ジェスチャによって実行される処理は、極力ブラウザ本体に実装されたコマンドを呼び出すようにしている。
  3. 設定用GUIは無いが、スクリプトを直接編集することで無駄なく柔軟にカスタマイズできる。詳しくは下記スクリプト内の _performAction 関数をご覧ください。

TOP

[userChrome.js] Mouse Gestures

I like mouse gestures, but All-in-One Gestures and Optimoz Mouse Gestures both have too much unwanted features for me. I tried to reduce unwanted parts from AiOG but I gave up since the original source codes was very complex.
And so, I made it by myself from scratch as a small user script for userChrome.js extension, which has only less than 200 lines.

xuldev.org :: userChrome.js scripts » Mouse Gestures

Major features

  1. No mouse trails. Because it would be one of a factor to be slow down the gesture. Nonetheless we can implement it by picking ‘trails.js’ from AiOG.
  2. As much as possible, it executes the ‘built-in’ commands of Firefox itself when we perform actions by gestures.
  3. No options dialog. But we can economically and flexibly customize by editing the script directly. For more details, please see ‘_performAction’ method in the script below.

TOP

[userChrome.js] 新しいタブを現在のタブの右隣に開く

リンク先を新しいタブを開いたときに、最後尾ではなく現在のタブの右隣(連続して2つ開く場合はさらにその右隣)に開くための userChrome.js 用ユーザスクリプトである Tabs to the Right では、Firefox 本体で定義された gBrowser.addTab 関数と gBrowser.moveTabTo 関数の改造を以下のような方法で実現させている。

  1. 元の関数(つまり Function オブジェクト)を toString() で文字列化
  2. 関数内の改造したい部分の文字列を置換
  3. evalで文字列から関数を再定義する
eval(
  "gBrowser.moveTabTo = " + 
  gBrowser.moveTabTo.toString().replace(/{/, "$& if (aTab == this.mCurrentTab) this.__uc_addedTabs = 0;")
);

なるほどこれは面白いやり方だ。拡張機能によって Firefox 本体で定義された関数の動作の一部分だけを無理やり変更したいときには苦肉の策として有効である。

同じく Firefox 本体で定義された関数の動作に変更を加えたいケースで、元の関数の前後に何らかの処理を割り込ませたい場合は、以下のような手段が有効である。

  1. 元の関数を新しい関数としてコピー
  2. 元の関数を書き換え、その関数内で割り込ませる処理とともにコピーされた関数を呼び出して実行

たとえばブックマークを削除するときに確認ダイアログを表示させるようにしたければ、 BookmarksCommand.deleteBookmark 関数の前へ確認ダイアログを表示する処理を割り込ませる。

// 関数のコピー
BookmarksCommand.deleteBookmarkOriginal = BookmarksCommand.deleteBookmark;
// 関数の書き換え
BookmarksCommand.deleteBookmark = function(aSelection)
{
    // 確認ダイアログ表示
    if ( !window.confirm("Are you sure you wish to delete bookmarks?") ) return;
    // ブックマークを削除
    this.deleteBookmarksOriginal(aSelection);
};

この方法でいくと、先ほどの、新しいタブを現在のタブの右隣に開くための userChrome.js は、以下のようにも書くことができる。どちらが良いかは好みの問題であろう。

(function()
{
    getBrowser().__uc_addedTabs = 0;
    gBrowser.addTabOriginal    = gBrowser.addTab;
    gBrowser.moveTabToOriginal = gBrowser.moveTabTo;
    gBrowser.addTab = function(aURI, aReferrerURI, aCharset, aPostData, aOwner, aAllowThirdPartyFixup)
    {
        var oldTabPos = this.mCurrentTab._tPos;
        var t = this.addTabOriginal(aURI, aReferrerURI, aCharset, aPostData, aOwner, aAllowThirdPartyFixup);
        if ( aURI != "about:blank" ) {
            this.moveTabTo(t, oldTabPos + 1 + this.__uc_addedTabs++);
        }
        return t;
    };
    gBrowser.moveTabTo = function(aTab, aIndex)
    {
        if ( aTab == this.mCurrentTab ) {
            this.__uc_addedTabs = 0;
        }
        return this.moveTabToOriginal(aTab, aIndex);
    };
    gBrowser.mTabContainer.addEventListener("select", function() { gBrowser.__uc_addedTabs = 0; }, false);
})();

TOP

[userChrome.js] 選択範囲内のすべてのURLをタブで開く、またはWeb検索する

選択範囲内にあるURLと思しき文字列をすべてタブで開くための、 userChrome.js 用スクリプトです。さらに、URLが含まれない場合はWeb検索します。URLかどうかの判定はかなり曖昧ですが、「ttp://」形式や「http://」が無い形式にも対応していますので、以下のような場合に有効です。

ttp://www.example.com/photo1.jpg
ttp://www.example.com/photo2.jpg
ttp://www.example.com/photo3.jpg

下記ではとりあえず関数として定義しています。
使い方は色々ありますが、userChrome.js マウスジェスチャからも利用可能です。

/**
 * A user script for userChrome.js extension.
 * @name    Open all URLs in selection or Web-search
 * @compatibility    Firefox 2.0
 * @author    Gomita
 * @version    2007.1.12
 * @permalink    http://www.xuldev.org/blog/?p=48
 */
function ucjsOpenOrSearchSelection()
{
    // getBrowserSelection function couldn't be apply since it removes all line breaks.
    var win = document.commandDispatcher.focusedWindow;
    var sel = win.getSelection().toString();
    if (!sel) return;
    // process each lines
    var flag = false;
    sel = sel.split("
");
    sel.forEach(function(str)
    {
        // extract strings which may be URL (not strict)
        str = str.match(/([a-zA-Z0-9+$;?.%,!#~*/:@&=_-]+)/);
        if (!str || str[1].indexOf(".") < 0 || str[1].length < 8 ) return;
        str = str[1];
        if ( str.indexOf("ttp://") == 0 ) str = "h" + str;
        // Open in a background tab
        gBrowser.loadOneTab(str, null, null, null, true, false);
        flag = true;
    });
    // If the selection doesn't contain URL, we does Web-Search it.
    if ( !flag )
        BrowserSearch.loadSearch(sel, true);
}

ついでに All-in-one Gestures の「閉じたタブを元に戻す」ジェスチャで Firefox 本体の undoCloseTab 関数を呼び出すように変更。

aioUndoCloseTab = undoCloseTab;

TOP

[userChrome.js] 「最近閉じたタブ」のエントリを中クリックしてタブを開き直す

Firefox 2.0 ではメニューバーの [履歴] → [最近閉じたタブ] から、閉じたタブを開き直すことができる。しかし、[履歴] メニュー下に最高10個表示される履歴のエントリが中クリックによって新しいタブで開くことができるのに対し、[最近閉じたタブ] のエントリは中クリックでは開くことができず、左クリックのみとなる。
そこで、 userChrome.js で以下のような簡単なスクリプトを読み込ませることで、中クリックも可能なようにする。

(function()
{
    document.getElementById("historyUndoPopup").addEventListener("click", function(event)
    {
        if (event.button == 1) event.originalTarget.doCommand();
    }, false);
})();

なお、Firefox 3.0 では本体側で修正されるもよう。

TOP

[userChrome.js] 検索バーのポップアップから検索エンジンを中クリックしてクリップボードの文字列を検索する

日々のブラウジング中での Firefox の検索バーの使い方というのは人それぞれ異なるものだと思うが、自分の場合は以下の2通りに大別される。

  • たいていの検索は Google を使用する。
    その方法は、検索バーに直接入力してEnterキー、またはWebページ中のキーワードを選択して右クリックメニューから検索のどちらかである。
  • ごくたまに Amazon などの異なるエンジンを使用して検索する。
    その手順は、Webページ中のキーワードを選択してコピー→検索バーへ貼り付け→検索バーのポップアップから検索エンジンを切り替え→虫眼鏡アイコンをクリック、という煩雑なものである。しかも、たいていの場合切り替えたエンジン(ここでは Amazon)では一度しか検索を行わず、次からはまた Google を使用するため、検索エンジンが切り替わってしまうのが嫌。

そこで思いついた便利な機能が、検索バーのポップアップから目的の検索エンジンを中クリックすることによって、クリップボードの文字列をそのエンジンで検索するという機能である。これなら検索エンジンを切り替える必要なく検索が行える。
前の記事同様、 userChrome.js によって使用可能なスクリプトとして実装した。ただし、Firefox 2.0 限定です。
スクリプトの内容としては、検索バーのポップアップの中クリック時に以下のような流れで処理が行われる。

  1. クリップボード内の文字列を取得
  2. クリックされた検索エンジンの menuitem 要素の engine プロパティから、 nsISearchEngine を取得
  3. nsISearchEngine から、送信先URLやPOSTするデータを取得
  4. 検索結果を新しいタブで開くかどうかの設定値を取得
  5. ブラウザのタブでロードする
  6. ポップアップを閉じる


10月26日追記
少し改良しました。詳しくはこちら:
[userChrome.js] Search Clipboard

TOP