misskey
misskey copied to clipboard
Service Workerが出しているオフライン時のメッセージがJavaScriptエラーになることがある
💡 Summary
Service Worker(SW)には、インターネットに接続されていないなどリクエストを処理できなかった時に「Offline. Service Worker @12.117.1
」という文字列を返す機能がある。
しかし、これはどのようなリクエストでも適用されるので、インスタンスがWebアナリティクスや広告を埋め込んでいて、ユーザーがそれを通信遮断によってブロックしている場合に、JavaScriptのそれらの関連ライブラリが読み込めないときに上記のような文字列がSWから返されることで、文法エラーを引き起こし、Misskeyのエラーであるかのように扱われてしまう。
🥰 Expected Behavior
ブロックが働いてもエラーが起きない。
🤬 Actual Behavior
JavaScriptとしては認識されないただのプレーンテキストが返ってくるので文法エラーになり、ブート時の例外キャッチに引っかかる
📝 Steps to Reproduce
広告ブロック機能を有効にしてMisskeyにアクセスする (アナリティクスのある misskey.io が良い例)
📌 Environment
Misskey version: 12.117.1 Your OS: Windows 10 Your browser: Chrome 103
諸悪の根源は Chromium 系だと Service Worker がある場合 SW の飛ばしたリクエストにのみ広告ブロッカーが効くせいな気がする
Firefox は ページ → コンテンツブロッカー → (あるなら SW → コンテンツブロッカー) → インターネット になるけど、Chromiumは ページ → (あるなら SW) → コンテンツブロッカー → インターネット
になっているっぽい (uBlock Origin のリクエストログを見る限り)
(misskey.io の場合はさらに /cdn-cgi/apps/head/
が script でだけブロックされるルールで、SWを通ったリクエストしか来ないとSWからのリクエストは一律xhrになって通してしまうので後の諸々のロード(これはドメイン単位ブロック)でコケるらしい)
広告ブロッカーの問題なら広告ブロッカーを外してほしい……とは思ったけど、ランディングでこれ見せられてもわけわからないだろうから直すか
実装方針→SharedWorkerGlobalScope.onfetchで/
以外のfetchでcatchしたら500でresponseする
Misskeyでどういう直し方をしてもエラーの内容が変わるだけでエラーになるのは変わらないのでclose
いやそもそもcatchせず上流にそのままエラー返すのが一番正しい動きをしそうだし https://github.com/misskey-dev/misskey/pull/9038#issuecomment-1200762775 syntax error になるというissueの趣旨は正しい
#9038 を見落としてた