cocolog:74918848
Firefox 17 で Greasemonkey のユーザースクリプトが動かなくなった。@grant 文を疑ったが、原因はそこではなく、E4X が廃止されたことにあった。 (JRF 4563)
JRF 2012年12月 7日 (金)
いちいちクォートするのではなく \ とかで改行を活かすのを好む方もいるかもしれないが、escapeHTML みたいなのがいるのが大事なところ。
JRF2012年12月7日2265
escapeHTML、escapeXML に相当するものは、すでにだいたい使っていると思うが、↓みたいな関数。
<pre>
function escapeHTML(s) {
return s.toString().replace(/\&/g, "&")
.replace(/\"/g, """)
.replace(/</g, "<")
.replace(/>/g, ">");
}
</pre>
なお、escapeHTML 内の s.toString() がない実装だと、ちょっとエラーが出るので注意。
JRF2012年12月7日6280
……。
《Firefox 17でE4Xが無効に | Yuji Noizumi's blog》
http://yuji.noizumi.org/blog/2012/11/23/firefox-17%E3%81%A7e4x%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%AB/
《E4X | MDN》
https://developer.mozilla.org/ja/docs/E4X
今だと about:config で有効にできるが、Firefox 18 では完全除去されるらしい。
JRF2012年12月7日5949
……。
しかし、こんな文法が変わるような変更が許されるのか?E4X はそれほど Flexible でもないんで、E4X で書いたのを後からさらにいじるとか、私もやってたけど、そういうのって単純な書き換えだけで済まないこともあると思うんだけど…。
JRF2012年12月7日5385
レガシーコードがダメになって、それをチマチマ書き直さないといけないとか、どんだけ人月かけさせるの?使ってる人に前もって警告画面でも表示していれば、ある程度時間使って準備もできるけど、例えば私なんか、これで、書こうと思った「ひとこと」を書けなくなったわけで、そういうリアルタイムな要求で損害が出てても知らんぷりで通ずるのか?
デフォルトから外すとしても、about:config じゃなくて、スクリプトのプラグマとかで E4X を有効にできる方法とか残すのが、普通のやり方じゃないか?
JRF2012年12月7日2926
今は、JavaScript がメジャー言語となって、他の言語を JavaScript へのコンパイラとして実装するみたいな話もよく聞く。だったら、例えば、特定のアドオンでコンパイラを用意し、プラグマによってはそこでコンパイルされた JavaScript を実行するとかいう機構を実装する道もあるだろう。そういうのがあれば、E4X が使える JavaScript を E4X が使えない JavaScript に変換するという「コンパイラ」を指定すれば、「対応終り」とできる方法もありえたはず。
JRF2012年12月7日6381
これを知って私はちょっと正直かなり怒っちゃって、他の人から電話応対に粗相を来たしちゃったぐらいで、今冷静になろうとしてるところなんだけど、やっぱり「技術者の劣化」([aboutme:120990]とか)はここまで来たか…ぐらいのことは言ってしまわないと気がおさまらない!
(まぁ、本当の昔かたぎのオープンソースな技術者なら文句があるなら自分でなんとかしろってところなんだろうね。結局のところ私がダメなんであって、他人のせいにしちゃいけないな。orz)
JRF2012年12月7日4154
typo 「'</id>」→「'</id>'」。
JRF2012年12月7日4599
E4X の除去は、
<pre>
val m1 = <member>
<name>{name}</name>
<id>{id}</id>
</member>;
</pre>
とかいうときは、
<pre>
val m1 = '<member>'
+ '<name>' + escapeHTML(name) + '</name>'
+ '<id>' + escapeHTML(id) + '</id>
+ '</member>';
</pre>
とかする必要がある。
JRF2012年12月7日1306