XMLHttpRequest#responseURL について

今年の2月に WHATWG の XMLHttpRequest (XHR) の仕様に追加された responseURL プロパティが、先日 Firefox に実装された (https://bugzil.la/998076) のでそのことについて書く。

responseURL は XHR のリクエストに対するレスポンスの URL を文字列で返すプロパティで、リダイレクトが発生した場合は最終的なリダイレクト先の URL を返すようになっている。つまり Greasemonkey の GM_xmlhttpRequest にある finalUrl で取得できる情報と同じものを取得できるプロパティだと言える。

responseURL が XHR の仕様に追加される以前の状態でも、 xhr.responseType === "document" の場合に xhr.response.URL 経由で finalUrl と同じ情報を取得できることは 1年前に書いた通り 。ただ、xhr.response.URL と比較して xhr.responseURL には以下のような利点があると考えている。

  1. XHR で取得したレスポンスの形式によらず取得できる

    xhr.response.URLxhr.responseType が “document” の場合のみ取得可能で、その他の場合には使用できない。一方で xhr.responseURL の場合は xhr.responseType の設定によらずレスポンスの URL を取得可能になっている。

  2. 機能が実装されているかを調べるのが楽

    xhr.responseURL の場合、最近になって仕様に追加されたことから "responseURL" in (new XMLHttpRequest()); の様にしてプロパティの存在が確認できれば、その UA では機能が仕様通り実装されていることを期待できる。一方で xhr.response.URL の場合、Document オブジェクトに URL プロパティが存在するのは当然なので、機能が仕様通り実装されているかどうかを調べるにはその存在を確認しただけでは不十分で、実際に適当な URL に XHR でリクエストして調べる必要がある。

今のところ responseURL は Firefox Nightly のみの実装ではあるのだけれど。XHR でリクエストした際の URL と xhr.responseURL の比較によってリダイレクトを検出できるので、 リダイレクトについての情報を提供しない壊れたAPI と言われていた XHR が、ようやく仕様と実装を含めてまともになり始めた、と言えるのではないかと思っている。


ところで https://bugzil.la/998076 の実装担当は自分なので、「responseURL プロパティが、先日 Firefox に実装された」みたく他人事として書くのは虚偽記述法っぽい。 まあなんというか、そういう感じ。