width/height IDL属性の型について

羽田野@HTML5.JPです。
日本語に関係する話ではありませんが、HTML5仕様で規定されているIDL属性
の型について、問題を提起させてください。
表題の通り、width/height IDL属性についてです。

まず、HTML5仕様では、さまざまな要素で、横幅と縦幅を表す width/height
IDL属性が規定されています。基本的には、width/height コンテンツ属性を
反映しますが、これらのIDL属性の型に一貫性がありません。
HTML5仕様のIDLから width IDL 属性を抜き出してみました。右側の列は、
仕様で規定されている型です。

[1] img.width	unsigned long
[2] iframe.width	DOMString
[3] embed.width	DOMString
[4] object.width	DOMString
[5] video.width	DOMString
[6] input.width	DOMString
[7] canvas.width	unsigned long

[1] http://www.w3.org/TR/html5/text-level-semantics.html#htmlimageelement
[2] http://www.w3.org/TR/html5/text-level-semantics.html#htmliframeelement
[3] http://www.w3.org/TR/html5/text-level-semantics.html#htmlembedelement
[4] http://www.w3.org/TR/html5/text-level-semantics.html#htmlobjectelement
[5] http://www.w3.org/TR/html5/video.html#htmlvideoelement
[6] http://www.w3.org/TR/html5/forms.html#htmlinputelement
[7] http://www.w3.org/TR/html5/the-canvas-element.html#htmlcanvaselement

ご覧の通り、同じ width IDL属性なのに、その型がバラバラです。
当初、ディメンジョン属性[8]として規定されているものは DOMString とし
て規定されているのかと思いきや、img.width だけ unsigned longです。
ちなみに、canvas.width 以外はすべてディメンジョン属性として規定されて
います。

[8] http://www.w3.org/TR/html5/the-canvas-element.html#dimension-attributes

たぶん、過去の実装と互換性を保つために、やむを得ず、img.widthだけは
ディメンジョン属性にもかかわらず、unsigned long にしたのかなぁと、勝
手に解釈しています。

では、実際にブラウザーは、どんな型を返すのかを調べてみました。
ブラウザー間の差異は見当たりませんでしたので、ここではまとめてご報告
します。右側に追加された列がブラウザーの実装状況です。

img.width	unsigned long	Number
iframe.width	DOMString	String
embed.width	DOMString	String
object.width	DOMString	String
video.width	DOMString	Number	*
input.width	DOMString	Number	*
canvas.width	unsigned long	Number

ブラウザーの実装については、JavaScriptの型で表記しています。
また行末の * は、仕様と実装が異なることを表しています。

ご覧の通り、さらに一貫性がありません。
そして、仕様と実装の間で乖離が出てきています。

そこで、仕様を変更するとしたらどうするか、という観点で、以下の2つの案
が浮かびました。

a. 仕様をブラウザーの実装にあわせる。
仕様で video.width と input.width の型を unsigned long にするだけ。
しかし、仕様上、型の一貫性はなくなる。
ちなみに、input.widthは現在のことろ、IEのみサポートしています。

b. ディメンジョン属性は DOMString とする。
仕様で img.width の型を DOMString にするだけ。
一応、一貫性が取れるわけですが、旧来から使われている要素なだけに、
互換性という観点から影響が大きい。また、実装とも異なる。

もう一つの案として、極論ですが、正直なところ、個人的には、width/height
IDL属性は、すべてNumber型で返ってくるのが理想的だと思っていますが、
過去の互換性を考えると、難しいでしょう。
また、b. についても、互換性の観点から難しいかなぁと思います。
そのため、せめて a. を提案した方が良いかなぁと思っています。
仕様の美しさは犠牲になりますが、ディベロッパーにとっては、やはり実装
の方が大事です。(現時点ですでに仕様に一貫性があるわけはありませんし)
HTML Design Principles [9] に照らし合わせても、もし仕様変更の提案をす
るなら、a. が良いと考えています。

[9] http://www.w3.org/TR/html-design-principles/

width/height IDL属性は実装に合わせ、互換性を重視し、仕様上の一貫性は
犠牲にしたままにしておき、新たに、例えば、element.widthAsNumber みた
いな、すべてNumber型で返す新たなIDL属性を提案するというのも考えられる
と思います。
個人的にはあまり必要性を強く感じていませんが、もしこれが規定され、将
来的にすべてのブラウザーで実装されれば使うでしょう。
width/height IDL属性の値を文字列として扱うことは稀ですし、数値に変換
するために、毎度、parseFloat(element.width) とするのは面倒ですしね。

JavaScriptは型を意識しなくても変数を利用できるようになっていますが、
近年、JavaScriptでは型を気にしたコーディング・スタイルも多くなってい
ます。(例えば、=== など)
また、型を変換しなければいけないシーンも数多くあります。
そういう意味で、仕様上の型についても、議論があっても良いかなぁと思った
次第です。

いろいろな案を出してみましたが、みなさんは、どう思われますか。

--
Futomi Hatano
http://www.html5.jp/
http://www.futomi.com/
http://twitter.com/futomi

Received on Friday, 9 April 2010 02:14:39 UTC