「このサイトはコンピュータに損害を与える可能性があります」

このサイトはコンピュータに損害を与える可能性があります

というメッセージを google の検索結果に挿入する userscript を作りました!!!!

(追記) AutoPagerize に対応させました

// ==UserScript==
// @name           malwarewarninglink
// @namespace      malwarewarninglink
// @description    この userscript はコンピュータに損害を与える可能性を与えます
// @include        http://www.google.co.jp/*
// ==/UserScript==
(function () {
    function filter(doc) {
	var elts = null
	if (!!doc) { elts = $x('descendant::div[@class="s"]', doc) }
	else       { elts = $x('//div[@class="s"]') }
	for (var i=0, l=elts.length; i<l; ++i) {
	    var first = elts[i].childNodes[0];
	    if (first.tagName != 'A') {
		elts[i].innerHTML = '<a href="/support/bin/answer.py?answer=45449&amp;topic=360&amp;hl=ja&amp;sa=X&amp;oi=malwarewarninglink&amp;resnum=1&amp;ct=help">このサイトはコンピュータに損害を与える可能性があります。</a><br />' + elts[i].innerHTML
	    }
	}
    }

    filter()
    addFilter(function (docs) { foreach(docs, filter) })

    function foreach (ary, callback, idx) {
	for (var i = idx || 0, l = ary.length; i < l; ++i)
	    callback(ary[i], i)
    }

    function addFilter(filter, i) {
	i = i || 4
	if (window.AutoPagerize && window.AutoPagerize.addFilter)
	    window.AutoPagerize.addFilter(filter)
	else if (i > 1) {
	    setTimeout(arguments.callee, 1000, filter, i - 1)
	}
    }

    // cho45 - http://lowreal.net/
    function $x(exp, context) {
	if (!context) context = document;
	var resolver = function (prefix) {
	    var o = document.createNSResolver((context.ownerDocument == null
		? context : context.ownerDocument)
		.documentElement).lookupNamespaceURI(prefix);
	    return o ? o : document.documentElement.namespaceURI;
	}
	var exp = document.createExpression(exp, resolver);
	var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
	switch (result.resultType) {
	case XPathResult.STRING_TYPE : return result.stringValue;
	case XPathResult.NUMBER_TYPE : return result.numberValue;
	case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
	case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
	    {
		result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
		var ret = [];
		for (var i = 0, len = result.snapshotLength; i < len ; i++) {
		    ret.push(result.snapshotItem(i));
		}
		return len != 0 ? ret : null;
	    }
	}
	return null
    }
})()