# JJ_MKVMaker 수정 사항 (webview_cef 0.6.2 원본: https://github.com/hlwhl/webview_cef @ bb2dbcc) "내장 Chrome" 은 환경 설정에서 고른 사람만 쓰므로, CEF 실행 파일 (약 250MB) 을 프로그램에 넣지 않고 고를 때 내려받는다. 그래서 CEF 가 없어도 프로그램이 켜지도록 두 가지를 바꿨다. 1. `windows/CMakeLists.txt` - 플러그인 DLL 이 `libcef.dll` 을 **지연 로딩** (`/DELAYLOAD:libcef.dll`, `delayimp`). CEF 함수를 처음 부를 때 (Dart 에서 `WebviewManager().initialize`) 에만 `libcef.dll` 을 찾는다. - `webview_cef_bundled_libraries` 를 비워 CEF 실행 파일을 프로그램 폴더에 복사하지 않는다. 2. 앱의 `windows/runner/main.cpp` (이 폴더 밖) - `\cef\libcef.dll` 이 있을 때만 `SetDllDirectoryW(\cef)` → `initCEFProcesses` → 메시지 루프에서 `handleWndProcForCEF`. CEF 실행 파일은 앱이 공식 배포처 (https://cef-builds.spotifycdn.com) 의 *Minimal Distribution* (`third/download.cmake` 의 `CEF_VERSION` 과 같은 버전) 을 받아 `Release\*` 와 `Resources\*` 를 `Lib\cef` 에 푼다. 버전을 올릴 때는 `third/download.cmake` 와 앱의 `lib/platform/windows/cef_runtime.dart` 의 버전을 함께 바꾼다. 3. `common/webview_handler.cc`: 주소 변경 (`OnAddressChange`) · 읽기 시작 / 끝 (`OnLoadStart` / `OnLoadEnd`) 을 **본문 (main frame) 일 때만** 알린다. 원본은 페이지 안 틀 (iframe, 예: YouTube 의 about:blank) 도 알려서 주소창이 about:blank 로 바뀌었다. 4. `windows/webview_cef_plugin.cpp`: CEF 실행 파일이 없으면 화면 갱신 스레드 (vsync) 와 IME 가로채기를 켜지 않는다. CEF 가 있어도 IME 는 **Chrome 화면 안의 입력칸에 포커스가 있을 때만** 가로챈다. 원본은 늘 IME 조합 창을 막아서, 앱의 다른 입력칸 (주소창 · 검색 등) 의 한글 입력에 영향을 줄 수 있었다. 5. `common/webview_plugin.cc` · `common/webview_handler.cc` · `lib/src/webview.dart`: JavaScript 끄기. `create` 가 주소 대신 `{url, javascript: false}` 를 받으면 그 브라우저의 `CefBrowserSettings.javascript` 를 `STATE_DISABLED` 로 만든다 (Dart: `WebViewController.initialize(url, javaScript: false)`). 이미 만든 브라우저는 바꿀 수 없어 앱이 새로 만든다. 6. `common/webview_plugin.cc` · `common/webview_app.*` · `lib/src/webview_manager.dart`: 프록시 (DNS 강제). `initialize(proxyServer: ...)` 를 주면 브라우저 프로세스에 `--proxy-server` 와 `--dns-prefetch-disable` 을 붙인다 (CEF 를 시작할 때 한 번). 앱은 환경 설정 > 네트워크 · DNS 가 강제일 때 앱 안 프록시 주소를 준다. Chrome 엔진은 프록시 인증 (407) 에 답하지 않으므로 (CEF 149 windowless 에서 GetAuthCredentials 가 불리지 않음, 10/11 확인) 앱은 Chrome 엔진에만 인증 없는 문을 준다: 실행마다 고른 루프백 주소 127.x.y.z 의 빈 포트, Chrome 엔진 웹 뷰가 있는 동안만 연다. 7. `common/webview_app.*` · `common/webview_plugin.cc` · `lib/src/webview_manager.dart`: 관리자 권한 실행 (10/11, 207). Chromium 은 관리자 권한 (높은 무결성) 으로 실행되면 권한을 낮춰 다시 띄우려고 스스로 끝난다 (CefInitialize 가 false, 종료 코드 38 CEF_RESULT_CODE_NORMAL_EXIT_AUTO_DE_ELEVATED). 앱은 관리자 권한이면 처음 값으로 Chrome 엔진을 시작하지 않고 (보안: CEF 는 샌드박스가 꺼져 있다), 사용자가 환경 설정에서 "관리자 권한일 때도 Chrome 엔진 쓰기" 를 켠 때만 `initialize(doNotDeElevate: true)` 로 `--do-not-de-elevate` 를 붙인다.