Androidでテキスト引用のポップアップメニューが反応しない

AI (GPT 5.6 Sol Ultra) の Codex による診断(参考になれば):

原因を発見しました:Discourse Reactions がグローバルな「テキスト選択不可」状態をリークしています。

  • Reaction の touchstart イベントで、plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:222 において <html>discourse-reactions-no-select クラスが追加されます。
  • このクラスは plugins/discourse-reactions/assets/stylesheets/common/discourse-reactions.scss:1user-select: none を適用し、ドキュメント全体に対して WebKit の長押し呼び出し(callout)を無効にします。
  • Reaction ボタン上で垂直スクロールが開始されると、plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:249 でジェスチャが無効化されますが、クラスは削除されません。
  • その後、plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:257 で早期リターンが発生し、クラスが永久に残ったままになります。
  • また、touchcancel やコンポーネントの破棄時のクリーンアップ処理も存在しません。

クラスが削除されるのは plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:690 のみです。これが報告されたワークアラウンド(https://meta.discourse.org/t/the-popup-menu-for-quoting-text-is-unresponsive-on-android/407332)の説明になります:Reaction のポップアップを開いて閉じると collapseAllPanels() が呼び出され、選択機能が復元されます。

引用ツールバー自体は下流に位置しており、frontend/discourse/app/components/post-text-selection.gjs:58selectionchange を監視し、ブラウザによる実際の選択を必要とします。グローバルな user-select: none が設定されているため、Android ではこの選択が作成されません。

履歴はこのバグの傾向を確認しています:2023 年のスクロール修正(https://github.com/discourse/discourse-reactions/commit/d1970cf750e82a3035e05ddc3d52733a5c76a6ab)で無効なタッチの早期リターンが導入され、2024 年の部分的な修正(https://github.com/discourse/discourse-reactions/commit/c6710ef909481fd2fc16c10405f3daa92b6481fc)でクリーンアップがパネルの閉じに移動しましたが、スクロール/キャンセルのパスは未対応のまま残されました。

修正では、タッチライフサイクルの完了、拒否、キャンセル、または破棄のたびにクラスをクリアし、touchstart → touchmove → touchend および touchcancel に対する回帰テストを追加する必要があります。

「いいね!」 3