- Firefox의 오래된 Bug 33654는
<textarea>가ROWS=와COLS=를 적용할 때 스크롤바 공간까지 더해 지정한 행·열보다 크게 보이던 문제였고, 현재는 Bug 1830576의 중복으로 닫힘 - overlay scrollbars가 꺼져 있거나 “always show scrollbars” 설정을 쓰는 환경에서
<textarea rows=N>이 대략 N+1행 높이로 계산되는 현상이 반복됨 - 초기 논의는 글꼴 상속,
monospace강제 적용,w와W평균 폭 기반cols계산, 스크롤바 공간 예약 방식까지 확장됐고 테스트케이스·패치·스크린샷이 장기간 쌓임 - 실제로는
rows=1이 3행처럼 보이거나rows=2가 3행 높이로 보이고,cols=80에서 IE와 Firefox의 줄바꿈 위치가 달라지는 등 폼 레이아웃 제어가 브라우저별로 어긋남 - Bug 1830576이
VERIFIED FIXED가 되면서 WebKit, Chromium, Firefox의 스크롤바 간격 적용이 일관됐고, Bug 33654는RESOLVED DUPLICATE로 정리됨
Bug 33654의 상태와 범위
- Bug 33654는
<textarea>가ROWS=와COLS=를 잘못 적용해, overlay scrollbars가 비활성화된 상태에서 가로·세로 스크롤바용 추가 공간이 생기던 결함임 - 제품과 컴포넌트는
Core :: Layout: Form Controls이며, HTML 폼 컨트롤의 레이아웃과 외형, 특히textarea같은 요소가 범위에 들어감 - 현재 상태는
RESOLVED DUPLICATE of bug 1830576임- 중복 대상인 Bug 1830576의 제목은
Firefox sizes <textarea rows=N> as roughly N+1 rows tall, under an "always show scrollbars" configuration - Bug 1830576의 상태는
VERIFIED FIXED
- 중복 대상인 Bug 1830576의 제목은
- 버그는 26년 전에 열렸고, 2년 전에
RESOLVED DUPLICATE로 닫힘 - 메타데이터에는 버전
Trunk, 플랫폼x86 / All, 유형defect, 우선순위P3, 심각도S3가 표시됨 - 키워드는
testcase, Whiteboard는[html][behavior]relnote-devel, 투표 수는 99로 표시됨 - 첨부파일은
17 files, 17 obsolete files로 표시되며, 테스트케이스·패치·스크린샷이 반복적으로 올라옴
처음 드러난 증상
- 최초 보고에서 Andrew McMillan은
ROWS=5 COLS=30으로 지정한TEXTAREA예제가 대략ROWS=7 COLS=48처럼 표시된다고 남김 - 초기 댓글에서는
INPUT TYPE=TEXT와TEXTAREA가 지정된 글꼴을 제대로 쓰지 않거나, 스크롤바가 나타나도 영역이 너무 높다는 사례가 이어짐 - 이후 논의는 textarea 레이아웃이 잘못된 정보를 받고 있으며, 열에는 추가 공간이 있고 행은 하나 더 많다는 쪽으로 모임
- 스크롤바를 위한 공간을 미리 보존하는 방식이 원인일 가능성도 초기에 다뤄짐
글꼴 계산과 초기 패치
- HTML authoring newsgroup 사례에서는
textarea { font-size: 8pt }와<textarea cols="40" rows="12">를 함께 쓰면 IE는 너비를 맞게 렌더링하지만, Mozilla는 12pt 글꼴 기준으로 너비를 계산하는 것처럼 보였음 arial글꼴을 쓰는 테스트 파일에는<textarea NAME=system_code wrap=soft rows=5 cols=30 WRAP style="font-family:arial">가 포함됨- Rod는 기본 글꼴에서는 크기 계산이 맞으므로 sizing 자체보다 textarea가 올바른 글꼴을 사용하지 않는 문제가 핵심이라고 봄
- Kin은 editor의
PlainText플래그가 설정되면 TextControl의 콘텐츠 영역에font-family: monospace;를 강제로 적용하는 코드를 발견함- 이 코드를 제거하면 올바른 글꼴이 사용됨
- 그러나 NavQuirks 모드에서는 30열 textarea 안의 30자 문자열이 너비의 약 2/3만 차지하는 문제가 남음
- 원인으로
nsFormControlHelper가 글꼴에서w와W의 평균 너비를 구해 열 수와 곱하고 scrollbar 너비를 더해 textarea 너비를 계산하는 방식이 지목됨
Patch to use the correct font.는 plain text editor 초기화 플래그에eEditorEnableWrapHackMask를 추가하고,font-family: monospace;적용을 조건부로 제한함- 이 패치는 한때
RESOLVED FIXED로 처리됐지만, 원래 리포터가COLS=...는 맞아도ROWS=...는 여전히 잘못 동작한다고 알리면서 다시 열림
반복된 재현과 중복 버그
- 중복 버그 목록에는
<textarea>가 지정된 행보다 한 줄 더 크게 보이거나rows=1이 3줄처럼 보이는 문제가 다수 포함됨- Bug 46106:
Textarea displaying more rows than designated. - Bug 116779:
<textarea rows=1> shows 3 rows - Bug 133342:
textarea always rendered with one more row than defined - Bug 186271:
textareas are 1 row taller than specified - Bug 206946:
<textarea rows="2"> shows ~3 lines - Bug 911226:
<TEXTAREA> always rendered one line too tall !
- Bug 46106:
- Interactive testcase는
rows와cols값을 버튼으로 바꿀 수 있는 HTML 4.01 Strict 문서였고, font tag나 variable-width font를 사용하지 않음- 동작 결과는 지정한 값보다 항상 3 columns가 더 많고, row는 보통 1개 더 많음
rows=1을 요청하면 3 rows가 표시됨
- 2002년 Linux 및 Win2000 trunk builds에서는
<textarea cols=40 rows=2></textarea>가 3 rows로 표시되고,rows=N이면 정확히N+1rows가 표시된다는 사례가 나옴 - W3C HTML 4.01 테스트도 참고 자료로 쓰였고,
ROWS관련 테스트에서 문제가 명확히 보인다는 댓글이 붙음 - Windows 2000과 Mozilla
0.9.3에서도rows=1textarea가 명백히 1 row로 보이지 않는 예제가 올라옴
스크롤바 공간 계산 논의
- Comment 86은 textarea 크기가 지정된
cols/rows에 scrollbar 공간을 더한 값으로 계산된다고 설명함 - IE와 달리 Mozilla는 필요할 때만 scrollbar를 표시하기 때문에 사용자들이 이를 깨진 동작으로 느낀다는 분석이 나옴
- 가능한 선택지로 세 가지가 제안됨
- textarea 크기 계산 시 scrollbar 크기를 더하지 않기
- IE처럼 항상 scrollbar 표시하기
- 표시할 scrollbar만 포함하기
- 세 번째 선택지는 크기가 scrollbar 표시 여부에 의존하고, scrollbar 표시 여부가 다시 크기에 의존해 순환적이라는 지적을 받음
- Comment 87은
ROWS와COLS가 textarea content 크기만 제어하고, scrollbar가 보이면 textarea가 커지는 방식을 네 번째 선택지로 제안함 - 이후 구현 방향은 scrollbar 없는 width/height로 reflow해 scrollbar 필요 여부를 결정한 뒤, 필요하면 새 width/height로 다시 reflow하는 방식으로 논의됨
사용자에게 보인 영향
rows="2"를 지정했는데 3-row 높이 textarea가 나타나면, 입력량을 시각적으로 안내하려는 의도가 흐려짐- 한 웹 애플리케이션은 짧은 요약 텍스트를 요청하며
rows="2"를 사용해 “한 줄보다는 많고 에세이는 아닌” 입력량을 안내함 - Firefox와 IE6, Opera 8의 동작 차이 때문에 같은
rows값이 사용자 에이전트마다 다른 시각적 안내를 만듦
- 한 웹 애플리케이션은 짧은 요약 텍스트를 요청하며
- textarea 내용이 스크롤되지 않는 경우에도 Firefox 동작이 잘못됐다는 댓글이 이어짐
- 주소 입력처럼 대부분 세 줄을 넘지 않을 textarea에
rows="3"을 지정해도 Firefox는 항상 extra row를 표시함 - 페이지가 불필요하게 커지고, 사용자가 박스가 예상보다 커서 정보를 충분히 채우지 않았다고 생각할 수 있음
- 주소 입력처럼 대부분 세 줄을 넘지 않을 textarea에
cols=80비교에서는 IE가 80개의1을 scrollbar 가장자리까지 채운 뒤 줄바꿈하지만, Firefox는 80개의1뒤에 2개가 더 들어갈 공간이 있고 이후 horizontal scrollbar가 나타난다는 스크린샷 설명이 붙음- 2019년에도 문제가 남아 있다는 댓글이 있었고, Discord의
Chat bar is a line taller than usual on FirefoxTrello 카드가 영향 사례로 제시됨
장기간 이어진 패치 시도
- Hideo Saito는 여러 차례 패치와 테스트케이스를 첨부함
patch for rows and colswrap="off"패치 테스트케이스base patchadditional patch for another bugpatch which does not remove space
- 한 접근은
nsTextControlFrame::Reflow를 스크롤바를 제외한 intrinsic size로 수행한 뒤, scrollbar가 있으면 intrinsic size에 scrollbar 크기를 더해 다시 reflow하는 흐름이었음 GetScrollbarStyles를 수정해 text control frame이 scrollbar를auto,hidden,scroll중 무엇으로 둘지 제어하는 접근도 다뤄짐- roc는
nsGfxScrollFrame에 많은 변경을 넣는 방식보다nsTextControlFrame에서 처리하는 방안을 선호함 - 이후 패치들은
SetScrollbarStyles,GetScrollbarStyles,SetScrollbarSpace,GetScrollbarOverflowState,FrameNeedsReflow, post-reflow callback 같은 메커니즘을 두고 리뷰와 재작업을 반복함 - 일부 패치는
review-를 받거나 obsolete 처리됐고, 리뷰어는 trunk에 맞춘 업데이트가 필요하다고 지적함
임시 회피책과 한계
- CSS
textarea{ overflow-x: hidden }를 추가하면 문제가 해결된다는 제안이 있었음 - 이 방법은 수평 스크롤바가 필요 없는 경우에만 적용된다는 조건이 붙음
- 다른 댓글은 이 버그가 CSS
overflow만으로 고칠 수 없고, Firefox가 textarea에 한 줄을 더 추가해 렌더링하는 유일한 브라우저라고 반박함 - Emilio Cobos Álvarez는 원인이 scrollbar 크기 때문으로 보이며
<textarea>에scrollbar-width: none을 적용하면 해결되는 것으로 보인다고 말함 - 같은 댓글은 그래도 버그 자체는 수정되어야 한다고 덧붙임
최종 정리
- 3년 전 BugBot은 이 버그의 severity가 상대적으로 낮은
S3이지만 중복 27개, 투표 103개, CC 91개가 있다며 severity 상향 검토를 요청함 - 버그 요약은
TEXTAREA incorrectly applying ROWS= and COLS=에서TEXTAREA incorrectly applying ROWS= and COLS= (horizontal / vertical scrollbar extra space, with overlay scrollbars disabled)로 바뀜 - Daniel Holbert가 Bug 1830576
Firefox sizes <textarea rows=N> as roughly N+1 rows tall, under an "always show scrollbars" configuration을 의존성으로 추가함 - Luke Warlow는 Bug 1830576이 수정되었으므로 WebKit, Chromium, Firefox의 스크롤바 간격 적용이 일관되게 되었고 이 버그를 닫을 수 있는지 물음
- Emilio Cobos Álvarez가 이에 동의했고, Bug 33654는
NEW에서RESOLVED로 바뀌며DUPLICATE로 닫힘 - 중복 대상은 Bug 1830576으로 지정됐고, 해당 버그는
VERIFIED FIXED상태임