すでにある機能の廃止は難しい

OperaがWebKitの接頭辞を…というのは、まあとりあえずは中の人からの報告を待っておくとして。

さて、WebKitプロジェクトは接頭辞についてどう考えているんだろうか。先週やっていたWebKit Contributor Meetingで接頭辞などについて取り上げたセッションがあったらしい。

機能の廃止、接頭辞の削除と、ふたつトピックがあったので、ふたつに分けて書く。

機能は廃止できるのか

この前WebKitは接頭辞をエイリアスとして残す方針があると書いた。もう少し広げてかくと、既存のコンテンツが依存している機能は、接頭辞の有無にかかわらず、削除せず残しておく感じだ。カジュアルに使われやすいCSSの機能は、たぶん削除されることは今後もほぼないと考えている。

けれど、APIについては実装を削除している場合もある。event.layerX/layerYがそのひとつで、昨年削除された。

コンソールにwarningが出るようになっている。Chrome 16以降あたりで反映されたので、見ている人も多いんじゃないかな。

なぜ「見ている人が多い」のかというと、ちょっと前までjQueryになんとなく入っていたから。Chromeでwarningがでまくるというバグが立てられて、その結果jQuery 1.7でも削除された。

layerX/Y are not used internally and we do not normalize them. They are only present on the event object where supported, so anyone actually using them would have to check if they were undefined first anyway.

内部で使ってもいないし、ノーマライズもしてない。依存したコードもそれほど多くないだろうというのが、削除の理由。ただ、jQueryのアップデートがされないなんて日常茶飯事だ。それでなんとかしろよ的なissueもあがっている。

そんな中IE9で互換性のため実装されたという話もあって、削除すべき(だった)のか、むしろもう標準化しないといけないんじゃ…的なことになった。

Warningが出なかったらここまで言われることもなかったのかなとも思う。けれど、一度世に出てしまった実装を削除するのはなかなか大変だ。MozillaFirefox 7でimage.x/yを削除したんだけど、互換性に問題があることが分かって昨日バックアウトされ、HTMLでの標準化を求めるバグが立てられた。

うまくいってそうな例もある。ミーティング内ではsync XHRでのArrayBufferサポートについて、削除したらどこかのゲームフレームワークに影響を与えたものの、フレームワーク開発側がなんとかしたので収まったという話がでていた。使っている人がほとんどおらず、また(結果的に)協力的な対応が行われればうまくいくということなんだろう。ただ、こういうケースは稀だろう。影響をほとんど出さずにうまく削除できるなんて奇跡に近い。

Blob.slice()は成功例か?

うまくいった例として、Blob.slice()も挙げられている。もともとBlob.slice()WebKitMozilla, Operaで接頭辞なしで実装されたんだけど、そのあと、String.slice()などとセマンティクスが違うということが分かった。お粗末ではあるんだけど、仕方ないから変えようということで、Blob.webkitSlice()/Blob.mozSlice()と接頭辞つきのメソッドに改名された。Chromeでは12あたりから、FirefoxはFx5から反映されている。

Operaはそのままなんだけど、WebKitMozillaではそのメソッドが1年近くも存在していない。なので、古いBlob.slice()に依存するコードがある場合、なにか問題がでてくるはず。ただ、とくになかったようだ。

今年2月になってOperaが、接頭辞なしで通していた古い実装を新しいものにする、でも接頭辞をつけて実装する必要性は(上記の理由から)たぶんないので、接頭辞を削除してくれとMozilla, WebKitに報告した。

Mozillaは速攻でmozSlice()から接頭辞を削除して、これ、Firefox 13で反映予定なのだけれど、どうやらmozSlice()に依存したコードがあったらしくバグが立てられている

なのでこれ、古いBlob.slice()への依存回避はうまくいったのかもしれない。ただ、mozSlice()/webKitSlice()でへの依存という新しい問題を生み出している。Blob.webkitSlice()接頭辞取れよってバグも放置されっぱなので、これからMozillaのように問題が起こる可能性がある。なので、接頭辞の削除ではなく、エイリアスとして残すんじゃないかな。

廃止の意義は?

機能や接頭辞の削除にどういう意義があるのか。こんなくだりがある。

weinig: aren't gradients a success story? we were able to ship the new syntax without breaking anything. arv: but we haven't removed the old syntax.

weinig: but is that really hurting us?

jamesr: who is "us" here? the web or webkit developers?

weinig: webkit developers.

WebKit開発者にとって、機能を削除しないことの悪影響はあまりないのかな。削除して動かなくなったらクレームが来るだろうし、残すことに利があるケースが多いのかも。Web開発者にとっても、うまく残せるのなら、今まで使えてたものが急に使えなくなるよりは、いいだろう。ただ、接頭辞によって特定の環境固有にされてしまってるので厄介なことになっている。

WebSQLを例に、メンテがされていない機能についてはどうなのかという質問もでている。(WebSQLはメンテがされているらしいので、適当な例ではないようだけれど、)広く使われている機能なら、長く残り続けるだろうと。Transition/Animationについても、たとえ他のブラウザが接頭辞を省いたとしても、これまでを考えると接頭辞のwarningさえ出せないだろうとも書かれている。

その後に、省きたくても使われていて省けないものには、よりよい代替が出るしかないとある。Mutation EventsやlocalStorageがそれに当たるのかな。よりよい代替が出たとしても、それの普及を待って消すというのには大変な時間がかかるだろう。

既存のコンテンツを大事にするなら、機能の廃止は接頭辞の有無や標準非標準に関係なく難しい。廃止だけじゃなくて追加や変更も難しいことがあるんだけど、それはそれで別に書こうかな。