iOSのブラウザーエンジン
先日iOSのアプリスイッチャーについて苦言を述べたが、iOS26に更新したら、くだんの色変換はしなくなった。ただし、仕様を見直したのか、実装が追いついていないだけなのかは不明。過去にもあったように、決められていた予定日に、機能が不十分なままOSがリリースされる例はめずらしくない。
iOS26は見た目をかなり大きく変更(買い替え促進策か、つまらぬ装飾のために負荷を強いる改悪)しており、スイッチャーどうこうではなくOS全体の色管理が変わった可能性もある。なぜそう言えるかというと、ウェブの表示も変わったから。CSSで広色域指定されている色が、従来のような鮮やかさを失っている。新たな仕様としてあえて抑えているのか、一時的な措置かはやはり不明。開発ログを追うほどの関心はない。
それはさておき、iOS26のSafariにはもっと深刻な問題があった。自分が昨年から公開しているウェブアプリが、iOS26版Safariでだけ(iPad版・macOS版は未確認)異常な挙動を示すのだ。
ちょっと不思議なのは、PWAインストールした場合や、Chrome・Firefoxなど他のiOS用ブラウザーで開くぶんには、そのウェブアプリは正常に動作すること。iOS上のブラウザーは、どれもSafariと同じブラウザーエンジンを強制されているはず(EU圏では怒られて改められたようだが)。にもかかわらずSafariでだけバグるということは、固有の変更なりフィルターなりをエンジンに加えているということか。
で、具体的に何が起きているのか。あれこれ調べてみたところ、canvasのdrawImageメソッドがおかしいとわかった。これはHTMLのcanvas要素に画像を描くメソッドだが、Safariはここで、余計な色調整(かどうか知らないがとにかくRGB値が微妙に変わる)を勝手にしてしまうのだ。与えている画像データはカラープロファイルなど含んでいないし、「色域はデフォルトのsRGB」「色空間の変換は無用」といったオプション指示もしつこくしているのに。
なぜ色調整がバグにつながるかといえば、うちのウェブアプリがここで与えている画像データは、ヒトが見るための絵や写真ではなく、巨大な数値テーブルだから。プログラムが使う数値テーブルを勝手に変化させられたら、挙動が狂うのは当たり前。
数値テーブルとしての画像とは、少々ハックくさく聞こえるかもしれない。けれども実は古典的な手法で、GPUプログラミングにおけるテクスチャーだって似たようなもので、突飛でもなんでもない。そこそこ高度なウェブアプリでは使われているであろう手で、このバグの影響を受けるのはうちだけではないはず。
しかし回避しようにも、画像のピクセル配列にJavaScriptからアクセスするにはcanvasを経るほかない。そもそもなぜ数値テーブルをわざわざ画像化するかといえば、画像ファイルはウェブにおいて何かと扱いやすいから。よほどの利益をその市場から得ていないかぎり、Safariの尻拭いだけのために独自のバイナリーファイルに切り替える開発者がどれだけいるか。結局、いずれ修正されるだろうと踏み、こちらでは特に対処せず(ここまでの調査だけでたくさん。とりあえずApple Developerにバグ報告はした)障害情報だけ載せることにした。