- From: Futomi Hatano <info@html5.jp>
- Date: Fri, 09 Apr 2010 11:14:06 +0900
- To: public-html-ig-jp@w3.org
羽田野@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