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

現在、Android でテキストのハイライトと引用ができません。この問題はしばらく前から続いています。何が原因でしょうか?(Android 16 および 17、Chrome)

「いいね!」 4

たまにこのようなことが起こります。テキストをハイライトできません。現在は動作しているようです。

「いいね!」 1

以下の方法では解決しないでしょうか?

  1. リロード
  2. ポップアップが表示されるまで投稿にリアクションし、その後でテキストを選択してみます
「いいね!」 4

わあ。これで直りました! なにそれ…今までで一番奇妙な回避策です! ありがとう!

「いいね!」 3

うん、以前にも自分にも同じことがあったけど、これでいつも直せたよ。

これは古くなった localStorage に関係しているのだろうか。非常に興味深い。

うーん。私はいつも、それが状態(state)に関係しているものだと思っていた。例えば、リアクションのポップアップを強制的に表示させれば、ホバー状態が再びアクティブになるだろう。でも、それは単なる推測に過ぎない。

また同じことが起こりました。

そして、回避策が再び効果を発揮しました。

この件を Contribute > Bug として分類します

「いいね!」 1

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

このバグはしばらくの間私を悩ませていましたが、修正方法を見つけられてよかったです :+1:

「いいね!」 3

@davidb ご一読ください

「いいね!」 1

@merefield さん、こんにちは。この件が、数週間前に公開した他の修正と関連しているかどうかを確認しています。本来 iOS に限定されるはずなので、「しばらく」というのはどのくらいの期間でしょうか?数週間ですか、それともそれ以上ですか?

「いいね!」 1

うーん、正確には覚えていないのですが、直感的には少なくとも数週間だったような気がします。ただ、完全に確信は持てません。

Android 16 でこの問題が発生していたのはほぼ間違いないので、Pixel の展開前だったはずです。

いずれにせよ、もちろんこれは Android に限った話ではないかもしれません…

「いいね!」 1

大丈夫です。変更を反映させずにローカルでテストして、これが私のiOS修正が原因かどうか確認します。もしそうなら、今日公開したパッチが役立つかもしれませんが、まず確認します。

「いいね!」 2

確認していただき、ありがとうございます!

「いいね!」 1

私はあるウェブサイトにおいて、Android版Chromeでこの問題に数ヶ月間遭遇しています。(正確な記録は取っていませんでしたが、2日前にもう一つの利用しているサイトがアップデートした際に確認しました)

「いいね!」 2