지금은 Android에서 텍스트를 강조하고 인용할 수 없습니다. 이미 상당한 시간 동안 이 상태가 유지되고 있습니다. 제가 놓치고 있는 부분이 있을까요? (Android 16 & 17, Chrome)
가끔 이런 일이 발생합니다. 텍스트를 강조 표시할 수 없었어요. 지금은 잘 작동하는 것 같습니다.
다음 방법들은 도움이 되지 않는다고 가정하고 있습니다.
- 새로고침
- 게시물에 반응(이모지)을 달아 반응 팝업이 표시될 때까지 시도한 후, 텍스트를 선택해 보기
와. 그게 해결이 되네요! 대체 이게 뭐야… 제가 지금까지 겪어본 가장 기이한 우회 방법이에요! 감사합니다!
네, 나도 전에 이런 일이 있었어요. 그리고 항상 이 방법으로 해결할 수 있었죠.
이것이 오래된 localStorage와 관련이 있는 건가? 정말 흥미롭군.
음. 나는 항상 그것이 상태(states)와 관련이 있다고 생각했어요. 예를 들어, 리액션 팝업을 강제 표시하면 호버 상태가 다시 활성화되는 것처럼요. 하지만 그것은 그냥 추측일 뿐이에요.
방금 또 발생했습니다.
우회 방법이 또 잘 먹혔습니다.
이것을 #contribute:bug로 분류하겠습니다.
Codex에서 AI(GPT 5.6 Sol Ultra) 진단 (참고 사항):
원인을 찾았습니다: 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:1에서 문서 전체에user-select: none을 적용하고 WebKit의 롱터치 콜아웃(long-touch callout)을 비활성화합니다. - 반응 버튼 위에서 세로 스크롤이 시작되면,
plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:249에서 제스처를 무효(invalid)로 처리하지만 클래스는 제거하지 않습니다. - 이후
plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:257에서 조기 반환(early return)이 발생하여 클래스가 영원히 남아 있게 됩니다. - 또한
touchcancel이벤트나 컴포넌트 파괴 시의 클린업(cleanup) 로직도 존재하지 않습니다.
클래스가 제거되는 유일한 위치는 plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:690입니다. 이는 보고된 우회 방법(The popup menu for quoting text is unresponsive on Android)을 설명합니다: 반응 팝업을 열었다가 닫으면 collapseAllPanels()가 호출되어 텍스트 선택이 복구됩니다.
인용(quote) 툴바 자체는 하류(downstream)에 위치합니다. frontend/discourse/app/components/post-text-selection.gjs:58에서 selectionchange 이벤트를 듣고 실제 브라우저 선택 상태를 요구합니다. 전역 user-select: none이 적용된 상태에서는 Android에서 해당 선택이 생성되지 않습니다.
히스토리는 이 버그 계열을 확인해 줍니다: 2023년 스크롤 수정(FIX: prevents triggering a reaction while scrolling (#224) · discourse/discourse-reactions@d1970cf · GitHub)에서 무효 터치 시 조기 반환이 도입되었고, 2024년 부분 수정(FIX: couldn't select text after dismissing a reaction (#296) · discourse/discourse-reactions@c6710ef · GitHub)에서 클린업을 패널 접힘 시점으로 옮겼지만 스크롤/취소 경로는 여전히 미처리 상태였습니다.
요약하자면, 문제는 다음 요소들의 조합입니다:
-
touchStart가 전역discourse-reactions-no-select클래스를 추가합니다. -
touchMove가 스크롤 제스처를 무효로 표시하지만 이를 해제하지 않습니다. -
touchEnd가 무효 제스처를 감지하고 조기 반환합니다. -
팝업이 열리지 않았으므로
collapseAllPanels()가 클래스를 해제하지 않습니다.
그 결과 페이지 전체에 user-select: none이 유지됩니다. touchcancel도 미처리 경로이지만, vertical-scroll 경로가 주된 핵심 문제입니다.
수정 방법은 완료, 거부, 취소 또는 파괴된 모든 터치 라이프사이클에서 클래스를 해제하는 것이며, touchstart → touchmove → touchend 및 touchcancel 시나리오에 대한 회귀 테스트(regression tests)를 포함해야 합니다.
이 버그가 한동안 골칫거리였는데, 해결 방법을 찾아주셔서 감사합니다 ![]()
@davidb 확인 부탁드립니다
@merefield 님 안녕하세요. 제가 몇 주 전에 배포한 다른 수정 사항과 이 문제가 관련이 있는지 확인해 보고 있습니다. 원래 iOS에만 적용되도록 고립되어 있어야 했기 때문에, "꽤 오랫동안"이라는 말은 정확히 얼마나 긴 기간을 의미하는지 궁금합니다. 몇 주 정도인지, 아니면 그보다 더 긴 기간을 말씀하시는 건가요?
아, 죄송합니다. 정확히 기억나지는 않지만, 제 추측으로는 최소 2주 정도였던 것 같습니다. 다만 확신은 하지 못합니다.
이 문제는 Android 16에서 발생했던 것 같으며, 이는 Pixel 배포 이전의 일입니다.
어쨌든 물론이겠지만, 이 문제가 Android에만 국한되지 않았을 수도 있습니다…
걱정하지 마세요. 변경 사항 없이 로컬에서 테스트를 해보고, 제 iOS 수정 사항이 이 문제를 일으킨 건지 확인해볼게요. 만약 그렇다면 오늘 배포한 패치가 도움이 될 수 있지만, 먼저 확인해볼 거예요.
확인해 주셔서 감사합니다!
저는 특정 웹사이트에서 Android Chrome으로 이 문제를 수개월째 경험하고 있는 것 같습니다. (다만, 두 번째로 사용하는 사이트가 2일 전에 업데이트되기 전까지는 정확한 시점을 추적하지는 않았습니다.)