FLYING

/* TODO: 気の利いた説明を書く */

Twitter公式のShareブックマークレットがブラクラ化した件

理由はよく分からないのですが,エントリタイトルのような現象が起こっています。Googleリアルタイム検索の結果を見る限り,Firefox4だけでなくChromeOperaでも同様の現象が起こっている様子。具体的な症状は,Shareブックマークレットを実行した瞬間に,ウィンドウが無限にポップアップするというものです。

詳しい話は置いておくと,ブックマークレットの内容を次のように書き換えることで,URITwitterで共有するという目的を達成できました。

javascript:(function(){window.twttr=window.twttr||{};var D=550,A=450,C=screen.height,B=screen.width,H=Math.round((B/2)-(D/2)),G=0,F=document,E;if(C>A){G=Math.round((C/2)-(A/2))}window.twttr.shareWin=window.open('http://twitter.com/share?url='+F.location.href+'&text='+encodeURI(F.title),'','left='+H+',top='+G+',width='+D+',height='+A+',personalbar=0,toolbar=0,scrollbars=1,resizable=1')}());

無限ポップアップの原因(2011-04-24T22:13:00+09:00時点)

公式で配布されているブックマークレットのソースは以下のようになっています。

javascript:(function(){window.twttr=window.twttr||{};var D=550,A=450,C=screen.height,B=screen.width,H=Math.round((B/2)-(D/2)),G=0,F=document,E;if(C>A){G=Math.round((C/2)-(A/2))}window.twttr.shareWin=window.open('http://twitter.com/share','','left='+H+',top='+G+',width='+D+',height='+A+',personalbar=0,toolbar=0,scrollbars=1,resizable=1');E=F.createElement('script');E.src='http://platform.twitter.com/bookmarklets/share.js?v=1';F.getElementsByTagName('head')[0].appendChild(E)}());

スクリプトの後半で「http://platform.twitter.com/bookmarklets/share.js?v=1」をsrc属性に持つscript要素を生成してhead要素にappendChildしているようなのですが,問題はココで参照されているスクリプトの内容。http://platform.twitter.com/bookmarklets/share.js?v=1にブラウザでアクセスしてみると,次のようなスクリプトが返って来ます。

(function(){window.twttr=window.twttr||{};var D=550,A=450,C=screen.height,B=screen.width,H=Math.round((B/2)-(D/2)),G=0,F=document,E;if(C>A){G=Math.round((C/2)-(A/2))}window.twttr.shareWin=window.open("http://twitter.com/share","","left="+H+",top="+G+",width="+D+",height="+A+",personalbar=0,toolbar=0,scrollbars=1,resizable=1");E=F.createElement("script");E.src="http://platform.twitter.com/bookmarklets/share.js?v=1";F.getElementsByTagName("head")[0].appendChild(E)}());

見ての通り,ブックマークレット自体と全く同じコードなので,結果としてブックマークレット実行時の処理が再帰的に実行されます。このスクリプトにはTwitter投稿用のウィンドウをポップアップさせる処理が含まれているので,前述したようなブラクラに近い挙動になってしまうというわけです。

色んな人のブラウザに登録されているブックマークレットスクリプトが勝手に書き換わることはあり得ないので,Twitter側のスクリプト(share.js)が何らかの原因で書き換えられてしまったんじゃないかと予想しています。単なるミスであるならば,もう少し待っていればTwitterの中の人が修正してくれるかも?

2011-05-01T09:47:00+09:00

改めてshare.jsを確認したところ,ソースコードが更新されており,公式ブックマークレットが正常に動作することを確認できました。上記の暫定スクリプトを使っている方は,公式のスクリプトに戻すことをお薦めします。

ところで,不具合報告は(メールでの連絡先がどこに記載されているか分からなかったので)@twedasukeアカウント宛にmentionという形で行ったのだけど,読んでもらえてるのかもらえてないのか,今の時点で一切の反応をもらえていないです。何もスルーすることないのに(´・ω・`)