Lỗi Firefox `<textarea>` được sửa sau 25 năm
(bugzilla.mozilla.org)- Bug 33654 lâu năm của Firefox là lỗi khiến
<textarea>khi áp dụngROWS=vàCOLS=bị cộng thêm cả phần không gian dành cho thanh cuộn, nên hiển thị lớn hơn số hàng·cột đã chỉ định; hiện đã được đóng là bản trùng của Bug 1830576 - Trong môi trường tắt overlay scrollbars hoặc dùng thiết lập “always show scrollbars”, hiện tượng
<textarea rows=N>bị tính thành chiều cao khoảng N+1 hàng lặp lại nhiều lần - Thảo luận ban đầu dần mở rộng sang việc kế thừa phông chữ, ép dùng
monospace, cách tínhcolsdựa trên độ rộng trung bình củawvàW, cho đến cách chừa sẵn không gian cho thanh cuộn; testcase·patch·ảnh chụp màn hình được tích lũy trong thời gian dài - Trên thực tế,
rows=1có thể trông như 3 hàng hoặcrows=2hiển thị với chiều cao 3 hàng; ởcols=80, vị trí xuống dòng giữa IE và Firefox cũng khác nhau, khiến việc kiểm soát bố cục biểu mẫu bị lệch tùy theo trình duyệt - Khi Bug 1830576 được đánh dấu
VERIFIED FIXED, cách áp dụng khoảng trống cho thanh cuộn giữa WebKit, Chromium và Firefox đã trở nên nhất quán, còn Bug 33654 được chốt làRESOLVED DUPLICATE
Trạng thái và phạm vi của Bug 33654
- Bug 33654 là lỗi khiến
<textarea>áp dụng saiROWS=vàCOLS=, tạo ra phần không gian bổ sung cho thanh cuộn theo chiều ngang·dọc khi overlay scrollbars bị vô hiệu hóa - Sản phẩm và thành phần là
Core :: Layout: Form Controls, bao gồm bố cục và giao diện của các điều khiển biểu mẫu HTML, đặc biệt là các phần tử nhưtextarea - Trạng thái hiện tại là
RESOLVED DUPLICATE of bug 1830576- Tiêu đề của Bug 1830576, bug bị trùng, là
Firefox sizes <textarea rows=N> as roughly N+1 rows tall, under an "always show scrollbars" configuration - Trạng thái của Bug 1830576 là
VERIFIED FIXED
- Tiêu đề của Bug 1830576, bug bị trùng, là
- Bug này được mở từ 26 năm trước và đã được đóng là
RESOLVED DUPLICATEtừ 2 năm trước - Metadata hiển thị phiên bản
Trunk, nền tảngx86 / All, loạidefect, độ ưu tiênP3, mức độ nghiêm trọngS3 - Từ khóa là
testcase, Whiteboard là[html][behavior]relnote-devel, số phiếu bầu là 99 - Phần đính kèm hiển thị
17 files, 17 obsolete files; testcase·patch·ảnh chụp màn hình được gửi lên lặp đi lặp lại
Triệu chứng ban đầu
- Trong báo cáo đầu tiên, Andrew McMillan cho biết ví dụ
TEXTAREAđược chỉ địnhROWS=5 COLS=30lại hiển thị gần giốngROWS=7 COLS=48 - Ở các bình luận đầu tiên, có nhiều trường hợp
INPUT TYPE=TEXTvàTEXTAREAkhông dùng đúng phông chữ đã chỉ định, hoặc vùng hiển thị quá cao dù thanh cuộn có xuất hiện hay không - Sau đó, thảo luận hội tụ ở nhận định rằng layout của textarea đang nhận thông tin sai: số cột có không gian bổ sung, còn số hàng thì bị cộng thêm một
- Khả năng nguyên nhân đến từ việc chừa sẵn không gian cho thanh cuộn cũng được đề cập từ sớm
Tính toán phông chữ và patch ban đầu
- Trong một trường hợp ở nhóm tin HTML authoring, khi dùng
textarea { font-size: 8pt }cùng với<textarea cols="40" rows="12">, IE render chiều rộng đúng như mong đợi, còn Mozilla trông như đang tính chiều rộng theo phông chữ 12pt - Tệp kiểm thử dùng phông
arialchứa<textarea NAME=system_code wrap=soft rows=5 cols=30 WRAP style="font-family:arial"> - Rod cho rằng với phông mặc định thì việc tính kích thước là đúng, nên vấn đề cốt lõi không phải sizing mà là textarea không dùng đúng phông chữ
- Kin phát hiện khi cờ
PlainTextcủa editor được đặt, mã sẽ ép áp dụngfont-family: monospace;cho vùng nội dung của TextControl- Nếu bỏ đoạn mã này thì phông chữ đúng sẽ được dùng
- Tuy nhiên, ở chế độ NavQuirks vẫn còn vấn đề: chuỗi 30 ký tự trong textarea 30 cột chỉ chiếm khoảng 2/3 chiều rộng
- Nguyên nhân được chỉ ra là
nsFormControlHelperlấy độ rộng trung bình củawvàWtừ phông chữ, nhân với số cột rồi cộng thêm độ rộng thanh cuộn để tính chiều rộng textarea
Patch to use the correct font.thêmeEditorEnableWrapHackMaskvào cờ khởi tạo plain text editor và giới hạn có điều kiện việc áp dụngfont-family: monospace;- Patch này từng được xử lý là
RESOLVED FIXED, nhưng sau đó được mở lại khi người báo cáo ban đầu cho biếtCOLS=...đã đúng cònROWS=...vẫn hoạt động sai
Tái hiện lặp lại và các bug trùng
- Danh sách bug trùng có nhiều trường hợp
<textarea>trông cao hơn một dòng so với số hàng được chỉ định, hoặcrows=1hiển thị như 3 dòng- 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 là một tài liệu HTML 4.01 Strict cho phép thay đổi giá trị
rowsvàcolsbằng nút bấm, không dùng font tag hay phông biến độ rộng- Kết quả hoạt động là luôn nhiều hơn 3 cột so với giá trị chỉ định, còn số hàng thì thường nhiều hơn 1
- Nếu yêu cầu
rows=1thì sẽ hiển thị 3 hàng
- Ở các trunk build Linux và Win2000 năm 2002, đã có trường hợp
<textarea cols=40 rows=2></textarea>hiển thị thành 3 hàng, vàrows=Nthì hiển thị chính xácN+1hàng - Bộ kiểm thử W3C HTML 4.01 cũng được dùng làm tài liệu tham khảo, với bình luận rằng lỗi hiện rõ trong bài kiểm thử liên quan đến
ROWS - Trên Windows 2000 và Mozilla
0.9.3, cũng có ví dụ cho thấy textarearows=1rõ ràng không trông như chỉ có 1 hàng
Thảo luận về cách tính không gian thanh cuộn
- Comment 86 giải thích rằng kích thước textarea được tính bằng giá trị
cols/rowschỉ định cộng thêm không gian cho thanh cuộn - Khác với IE, Mozilla chỉ hiển thị thanh cuộn khi cần, nên người dùng cảm thấy đây là hành vi bị lỗi
- Ba lựa chọn khả dĩ đã được đề xuất
- Không cộng kích thước thanh cuộn khi tính kích thước textarea
- Luôn hiển thị thanh cuộn như IE
- Chỉ tính phần thanh cuộn sẽ hiển thị
- Lựa chọn thứ ba bị chỉ ra là có tính vòng lặp: kích thước phụ thuộc vào việc có hiển thị thanh cuộn hay không, trong khi việc hiển thị thanh cuộn lại phụ thuộc vào kích thước
- Comment 87 đề xuất lựa chọn thứ tư:
ROWSvàCOLSchỉ điều khiển kích thước phần nội dung của textarea, còn khi thanh cuộn xuất hiện thì textarea sẽ tự lớn ra - Sau đó, hướng triển khai được thảo luận là reflow với width/height không có thanh cuộn để xác định có cần thanh cuộn không, rồi nếu cần thì reflow lại với width/height mới
Ảnh hưởng người dùng nhìn thấy
- Khi chỉ định
rows="2"mà lại xuất hiện textarea cao 3 hàng, ý đồ hướng dẫn trực quan về lượng nội dung cần nhập bị mờ đi- Một web application yêu cầu đoạn tóm tắt ngắn và dùng
rows="2"để gợi ý lượng nhập kiểu “nhiều hơn một dòng nhưng không phải bài luận” - Do khác biệt giữa Firefox, IE6 và Opera 8, cùng một giá trị
rowslại tạo ra hướng dẫn trực quan khác nhau tùy user agent
- Một web application yêu cầu đoạn tóm tắt ngắn và dùng
- Ngay cả khi nội dung textarea không cuộn, vẫn có nhiều bình luận cho rằng hành vi của Firefox là sai
- Với các ô nhập như địa chỉ, thường không vượt quá ba dòng, ngay cả khi đặt
rows="3"Firefox vẫn luôn hiển thị thêm một hàng - Trang trở nên cao không cần thiết, và người dùng có thể nghĩ rằng vì ô lớn hơn dự kiến nên họ chưa điền đủ thông tin
- Với các ô nhập như địa chỉ, thường không vượt quá ba dòng, ngay cả khi đặt
- Ở so sánh
cols=80, mô tả ảnh chụp màn hình cho thấy IE lấp đầy đủ 80 ký tự1tới sát mép thanh cuộn rồi mới xuống dòng, còn Firefox sau 80 ký tự1vẫn còn chỗ cho thêm 2 ký tự và sau đó mới xuất hiện thanh cuộn ngang - Đến năm 2019 vẫn còn bình luận cho biết vấn đề chưa biến mất, và thẻ Trello
Chat bar is a line taller than usual on Firefoxcủa Discord được nêu như một ví dụ bị ảnh hưởng
Những nỗ lực vá lỗi kéo dài nhiều năm
- Hideo Saito đã nhiều lần đính kèm patch và testcase
patch for rows and cols- testcase patch
wrap="off" base patchadditional patch for another bugpatch which does not remove space
- Một hướng tiếp cận là để
nsTextControlFrame::Reflowchạy với intrinsic size loại trừ thanh cuộn, rồi nếu có thanh cuộn thì cộng kích thước thanh cuộn vào intrinsic size và reflow lại - Cách sửa
GetScrollbarStylesđể text control frame kiểm soát việc thanh cuộn ở chế độauto,hidden, hayscrollcũng được bàn tới - roc thích phương án xử lý trong
nsTextControlFramehơn là đưa quá nhiều thay đổi vàonsGfxScrollFrame - Các patch về sau liên tục lặp lại vòng review và làm lại quanh các cơ chế như
SetScrollbarStyles,GetScrollbarStyles,SetScrollbarSpace,GetScrollbarOverflowState,FrameNeedsReflow, callback hậu reflow - Một số patch nhận
review-hoặc bị đánh dấu obsolete; reviewer lưu ý cần cập nhật cho phù hợp với trunk
Cách né tạm thời và giới hạn
- Có đề xuất rằng thêm CSS
textarea{ overflow-x: hidden }sẽ giải quyết được vấn đề - Tuy vậy, cách này chỉ áp dụng khi không cần thanh cuộn ngang
- Một bình luận khác phản bác rằng bug này không thể sửa chỉ bằng CSS
overflow, và Firefox là trình duyệt duy nhất render textarea dư thêm một dòng - Emilio Cobos Álvarez nói nguyên nhân có vẻ đến từ kích thước thanh cuộn, và việc áp dụng
scrollbar-width: nonecho<textarea>dường như giải quyết được - Cùng bình luận đó cũng nói thêm rằng bản thân bug vẫn nên được sửa đúng cách
Kết luận cuối cùng
- 3 năm trước, BugBot cho biết bug này có mức độ nghiêm trọng tương đối thấp là
S3, nhưng có 27 bug trùng, 103 phiếu bầu và 91 người trong CC, nên đề nghị xem xét nâng severity - Tóm tắt bug được đổi từ
TEXTAREA incorrectly applying ROWS= and COLS=thànhTEXTAREA incorrectly applying ROWS= and COLS= (horizontal / vertical scrollbar extra space, with overlay scrollbars disabled) - Daniel Holbert thêm Bug 1830576
Firefox sizes <textarea rows=N> as roughly N+1 rows tall, under an "always show scrollbars" configurationlàm dependency - Luke Warlow hỏi liệu có thể đóng bug này không, vì Bug 1830576 đã được sửa nên cách áp dụng khoảng trống cho thanh cuộn giữa WebKit, Chromium và Firefox đã nhất quán
- Emilio Cobos Álvarez đồng ý, và Bug 33654 được chuyển từ
NEWsangRESOLVEDrồi đóng làDUPLICATE - Bug trùng được chỉ định là Bug 1830576, và bug đó hiện ở trạng thái
VERIFIED FIXED
1 bình luận
Ý kiến trên Hacker News
Ha! Tôi đã theo dõi lỗi này trong phần lớn 25 năm đó. Hồi ấy chưa có Firefox, và lỗi này được ghi nhận ở phía Mozilla trước/sau đó chứ không phải Netscape Navigator
Tôi không nhớ vì sao mình theo dõi, nhưng có lẽ là vì đã bình luận. Cứ vài năm lại có email thông báo nên lúc nào cũng thấy buồn cười, và vài ngày trước cuối cùng nó đã được sửa
Tôi luôn nghĩ rằng viết kiểu
html { background: transparent; }thì đáng lẽ cứ thế phải chạy. Tuy nhiên bản sửa lỗi lần này thực ra không làm điều đó. Trước hết, đây không phải tính năng website mặc định chọn, mà là một thiết lập người dùng hoặc extension có thể bật. Có lẽ như vậy tốt hơn, vì nếu cho phép mặc định thì đã mở ra một con đường mới cho clickjackingHơi lạc đề một chút, nhưng tôi thật sự ghét trào lưu hiển thị khoảng thời gian dễ đọc cho con người kiểu “một tháng trước”. Cứ hiển thị ngày tháng đi, tôi tự tính được
Outlook, ít nhất là bản Mac, là tệ nhất. Email trước hôm nay chẳng hạn chỉ hiện mỗi “hôm qua”, và phải bấm vào email mới thấy cả giờ. Mỗi ngày tôi nhận hàng chục email, nên nếu 50 tin nhắn liên tiếp chỉ toàn hiện “hôm qua” thì hoàn toàn vô dụng
Bia thì nên lạnh, timestamp thì nên chính xác
Bugzilla của Firefox chắc chắn là một trong những trình theo dõi lỗi được vận hành lâu đời nhất. Dù đã trải qua vô số lần sửa đổi, thật ấn tượng là nó vẫn còn giữ khá nhiều cảm giác ban đầu. Ngày xưa đó là một codebase khá thô ráp và giống như quái vật
Khoảng năm 2000, trong một tổ chức phát triển Windows, tôi từng dựng một instance để thay thế trình theo dõi lỗi tự làm dựa trên Microsoft Access/Outlook. Nó phức tạp, nhưng trong một thời gian gần như là trình theo dõi lỗi hàng đầu. FogBugz cũng mới bắt đầu vào khoảng thời gian đó, và tôi nghĩ đội ngũ ấy là một trong những nhóm đầu tiên xem xét nghiêm túc trải nghiệm người dùng
Ngược lại, FogBugz là công cụ mà tôi luôn muốn thử một lần nếu có dịp
Nhìn những chuyện như thế này thấy ấm lòng. Gần đây tôi cũng trải qua chuyện tương tự với một lỗi Firefox 24 năm tuổi: https://bugzilla.mozilla.org/show_bug.cgi?id=62151
Trong số các lỗi tồn đọng lâu năm, điều gây khó chịu nhất là trong LibreOffice không thể định dạng đúng trục x của biểu đồ phân tán dưới dạng ngày tháng
https://bugs.documentfoundation.org/show_bug.cgi?id=54132
Đây là lỗi 12 năm tuổi. Nhìn các bình luận thì có vẻ mọi người ngại sửa vì code quá “phức tạp kinh khủng”, và nếu sửa thì rất có thể gây hồi quy
Lần tới mong họ xử lý XDG. Cái này tôi cũng đã chờ 20 năm rồi [1]
[1] https://bugzilla.mozilla.org/show_bug.cgi?id=259356
Thành thật mà nói, đặc tả này không chủ động giải quyết các vấn đề thực tế mà mọi người gặp phải. Phần lớn việc áp dụng là kết quả của việc những người khó chịu với cách tổ chức thư mục
$HOMEliên tục gây áp lực lên các maintainer, còn 99% người dùng không quan tâm chương trình có tuân theo thư mục cơ sở XDG hay không. Nó chỉ giúp người ta có thể lập luận rằng mọi thứ “gọn gàng hơn” theo một đặc tả freedesktop đã hơn 20 năm vẫn chưa được áp dụng rộng rãiCá nhân tôi không thích cách tách biệt lỏng lẻo giữa cấu hình/dữ liệu/cache và ý định ngầm định của nó. Không phải thứ gì cũng khớp với các nhóm đó, và như vậy hành vi của hệ thống sẽ khó dự đoán hơn. Daemon có xóa cache của tôi không? Người dùng có mang thư mục cấu hình đi sao chép không? Chính xác thì thứ gì sẽ được sao lưu? Đặc tả không có chuẩn nào về việc các thư mục thực sự nên được xử lý ra sao. Nó cố ý mơ hồ, nhưng mơ hồ theo cách có thể làm hỏng mọi thứ nếu người ta đưa ra giả định
Nó giống như tách
/usrkhỏi root, tách/usr/localkhỏi root, hoặc đặt/opt. Cảm giác như tàn dư của một thời đã qua vẫn tiếp tục tồn tại, rồi lại muốn tạo thêm một cái nữaTrong sản phẩm của chúng tôi cũng miễn cưỡng hỗ trợ, nhưng chỉ khi biến môi trường tương ứng được đặt rõ ràng. Khi không được đặt, chúng tôi bỏ qua 100% hành vi của XDG cho rằng mặc định trên mọi hệ thống Linux phải như vậy. Vì nó khác với cách các hệ UNIX khác như MacOS mong đợi. Chúng tôi chỉ thêm vừa đủ để ngăn các fan cuồng Arch Linux kéo vào bug tracker hằng tuần đòi áp dụng, và họ còn chưa tới 1% tổng số người dùng. Chỉ riêng việc viết tài liệu hướng dẫn người dùng tìm file của sản phẩm chúng tôi ở đâu trên hệ thống của họ đã đủ khó rồi. Người dùng không phải lúc nào cũng biết XDG, và với đa số, XDG cũng không phải là một quy ước đã được thiết lập mà họ kỳ vọng. Ngoài những người muốn thư mục người dùng sạch sẽ ra thì nó không có giá trị mạnh mẽ, trong khi di sản cũ quá nhiều để chuyển tất cả mọi người sang đặc tả này
Thành thật mà nói, nên nghĩ lại toàn bộ và đi theo giải pháp dựa trên container, nơi ứng dụng desktop không thể thoát khỏi cái nhà tù nhỏ của nó. Gần giống như ứng dụng snap vậy. Cũng có thể học một chút từ Nix. Phải thừa nhận rằng việc khiến mọi ứng dụng người dùng Linux trên thế giới quan tâm và áp dụng thư mục cơ sở XDG, thậm chí cả thư mục người dùng, là một thất bại. Chỉ riêng việc hỗ trợ port cho Mac và Windows đã đủ vất vả, mà chúng không tuân theo hành vi này. Cần thoát khỏi mô hình quyền UNIX chạy chương trình dưới quyền người dùng, và chạy mỗi chương trình bằng uid riêng của nó. Android hoạt động như vậy
Mong sao lỗi tùy chọn sao chép bị vô hiệu hóa ngẫu nhiên dù có văn bản để sao chép sẽ được sửa. Thật sự phát điên lên được
AWS giải quyết vấn đề này bằng cách định kỳ xóa các bug cũ và mọi đề cập đến chúng
Bài liên quan hồi tháng 8 năm ngoái:
Chúc mừng sinh nhật lần thứ 25 của Bugzilla
https://news.ycombinator.com/item?id=37279543
Tuyệt! Nhưng 2000-03-28 vẫn chưa phải là 25 năm trước