요약
rhwp-studio에서 수능형 샘플 문서의 상단 답안지 영역 중 성명 입력칸에 이름을 입력하려 하면 콘솔에 Uncaught 렌더링 오류: 컨트롤 인덱스 0 범위 초과가 발생하고 입력이 되지 않습니다.
확인된 문서:
samples/exam_social.hwp
samples/exam_science.hwp
중요한 점은 v0.7.10에서는 같은 위치 입력이 정상 동작했으나, v0.7.11부터 동일 증상이 발생한다는 점입니다. 즉 신규 기능 문제가 아니라 회귀입니다.
재현 절차
rhwp-studio에서 samples/exam_social.hwp 또는 samples/exam_science.hwp를 엽니다.
- 1쪽 상단 답안지 영역의
성명 오른쪽 빈칸을 클릭합니다.
- 이름 텍스트를 입력합니다.
- 입력이 반영되지 않고 콘솔에 렌더링 오류가 발생합니다.
관찰된 콘솔 오류:
Uncaught 렌더링 오류: 컨트롤 인덱스 0 범위 초과
회귀 증거
사용자 환경에서 v0.7.10은 동일한 성명 입력칸 입력이 정상 동작하는 것을 확인했습니다. v0.7.11부터 입력이 실패합니다.
분석 중 최신 upstream/devel 기준으로 hit_test_native() 결과와 입력 라우팅을 확인했습니다.
exam_science.hwp의 성명 입력칸에 해당하는 좌표에서 최신 소스는 다음과 같은 hit-test 결과를 반환합니다.
{
"sectionIndex": 0,
"paragraphIndex": 0,
"charOffset": 0,
"parentParaIndex": 3,
"controlIndex": 0,
"cellIndex": 1,
"cellParaIndex": 0,
"cellPath": [
{ "controlIndex": 0, "cellIndex": 1, "cellParaIndex": 0 }
]
}
이 값으로 입력 경로가 insertTextInCell(0, 3, 0, 1, 0, 0, text)로 들어가면 Rust 쪽에서 다음 오류가 재현됩니다.
Err(RenderError("컨트롤 인덱스 0 범위 초과"))
exam_social.hwp도 같은 잘못된 hit-test 컨텍스트로 동일 오류가 재현됩니다.
실제 문서 구조와 기대 결과
상단 답안지의 성명 입력칸은 본문 문단 3의 일반 표가 아닙니다. 실제로는 첫 문단의 큰 상단 표 안에 들어 있는 중첩 표입니다.
exam_social.hwp 구조:
- 바깥 상단 표:
section 0 / paragraph 0 / control 4
- 성명 입력칸: 바깥 표의
cellParaIndex=3 내부에 있는 1x2 중첩 표의 두 번째 셀
- 기대 hit-test 경로 예:
{
"parentParaIndex": 0,
"controlIndex": 4,
"cellPath": [
{ "controlIndex": 4, "cellIndex": 0, "cellParaIndex": 3 },
{ "controlIndex": 0, "cellIndex": 1, "cellParaIndex": 0 }
]
}
exam_science.hwp 구조:
- 바깥 상단 표:
section 0 / paragraph 0 / control 6
- 성명 입력칸: 바깥 표의
cellParaIndex=3 내부에 있는 1x2 중첩 표의 두 번째 셀
- 기대 hit-test 경로 예:
{
"parentParaIndex": 0,
"controlIndex": 6,
"cellPath": [
{ "controlIndex": 6, "cellIndex": 0, "cellParaIndex": 3 },
{ "controlIndex": 0, "cellIndex": 1, "cellParaIndex": 0 }
]
}
즉 현재는 루트 문단 기준 parentParaIndex/controlIndex와 전체 cellPath가 손실되어, 내부 표의 로컬 좌표가 문서 루트 좌표처럼 반환되는 상태입니다.
의심 회귀 지점
회귀는 v0.7.11에 포함된 아래 변경에서 시작된 것으로 보입니다.
- 커밋:
ef67efa1 Task #717: Fix table cell whitespace hit test
- 머지:
bbf01424 Merge PR #725 (Task #717): rhwp-studio 표 셀 빈 영역 hitTest 컨텍스트 이탈 정정
- 주요 파일:
src/document_core/queries/cursor_rect.rs
특히 hit_test_native()의 collect_runs()에서 중첩 Table 노드가 자체 section_index/para_index/control_index 메타를 갖지 않을 때 기존 외부 표 메타를 이어받지 않고 None으로 끊는 변경이 들어갔습니다.
let table_meta = if let RenderNodeType::Table(ref tn) = node.node_type {
match (tn.section_index, tn.para_index, tn.control_index) {
(Some(si), Some(pi), Some(ci)) => Some((si, pi, ci)),
_ => None,
}
} else {
current_table_meta
};
이후 cell_bboxes 보정과 format_hit()에서 사용하는 CellContext가 내부 표 로컬 컨텍스트만 갖게 되면서, Studio 입력 경로가 insertTextInCell()로 잘못 분기합니다.
현재 회귀 테스트 공백
tests/issue_717_table_cell_hit_test.rs는 통과하지만, 해당 테스트는 주로 본문 자료 표와 보기 표의 빈 영역을 커버합니다. 상단 답안지의 성명 입력칸처럼 “첫 문단 큰 표 내부의 중첩 표 빈 입력칸”은 커버하지 못해 이번 회귀가 통과했습니다.
수정 방향 제안
hit_test_native()에서 중첩 표 hit 시에도 항상 루트 문서 기준의 parentParaIndex/controlIndex와 전체 cellPath를 반환하도록 보정합니다.
collect_runs()에서 메타가 없는 중첩 Table을 만났을 때 루트 경로를 잃지 않도록 current_table_meta 또는 CellContext의 전체 경로 전파 방식을 재검토합니다.
cell_bboxes 보정 시 ctx.innermost()만 맞추는 것이 아니라, 반환용 public 필드는 항상 최외곽 표 기준이 되도록 유지합니다.
- 회귀 테스트를 추가합니다.
exam_social.hwp 1쪽 상단 성명 입력칸 hit-test가 parentParaIndex=0, controlIndex=4, cellPath.length=2를 반환해야 함
insert_text_in_cell_by_path()로 실제 입력이 가능해야 함
exam_science.hwp도 같은 방식으로 controlIndex=6, cellPath.length=2를 검증
기대 동작
성명 입력칸 클릭 후 이름을 입력하면 v0.7.10처럼 정상 입력되어야 하며, 콘솔에 컨트롤 인덱스 0 범위 초과 또는 표가 아님 류의 렌더링 오류가 발생하지 않아야 합니다.
요약
rhwp-studio에서 수능형 샘플 문서의 상단 답안지 영역 중성명입력칸에 이름을 입력하려 하면 콘솔에Uncaught 렌더링 오류: 컨트롤 인덱스 0 범위 초과가 발생하고 입력이 되지 않습니다.확인된 문서:
samples/exam_social.hwpsamples/exam_science.hwp중요한 점은
v0.7.10에서는 같은 위치 입력이 정상 동작했으나,v0.7.11부터 동일 증상이 발생한다는 점입니다. 즉 신규 기능 문제가 아니라 회귀입니다.재현 절차
rhwp-studio에서samples/exam_social.hwp또는samples/exam_science.hwp를 엽니다.성명오른쪽 빈칸을 클릭합니다.관찰된 콘솔 오류:
회귀 증거
사용자 환경에서
v0.7.10은 동일한성명입력칸 입력이 정상 동작하는 것을 확인했습니다.v0.7.11부터 입력이 실패합니다.분석 중 최신
upstream/devel기준으로hit_test_native()결과와 입력 라우팅을 확인했습니다.exam_science.hwp의 성명 입력칸에 해당하는 좌표에서 최신 소스는 다음과 같은 hit-test 결과를 반환합니다.{ "sectionIndex": 0, "paragraphIndex": 0, "charOffset": 0, "parentParaIndex": 3, "controlIndex": 0, "cellIndex": 1, "cellParaIndex": 0, "cellPath": [ { "controlIndex": 0, "cellIndex": 1, "cellParaIndex": 0 } ] }이 값으로 입력 경로가
insertTextInCell(0, 3, 0, 1, 0, 0, text)로 들어가면 Rust 쪽에서 다음 오류가 재현됩니다.exam_social.hwp도 같은 잘못된 hit-test 컨텍스트로 동일 오류가 재현됩니다.실제 문서 구조와 기대 결과
상단 답안지의
성명입력칸은 본문 문단3의 일반 표가 아닙니다. 실제로는 첫 문단의 큰 상단 표 안에 들어 있는 중첩 표입니다.exam_social.hwp구조:section 0 / paragraph 0 / control 4cellParaIndex=3내부에 있는 1x2 중첩 표의 두 번째 셀{ "parentParaIndex": 0, "controlIndex": 4, "cellPath": [ { "controlIndex": 4, "cellIndex": 0, "cellParaIndex": 3 }, { "controlIndex": 0, "cellIndex": 1, "cellParaIndex": 0 } ] }exam_science.hwp구조:section 0 / paragraph 0 / control 6cellParaIndex=3내부에 있는 1x2 중첩 표의 두 번째 셀{ "parentParaIndex": 0, "controlIndex": 6, "cellPath": [ { "controlIndex": 6, "cellIndex": 0, "cellParaIndex": 3 }, { "controlIndex": 0, "cellIndex": 1, "cellParaIndex": 0 } ] }즉 현재는 루트 문단 기준
parentParaIndex/controlIndex와 전체cellPath가 손실되어, 내부 표의 로컬 좌표가 문서 루트 좌표처럼 반환되는 상태입니다.의심 회귀 지점
회귀는
v0.7.11에 포함된 아래 변경에서 시작된 것으로 보입니다.ef67efa1 Task #717: Fix table cell whitespace hit testbbf01424 Merge PR #725 (Task #717): rhwp-studio 표 셀 빈 영역 hitTest 컨텍스트 이탈 정정src/document_core/queries/cursor_rect.rs특히
hit_test_native()의collect_runs()에서 중첩Table노드가 자체section_index/para_index/control_index메타를 갖지 않을 때 기존 외부 표 메타를 이어받지 않고None으로 끊는 변경이 들어갔습니다.이후
cell_bboxes보정과format_hit()에서 사용하는CellContext가 내부 표 로컬 컨텍스트만 갖게 되면서, Studio 입력 경로가insertTextInCell()로 잘못 분기합니다.현재 회귀 테스트 공백
tests/issue_717_table_cell_hit_test.rs는 통과하지만, 해당 테스트는 주로 본문 자료 표와 보기 표의 빈 영역을 커버합니다. 상단 답안지의성명입력칸처럼 “첫 문단 큰 표 내부의 중첩 표 빈 입력칸”은 커버하지 못해 이번 회귀가 통과했습니다.수정 방향 제안
hit_test_native()에서 중첩 표 hit 시에도 항상 루트 문서 기준의parentParaIndex/controlIndex와 전체cellPath를 반환하도록 보정합니다.collect_runs()에서 메타가 없는 중첩Table을 만났을 때 루트 경로를 잃지 않도록current_table_meta또는CellContext의 전체 경로 전파 방식을 재검토합니다.cell_bboxes보정 시ctx.innermost()만 맞추는 것이 아니라, 반환용 public 필드는 항상 최외곽 표 기준이 되도록 유지합니다.exam_social.hwp1쪽 상단성명입력칸 hit-test가parentParaIndex=0,controlIndex=4,cellPath.length=2를 반환해야 함insert_text_in_cell_by_path()로 실제 입력이 가능해야 함exam_science.hwp도 같은 방식으로controlIndex=6,cellPath.length=2를 검증기대 동작
성명입력칸 클릭 후 이름을 입력하면v0.7.10처럼 정상 입력되어야 하며, 콘솔에컨트롤 인덱스 0 범위 초과또는표가 아님류의 렌더링 오류가 발생하지 않아야 합니다.