bokken.io
作成日
2020-10-02
更新日
2020-10-02
author
@bokken_
tag
html, tag, parser, Web 仕様

HTML parser を書いてるときに出会った Web 標準仕様の話

TL;DR

筆者はブラウザをスクラッチで書いている。そのときに HTML の標準を読みながらブラウザを書いている

そのときに仕様の不備のように疑われる挙動に出会った。

内容について調査しているうちに

ということを再認識できたので、その内容について紹介したい。

出会った背景

まず、筆者がどういう背景でどのような挙動に出会ったかを簡単に紹介する。

筆者はブラウザに興味があり、ブラウザをフルスクラッチで作っている。

その中で HTML の parser を WHATWG の仕様 を読み解きながら実装している。

そのときに、attribute (<a href="https://example.com"></a>href などの部分) の parse 処理を実装しているときに出会った。

HTML タグの attribute の書き方

HTML タグの attribute value は double-quoted,single-quoted,unquoted が許されている。

つまり、下記の三種類の書き方ができる。

<a href="https://example.com"></a>
<a href='https://example.com'></a>
<a href=https://example.com></a>

この仕様に沿って parser を書いてると、どうも anchor タグのテストが通らないという事象に出会った。

そのときのテスト入力には下記のように書いていた。

<a href=https://example.com/></a>

URL の末尾に / を書き、さらに属性値の '" を省略している状態だ。

このときに実装していた HTML parser ではどのように解釈されていたかをかいつまんで説明すると下記である。

  1. a タグの開始
  2. href という attribute name がある
  3. attribute の value は https://example.com (/ は次で使われる)
  4. a タグは self closing />
  5. a タグの閉じタグが余っている (</a>)

という具合に処理されて、</a> が浮いてしまい、テストが落ちていたのだっ た

WHATWG の仕様には沿っているし、URL としては https://example.com/ と書いていても問題なさそうだ。

これの挙動については、なにか議論ができるかもしれないと思い、issue を立ててみるかと思い立ったのだった。

このあと分かったことだがこの挙動は Web として正しい。

issue の調査

WHATWG/html の issue を調査をしてみると、すでに似たようなことについては [Parser] Make `/` in unquoted attribute value a parse error. · Issue #2665 · whatwg/html で議論がなされていた。

この issue では、この挙動への変更について @hsivonen 氏は下記のように述べて、変更をしない方が良いということを述べている。

If we now recanted on this, we'd undermine the WHATWG's credibility as source of reliable requirements than don't change on whim and that don't need "defensive coding" in case they change. If we now changed this, we'd vindicate the story that you should always do something extra (quotes, end tags), just in case, because you never know how things work out if you do something easy and convenient and you can't trust things to actually work the way specs say.

簡単に要約すると、下記のようだった。

確かにこの仕様を変更するだけで、いくつのソフトウェアが書き直されるかわからないし、この挙動を前提として書かれたウェブページもあるかもしれない。

そういう状況では仕様を変更することにはかなりの危険が伴うのだ。

おわりに

WHATWG の標準の変更に対する考えにも変更はとても慎重になることが書かれている。

また、団体が少し変わるが W3C の後方互換性に関する説明書き にも下記のように述べられている。

The Web itself is designed to be backwards compatible.

Web というのはとても互換性を大切に作られてきている。また、実際に動くものを重視しているのも間違いない。

少なくとも標準化までに、仕様の提案、各ベンダによる実装、仕様の改善がなされてはじめて標準として成立して、今 Web は動いている。

よほどのことがない限り、今動いているものが正義なのだ。

それをより身近に感じられた出来事だった。

この Web 、あるいはインターネットを壊さないように、改善するためにどうするかをコミュニティのメンバー全体で作られている感覚が筆者にはとてもよいなと感じる。

Tweet このエントリーをはてなブックマークに追加
Subscribe via RSS
TOP