The pages linked to below test how well a browser supports the different elements, attributes, and features of HTML 4.01. The organization of the tests is somewhat based on the chapters of the W3C specification. Some attributes and elements that affect text style, etc. have been deprecated in favor of using Cascading Style Sheets (CSS), but the pages below test them anyway, since older web pages may still use them, and a browser should be able to handle them. All of the pages linked to below are valid HTML 4.01 Transitional, so they don't test how well a browser handles bad HTML syntax. The original purpose of these pages was so new browsers (or versions of existing ones) could be tested. However, it is also possible to use the results below to help know what to avoid when making webpages that work in all major browsers.

If you have questions, suggestions for improvements, other browsers to test, think my result expectations are off, etc., you can e-mail me about them: mauvecloud at mauvecloud dot net (mailto link avoided to discourage spam generators).

Results

Key:
C = Crashes browser (whether it is a freeze, O/S terminates browser, or spontaneous reset).
D = Destroys page (by overlapping elements or failing to display elements that should be displayed).
B = Buggy (diverges significantly from specification, not just ignoring item).
N = Not supported (ignores the element or attribute in question).
U = Untestable (something else is known to be unsupported, so the browser does not claim support for the item).
P = Partially supported.
Yb = Yes, but with minor bugs, or almost completely supported, but not quite.
Y = Yes, the item is completely supported.
Y? = Yes, the item seems to be supported, but ambiguities in the specification make it uncertain whether this is the optimum way of handling the item.
Y+ = Yes, and the browser does a little better than the specification requires.

