Hatena::Groupsubtech

冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

 | 

Nov 27, 2007 (Tue)

jAutoPagerize キャッシュ関係 21:20 はてなブックマーク - jAutoPagerize キャッシュ関係 - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

なんかしばらく新しく siteinfo をとりにいってキャッシュするところがうごいてなかったっぽい。なおした。

でも Safari だといまいち挙動不審で、たまにsiteinfo 全部 ({}) になってしまうことがある。textarea.replace(//, function () {}) がへんなのかも……めんどい

uneval を適当に実装してテストしてたらきづいた。

Firefox での HTMLDocument 生成 (XSLT つかう BK) 16:33 はてなブックマーク - Firefox での HTMLDocument 生成 (XSLT つかう BK) - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

nanto_vi さんのコメントで原因が判明したので試行錯誤してコミットした。

http://coderepos.org/share/changeset/2053

var x = new XSLTProcessor();
var t = [
	"<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>",
		"<xsl:output method='html'/>",
		"<xsl:template match='/'>",
			"<html><head><title>", title, "</title></head><body/></html>",
		"</xsl:template>",
	"</xsl:stylesheet>",
].join("");
var d = document.implementation.createDocument("", "nice-boat", null);
var r = d.createRange();
r.selectNodeContents(d.documentElement);
d.documentElement.appendChild(r.createContextualFragment(t));
x.importStylesheet(d.documentElement.firstChild);
var ret = x.transformToDocument(d);
  1. DOMParser をやめた。
  2. そもそも二回 DOMParser していた部分を一個にした (かったぽの XML はなんでもよかったので XSLT つくるのに使った Document をそのままつかう)
  3. 生成結果が HTMLDocument っぽくないなら捨てる。

Safari でのあれ 13:28 はてなブックマーク - Safari でのあれ - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

GreaseKit だと同じウィンドウで userjs が実行されるので、常に prototype 上書きされる危険性があって、これはどうしよもない。普通は標準の関数をわざわざうわがきしたりしないから問題ないけど、前述の Array#reduce みたいに、微妙な立場の関数でしかも名前がよくつかわれるやつは上書きされやすい。(というか実際には Array#map も上書きされているけど、こっちは挙動が同じなので問題になってないだけ)

Opera もたぶん同じウィンドウで実行されるから同じ問題をもっていると思うけど、あんまり調べてない。


解決法:

  1. 全部関数形式でよんで、全部の関数を独自で実装する (むり)
  2. JS 1.6, 1.8 の関数は関数形式にして独自で実装する (妥協案)
  3. きりがないので放置
  4. GreaseKit 側に手をいれて別ウィンドウでの実行にする (むずかしそう)

あとたぶんこういう関係 (unsafeWindow的な意味で) jAutoPagerize + Safari + GreaseKit だと XSS ふんでそうな感じがするのでチェック必要だと思う。(ちょっと考えたけどとれちゃうな…… http://coderepos.org/share/changeset/2050 修正した。ほかにもある予感……)

(Greasemonkey だとウィンドウが別れているのでだいだい問題おきない。なぜ unsafeWindow が GM にはあって、他のにはないのかをよく考えて使わないとだめですね><)

あれ r2050 じゃ解決になってないよね…… siteinfo を外からアクセスできるようにしたらだめだな。

r2051 でたぶん解決。Safari でつかうのは危険なかおりがプンプンする。

Regexp $1 $2 12:55 はてなブックマーク - Regexp $1 $2 - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

Ruby にしても JS にしても $1 $2 は、それらがどっから沸いてきたのかソースコードをうえからよんでいったときにわかりにくいので、できるだけ使たくない。暗黙的に代入されているし、$1 $2 っていう名前には全くマッチを連想させない (慣れればわかるけど……あと JS の場合は RegExp.$1 とかになるのでいくぶんマシ)。しかも $0 は実行中のプロセス名だから $0 と $1 の間に同じ $n なのに全く関連がない。

よっぽどめんどくさくない限りは Regexp.last_match したり m = str.match(r); する。(Perl のときは気にしない)

jAutoPagerize 03:15 はてなブックマーク - jAutoPagerize - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

http://coderepos.org/share/changeset/2041

ごくごく簡単な XPath ジェネレータ/チェッカをくみこんでみました (Safari でのデバッグ用途が主目的)。siteinfo つくるなら基本的に no title をつかえばいいとおもうのでいらないと思います (さっきまで AutoPagerize IDE つかったことなかったw こりゃ便利ですね><)。

jAutoPagerize のアイコンをクリックするとテキストエリアがでます。Inspect ボタンをおすと要素選択して XPath を生成します。テキストエリア編集すると選択ノードにアウトラインがつきます。Safari でも動きます。jAutoPagerize のアイコンが表示されてないところでは javascript:XPathGenerator.open(); するとでてきます。

ノードから XPath つくるやつはちょー簡単に生成するのを前書いていたらしくて (test.user.js で getXPath... までうちこんだら autocompletepop された……) それをちょい改善してつかいました (ほとんどテストしてないからバグってるかも)。

		getXPathByElement : function (target) {
			var pathElement  = "";
			var node = target;
			if (node.nodeType == 9 /*DOCUMENT_NODE=9*/) {
				return ""
			} else {
				var tagName = node.tagName.toLowerCase();
				if (node.hasAttribute("id")) {
					// pathElement = tagName + '[@id="'+node.getAttribute("id")+'"]';
					pathElement = 'id("'+node.getAttribute("id")+'")';
				} else {
					pathElement = arguments.callee(node.parentNode) + '/' + tagName;
					if (node.hasAttribute("class")){
						pathElement += '[@class="'+node.getAttribute("class")+'"]';
					} else {
						pathElement += '['+indexOf(node)+']';
					}
				}
			}
			return pathElement;

			function indexOf (node) {
				for (var i = 0, r = 1, c = node.parentNode.childNodes, len = c.length; i < len; i++) {
					if (c[i].nodeName == node.nodeName &&
						c[i].nodeType == node.nodeType) {
						if (c[i] == node) return r;
						r++;
					}
				}
				return -1;
			}
		}

jAutoPagerize / Bug in Safari 02:21 はてなブックマーク - jAutoPagerize / Bug in Safari - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

twitter とか、prototype.js をつかっているサイトだと Array#reduce がうわがきされるうえに挙動がちがっててうごかない。

こっちの prototype 拡張をやめる (関数よびだしにする) っていうの以外で解決できるならするけど、できないならやらない。

 | 

スポンサード リンク

書いてる人

cho45 (佐藤広央) (www.lowreal.net)

Perl, JavaScript, Ruby, HTML, CSS, Web etc


スポンサード リンク