문제 해결
문제와 알아보는 방법
HTML 경로에서 놀라는 일은 대부분 아직 만들어지지 않은 것에서, 위젯 경로에서는 대부분 텍스트 입력 규칙에서 옵니다. 절마다 어떤 경우인지와 왜 그렇게 동작하는지를 적었습니다.
HTML 앱이 창을 열지 않습니다
지금은 정상입니다. HtmlDom 은 앱을 실행하고 배치해서 그리기 목록과 계획을 돌려주지만,
그 계획을 렌더러에 넘기는 것이 아직 없습니다
(#43). 화면은 대신 레이아웃으로
확인합니다. 항목을 출력하거나 예제처럼 테스트합니다.
클릭이나 변경이 보이지 않습니다
핸들러는 click, input 같은 호출 안에서 실행되고, 문서는
render 를 불러야 바뀝니다. 그리기 목록은 다음 layout 에서야 바뀝니다.
그래서 순서는 언제나 호출, render, layout 입니다.
dom.click(x, y);
dom.render();
dom.layout(800.0, 600.0, 1.0);
그 자리 아래에 듣는 것이 없으면 click 은 None 을 돌려줍니다. 그 점이 잘라
내는 조상의 바깥이거나 z-index 가 더 높은 상자 아래에 있을 때도 그렇습니다. 그 자리에 어떤
노드가 있는지는 hit_test(x, y) 가 알려 줍니다.
타이핑해도 페이지가 바뀌지 않습니다
입력란은 일부러 비제어입니다. 글자는 렌더러가 갖고, 확정된 글자가 oninput 으로 옵니다.
페이지는 핸들러가 무언가 그리는 데 쓰이는 시그널에 써야 바뀝니다. samples/chat 이 초안으로
그렇게 합니다. 입력란은 비제어입니다를 보십시오.
텍스트 크기가 브라우저와 다릅니다
측정기를 따로 넘기지 않으면 Parley 가 텍스트를 재고, macOS 에서 Parley 의 크기는 Chromium 과 줄바꿈이 달라질 만큼 차이 납니다. 글꼴이 섞인 문단, 표 칸, 입력 컨트롤은 측정기를 넘겨도 Parley 가 잽니다. Compose 로 재는 것은 부분 입니다 (#43). 텍스트 크기가 맞으면 상자 배치 자체는 VS Code 와 1px 이내로 맞습니다.
이미지가 그려지지 않거나 크기가 없습니다
ImageResolver가 없거나None으로 답했습니다. 아무것도 내려받지 않으므로 리졸버가 모르는 이미지는 그려지지 않습니다.width나height가 없는<img>는 리졸버의size에서 크기를 받습니다. 그 답이 없으면 본래 크기가 없습니다.- URL 이 예상과 다릅니다. 상대 URL 은
HtmlConfig::base_url기준으로 풀리고, 기준이 없으면 쓴 그대로 갑니다. 리졸버가 받는 질문을 기록해 보십시오.
CSS 기능이 효과가 없습니다
rotate,scale,skew,matrix(),transform-origin은 그리지 않고,translate는 그립니다 (#46).- transition 과 animation 은 재생되지 않습니다 (#46, #47).
<script>는 설계상 아무 일도 하지 않습니다. 동작은 Rust 로 씁니다.- 사용자 에이전트 스타일시트는 브라우저처럼
body에 8px 여백을 줍니다. 예제들은 스타일시트를body { margin: 0; }로 시작합니다.
빌드가 렌더러를 받지 못합니다
렌더러는 미리 빌드된 네이티브 라이브러리이고, compose-rust 의 빌드 스크립트가 대상 플랫폼용을 내려받아 공개된 체크섬과 대조합니다. 실패하면 빌드가 무엇을 시도했는지 알려 줍니다. 네트워크 없이 빌드하기, 직접 빌드한 렌더러 쓰기, 다운로드 캐시 옮기기는 compose-rust README 에 있습니다.
위젯 경로의 IME 문제
Enter 가 제출하면서 음절을 잃습니다. 한글을 치고 음절을 확정하려고 Enter 를 눌렀는데 그 음절 없이 메시지가 보내집니다. 조합 중에 키 이벤트가 Rust 에 닿은 것이고, 렌더러는 그것을 절대 허용하면 안 됩니다. 핸들러가 아니라 렌더러의 버그입니다.
타이핑하는 동안 조합이 초기화됩니다. 음절을 만드는 동안 글자가 사라지거나 순서가
바뀝니다. 조합 중에 무언가 Rust 에서 입력란의 글자를 정한 것입니다. TextField 에
value 가 없는 이유가 바로 이것이고, 입력란은 새 정체성을 주어 비웁니다.
ProtocolError 이벤트
렌더러가 모르는 위젯, 속성, 모디파이어는 아무것도 멈추게 하지 않습니다. 렌더러는 코드와 메시지를 담은
ProtocolError 이벤트를 보냅니다. 두 쪽이 스키마에 대해 다르게 알고 있다는 뜻이고, 보통은
빌드가 링크한 것과 다른 compose-rust 버전의 렌더러입니다. 더 큰 불일치는 더 일찍 잡힙니다. 시작할 때
스키마 해시를 비교하고, 두 쪽이 함께 돌기를 거부합니다.