Index: khtml/html/dtd.cpp =================================================================== RCS file: /local/home/cvs/Labyrinth/WebCore/khtml/html/dtd.cpp,v retrieving revision 1.37 diff -u -p -r1.37 khtml/html/dtd.cpp --- khtml/html/dtd.cpp 2005/02/19 01:13:01 1.37 +++ khtml/html/dtd.cpp 2005/04/12 22:48:51 @@ -553,7 +553,7 @@ bool check_array(ushort child, const ush } -bool DOM::checkChild(ushort tagID, ushort childID) +bool DOM::checkChild(ushort tagID, ushort childID, bool strict) { //kdDebug( 6030 ) << "checkChild: " << tagID << "/" << childID << endl; @@ -597,7 +597,7 @@ bool DOM::checkChild(ushort tagID, ushor return check_array(childID, tag_list_1); case ID_P: // P: ( _0 | TABLE ) * - return check_array(childID, tag_list_0) || childID == ID_TABLE; + return check_array(childID, tag_list_0) || (!strict && childID == ID_TABLE); case ID_H1: case ID_H2: case ID_H3: Index: khtml/html/dtd.h =================================================================== RCS file: /local/home/cvs/Labyrinth/WebCore/khtml/html/dtd.h,v retrieving revision 1.4 diff -u -p -r1.4 khtml/html/dtd.h --- khtml/html/dtd.h 2005/02/19 01:13:01 1.4 +++ khtml/html/dtd.h 2005/04/12 22:48:51 @@ -33,7 +33,7 @@ void removeForbidden(int tagId, ushort * enum tagStatus { OPTIONAL, REQUIRED, FORBIDDEN }; -bool checkChild(ushort tagID, ushort childID); +bool checkChild(ushort tagID, ushort childID, bool strict); extern const unsigned short tagPriorityArray[]; extern const tagStatus endTagArray[]; Index: khtml/html/htmlparser.cpp =================================================================== RCS file: /local/home/cvs/Labyrinth/WebCore/khtml/html/htmlparser.cpp,v retrieving revision 1.92 diff -u -p -r1.92 khtml/html/htmlparser.cpp --- khtml/html/htmlparser.cpp 2005/03/10 21:09:24 1.92 +++ khtml/html/htmlparser.cpp 2005/04/12 22:48:51 @@ -650,7 +650,7 @@ bool KHTMLParser::insertNode(NodeImpl *n ( parent->id() == ID_THEAD || parent->id() == ID_TBODY || parent->id() == ID_TFOOT ) && parentparent->id() == ID_TABLE ) || - ( !checkChild( ID_TR, id ) && ( node->id() == ID_THEAD || node->id() == ID_TBODY || node->id() == ID_TFOOT ) && + ( !checkChild(ID_TR, id, !doc()->inCompatMode()) && ( node->id() == ID_THEAD || node->id() == ID_TBODY || node->id() == ID_TFOOT ) && parent->id() == ID_TABLE )) { node = (node->id() == ID_TABLE) ? node : Index: khtml/html/htmltokenizer.cpp =================================================================== RCS file: /local/home/cvs/Labyrinth/WebCore/khtml/html/htmltokenizer.cpp,v retrieving revision 1.84 diff -u -p -r1.84 khtml/html/htmltokenizer.cpp --- khtml/html/htmltokenizer.cpp 2005/03/20 00:58:28 1.84 +++ khtml/html/htmltokenizer.cpp 2005/04/12 22:48:51 @@ -1398,7 +1398,7 @@ void HTMLTokenizer::parseTag(TokenizerSt // we have to take care to close the pre block in // case we encounter an unallowed element.... - if(pre && beginTag && !DOM::checkChild(ID_PRE, tagID)) { + if(pre && beginTag && !DOM::checkChild(ID_PRE, tagID, !parser->doc()->inCompatMode())) { kdDebug(6036) << " not allowed in
 " << (int)tagID << endl;
                 pre = false;
             }
Index: khtml/xml/dom_elementimpl.cpp
===================================================================
RCS file: /local/home/cvs/Labyrinth/WebCore/khtml/xml/dom_elementimpl.cpp,v
retrieving revision 1.61
diff -u -p -r1.61 khtml/xml/dom_elementimpl.cpp
--- khtml/xml/dom_elementimpl.cpp	2005/03/01 01:58:34	1.61
+++ khtml/xml/dom_elementimpl.cpp	2005/04/12 22:48:51
@@ -527,7 +527,7 @@ bool ElementImpl::childAllowed( NodeImpl
 
     // For XML documents, we are non-validating and do not check against a DTD, even for HTML elements.
     if (getDocument()->isHTMLDocument())
-        return checkChild(id(), newChild->id());
+        return checkChild(id(), newChild->id(), !getDocument()->inCompatMode());
     return true;
 }