Skip to content

fix: 코드포스 리눅스 가져오기(#30) + UI 언어 즉시 반영#31

Merged
dj258255 merged 9 commits into
mainfrom
fix/codeforces-visible-fallback
Jul 7, 2026
Merged

fix: 코드포스 리눅스 가져오기(#30) + UI 언어 즉시 반영#31
dj258255 merged 9 commits into
mainfrom
fix/codeforces-visible-fallback

Conversation

@dj258255

@dj258255 dj258255 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

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에서 효과 없음이 증명되어 철회.

해결

  • Linux: OSR을 건너뛰고 곧바로 보이는 다이얼로그(CodeforcesFetchDialog)로 간다. 실제 창은 페인트 루프가 정상 → Cloudflare 통과(Cloudflare 공식 권장 non-headless 방식). cf_clearance 캐싱으로 첫 문제만 팝업, 이후 HTTP로 조용히 ~1초.
  • macOS/Windows: OSR 유지 (팝업 없이 자동, 정상 동작 확인).
  • HTTP 크롤에 로그인/JCEF 통과 쿠키(cf_clearance) 병합해 빠른 경로 우선.

UI 언어 즉시 반영

설정에서 언어(한국어↔English) 변경 시 재시작 없이 즉시 모든 패널 텍스트 갱신 (I18n 변경 리스너 → 도구 창 콘텐츠 재생성, 보던 탭 유지). '다시 열어야 적용' 안내 문구 제거.

검증

  • 전체 테스트 통과 (ubuntu ✅ / windows CI)
  • 맥 실동작: 코드포스 OSR 자동 가져오기(2242A/D 등, 팝업 없음), 다이얼로그 폴백 강제 검증(RemovevomeR — 설명 3807자·테스트·제한시간 완전 추출), 언어 즉시 전환
  • OSR-리눅스 진단 스파이크는 spike/osr-ci 브랜치에 도구로 보관 (향후 수정 시도 시 재실행)

미검증 (정직)

리눅스 실데스크탑에서 다이얼로그 실동작은 실기기 미검증(CI로는 Cloudflare 검증 불가). 단 동일 windowed 브라우저를 맥에서 검증했고, 실제 디스플레이+GPU면 렌더 거의 확실.

dj258255 added 8 commits July 7, 2026 09:25
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는 원상 복구 (효과 없는 하드닝/타임아웃 변경 제거).
@dj258255 dj258255 changed the title fix: 코드포스 가져오기에 보이는 다이얼로그 폴백 추가 (#30) fix: 코드포스 리눅스 가져오기(#30) + UI 언어 즉시 반영 Jul 7, 2026
@dj258255 dj258255 merged commit 580dcc6 into main Jul 7, 2026
2 checks passed
@dj258255 dj258255 deleted the fix/codeforces-visible-fallback branch July 7, 2026 12:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Linux에서 코드포스 OSR 폴백이 페이지를 못 가져오고 타임아웃 (#9 후속)

1 participant