misskey icon indicating copy to clipboard operation
misskey copied to clipboard

Service Workerが出しているオフライン時のメッセージがJavaScriptエラーになることがある

Open CyberRex0 opened this issue 1 year ago • 3 comments

💡 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

CyberRex0 avatar Aug 01 '22 06:08 CyberRex0

諸悪の根源は Chromium 系だと Service Worker がある場合 SW の飛ばしたリクエストにのみ広告ブロッカーが効くせいな気がする

rinsuki avatar Aug 01 '22 06:08 rinsuki

Firefox は ページ → コンテンツブロッカー → (あるなら SW → コンテンツブロッカー) → インターネット になるけど、Chromiumは ページ → (あるなら SW) → コンテンツブロッカー → インターネット

になっているっぽい (uBlock Origin のリクエストログを見る限り)

rinsuki avatar Aug 01 '22 06:08 rinsuki

(misskey.io の場合はさらに /cdn-cgi/apps/head/ が script でだけブロックされるルールで、SWを通ったリクエストしか来ないとSWからのリクエストは一律xhrになって通してしまうので後の諸々のロード(これはドメイン単位ブロック)でコケるらしい)

rinsuki avatar Aug 01 '22 06:08 rinsuki

広告ブロッカーの問題なら広告ブロッカーを外してほしい……とは思ったけど、ランディングでこれ見せられてもわけわからないだろうから直すか

実装方針→SharedWorkerGlobalScope.onfetchで/以外のfetchでcatchしたら500でresponseする

tamaina avatar Aug 22 '22 13:08 tamaina

Misskeyでどういう直し方をしてもエラーの内容が変わるだけでエラーになるのは変わらないのでclose

tamaina avatar Aug 22 '22 16:08 tamaina

いやそもそもcatchせず上流にそのままエラー返すのが一番正しい動きをしそうだし https://github.com/misskey-dev/misskey/pull/9038#issuecomment-1200762775 syntax error になるというissueの趣旨は正しい

rinsuki avatar Aug 22 '22 20:08 rinsuki

#9038 を見落としてた

tamaina avatar Aug 23 '22 10:08 tamaina