In the table below, Internet Explorer 6 was tested in XP, and the userAgent reports to JavaScript as "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)". Internet Explorer 7 was tested in Vista, and the userAgent reports to JavaScript as "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506)". FireFox 2.0 was tested in Vista, and the userAgent reports to JavaScript as "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11".
Test Name Internet Explorer 6 (IE6) Internet Explorer 7 (IE7) FireFox 2.0 (FF2)
3.2.1 Elements YYY
3.2.3 Character References YYY
3.2.4 Comments BBY
IE6 and IE7 both incorrectly treat "<!-->" and "<!--->"
B.3.1 Line Breaks NNN
All three browsers give the bold text its own line, in clear violation of the specification quoted above on that page.
B.3.5 Marked Sections NNY?
Both IE6 and IE7 display { < << <<< <<<< <<<<< <<<<<< <<<<<<<]]>}, but FF2 displays {}, which could be correct.
B.3.6 Processing Instructions YYY
B.3.7 Shorthand Markup NNP
FF2 supports the closed start tag, but none of the others.
5 HTML Document Representation YYY
6.5 Colors YYY
Extended Colors YYY
Wikipedia Colors BBN
FF2 simply ignores these colors and leaves the background white, but both IE6 and IE7 accept all color names, only the colors produced are not appropriate to the names.
6.6 Lengths BBP
None of the three browsers render the mismatching total sizes the way I would expect, and both IE6 and IE7 allow "*" and "0*" widths to grow to maximum possible width.
7.4.1 The HEAD Element YYY
7.4.2 The TITLE Element YYY
7.4.3 The TITLE Attribute YYY
7.4.4 Meta data NNY
7.5.1 The BODY Element YPY
In FF2, I can hold down the mouse button on the link for the "active" test and it immediately blends in. In IE6, I can hold the mouse button over the link and move it away before releasing the button to make it blend in, but I could not make the link blend in in IE7.
7.5.2 Element Identifiers YYY
7.5.4 Grouping Elements YYY
7.5.5 Headings YYY
7.5.6 The ADDRESS Element YYY
8.1.2 Inheritance of Language Codes UUY
8.2.3 Setting the direction of embedded text ???
8.2.4 Overriding the Bidirectional Algorithm ???
All three browsers tested handled the direction tests in a way that seems illogical to me, but since they all used the exact same way, I may be misunderstanding the direction handling described in the HTML specification. If someone can direct me to a better explanation (see my contact info near the top of the page), I can fix these tests.
8.2.5 Character references for directionality and joining control YYY
9.1 White Space YbYbYb
All three browsers collapse the extra whitespace, but underline the space after "Underlined Text" on the second line, even though there is whitespace after the span that provides the underlining.
9.2.1 Phrase Elements PYY
IE6 does not recognize "ABBR" as a valid element, though IE7 and FF2 do.
9.2.2 Quotations BBY
IE6 and IE7 both style the Q element (indicating they consider it valid), but fail to add any sort of quote marks. Long Live the Q Tag describes one possible workaround, and mentions some alternatives if you don't like that one.
9.2.3 Subscripts and Superscripts YYY
9.3.1 Paragraphs YYY
9.3.2 Controlling Line Breaks YYY
9.3.3 Hyphenation Y+Y+N
One of the few cases where IE does better than FF2 at following the specification. Both IE6 and IE7 allow lines to break on hard hyphens, but FF2 doesn't break the lines at either.
9.3.4 Preformatted Text YYY
9.4 Making Document Changes YbYbYb
The specification states that "These two elements are unusual for HTML in that they may serve as either block-level or inline elements (but not both)." Therefore, it is not surprising that none of the three browsers tested could treat them as block-level elements.
Chapter 10 - Extra-Deep Nesting Tests YYY
Chapter 10 - Extra-large Values Test BBB
None of the browsers size the lists to make the alphabetic or roman numeral entries fit. All three browsers switch to arabic numerals when the roman numerals hit 4000. Most roman numeral conversion algorithms that accept 4000 make it MMMM, but MV (should be a line over the V), or MIƆƆ may be acceptable alternatives (see the Wikipedia article). Also, both IE6 and IE7 only show the last three digits of arabic numerals.
11.2.1 The TABLE Element YYY
11.2.2 Table Captions YbYbY
The "left" and "right" alignments specify that the caption should be at the left and right of the table, respectively, not at the top aligned with the left and right of the table, as IE6 and IE7 render them.
11.2.3 Row Groups YYY
11.2.4 Column Groups YbYbYb
FF2 ignores alignment on columns and groups, while IE6 and IE7 mishandle relative widths.
11.2.5 Table Rows YYY
11.2.6 Table Cells YYY
11.3 Table Formatting by Visual User Agents YbYbYb
Specification gives no reason for frame=box to ever be interpreted differently than frame=border, but in all three browsers tested, rules=all causes frame=border to act exactly like frame=void.
11.3.2 Horizontal and Vertical Alignment PPP
None of the three browsers tested supported either in-cell valign or character alignment.
11.3.3 Cell Margins YYY
12.2.1 Syntax of anchor names YYY
12.2.3 Anchors with the id Attribute YYY
12.2.4 Unavailable and unidentifiable resources PPP
All three browser inform the user that it couldn't find the document, but none of them "allow the user to intervene and identify the document type."
12.3.1 Forward and Reverse Links NNP
IE6 and IE7 both have "Links" toolbars, but these do not pick up the LINK elements from the page that have urls for related content. FF2 shows the link values in the Page Info, but does not allow the user to click or double-click to visit any that are urls.
12.3.2 Links and External Style Sheets YYY
12.3.3 Links and Search Engines NNY
12.4.1 Resolving Relative URIs YYY
13.2 Including an Image YYY
Generic Inclusion BBY
Neither IE6 nor IE7 show an image in the OBJECT element here, and IE7 produces text to indicate it rejected the PNG image, which makes no sense considering it rendered the PNG image when it was in an IMG tag.
13.3.1 Rules for rendering objects YYY
13.3.2 Object Initialization YYY
13.3.4 Object Declaration and Instantiations BBB
Neither IE6 nor IE7 will display either the JPEG image or the text contents of the OBJECT tag. FF2 displays the JPEG image before the anchor has been used.
13.6.1 Client-side Image Maps NNY
Neither IE6 nor IE7 display the image for the client-side image map.
13.6.2 Server-side Image Maps YYY
13.7.1 Width and Height BBY
Images in OBJECT tags are supposed to be scaled, not put into scroll panes, as IE6 and IE7 do.
Chapter 14 Style Sheets YYY
15.2.1 Font Style Elements YYY
Font Modifier Elements YYP
FF2 does not handle multiple BASEFONT elements, though there is nothing in the specification stipulating there can only be one BASEFONT element in a document.
15.3 Rules YYY
16.2.1 The FRAMESET Element YbBY
IE6 and IE7 both fail to render Frame 77, and IE7 draws frame borders inconsistently (none of the frames specify border details, so the borders should all look identical)
16.2.2 The FRAME Element PPYb
None of the three browsers tested treated the "margin" as a margin; all of them put the space inside the border instead of outside. IE6 and IE7 allow scrolling by selection in the frame that specified no scrolling.
16.3.1 Specifying the Default Target for Links YYY
16.3.2 Target Semantics YYY
16.4.1 The NOFRAMES Element UUU
16.4.2 Long Descriptions of Frames NNN
16.5 Inline Frames YbYbYb
None of the three browsers prevented the first iframe from scrolling, even though they were supposed to. The other features of iframes were fully supported.
17.4.1 Control Types created with INPUT - Text YbYbY
IE6 and IE7 do not truncate the specified value in the maxlength test, but do not allow text to be added until the content is shorter than the maxlength.
17.4.1 Control Types created with INPUT - Size Tests None of them provide enough room for 19 "M"s at size=20, but in IE7 and FF2, the CSS sized to width "20ex" and font set to 12 point field looks like it has room for one more "x".
17.4.1 Control Types created with INPUT - Password YbYbY
IE6 and IE7 do not truncate the specified value in the maxlength test, but do not allow text to be added until the content is shorter than the maxlength.
17.4.1 Control Types created with INPUT - Checkbox YYY
17.4.1 Control Types created with INPUT - Radio YYY
17.4.1 Control Types created with INPUT - Submit YYY
17.4.1 Control Types created with INPUT - Image YYY
17.4.1 Control Types created with INPUT - Reset Y?Y?Y?
In radio button group "r2", the page loads with the third button checked, but resetting causes the first button (which had also been marked as checked in the source) to be checked instead.
17.4.1 Control Types created with INPUT - Button YY
17.4.1 Control Types created with INPUT - Hidden YYY
17.4.1 Control Types created with INPUT - File YYY
17.5 The BUTTON Element YbYbYb
None of the three browsers tested rendered the PRE on the button with the same positioning as the normal PRE below.
17.6.1 Pre-selected options BBB
None of the three browsers handle these correctly: Only FF2 correctly allows individual options to be disabled, and only IE7 correctly picks up the "label" attribute. FF2 does not provide a scrolling mechanism for the size 1 multiple selects, and adds disabled scrollbars to the largest selects, which truncate the italicized group names in the hierarchical selects.
17.7 The TEXTAREA Element YYY
17.9.1 The LABEL Element PPN
In IE6, only the letter labels work (maybe it insists on the "for" attribute). In IE7, the "4" label works, but the "3" label doesn't.
17.10 Adding Structure to Forms YYY
17.11.1 Tabbing navigation YYY
17.11.2 Access keys YYYb
FF2 only accepts the access keys with both alt and shift, which doesn't make sense for 5 or period (because it could be interpreted as pressing Alt+% or Alt+>), and prevents the use of the access key for the tilde field.
17.12 Disabled and Read-only controls - text YYY
17.12 Disabled and Read-only controls - password YYY
17.12 Disabled and Read-only controls - checkbox PPP
17.12 Disabled and Read-only controls - radio button PPP
There is a comment in the DTD that indicates "readonly" applies to text and password fields, but the specification says "The following elements support the readonly attribute: INPUT and TEXTAREA." That provides no excuse for browsers to fail to support "readonly" on check boxes and radio buttons, but all three fail that way.
17.12 Disabled and Read-only controls - button YYY
17.12 Disabled and Read-only controls - textarea YYY
18 HTML Events - Body-specific Events YYY
18 HTML Events - Generic Events YbYbYb
None of the three browsers tested seemed able to distinguish "Key Press" from "Key Down".
18 HTML Events - Element-specific events - Anchor YYY
18 HTML Events - Element-specific events - Area NNY
18 HTML Events - Element-specific events - Input YYY
18 HTML Events - Element-specific events - Select YbYbY
The specification makes it clear that IE6 and IE7 are doing this wrong: "The onchange event occurs when a control loses the input focus and its value has been modified since gaining focus. This attribute applies to the following elements: INPUT, SELECT, and TEXTAREA." IE6 and IE7 do not wait for a SELECT element to lose input focus before triggering this event.
18 HTML Events - Element-specific events - Textarea YYY
18 HTML Events - Element-specific events - Button YYY