fix: 코드포스 리눅스 가져오기(#30) + UI 언어 즉시 반영#31
Merged
Conversation
Linux 등에서 OSR 폴백이 페이지를 못 가져오고 타임아웃되는 문제(#9 후속) 대응. Jsoup(HTTP) → OSR(안 보임) → 보이는 다이얼로그 3단 폴백으로 확장. - CodeforcesFetchDialog: OSR 실패 시 제목줄·닫기 버튼이 있는 정식 다이얼로그에 실브라우저를 띄워 사용자가 직접 Cloudflare 챌린지를 통과하게 함. .problem-statement 감지 시 자동 추출·닫기 (최대 5분 대기). SweaFetchDialog와 동일 패턴 - ProblemPanel: OSR이 null 반환 시 fetchCodeforcesViaDialog로 폴백 - CodeforcesJcefFetcher: OSR 뷰포트가 0×0으로 잡혀 렌더링 안 되는 환경 대응으로 wasResized(1024,768) 통지 추가
macOS/Windows에 없는 Linux 전용 JCEF 렌더링 문제를 재현·검증하기 위한 개발용 도구. - scripts/force-cf-fallback.sh: Jsoup(HTTP) 경로를 일부러 실패시켜 JCEF 폴백을 강제로 태우는 on/off 토글 (평소엔 HTTP 성공으로 폴백을 안 타므로) - docs/dev/linux-jcef-test.md: UTM Ubuntu ARM64 VM 세팅부터 로그 진단, Wayland/X11 양쪽 테스트까지의 절차
제보자 GIF(#9 원본) 분석 결과: Linux/RustRover에서 브라우저는 페이지를 완벽히 로드하는데(Cloudflare 챌린지도 없음) JBCefJSQuery 추출 콜백이 오지 않아 'Fetching...'에서 멈춤. 맥에서는 정상. 브라우저가 문제 페이지를 로드하면 cf_clearance 쿠키가 설정되므로, JS로 HTML을 긁는 대신 그 쿠키로 Jsoup을 재시도하는 경로를 병행 추가. JS 폴러와 경쟁해 먼저 성공하는 쪽이 이긴다. 맥은 기존 경로로 잘 되므로 영향 없고, 추출 콜백이 죽는 환경에서만 우회 경로가 문제를 살린다. - CodeforcesJcefFetcher(OSR)·CodeforcesFetchDialog 양쪽에 tryCookieRetry 추가 - CodeforcesCrawler.fetchProblem이 전역 쿠키를 자동 병합(#21)하므로 재호출만으로 동작
기존: setCreateImmediately(true)로 브라우저를 먼저 생성한 뒤 JBCefJSQuery와 로드 핸들러를 등록 → 메시지 라우터 등록이 늦어 일부 환경(Linux)에서 콜백이 아예 안 붙는 것으로 추정. 변경: buildHiddenBrowser는 생성(createImmediately) 없이 브라우저만 만들고, start()에서 JSQuery·핸들러 등록을 마친 뒤 realizeBrowser로 네이티브를 생성. JCEF 정석 순서에 맞춤. 맥에서는 기존에도 잘 됐으므로 무영향, Linux에서 JS 추출이 살아나면 이게 근본 원인이었음을 로그(fetch OK)로 확인 가능.
- setWindowVisibility(true)+setFocus로 창 없는 OSR의 컴포지터·rAF를 계속 돌려
Cloudflare canvas 챌린지가 완료되도록 함 (리눅스 OnPaint 미호출 대응)
- 리눅스는 OSR 타임아웃을 12초로 단축해 실패 시 60초 낭비 없이 보이는
다이얼로그(안전망)로 빠르게 전환. macOS/Windows는 기존 60초 유지
주: canvas 지문 특성상 소프트웨어 렌더 OSR은 근본적으로 불안정할 수 있어
다이얼로그(non-headless, Cloudflare 권장 방식)가 최종 보장. 리눅스 실기기 미검증.
I18n에 변경 리스너 추가 → 언어 바꾸면 MainPanel이 도구 창 콘텐츠를 새로 생성해 모든 패널 텍스트가 재시작 없이 갱신됨. 보던 탭은 유지. '다시 열어야 적용' 안내 문구 제거.
앞선 setWindowVisibility 하드닝(90cdacd)은 GitHub Actions(Xvfb) 스파이크로 '리눅스 헤드리스 OSR에서 rAF/OnPaint가 안 돈다'를 재현·확인한 결과 효과가 없음이 증명되어 철회한다. JCEF는 자체 Chromium을 내장하므로(시스템 Chrome과 무관) 엔진은 뜨지만, 창 없는 OSR의 페인트 루프가 리눅스에서 돌지 않아 Cloudflare canvas 챌린지를 통과하지 못한다 (chromiumembedded/cef#2800,#4166). - Linux: OSR을 건너뛰고 즉시 보이는 다이얼로그(실제 창 렌더 → 통과, cf_clearance 캐싱으로 첫 문제만 팝업)로 간다. 12초 낭비 제거. - macOS/Windows: OSR 유지 (팝업 없이 자동, 정상 동작 확인됨). - CodeforcesJcefFetcher는 원상 복구 (효과 없는 하드닝/타임아웃 변경 제거).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #30
코드포스 리눅스 가져오기 (#30)
리눅스에서 코드포스 문제 가져오기가 Cloudflare에 막히던 문제를, 근본 원인을 CI로 규명하고 해결.
근본 원인 (CI로 확정)
"Cloudflare가 리눅스만 차단"이 아님. Cloudflare 챌린지는 canvas 렌더링을 요구하는데, JCEF OSR(오프스크린)이 리눅스에서 OnPaint/requestAnimationFrame을 돌리지 못해 챌린지가 완료되지 않는 CEF 레벨 버그(chromiumembedded/cef #2800, #4166). JCEF는 자체 Chromium을 내장하므로 시스템 Chrome 설치 여부와 무관하며, 엔진은 뜨지만(
isSupported()=true) 창 없는 OSR의 페인트 루프가 안 도는 것.이를 GitHub Actions(Xvfb) 스파이크로 재현·확인: 맥에선 로컬 rAF 픽스처 추출 성공, 리눅스 CI에선 동일 테스트 실패.
setWindowVisibility하드닝도 CI에서 효과 없음이 증명되어 철회.해결
CodeforcesFetchDialog)로 간다. 실제 창은 페인트 루프가 정상 → Cloudflare 통과(Cloudflare 공식 권장 non-headless 방식).cf_clearance캐싱으로 첫 문제만 팝업, 이후 HTTP로 조용히 ~1초.UI 언어 즉시 반영
설정에서 언어(한국어↔English) 변경 시 재시작 없이 즉시 모든 패널 텍스트 갱신 (I18n 변경 리스너 → 도구 창 콘텐츠 재생성, 보던 탭 유지). '다시 열어야 적용' 안내 문구 제거.
검증
spike/osr-ci브랜치에 도구로 보관 (향후 수정 시도 시 재실행)미검증 (정직)
리눅스 실데스크탑에서 다이얼로그 실동작은 실기기 미검증(CI로는 Cloudflare 검증 불가). 단 동일 windowed 브라우저를 맥에서 검증했고, 실제 디스플레이+GPU면 렌더 거의 확실.