トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

greasemonkey

[カテゴリ:Javascript]
[カテゴリ:Greasemonkey]

greasemonkey(2008/04/19)

とは?

Greasemonkey - Wikipedia
http://ja.wikipedia.org/wiki/Greasemonkey

ユーザスクリプトの作り方

このあたり見れば作れる。

Greasemonkey - Mozilla Firefox まとめサイト
http://firefox.geckodev.org/index.php?Greasemonkey

Dive into Greasemonkey 日本語訳 - Mozilla Firefox まとめサイト
http://firefox.geckodev.org/index.php?plugin=attach&pcmd=open&file=dive_gm.pdf&refer=Greasemonkey

GreaseMonkeyスクリプト作成クイックスタート - mitc - 日記
http://mitc.xrea.jp/diary/013

Greasemonkey スクリプトの構成 - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech
http://subtech.g.hatena.ne.jp/cho45/20071207/1197038494

Greasemonkeyによるアプリケーション開発:第1回 Greasemonkeyによるアプリケーション開発の準備|gihyo.jp … 技術評論社
http://gihyo.jp/dev/feature/01/greasemonkey/0001

メモ

Greasemonkeyのソースがかなりアレな件 - hogehoge
http://d.hatena.ne.jp/teramako/20080213/p1

Greasemonkeyの開発をまとめてみる
http://www.ohmiyapatriots.com/blog/2007/07/04/greasemonkey%E3%81%AE%E9%96%8B%E7%99%BA%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF%E3%82%8B/

SNAPSHOT_TYPEで取得したnodeを変更してはいけない?(2008/04/19)

現象

SNAPSHOT_TYPEで取得したnodeのinnerHTMLなどを経由して、
表示を動的に書き換えた。ところが、特にエラーなどでなくても
表示が更新されたり、されなかったりする現象が発生。

# 何か勘違いしてたっぽい。詳細は最後。

調査

調べてみた。

Introduction to using XPath in JavaScript - MDC
http://developer.mozilla.org/ja/docs/Introduction_to_using_XPath_in_JavaScript#Snapshots
スナップショットは文書が変異しても変更されず、イテレータと違って無効
になることはありませんが、スナップショットは現在の文書に対応しません。
ノードが移動されていたり、既に存在しないノードが含まれていたり、新しい
ノードが追加されている可能性もあります。

*現在の文書*に対応している保証がないらしい。
名前がスナップショットなのだから、当然と言えば当然でした。。。

かといって、ITERATOR_TYPEは、

Introduction to using XPath in JavaScript - MDC
http://developer.mozilla.org/ja/docs/Introduction_to_using_XPath_in_JavaScript#Iterators
ただし、反復処理中に文書が変異した (文書ツリーが改変された) 場合、
反復処理は無効化され、XPathResult の invalidIteratorState プロパティ
が true に設定され、NS_ERROR_DOM_INVALID_STATE_ERR 例外が投げられます。

ということなので、ループ中に改変することはできない。

対策

以下を行うと例外になるので、

  • イテレータでnodeを抽出しながらnodeを改変

以下のように分離すればよさげ。

  • イテレータでnodeを抽出
  • nodeを改変

ノード抽出

function getElementsByXPath(xpath, node)
{
    var node = node || document;
    var iterator = document.evaluate(xpath, node, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    var ret = [];
    var current;
    while (current = iterator.iterateNext()) {
        ret.push(current);
    }
    return ret;
}

とか思ったんだけど・・・

getElementsByXPathで検索してみると、
多くはORDERED_NODE_SNAPSHOT_TYPE を使ってる。

試しに以下で置き換えてみると、うまく動いてる。

// copied from AutoPagerize(c) id:swdyh
function getElementsByXPath(xpath, node) {
    var node = node || document
    var doc = node.ownerDocument ? node.ownerDocument : node
    var nodesSnapshot = doc.evaluate(xpath, node, null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
    var data = []
    for (var i = 0; i < nodesSnapshot.snapshotLength; i++) {
        data.push(nodesSnapshot.snapshotItem(i))
    }
    return (data.length >= 1) ? data : null
}

んー・・・
XPath以外の部分でミスってたのか。。。

Greasemonkeyの危険さ加減。(2008/04/20)

Greasemonkey スクリプトは安全ではありません
http://espion.just-size.jp/archives/07/192000455.html

Greasemonkey の危険性 - まちゅダイアリー (2006-05-02)
http://www.machu.jp/diary/20060502.html#p01

Amazonアソシエイトのtakochu04-22って何? - diary.yuco.net (2006-05-01)
# mazonアフェリエイトのIDをこっそり変更されて大騒ぎ?
http://diary.yuco.net/20060501.html#p01

スクリプト

Dec 03 2006 :: 英和辞書ひきまくる Greasemonkey スクリプト / nulog, NULL::something : out of the washer
# シンプル版
http://lowreal.net/blog/2006/12/03/1

Fast look up JP and EN &#8211; Userscripts.org
# いろいろできるようになった版
http://userscripts.org/scripts/show/12901

ジャンル別Greasemonkeyスクリプトのまとめ: DesignWorks
http://designwork-s.com/article/44393662.html

最終更新時間:2008年04月20日 15時56分00秒