Skip to content

[rhwp-studio] v0.7.11 회귀: exam_social/exam_science 성명 칸 입력 시 컨트롤 인덱스 0 범위 초과 #850

@postmelee

Description

@postmelee

요약

rhwp-studio에서 수능형 샘플 문서의 상단 답안지 영역 중 성명 입력칸에 이름을 입력하려 하면 콘솔에 Uncaught 렌더링 오류: 컨트롤 인덱스 0 범위 초과가 발생하고 입력이 되지 않습니다.

확인된 문서:

  • samples/exam_social.hwp
  • samples/exam_science.hwp

중요한 점은 v0.7.10에서는 같은 위치 입력이 정상 동작했으나, v0.7.11부터 동일 증상이 발생한다는 점입니다. 즉 신규 기능 문제가 아니라 회귀입니다.

재현 절차

  1. rhwp-studio에서 samples/exam_social.hwp 또는 samples/exam_science.hwp를 엽니다.
  2. 1쪽 상단 답안지 영역의 성명 오른쪽 빈칸을 클릭합니다.
  3. 이름 텍스트를 입력합니다.
  4. 입력이 반영되지 않고 콘솔에 렌더링 오류가 발생합니다.

관찰된 콘솔 오류:

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는 통과하지만, 해당 테스트는 주로 본문 자료 표와 보기 표의 빈 영역을 커버합니다. 상단 답안지의 성명 입력칸처럼 “첫 문단 큰 표 내부의 중첩 표 빈 입력칸”은 커버하지 못해 이번 회귀가 통과했습니다.

수정 방향 제안

  1. hit_test_native()에서 중첩 표 hit 시에도 항상 루트 문서 기준의 parentParaIndex/controlIndex와 전체 cellPath를 반환하도록 보정합니다.
  2. collect_runs()에서 메타가 없는 중첩 Table을 만났을 때 루트 경로를 잃지 않도록 current_table_meta 또는 CellContext의 전체 경로 전파 방식을 재검토합니다.
  3. cell_bboxes 보정 시 ctx.innermost()만 맞추는 것이 아니라, 반환용 public 필드는 항상 최외곽 표 기준이 되도록 유지합니다.
  4. 회귀 테스트를 추가합니다.
    • 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 범위 초과 또는 표가 아님 류의 렌더링 오류가 발생하지 않아야 합니다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions