bokken.io
作成日
2023-11-30
更新日
2023-11-30
author
@bokken_
tag
chromium

Chromium の Expires: 0 の取り扱いを修正したときに学んだこと

はじめに

ことのはじまりは https://crbug.com/853508 を見つけたことだった。

この bug は HTTP Caching に関わる話で、Expires: 0 がレスポンスに付与されていた際には、ブラウザはこのキャッシュを expired なものとして扱わなければいけないというものだった。

A cache recipient MUST interpret invalid date formats, especially the value "0", as representing a time in the past (i.e., "already expired")

--- https://www.rfc-editor.org/rfc/rfc9111.html#field.expires

面白くて大変だったこと

結局、問題箇所の特定と修正などですべて合わせるとトラッキングしていた時間を見ると 60 時間ぐらいかかっていた。一日 1, 2 時間費やして 1.5 ヶ月〜 2 ヶ月ぐらい取り組んでいたように思う。

一番大変だったのは問題箇所の特定だった。エディタの検索機能や、デバッガを駆使して、どこで Expires を取り扱っているのか調べていく必要があったのだが、Chromium は規模が大きく探すのが大変だった。ただ、問題箇所を探す上で、リソースやキャッシュを取扱うコードがどこにどんな形であるのか知っていくのはとても楽しかった。

問題が解決できたときもすごく楽しいのだが、原因を特定するために自由にコードを見て回っているのも発見があって楽しい。自分は標準化されていたり、オープンな仕様がどう実装されていくのかに興味関心があるのだと思う。

もしも、同じような興味関心を持っている人は Chromium はまさにそれなのでおすすめである(しかも大きすぎて終わりが見えない)。

レビューを通して学んだブラウザ開発者の動き

この変更については、toyoshim さん、hayato さん、ricea さんに見ていただいた (ありがとうございました!)。

レビューを通して直接コメントをもらったところと、その他にも気づいたことがあったので、忘れないために記載しておく。主には次の通りだ。

  1. ユニットテストだけでなく Web Platform Test も修正する必要がある
  2. 変更をフラグ下に入れるのはいつだって有効な手段
  3. Intent to Ship か、PSA (Public Service Announcement) で開発者に知らせる必要がある

順番に紹介していく。

1. ユニットテストだけでなく Web Platform Test も修正する必要がある

これはユニットテストだけで動作が担保できない変更であったこともあるのだが、ブラウザ共通の処理であったことも関係がある。 今回の変更は RFC の仕様をもとに実施している。そのため、この仕様はブラウザ共通である。そのため、Web Platform Test という形で各ブラウザが仕様をテストできるようにした方がよい。このように、ブラウザ間で協力して開発をしている様子がよくわかった。

2. 変更をフラグ下に入れるのはいつだって有効な手段

今回の修正は比較的軽微な変更なので、フラグを使わずそのまま修正を出すと思っていた。 しかし、30 億以上のユーザがいる状況では、なにかがあったときに影響が大きい。変更については細心の注意を払わなければいけない。 フラグを使うと少し記述量が増えるのだが、そのちょっとした工夫で 30 億以上のユーザが安全に使えるなら十分にリターンがある(もちろんすべてをフラグ下に入れているわけではないが)。

3. Intent to Ship か、PSA (Public Service Announcement) で開発者に知らせる必要がある

今回の修正はユーザや Web 開発者の目に触れる変更だった。そういった変更の際には、(ものによるが) blink-dev に Intent to Ship や PSA (Public Service Announcement) という形で知らせる必要がある。

急に挙動が変わってしまうとユーザや、特に Web 開発者は驚く可能性がある。そういったところに十分に気をつけているようであった。また、当時、お知らせの内容はブラウザ開発者への情報共有だと思っていたのだが、それだけではなく Web 開発者に向けて知らせる必要があることも今回のことで学んだ。

また、Web 開発者がどういう事象を見つけたときに、どういう対応が必要かも書いておくことで、時間を削減できることにも気づいた。

実際にコメントとして追加した方がよいと教えてもらったのは以下の文言だ。

In almost all cases no action from web developers is required. However, if you see an unwanted increase in 304 Not Modified responses in your server logs or unwanted cache miss, you may wish to check the Expires: header that your server is sending using DevTools.

この文言には

ということが書かれている。

このように Web 開発者へ最大限配慮してブラウザ開発が行われていることを学んだ。

おわりに

今回、Chromium の bug の修正に取り組んで、そこから学んだことを紹介した。 ブラウザ開発をしている上で特殊なこともあれば、ビジネスマナーと共通しているようなところもあった。

今後もブラウザ開発者としての姿勢を身に着けていきたいと思った経験だった。

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