- rolled out my custom tag name change -- it broke amazon.com
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Dec 2004 23:18:19 +0000 (23:18 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Dec 2004 23:18:19 +0000 (23:18 +0000)
        * khtml/css/cssstyleselector.cpp:
        * khtml/editing/htmlediting.cpp:
        * khtml/editing/selection.cpp:
        * khtml/editing/visible_position.cpp:
        * khtml/html/dtd.cpp:
        * khtml/html/htmlparser.cpp:
        * khtml/html/htmlparser.h:
        * khtml/html/htmltokenizer.cpp:
        * khtml/misc/htmlhashes.cpp:
        * khtml/misc/htmlhashes.h:
        * khtml/misc/htmltags.c:
        * khtml/misc/htmltags.h:
        * khtml/misc/maketags:
        * khtml/xml/dom_docimpl.cpp:
        * khtml/xml/dom_docimpl.h:
        * khtml/xml/dom_nodeimpl.cpp:
        * khtml/xml/dom_position.cpp:
        * kwq/KWQRenderTreeDebug.cpp:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8278 268f45cc-cd09-0410-ab3c-d52691b4dbfc

20 files changed:
WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/cssstyleselector.cpp
WebCore/khtml/editing/SelectionController.cpp
WebCore/khtml/editing/htmlediting.cpp
WebCore/khtml/editing/selection.cpp
WebCore/khtml/editing/visible_position.cpp
WebCore/khtml/html/dtd.cpp
WebCore/khtml/html/htmlparser.cpp
WebCore/khtml/html/htmlparser.h
WebCore/khtml/html/htmltokenizer.cpp
WebCore/khtml/misc/htmlhashes.cpp
WebCore/khtml/misc/htmlhashes.h
WebCore/khtml/misc/htmltags.c
WebCore/khtml/misc/htmltags.h
WebCore/khtml/misc/maketags
WebCore/khtml/xml/dom_docimpl.cpp
WebCore/khtml/xml/dom_docimpl.h
WebCore/khtml/xml/dom_nodeimpl.cpp
WebCore/khtml/xml/dom_position.cpp
WebCore/kwq/KWQRenderTreeDebug.cpp

index a76f931a765120cc5713bb8591779663417354e5..bd24eb0cc9d8c8c6b0ec4f8afb39b0712b0891c2 100644 (file)
@@ -1,3 +1,26 @@
+2004-12-22  Darin Adler  <darin@apple.com>
+
+        - rolled out my custom tag name change -- it broke amazon.com
+
+        * khtml/css/cssstyleselector.cpp:
+        * khtml/editing/htmlediting.cpp:
+        * khtml/editing/selection.cpp:
+        * khtml/editing/visible_position.cpp:
+        * khtml/html/dtd.cpp:
+        * khtml/html/htmlparser.cpp:
+        * khtml/html/htmlparser.h:
+        * khtml/html/htmltokenizer.cpp:
+        * khtml/misc/htmlhashes.cpp:
+        * khtml/misc/htmlhashes.h:
+        * khtml/misc/htmltags.c:
+        * khtml/misc/htmltags.h:
+        * khtml/misc/maketags:
+        * khtml/xml/dom_docimpl.cpp:
+        * khtml/xml/dom_docimpl.h:
+        * khtml/xml/dom_nodeimpl.cpp:
+        * khtml/xml/dom_position.cpp:
+        * kwq/KWQRenderTreeDebug.cpp:
+
 2004-12-22  David Harrison  <harrison@apple.com>
 
         Reviewed by Darin Adler.
index 5b6895028526c760b1414ac00561454f6527a6f3..796bbac9c59663c3ff55df9ca01d63911c387950 100644 (file)
@@ -1109,7 +1109,7 @@ bool CSSStyleSelector::checkOneSelector(DOM::CSSSelector *sel, DOM::ElementImpl
         Q_UINT16 selLocalName = localNamePart(sel->tag);
         Q_UINT16 selNS = namespacePart(sel->tag);
         
-        if (localName <= ID_LAST_TAG && e->isHTMLElement())
+        if (localName < ID_LAST_TAG && e->isHTMLElement())
             ns = xhtmlNamespace; // FIXME: Really want to move away from this complicated hackery and just
                                  // switch tags and attr names over to AtomicStrings.
         
index c62cf46ac35a73adf998a6f3db1d35c96653b9c3..0248a3311fe3250ea863e2ebf2f21f01d9c60b45 100644 (file)
@@ -1131,24 +1131,24 @@ void Selection::debugPosition() const
         Position pos = m_start;
         Position upstream = pos.upstream();
         Position downstream = pos.downstream();
-        fprintf(stderr, "upstream:   %s %p:%d\n", upstream.node()->nodeName().string().latin1(), upstream.node(), upstream.offset());
-        fprintf(stderr, "pos:        %s %p:%d\n", pos.node()->nodeName().string().latin1(), pos.node(), pos.offset());
-        fprintf(stderr, "downstream: %s %p:%d\n", downstream.node()->nodeName().string().latin1(), downstream.node(), downstream.offset());
+        fprintf(stderr, "upstream:   %s %p:%d\n", getTagName(upstream.node()->id()).string().latin1(), upstream.node(), upstream.offset());
+        fprintf(stderr, "pos:        %s %p:%d\n", getTagName(pos.node()->id()).string().latin1(), pos.node(), pos.offset());
+        fprintf(stderr, "downstream: %s %p:%d\n", getTagName(downstream.node()->id()).string().latin1(), downstream.node(), downstream.offset());
     }
     else {
         Position pos = m_start;
         Position upstream = pos.upstream();
         Position downstream = pos.downstream();
-        fprintf(stderr, "upstream:   %s %p:%d\n", upstream.node()->nodeName().string().latin1(), upstream.node(), upstream.offset());
-        fprintf(stderr, "start:      %s %p:%d\n", pos.node()->nodeName().string().latin1(), pos.node(), pos.offset());
-        fprintf(stderr, "downstream: %s %p:%d\n", downstream.node()->nodeName().string().latin1(), downstream.node(), downstream.offset());
+        fprintf(stderr, "upstream:   %s %p:%d\n", getTagName(upstream.node()->id()).string().latin1(), upstream.node(), upstream.offset());
+        fprintf(stderr, "start:      %s %p:%d\n", getTagName(pos.node()->id()).string().latin1(), pos.node(), pos.offset());
+        fprintf(stderr, "downstream: %s %p:%d\n", getTagName(downstream.node()->id()).string().latin1(), downstream.node(), downstream.offset());
         fprintf(stderr, "-----------------------------------\n");
         pos = m_end;
         upstream = pos.upstream();
         downstream = pos.downstream();
-        fprintf(stderr, "upstream:   %s %p:%d\n", upstream.node()->nodeName().string().latin1(), upstream.node(), upstream.offset());
-        fprintf(stderr, "end:        %s %p:%d\n", pos.node()->nodeName().string().latin1(), pos.node(), pos.offset());
-        fprintf(stderr, "downstream: %s %p:%d\n", downstream.node()->nodeName().string().latin1(), downstream.node(), downstream.offset());
+        fprintf(stderr, "upstream:   %s %p:%d\n", getTagName(upstream.node()->id()).string().latin1(), upstream.node(), upstream.offset());
+        fprintf(stderr, "end:        %s %p:%d\n", getTagName(pos.node()->id()).string().latin1(), pos.node(), pos.offset());
+        fprintf(stderr, "downstream: %s %p:%d\n", getTagName(downstream.node()->id()).string().latin1(), downstream.node(), downstream.offset());
         fprintf(stderr, "-----------------------------------\n");
     }
           
index 56e116dff693e7de3c8fa30d35c8c3fc62ea8d99..131c741c4b7b7bd2df090900bfbe18184f872922 100644 (file)
@@ -192,7 +192,7 @@ static void debugPosition(const char *prefix, const Position &pos)
     if (pos.isNull())
         LOG(Editing, "%s <null>", prefix);
     else
-        LOG(Editing, "%s%s %p : %d", prefix, pos.node()->nodeName().string().latin1(), pos.node(), pos.offset());
+        LOG(Editing, "%s%s %p : %d", prefix, getTagName(pos.node()->id()).string().latin1(), pos.node(), pos.offset());
 }
 
 static void debugNode(const char *prefix, const NodeImpl *node)
@@ -202,7 +202,7 @@ static void debugNode(const char *prefix, const NodeImpl *node)
     if (!node)
         LOG(Editing, "%s <null>", prefix);
     else
-        LOG(Editing, "%s%s %p", prefix, node->nodeName().string().latin1(), node);
+        LOG(Editing, "%s%s %p", prefix, getTagName(node->id()).string().latin1(), node);
 }
 
 //------------------------------------------------------------------------------------------
index c62cf46ac35a73adf998a6f3db1d35c96653b9c3..0248a3311fe3250ea863e2ebf2f21f01d9c60b45 100644 (file)
@@ -1131,24 +1131,24 @@ void Selection::debugPosition() const
         Position pos = m_start;
         Position upstream = pos.upstream();
         Position downstream = pos.downstream();
-        fprintf(stderr, "upstream:   %s %p:%d\n", upstream.node()->nodeName().string().latin1(), upstream.node(), upstream.offset());
-        fprintf(stderr, "pos:        %s %p:%d\n", pos.node()->nodeName().string().latin1(), pos.node(), pos.offset());
-        fprintf(stderr, "downstream: %s %p:%d\n", downstream.node()->nodeName().string().latin1(), downstream.node(), downstream.offset());
+        fprintf(stderr, "upstream:   %s %p:%d\n", getTagName(upstream.node()->id()).string().latin1(), upstream.node(), upstream.offset());
+        fprintf(stderr, "pos:        %s %p:%d\n", getTagName(pos.node()->id()).string().latin1(), pos.node(), pos.offset());
+        fprintf(stderr, "downstream: %s %p:%d\n", getTagName(downstream.node()->id()).string().latin1(), downstream.node(), downstream.offset());
     }
     else {
         Position pos = m_start;
         Position upstream = pos.upstream();
         Position downstream = pos.downstream();
-        fprintf(stderr, "upstream:   %s %p:%d\n", upstream.node()->nodeName().string().latin1(), upstream.node(), upstream.offset());
-        fprintf(stderr, "start:      %s %p:%d\n", pos.node()->nodeName().string().latin1(), pos.node(), pos.offset());
-        fprintf(stderr, "downstream: %s %p:%d\n", downstream.node()->nodeName().string().latin1(), downstream.node(), downstream.offset());
+        fprintf(stderr, "upstream:   %s %p:%d\n", getTagName(upstream.node()->id()).string().latin1(), upstream.node(), upstream.offset());
+        fprintf(stderr, "start:      %s %p:%d\n", getTagName(pos.node()->id()).string().latin1(), pos.node(), pos.offset());
+        fprintf(stderr, "downstream: %s %p:%d\n", getTagName(downstream.node()->id()).string().latin1(), downstream.node(), downstream.offset());
         fprintf(stderr, "-----------------------------------\n");
         pos = m_end;
         upstream = pos.upstream();
         downstream = pos.downstream();
-        fprintf(stderr, "upstream:   %s %p:%d\n", upstream.node()->nodeName().string().latin1(), upstream.node(), upstream.offset());
-        fprintf(stderr, "end:        %s %p:%d\n", pos.node()->nodeName().string().latin1(), pos.node(), pos.offset());
-        fprintf(stderr, "downstream: %s %p:%d\n", downstream.node()->nodeName().string().latin1(), downstream.node(), downstream.offset());
+        fprintf(stderr, "upstream:   %s %p:%d\n", getTagName(upstream.node()->id()).string().latin1(), upstream.node(), upstream.offset());
+        fprintf(stderr, "end:        %s %p:%d\n", getTagName(pos.node()->id()).string().latin1(), pos.node(), pos.offset());
+        fprintf(stderr, "downstream: %s %p:%d\n", getTagName(downstream.node()->id()).string().latin1(), downstream.node(), downstream.offset());
         fprintf(stderr, "-----------------------------------\n");
     }
           
index a602a92d818e715bba8f7e27b99a26d749648e4c..8a581461f7e75b9ef75d5591feba26405cd115ce 100644 (file)
@@ -406,7 +406,7 @@ void VisiblePosition::debugPosition(const char *msg) const
     if (isNull())
         fprintf(stderr, "Position [%s]: null\n", msg);
     else
-        fprintf(stderr, "Position [%s]: %s [%p] at %d\n", msg, m_deepPosition.node()->nodeName().string().latin1(), m_deepPosition.node(), m_deepPosition.offset());
+        fprintf(stderr, "Position [%s]: %s [%p] at %d\n", msg, getTagName(m_deepPosition.node()->id()).string().latin1(), m_deepPosition.node(), m_deepPosition.offset());
 }
 
 #ifndef NDEBUG
index f193705b770ce7db0a4eb6d55708285e170e1aa1..cb964e720f93514e80bc1526e64d712e13b30177 100644 (file)
@@ -559,8 +559,8 @@ bool DOM::checkChild(ushort tagID, ushort childID)
 
     // ### allow comments inside ANY node that can contain children
 
-    if (tagID > ID_LAST_TAG || childID > ID_LAST_TAG)
-        return true; // one or both of the elements is an XML element; just allow for now
+    if (tagID >= 1000 || childID >= 1000)
+        return true; // one or both of the elements in an XML element; just allow for now
 
     switch(tagID)
     {
index b6d792e39114ee92519c9437fa6ab071a5075183..9a1bea854261dad2f5c633e300648639fab546a4 100644 (file)
@@ -126,6 +126,9 @@ KHTMLParser::KHTMLParser(KHTMLView *_parent, DocumentPtr *doc, bool includesComm
 
     blockStack = 0;
 
+    // ID_CLOSE_TAG == Num of tags
+    forbiddenTag = new ushort[ID_CLOSE_TAG+1];
+
     reset();
 }
 
@@ -136,6 +139,8 @@ KHTMLParser::KHTMLParser(DOM::DocumentFragmentImpl *i, DocumentPtr *doc, bool in
     document = doc;
     document->ref();
 
+    forbiddenTag = new ushort[ID_CLOSE_TAG+1];
+
     blockStack = 0;
 
     reset();
@@ -155,8 +160,8 @@ KHTMLParser::~KHTMLParser()
 
     document->deref();
 
-    if (isindex)
-        isindex->deref();
+    delete [] forbiddenTag;
+    delete isindex;
 }
 
 void KHTMLParser::reset()
@@ -165,8 +170,8 @@ void KHTMLParser::reset()
 
     freeBlock();
 
-    // before parsing, no tags are forbidden
-    memset(forbiddenTag, 0, sizeof(forbiddenTag));
+    // before parsing no tags are forbidden...
+    memset(forbiddenTag, 0, (ID_CLOSE_TAG+1)*sizeof(ushort));
 
     inBody = false;
     haveFrameSet = false;
@@ -196,6 +201,11 @@ void KHTMLParser::setCurrent(DOM::NodeImpl *newCurrent)
 
 void KHTMLParser::parseToken(Token *t)
 {
+    if (t->id > 2*ID_CLOSE_TAG)
+    {
+      kdDebug( 6035 ) << "Unknown tag!! tagID = " << t->id << endl;
+      return;
+    }
     if(discard_until) {
         if(t->id == discard_until)
             discard_until = 0;
@@ -213,10 +223,10 @@ void KHTMLParser::parseToken(Token *t)
 
     // holy shit. apparently some sites use </br> instead of <br>
     // be compatible with IE and NS
-    if (t->id == ID_BR + ID_CLOSE_TAG && doc()->inCompatMode())
-        t->id = ID_BR;
+    if(t->id == ID_BR+ID_CLOSE_TAG && doc()->inCompatMode())
+        t->id -= ID_CLOSE_TAG;
 
-    if (t->id > ID_CLOSE_TAG)
+    if(t->id > ID_CLOSE_TAG)
     {
         processCloseTag(t);
         return;
@@ -257,7 +267,7 @@ void KHTMLParser::parseToken(Token *t)
 
     // if this tag is forbidden inside the current context, pop
     // blocks until we are allowed to add it...
-    while (t->id <= ID_LAST_TAG && forbiddenTag[t->id]) {
+    while(forbiddenTag[t->id]) {
 #ifdef PARSER_DEBUG
         kdDebug( 6035 ) << "t->id: " << t->id << " is forbidden :-( " << endl;
 #endif
@@ -688,7 +698,7 @@ bool KHTMLParser::insertNode(NodeImpl *n, bool flat)
             } // end switch
             break;
         case ID_OBJECT:
-            discard_until = ID_OBJECT + ID_CLOSE_TAG;
+            discard_until = id + ID_CLOSE_TAG;
             return false;
         case ID_UL:
         case ID_OL:
@@ -779,29 +789,56 @@ bool KHTMLParser::insertNode(NodeImpl *n, bool flat)
     }
 }
 
+// FIXME: getElement looks like copied code of DocumentImpl::createHTMLElement or vice versa.
+// This has been the cause of bugs. They should share the same code.
 NodeImpl *KHTMLParser::getElement(Token* t)
 {
-    switch (t->id)
+    NodeImpl *n = 0;
+
+    switch(t->id)
     {
+    case ID_HTML:
+        n = new HTMLHtmlElementImpl(document);
+        break;
     case ID_HEAD:
-        if (!head && current->id() == ID_HTML) {
+        if(!head && current->id() == ID_HTML) {
             head = new HTMLHeadElementImpl(document);
-            return head;
+            n = head;
         }
-        return 0;
+        break;
     case ID_BODY:
         // body no longer allowed if we have a frameset
-        if (haveFrameSet)
-            return 0;
+        if(haveFrameSet) break;
         popBlock(ID_HEAD);
+        n = new HTMLBodyElementImpl(document);
         startBody();
-        return new HTMLBodyElementImpl(document);
+        break;
+
+// head elements
+    case ID_BASE:
+        n = new HTMLBaseElementImpl(document);
+        break;
+    case ID_LINK:
+        n = new HTMLLinkElementImpl(document);
+        break;
+    case ID_META:
+        n = new HTMLMetaElementImpl(document);
+        break;
+    case ID_STYLE:
+        n = new HTMLStyleElementImpl(document);
+        break;
+    case ID_TITLE:
+        n = new HTMLTitleElementImpl(document);
+        break;
 
 // frames
+    case ID_FRAME:
+        n = new HTMLFrameElementImpl(document);
+        break;
     case ID_FRAMESET:
         popBlock(ID_HEAD);
-        if (inBody && !haveFrameSet && !haveContent) {
-            popBlock(ID_BODY);
+        if ( inBody && !haveFrameSet && !haveContent) {
+            popBlock( ID_BODY );
             // ### actually for IE document.body returns the now hidden "body" element
             // we can't implement that behaviour now because it could cause too many
             // regressions and the headaches are not worth the work as long as there is
@@ -810,95 +847,236 @@ NodeImpl *KHTMLParser::getElement(Token* t)
                 doc()->body()->setAttribute(ATTR_STYLE, "display:none");
             inBody = false;
         }
-        if ((haveContent || haveFrameSet) && current->id() == ID_HTML)
-            return 0;
+        if ( (haveContent || haveFrameSet) && current->id() == ID_HTML)
+            break;
+        n = new HTMLFrameSetElementImpl(document);
         haveFrameSet = true;
         startBody();
-        return new HTMLFrameSetElementImpl(document);
-
-    // a bit of a special case, since the frame is inlined
+        break;
+        // a bit a special case, since the frame is inlined...
     case ID_IFRAME:
-        discard_until = ID_IFRAME + ID_CLOSE_TAG;
+        n = new HTMLIFrameElementImpl(document);
+        discard_until = ID_IFRAME+ID_CLOSE_TAG;
         break;
 
 // form elements
     case ID_FORM:
-        // Only create a new form if we're not already inside one.
-        // This is consistent with other browsers' behavior.
-        if (form)
-            return 0;
-        form = new HTMLFormElementImpl(document);
-        return form;
-    case ID_ISINDEX: {
-        NodeImpl *n = handleIsindex(t);
-        if (!inBody) {
-            if (isindex)
-                isindex->deref();
-            isindex = n;
-            isindex->ref();
-            return 0;
+        if (!form) {
+            // Only create a new form if we're not already inside one.
+            // This is consistent with other browsers' behavior.
+            form = new HTMLFormElementImpl(document);
+            n = form;
         }
-        t->flat = true;
-        return n;
-    }
+        break;
+    case ID_BUTTON:
+        n = new HTMLButtonElementImpl(document, form);
+        break;
+    case ID_FIELDSET:
+        n = new HTMLFieldSetElementImpl(document, form);
+        break;
+    case ID_INPUT:
+        n = new HTMLInputElementImpl(document, form);
+        break;
+    case ID_ISINDEX:
+        n = handleIsindex(t);
+        if( !inBody ) {
+            isindex = n;
+            n = 0;
+        } else
+            t->flat = true;
+        break;
     case ID_KEYGEN:
-        return new HTMLKeygenElementImpl(document, form);
+        n = new HTMLKeygenElementImpl(document, form);
+        break;
+    case ID_LABEL:
+        n = new HTMLLabelElementImpl(document);
+        break;
     case ID_LEGEND:
-        return new HTMLLegendElementImpl(document, form);
+        n = new HTMLLegendElementImpl(document, form);
+        break;
     case ID_OPTGROUP:
-        return new HTMLOptGroupElementImpl(document, form);
+        n = new HTMLOptGroupElementImpl(document, form);
+        break;
     case ID_OPTION:
-        return new HTMLOptionElementImpl(document, form);
+        n = new HTMLOptionElementImpl(document, form);
+        break;
     case ID_SELECT:
         inSelect = true;
-        return new HTMLSelectElementImpl(document, form);
+        n = new HTMLSelectElementImpl(document, form);
+        break;
     case ID_TEXTAREA:
-        return new HTMLTextAreaElementImpl(document, form);
+        n = new HTMLTextAreaElementImpl(document, form);
+        break;
 
 // lists
+    case ID_DL:
+        n = new HTMLDListElementImpl(document);
+        break;
     case ID_DD:
+        n = new HTMLGenericElementImpl(document, t->id);
         popBlock(ID_DT);
         popBlock(ID_DD);
         break;
     case ID_DT:
+        n = new HTMLGenericElementImpl(document, t->id);
         popBlock(ID_DD);
         popBlock(ID_DT);
         break;
+    case ID_UL:
+    {
+        n = new HTMLUListElementImpl(document);
+        break;
+    }
+    case ID_OL:
+    {
+        n = new HTMLOListElementImpl(document);
+        break;
+    }
+    case ID_DIR:
+        n = new HTMLDirectoryElementImpl(document);
+        break;
+    case ID_MENU:
+        n = new HTMLMenuElementImpl(document);
+        break;
     case ID_LI:
+    {
         popBlock(ID_LI);
+        n = new HTMLLIElementImpl(document);
+        break;
+    }
+// formatting elements (block)
+    case ID_BLOCKQUOTE:
+        n = new HTMLBlockquoteElementImpl(document);
+        break;
+    case ID_DIV:
+        n = new HTMLDivElementImpl(document);
+        break;
+    case ID_LAYER:
+        n = new HTMLLayerElementImpl(document);
+        break;
+    case ID_H1:
+    case ID_H2:
+    case ID_H3:
+    case ID_H4:
+    case ID_H5:
+    case ID_H6:
+        n = new HTMLHeadingElementImpl(document, t->id);
+        break;
+    case ID_HR:
+        n = new HTMLHRElementImpl(document);
+        break;
+    case ID_P:
+        n = new HTMLParagraphElementImpl(document);
+        break;
+    case ID_XMP:
+    case ID_PRE:
+    case ID_PLAINTEXT:
+        n = new HTMLPreElementImpl(document, t->id);
+        break;
+
+// font stuff
+    case ID_BASEFONT:
+        n = new HTMLBaseFontElementImpl(document);
+        break;
+    case ID_FONT:
+        n = new HTMLFontElementImpl(document);
+        break;
+
+// ins/del
+    case ID_DEL:
+    case ID_INS:
+        n = new HTMLGenericElementImpl(document, t->id);
         break;
 
 // anchor
     case ID_A:
         // Never allow nested <a>s.
         popBlock(ID_A);
+
+        n = new HTMLAnchorElementImpl(document);
+        break;
+
+// canvas
+    case ID_CANVAS:
+        n = new HTMLCanvasElementImpl(document);
         break;
 
 // images
     case ID_IMG:
-        return new HTMLImageElementImpl(document, form);
+        n = new HTMLImageElementImpl(document, form);
+        break;
     case ID_MAP:
         map = new HTMLMapElementImpl(document);
-        return map;
+        n = map;
+        break;
+    case ID_AREA:
+        n = new HTMLAreaElementImpl(document);
+        break;
+
+// objects, applets and scripts
+    case ID_APPLET:
+        n = new HTMLAppletElementImpl(document);
+        break;
+    case ID_EMBED:
+        n = new HTMLEmbedElementImpl(document);
+        break;
+    case ID_OBJECT:
+        n = new HTMLObjectElementImpl(document);
+        break;
+    case ID_PARAM:
+        n = new HTMLParamElementImpl(document);
+        break;
+    case ID_SCRIPT:
+        n = new HTMLScriptElementImpl(document);
+        break;
 
 // tables
+    case ID_TABLE:
+        n = new HTMLTableElementImpl(document);
+        break;
+    case ID_CAPTION:
+        n = new HTMLTableCaptionElementImpl(document);
+        break;
+    case ID_COLGROUP:
+    case ID_COL:
+        n = new HTMLTableColElementImpl(document, t->id);
+        break;
     case ID_TR:
         popBlock(ID_TR);
+        n = new HTMLTableRowElementImpl(document);
         break;
     case ID_TD:
     case ID_TH:
         popBlock(ID_TH);
         popBlock(ID_TD);
+        n = new HTMLTableCellElementImpl(document, t->id);
         break;
     case ID_TBODY:
     case ID_THEAD:
     case ID_TFOOT:
-        popBlock(ID_THEAD);
-        popBlock(ID_TBODY);
-        popBlock(ID_TFOOT);
+        popBlock( ID_THEAD );
+        popBlock( ID_TBODY );
+        popBlock( ID_TFOOT );
+        n = new HTMLTableSectionElementImpl(document, t->id, false);
+        break;
+
+// inline elements
+    case ID_BR:
+        n = new HTMLBRElementImpl(document);
+        break;
+    case ID_Q:
+        n = new HTMLGenericElementImpl(document, t->id);
         break;
 
 // elements with no special representation in the DOM
+
+// block:
+    case ID_ADDRESS:
+    case ID_CENTER:
+        n = new HTMLGenericElementImpl(document, t->id);
+        break;
+// inline
+        // %fontstyle
     case ID_TT:
     case ID_U:
     case ID_B:
@@ -909,14 +1087,34 @@ NodeImpl *KHTMLParser::getElement(Token* t)
     case ID_SMALL:
         if (!allowNestedRedundantTag(t->id))
             return 0;
-        break;
-
+        // Fall through and get handled with the rest of the tags
+        // %phrase
+    case ID_EM:
+    case ID_STRONG:
+    case ID_DFN:
+    case ID_CODE:
+    case ID_SAMP:
+    case ID_KBD:
+    case ID_VAR:
+    case ID_CITE:
+    case ID_ABBR:
+    case ID_ACRONYM:
+
+        // %special
+    case ID_SUB:
+    case ID_SUP:
+    case ID_SPAN:
     case ID_NOBR:
     case ID_WBR:
-        popBlock(t->id); // Don't allow nested <nobr> or <wbr>
+        if (t->id == ID_NOBR || t->id == ID_WBR)
+            popBlock(t->id); // Don't allow nested <nobr> or <wbr>
+        n = new HTMLGenericElementImpl(document, t->id);
+        break;
+
+    case ID_BDO:
         break;
 
-// these are special, and normally not rendered
+        // these are special, and normally not rendered
     case ID_NOEMBED:
         discard_until = ID_NOEMBED + ID_CLOSE_TAG;
         return 0;
@@ -924,21 +1122,28 @@ NodeImpl *KHTMLParser::getElement(Token* t)
         discard_until = ID_NOFRAMES + ID_CLOSE_TAG;
         return 0;
     case ID_NOSCRIPT:
-        if (HTMLWidget && HTMLWidget->part()->jScriptEnabled())
+        if(HTMLWidget && HTMLWidget->part()->jScriptEnabled())
             discard_until = ID_NOSCRIPT + ID_CLOSE_TAG;
         return 0;
     case ID_NOLAYER:
-        //discard_until = ID_NOLAYER + ID_CLOSE_TAG;
+//        discard_until = ID_NOLAYER + ID_CLOSE_TAG;
         return 0;
+        break;
+    case ID_MARQUEE:
+        n = new HTMLMarqueeElementImpl(document);
+        break;
+// text
     case ID_TEXT:
-        return new TextImpl(document, t->text);
+        n = new TextImpl(document, t->text);
+        break;
     case ID_COMMENT:
-        if (!includesCommentsInDOM)
-            return 0;
+        if (includesCommentsInDOM)
+            n = new CommentImpl(document, t->text);
         break;
+    default:
+        kdDebug( 6035 ) << "Unknown tag " << t->id << "!" << endl;
     }
-
-    return document->document()->createHTMLElement(t->id);
+    return n;
 }
 
 #define MAX_REDUNDANT 20
index 0655fd3a0eea9c48f40c2dfb65bc4702e20c65fd..d392d200cbbac09f79adffb5693b316900c9aec4 100644 (file)
@@ -5,7 +5,7 @@
               (C) 1997 Torben Weis (weis@kde.org)
               (C) 1998 Waldo Bastian (bastian@kde.org)
               (C) 1999 Lars Knoll (knoll@kde.org)
-    Copyright (C) 2004 Apple Computer, Inc.
+    Copyright (C) 2003 Apple Computer, Inc.
 
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
 #include <qdatetime.h>
 #endif
 
+
 #include "dom/dom_string.h"
 #include "xml/dom_nodeimpl.h"
 #include "html/html_documentimpl.h"
-#include "misc/htmltags.h"
 
 class KHTMLView;
 class HTMLStackElem;
@@ -139,6 +139,8 @@ protected:
     static bool isHeaderTag(int _id);
     void popNestedHeaderTag();
 
+    ushort *forbiddenTag;
+    
     /*
      * currently active form
      */
@@ -182,11 +184,10 @@ protected:
 
     bool includesCommentsInDOM;
     
-    ushort forbiddenTag[ID_LAST_TAG + 1];
-    
 #if SPEED_DEBUG > 0
     QTime qt;
 #endif
 };
 
 #endif // HTMLPARSER_H
+
index 4229244e1883e857d1e404897f41ecf93183bacd..35f7e49585d02a7b73e2ff89ea83b6e7e030ae1a 100644 (file)
@@ -1031,21 +1031,23 @@ void HTMLTokenizer::parseTag(TokenizerString &src)
 
                 // Look up the tagID for the specified tag name (now that we've shaved off any
                 // invalid / that might have followed the name).
-                unsigned short tagID = getTagID(ptr, len);
+                uint tagID = getTagID(ptr, len);
                 if (!tagID) {
-                    DOMString tagName(ptr);
-                    DocumentImpl *doc = parser->docPtr()->document();
-                    if (doc->isValidName(tagName))
-                        tagID = parser->docPtr()->document()->tagId(0, tagName.implementation(), false);
+#ifdef TOKEN_DEBUG
+                    QCString tmp(ptr, len+1);
+                    kdDebug( 6036 ) << "Unknown tag: \"" << tmp.data() << "\"" << endl;
+#endif
+                    dest = buffer;
                 }
-                if (tagID) {
+                else
+                {
 #ifdef TOKEN_DEBUG
                     QCString tmp(ptr, len+1);
                     kdDebug( 6036 ) << "found tag id=" << tagID << ": " << tmp.data() << endl;
 #endif
                     currToken.id = beginTag ? tagID : tagID + ID_CLOSE_TAG;
+                    dest = buffer;
                 }
-                dest = buffer;
                 tag = SearchAttribute;
                 cBufferPos = 0;
             }
@@ -1324,9 +1326,9 @@ void HTMLTokenizer::parseTag(TokenizerString &src)
 #if defined(TOKEN_DEBUG) && TOKEN_DEBUG > 0
             kdDebug( 6036 ) << "appending Tag: " << tagID << endl;
 #endif
-            bool beginTag = !currToken.flat && (tagID <= ID_CLOSE_TAG);
+            bool beginTag = !currToken.flat && (tagID < ID_CLOSE_TAG);
 
-            if (tagID > ID_CLOSE_TAG)
+            if (tagID >= ID_CLOSE_TAG)
                 tagID -= ID_CLOSE_TAG;
             else if (tagID == ID_SCRIPT) {
                 AttributeImpl* a = 0;
@@ -1422,7 +1424,7 @@ void HTMLTokenizer::parseTag(TokenizerString &src)
                     script = true;
                     parseSpecial(src);
                 }
-                else if (tagID <= ID_CLOSE_TAG) // Handle <script src="foo"/>
+                else if (tagID < ID_CLOSE_TAG) // Handle <script src="foo"/>
                     scriptHandler();
                 break;
             case ID_STYLE:
index c2fc7f25955f0ebc6558f8ec49eef29f31f87ef1..ae3a5d52c7a3bbae69617f3cacc9feca691b9bd9 100644 (file)
@@ -2,7 +2,6 @@
     This file is part of the KDE libraries
 
     Copyright (C) 1999 Lars Knoll (knoll@mpi-hd.mpg.de)
-    Copyright (C) 2004 Apple Computer, Inc.
 
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
 #include "htmlattrs.c"
 #undef __inline
 
-unsigned short khtml::getTagID(const char *tagStr, int len)
+int khtml::getTagID(const char *tagStr, int len)
 {
     const struct tags *tagPtr = findTag(tagStr, len);
     if (!tagPtr)
         return 0;
+
     return tagPtr->id;
 }
 
-unsigned short khtml::getAttrID(const char *tagStr, int len)
+int khtml::getAttrID(const char *tagStr, int len)
 {
     const struct attrs *tagPtr = findAttr(tagStr, len);
     if (!tagPtr)
         return 0;
+
     return tagPtr->id;
 }
+
index 8a8c688435981b944314a5dd3c15b24dee4e7cd1..686d6d893aeac6f5b75a13294b0967c994f76c43 100644 (file)
@@ -1,35 +1,14 @@
-/*
-    This file is part of the KDE libraries
-
-    Copyright (C) 1999 Lars Knoll (knoll@mpi-hd.mpg.de)
-    Copyright (C) 2004 Apple Computer, Inc.
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-    Boston, MA 02111-1307, USA.
-*/
-
 #ifndef HTMLHASHES_H
 #define HTMLHASHES_H
 
-#include "htmltags.h"
+#include "xml/dom_stringimpl.h"
 #include "htmlattrs.h"
+#include "htmltags.h"
 
 namespace khtml
 {
-  unsigned short getTagID(const char *tagStr, int len);
-  unsigned short getAttrID(const char *tagStr, int len);
-}
+  int getTagID(const char *tagStr, int len);
+  int getAttrID(const char *tagStr, int len);
+};
 
 #endif
index ad5045bab7af26d5a62153444044414a46c2fd59..e7b6ff1bf7322789cd5c5944c7869546ff3dd9d0 100644 (file)
@@ -422,12 +422,10 @@ findTag (register const char *str, register unsigned int len)
 }
 #line 116 "htmltags.gperf"
 
-#line 426 "htmltags.c"
 
-using DOM::DOMString;
 
-static const char * const openTagNames[] = {
-    0,
+static const char * const tagList[] = {
+"",
     "A",
     "ABBR",
     "ACRONYM",
@@ -530,12 +528,8 @@ static const char * const openTagNames[] = {
     "VAR",
     "WBR",
     "XMP",
-    "TEXT",
-    "COMMENT"
-};
-
-static const char * const closeTagNames[] = {
-    0,
+"TEXT",
+"COMMENT",
     "/A",
     "/ABBR",
     "/ACRONYM",
@@ -638,17 +632,10 @@ static const char * const closeTagNames[] = {
     "/VAR",
     "/WBR",
     "/XMP",
+    0
 };
-
-DOMString getTagName(unsigned short id)
+DOM::DOMString getTagName(unsigned short id)
 {
-    if (id > ID_CLOSE_TAG) {
-        int index = id - ID_CLOSE_TAG;
-        if (index >= ID_TEXT)
-            return DOMString();
-        return closeTagNames[index];
-    }
-    if (id > ID_LAST_TAG)
-        return DOMString();
-    return openTagNames[id];
+    if(id > ID_CLOSE_TAG*2) id = ID_CLOSE_TAG+1;
+    return DOM::DOMString(tagList[id]);
 }
index e56bfdad8eadd282ca8fc2460953ec53dc0e3a4f..b79b6ed07e4acde5ebac8fd567f02246d4a59f77 100644 (file)
@@ -1,7 +1,6 @@
 /* This file is automatically generated from
 htmltags.in by maketags, do not edit */
 /* Copyright 1999 Lars Knoll */
-/* Copyright 2004 Apple Computer, Inc. */
 
 #ifndef KHTML_TAGS_H
 #define KHTML_TAGS_H
@@ -9,112 +8,111 @@ htmltags.in by maketags, do not edit */
 #include "dom/dom_string.h"
 
 DOM::DOMString getTagName(unsigned short id);
-
-const unsigned short ID_A = 1;
-const unsigned short ID_ABBR = 2;
-const unsigned short ID_ACRONYM = 3;
-const unsigned short ID_ADDRESS = 4;
-const unsigned short ID_APPLET = 5;
-const unsigned short ID_AREA = 6;
-const unsigned short ID_B = 7;
-const unsigned short ID_BASE = 8;
-const unsigned short ID_BASEFONT = 9;
-const unsigned short ID_BDO = 10;
-const unsigned short ID_BIG = 11;
-const unsigned short ID_BLOCKQUOTE = 12;
-const unsigned short ID_BODY = 13;
-const unsigned short ID_BR = 14;
-const unsigned short ID_BUTTON = 15;
-const unsigned short ID_CANVAS = 16;
-const unsigned short ID_CAPTION = 17;
-const unsigned short ID_CENTER = 18;
-const unsigned short ID_CITE = 19;
-const unsigned short ID_CODE = 20;
-const unsigned short ID_COL = 21;
-const unsigned short ID_COLGROUP = 22;
-const unsigned short ID_DD = 23;
-const unsigned short ID_DEL = 24;
-const unsigned short ID_DFN = 25;
-const unsigned short ID_DIR = 26;
-const unsigned short ID_DIV = 27;
-const unsigned short ID_DL = 28;
-const unsigned short ID_DT = 29;
-const unsigned short ID_EM = 30;
-const unsigned short ID_EMBED = 31;
-const unsigned short ID_FIELDSET = 32;
-const unsigned short ID_FONT = 33;
-const unsigned short ID_FORM = 34;
-const unsigned short ID_FRAME = 35;
-const unsigned short ID_FRAMESET = 36;
-const unsigned short ID_H1 = 37;
-const unsigned short ID_H2 = 38;
-const unsigned short ID_H3 = 39;
-const unsigned short ID_H4 = 40;
-const unsigned short ID_H5 = 41;
-const unsigned short ID_H6 = 42;
-const unsigned short ID_HEAD = 43;
-const unsigned short ID_HR = 44;
-const unsigned short ID_HTML = 45;
-const unsigned short ID_I = 46;
-const unsigned short ID_IFRAME = 47;
-const unsigned short ID_IMG = 48;
-const unsigned short ID_INPUT = 49;
-const unsigned short ID_INS = 50;
-const unsigned short ID_ISINDEX = 51;
-const unsigned short ID_KBD = 52;
-const unsigned short ID_KEYGEN = 53;
-const unsigned short ID_LABEL = 54;
-const unsigned short ID_LAYER = 55;
-const unsigned short ID_LEGEND = 56;
-const unsigned short ID_LI = 57;
-const unsigned short ID_LINK = 58;
-const unsigned short ID_MAP = 59;
-const unsigned short ID_MARQUEE = 60;
-const unsigned short ID_MENU = 61;
-const unsigned short ID_META = 62;
-const unsigned short ID_NOBR = 63;
-const unsigned short ID_NOEMBED = 64;
-const unsigned short ID_NOFRAMES = 65;
-const unsigned short ID_NOSCRIPT = 66;
-const unsigned short ID_NOLAYER = 67;
-const unsigned short ID_OBJECT = 68;
-const unsigned short ID_OL = 69;
-const unsigned short ID_OPTGROUP = 70;
-const unsigned short ID_OPTION = 71;
-const unsigned short ID_P = 72;
-const unsigned short ID_PARAM = 73;
-const unsigned short ID_PLAINTEXT = 74;
-const unsigned short ID_PRE = 75;
-const unsigned short ID_Q = 76;
-const unsigned short ID_S = 77;
-const unsigned short ID_SAMP = 78;
-const unsigned short ID_SCRIPT = 79;
-const unsigned short ID_SELECT = 80;
-const unsigned short ID_SMALL = 81;
-const unsigned short ID_SPAN = 82;
-const unsigned short ID_STRIKE = 83;
-const unsigned short ID_STRONG = 84;
-const unsigned short ID_STYLE = 85;
-const unsigned short ID_SUB = 86;
-const unsigned short ID_SUP = 87;
-const unsigned short ID_TABLE = 88;
-const unsigned short ID_TBODY = 89;
-const unsigned short ID_TD = 90;
-const unsigned short ID_TEXTAREA = 91;
-const unsigned short ID_TFOOT = 92;
-const unsigned short ID_TH = 93;
-const unsigned short ID_THEAD = 94;
-const unsigned short ID_TITLE = 95;
-const unsigned short ID_TR = 96;
-const unsigned short ID_TT = 97;
-const unsigned short ID_U = 98;
-const unsigned short ID_UL = 99;
-const unsigned short ID_VAR = 100;
-const unsigned short ID_WBR = 101;
-const unsigned short ID_XMP = 102;
-const unsigned short ID_TEXT = 103;
-const unsigned short ID_COMMENT = 104;
-const unsigned short ID_LAST_TAG = 104;
-const unsigned short ID_CLOSE_TAG = 32000;
+#define ID_A 1
+#define ID_ABBR 2
+#define ID_ACRONYM 3
+#define ID_ADDRESS 4
+#define ID_APPLET 5
+#define ID_AREA 6
+#define ID_B 7
+#define ID_BASE 8
+#define ID_BASEFONT 9
+#define ID_BDO 10
+#define ID_BIG 11
+#define ID_BLOCKQUOTE 12
+#define ID_BODY 13
+#define ID_BR 14
+#define ID_BUTTON 15
+#define ID_CANVAS 16
+#define ID_CAPTION 17
+#define ID_CENTER 18
+#define ID_CITE 19
+#define ID_CODE 20
+#define ID_COL 21
+#define ID_COLGROUP 22
+#define ID_DD 23
+#define ID_DEL 24
+#define ID_DFN 25
+#define ID_DIR 26
+#define ID_DIV 27
+#define ID_DL 28
+#define ID_DT 29
+#define ID_EM 30
+#define ID_EMBED 31
+#define ID_FIELDSET 32
+#define ID_FONT 33
+#define ID_FORM 34
+#define ID_FRAME 35
+#define ID_FRAMESET 36
+#define ID_H1 37
+#define ID_H2 38
+#define ID_H3 39
+#define ID_H4 40
+#define ID_H5 41
+#define ID_H6 42
+#define ID_HEAD 43
+#define ID_HR 44
+#define ID_HTML 45
+#define ID_I 46
+#define ID_IFRAME 47
+#define ID_IMG 48
+#define ID_INPUT 49
+#define ID_INS 50
+#define ID_ISINDEX 51
+#define ID_KBD 52
+#define ID_KEYGEN 53
+#define ID_LABEL 54
+#define ID_LAYER 55
+#define ID_LEGEND 56
+#define ID_LI 57
+#define ID_LINK 58
+#define ID_MAP 59
+#define ID_MARQUEE 60
+#define ID_MENU 61
+#define ID_META 62
+#define ID_NOBR 63
+#define ID_NOEMBED 64
+#define ID_NOFRAMES 65
+#define ID_NOSCRIPT 66
+#define ID_NOLAYER 67
+#define ID_OBJECT 68
+#define ID_OL 69
+#define ID_OPTGROUP 70
+#define ID_OPTION 71
+#define ID_P 72
+#define ID_PARAM 73
+#define ID_PLAINTEXT 74
+#define ID_PRE 75
+#define ID_Q 76
+#define ID_S 77
+#define ID_SAMP 78
+#define ID_SCRIPT 79
+#define ID_SELECT 80
+#define ID_SMALL 81
+#define ID_SPAN 82
+#define ID_STRIKE 83
+#define ID_STRONG 84
+#define ID_STYLE 85
+#define ID_SUB 86
+#define ID_SUP 87
+#define ID_TABLE 88
+#define ID_TBODY 89
+#define ID_TD 90
+#define ID_TEXTAREA 91
+#define ID_TFOOT 92
+#define ID_TH 93
+#define ID_THEAD 94
+#define ID_TITLE 95
+#define ID_TR 96
+#define ID_TT 97
+#define ID_U 98
+#define ID_UL 99
+#define ID_VAR 100
+#define ID_WBR 101
+#define ID_XMP 102
+#define ID_TEXT 103
+#define ID_COMMENT 104
+#define ID_CLOSE_TAG 104
+#define ID_LAST_TAG 104
 
 #endif
index 69c2397231a98031c300a5e1e44ac4e31c97bb6c..29fb5456fbc3903eb010a7fa1e222b6015fbee18 100644 (file)
@@ -3,7 +3,6 @@
 #
 #   Copyright (C) 1998 Waldo Bastian (bastian@kde.org)
 #                 1999 Lars Knoll (knoll@kde.org)
-#   Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
 #
 #   This library is free software; you can redistribute it and/or
 #   modify it under the terms of the GNU Library General Public
@@ -24,9 +23,6 @@
 #
 #  KDE HTML Widget -- Script to generate htmltags.c and htmltags.h
 #
-
-use strict;
-
 open IN, "htmltags.in"
   or die "Can't open in\n";
 open header, ">htmltags.h"
@@ -38,33 +34,31 @@ print out "%{\n/* This file is automatically generated from htmltags.in by maket
 print out "struct tags {\n    const char *name;\n    int id;\n};\n%%\n";
 
 print header "/* This file is automatically generated from
-htmltags.in by maketags, do not edit */\n/* Copyright 1999 Lars Knoll */\n/* Copyright 2004 Apple Computer, Inc. */\n\n#ifndef KHTML_TAGS_H\n#define KHTML_TAGS_H\n\n#include \"dom/dom_string.h\"\n\n";
+htmltags.in by maketags, do not edit */\n/* Copyright 1999 Lars Knoll */\n\n#ifndef KHTML_TAGS_H\n#define KHTML_TAGS_H\n\n#include \"dom/dom_string.h\"\n\n";
 
-print header "DOM::DOMString getTagName(unsigned short id);\n\n";
+print header "DOM::DOMString getTagName(unsigned short id);\n";
 
-my $num = 0;
-my $openTags = "";
-my $closeTags = "";
+$num = 0;
 while (<IN>) {
     chomp;
-    my $attr = $_;
-    $num += 1;
-    my $up = uc($attr);
-    $openTags .= "    \"$up\",\n";
-    $closeTags .= "    \"/$up\",\n";
+    $attr = $_;
+    $num = $num + 1;
+    $up = uc($attr);
+    push(@a, "    \"$up\",");
+    push(@b, "    \"/$up\",");
     $up =~ s/-/_/;
     print out $attr . ", ID_" . $up . "\n";
-    print header "const unsigned short ID_$up = $num;\n";
+    print header "#define ID_" . $up . " " . $num . "\n";
 }
 print out "anchor, ID_A\n";
 print out "image, ID_IMG\n";
 print out "listing, ID_PRE\n";
-$num += 1;
-print header "const unsigned short ID_TEXT = $num;\n";
-$num += 1;
-print header "const unsigned short ID_COMMENT = $num;\n";
-print header "const unsigned short ID_LAST_TAG = $num;\n";
-print header "const unsigned short ID_CLOSE_TAG = 32000;\n";
+$num = $num+1;
+print header "#define ID_TEXT $num\n";
+$num = $num+1;
+print header "#define ID_COMMENT $num\n";
+print header "#define ID_CLOSE_TAG $num\n";
+print header "#define ID_LAST_TAG $num\n";
 
 print out "%%\n";
 close out;
@@ -77,45 +71,21 @@ if ($result) {
   exit $result;
 }
 
-open IN, "htmltags.c" or die;
-
-my $numLines = 0;
-while (<IN>) {
-    $numLines++;
+open(OUT, ">>htmltags.c");
+print OUT "\n\nstatic const char * const tagList[] = {\n";
+print OUT "\"\",\n";
+while(defined ($line = shift @a))
+{
+    print OUT $line."\n";
 }
-$numLines += 2;
-
-chomp $openTags;
-chomp $closeTags;
-
-open OUT, ">>htmltags.c" or die;
-print OUT <<END
-#line $numLines "htmltags.c"
-
-using DOM::DOMString;
-
-static const char * const openTagNames[] = {
-    0,
-$openTags
-    "TEXT",
-    "COMMENT"
-};
-
-static const char * const closeTagNames[] = {
-    0,
-$closeTags
-};
-
-DOMString getTagName(unsigned short id)
+print OUT "\"TEXT\",\n";
+print OUT "\"COMMENT\",\n";
+while(defined ($line = shift @b))
 {
-    if (id > ID_CLOSE_TAG) {
-        int index = id - ID_CLOSE_TAG;
-        if (index >= ID_TEXT)
-            return DOMString();
-        return closeTagNames[index];
-    }
-    if (id > ID_LAST_TAG)
-        return DOMString();
-    return openTagNames[id];
+    print OUT $line."\n";
 }
-END
+print OUT "    0\n};\n";
+print OUT "DOM::DOMString getTagName(unsigned short id)\n{\n";
+print OUT "    if(id > ID_CLOSE_TAG*2) id = ID_CLOSE_TAG+1;\n";
+print OUT "    return DOM::DOMString(tagList[id]);\n";
+print OUT "}\n";
index c83c801481725add831a6f60d54e33d2792d4b2a..7f629e5996fa56c7fbe391cfc9866c63ba4719c6 100644 (file)
@@ -716,179 +716,235 @@ unsigned short DocumentImpl::nodeType() const
     return Node::DOCUMENT_NODE;
 }
 
+// FIXME: createHTMLElement looks like copied code of KHTMLParser::getElement or vice versa.
+// This has been the cause of bugs. They should share the same code.
 ElementImpl *DocumentImpl::createHTMLElement( const DOMString &name, int &exceptioncode )
 {
     if (!isValidName(name)) {
         exceptioncode = DOMException::INVALID_CHARACTER_ERR;
         return 0;
     }
-    return createHTMLElement(tagId(0, name.implementation(), false));
-}
 
-ElementImpl *DocumentImpl::createHTMLElement(unsigned short tagID)
-{
-    switch (tagID)
+    uint id = khtml::getTagID( name.string().lower().latin1(), name.string().length() );
+
+    ElementImpl *n = 0;
+    switch(id)
     {
     case ID_HTML:
-        return new HTMLHtmlElementImpl(docPtr());
+        n = new HTMLHtmlElementImpl(docPtr());
+        break;
     case ID_HEAD:
-        return new HTMLHeadElementImpl(docPtr());
+        n = new HTMLHeadElementImpl(docPtr());
+        break;
     case ID_BODY:
-        return new HTMLBodyElementImpl(docPtr());
+        n = new HTMLBodyElementImpl(docPtr());
+        break;
 
 // head elements
     case ID_BASE:
-        return new HTMLBaseElementImpl(docPtr());
+        n = new HTMLBaseElementImpl(docPtr());
+        break;
     case ID_LINK:
-        return new HTMLLinkElementImpl(docPtr());
+        n = new HTMLLinkElementImpl(docPtr());
+        break;
     case ID_META:
-        return new HTMLMetaElementImpl(docPtr());
+        n = new HTMLMetaElementImpl(docPtr());
+        break;
     case ID_STYLE:
-        return new HTMLStyleElementImpl(docPtr());
+        n = new HTMLStyleElementImpl(docPtr());
+        break;
     case ID_TITLE:
-        return new HTMLTitleElementImpl(docPtr());
+        n = new HTMLTitleElementImpl(docPtr());
+        break;
 
 // frames
     case ID_FRAME:
-        return new HTMLFrameElementImpl(docPtr());
+        n = new HTMLFrameElementImpl(docPtr());
+        break;
     case ID_FRAMESET:
-        return new HTMLFrameSetElementImpl(docPtr());
+        n = new HTMLFrameSetElementImpl(docPtr());
+        break;
     case ID_IFRAME:
-        return new HTMLIFrameElementImpl(docPtr());
+        n = new HTMLIFrameElementImpl(docPtr());
+        break;
 
 // form elements
 // ### FIXME: we need a way to set form dependency after we have made the form elements
     case ID_FORM:
-        return new HTMLFormElementImpl(docPtr());
+            n = new HTMLFormElementImpl(docPtr());
+        break;
     case ID_BUTTON:
-        return new HTMLButtonElementImpl(docPtr());
+            n = new HTMLButtonElementImpl(docPtr());
+        break;
     case ID_FIELDSET:
-        return new HTMLFieldSetElementImpl(docPtr());
+            n = new HTMLFieldSetElementImpl(docPtr());
+        break;
     case ID_INPUT:
-        return new HTMLInputElementImpl(docPtr());
+            n = new HTMLInputElementImpl(docPtr());
+        break;
     case ID_ISINDEX:
-        return new HTMLIsIndexElementImpl(docPtr());
+            n = new HTMLIsIndexElementImpl(docPtr());
+        break;
     case ID_LABEL:
-        return new HTMLLabelElementImpl(docPtr());
+            n = new HTMLLabelElementImpl(docPtr());
+        break;
     case ID_LEGEND:
-        return new HTMLLegendElementImpl(docPtr());
+            n = new HTMLLegendElementImpl(docPtr());
+        break;
     case ID_OPTGROUP:
-        return new HTMLOptGroupElementImpl(docPtr());
+            n = new HTMLOptGroupElementImpl(docPtr());
+        break;
     case ID_OPTION:
-        return new HTMLOptionElementImpl(docPtr());
+            n = new HTMLOptionElementImpl(docPtr());
+        break;
     case ID_SELECT:
-        return new HTMLSelectElementImpl(docPtr());
+            n = new HTMLSelectElementImpl(docPtr());
+        break;
     case ID_TEXTAREA:
-        return new HTMLTextAreaElementImpl(docPtr());
+            n = new HTMLTextAreaElementImpl(docPtr());
+        break;
 
 // lists
     case ID_DL:
-        return new HTMLDListElementImpl(docPtr());
+        n = new HTMLDListElementImpl(docPtr());
+        break;
     case ID_DD:
-        return new HTMLGenericElementImpl(docPtr(), tagID);
+        n = new HTMLGenericElementImpl(docPtr(), id);
+        break;
     case ID_DT:
-        return new HTMLGenericElementImpl(docPtr(), tagID);
+        n = new HTMLGenericElementImpl(docPtr(), id);
+        break;
     case ID_UL:
-        return new HTMLUListElementImpl(docPtr());
+        n = new HTMLUListElementImpl(docPtr());
+        break;
     case ID_OL:
-        return new HTMLOListElementImpl(docPtr());
+        n = new HTMLOListElementImpl(docPtr());
+        break;
     case ID_DIR:
-        return new HTMLDirectoryElementImpl(docPtr());
+        n = new HTMLDirectoryElementImpl(docPtr());
+        break;
     case ID_MENU:
-        return new HTMLMenuElementImpl(docPtr());
+        n = new HTMLMenuElementImpl(docPtr());
+        break;
     case ID_LI:
-        return new HTMLLIElementImpl(docPtr());
+        n = new HTMLLIElementImpl(docPtr());
+        break;
 
 // formatting elements (block)
     case ID_BLOCKQUOTE:
-        return new HTMLBlockquoteElementImpl(docPtr());
+        n = new HTMLBlockquoteElementImpl(docPtr());
+        break;
     case ID_DIV:
-        return new HTMLDivElementImpl(docPtr());
+        n = new HTMLDivElementImpl(docPtr());
+        break;
     case ID_H1:
     case ID_H2:
     case ID_H3:
     case ID_H4:
     case ID_H5:
     case ID_H6:
-        return new HTMLHeadingElementImpl(docPtr(), tagID);
+        n = new HTMLHeadingElementImpl(docPtr(), id);
+        break;
     case ID_HR:
-        return new HTMLHRElementImpl(docPtr());
+        n = new HTMLHRElementImpl(docPtr());
+        break;
     case ID_P:
-        return new HTMLParagraphElementImpl(docPtr());
+        n = new HTMLParagraphElementImpl(docPtr());
+        break;
     case ID_PRE:
-    case ID_XMP:
-    case ID_PLAINTEXT:
-        return new HTMLPreElementImpl(docPtr(), tagID);
-    case ID_LAYER:
-        return new HTMLLayerElementImpl(docPtr());
+        n = new HTMLPreElementImpl(docPtr(), id);
+        break;
 
 // font stuff
     case ID_BASEFONT:
-        return new HTMLBaseFontElementImpl(docPtr());
+        n = new HTMLBaseFontElementImpl(docPtr());
+        break;
     case ID_FONT:
-        return new HTMLFontElementImpl(docPtr());
+        n = new HTMLFontElementImpl(docPtr());
+        break;
 
 // ins/del
     case ID_DEL:
     case ID_INS:
-        return new HTMLGenericElementImpl(docPtr(), tagID);
+        n = new HTMLGenericElementImpl(docPtr(), id);
+        break;
 
 // anchor
     case ID_A:
-        return new HTMLAnchorElementImpl(docPtr());
+        n = new HTMLAnchorElementImpl(docPtr());
+        break;
 
 // images
     case ID_IMG:
-        return new HTMLImageElementImpl(docPtr());
+        n = new HTMLImageElementImpl(docPtr());
+        break;
     case ID_MAP:
-        return new HTMLMapElementImpl(docPtr());
+        n = new HTMLMapElementImpl(docPtr());
+        /*n = map;*/
+        break;
     case ID_AREA:
-        return new HTMLAreaElementImpl(docPtr());
+        n = new HTMLAreaElementImpl(docPtr());
+        break;
     case ID_CANVAS:
-        return new HTMLCanvasElementImpl(docPtr());
+        n = new HTMLCanvasElementImpl(docPtr());
+        break;
 
 // objects, applets and scripts
     case ID_APPLET:
-        return new HTMLAppletElementImpl(docPtr());
+        n = new HTMLAppletElementImpl(docPtr());
+        break;
     case ID_EMBED:
-        return new HTMLEmbedElementImpl(docPtr());
+        n = new HTMLEmbedElementImpl(docPtr());
+        break;
     case ID_OBJECT:
-        return new HTMLObjectElementImpl(docPtr());
+        n = new HTMLObjectElementImpl(docPtr());
+        break;
     case ID_PARAM:
-        return new HTMLParamElementImpl(docPtr());
+        n = new HTMLParamElementImpl(docPtr());
+        break;
     case ID_SCRIPT:
-        return new HTMLScriptElementImpl(docPtr());
+        n = new HTMLScriptElementImpl(docPtr());
+        break;
 
 // tables
     case ID_TABLE:
-        return new HTMLTableElementImpl(docPtr());
+        n = new HTMLTableElementImpl(docPtr());
+        break;
     case ID_CAPTION:
-        return new HTMLTableCaptionElementImpl(docPtr());
+        n = new HTMLTableCaptionElementImpl(docPtr());
+        break;
     case ID_COLGROUP:
     case ID_COL:
-        return new HTMLTableColElementImpl(docPtr(), tagID);
+        n = new HTMLTableColElementImpl(docPtr(), id);
+        break;
     case ID_TR:
-        return new HTMLTableRowElementImpl(docPtr());
+        n = new HTMLTableRowElementImpl(docPtr());
+        break;
     case ID_TD:
     case ID_TH:
-        return new HTMLTableCellElementImpl(docPtr(), tagID);
+        n = new HTMLTableCellElementImpl(docPtr(), id);
+        break;
     case ID_THEAD:
     case ID_TBODY:
     case ID_TFOOT:
-        return new HTMLTableSectionElementImpl(docPtr(), tagID, false);
+        n = new HTMLTableSectionElementImpl(docPtr(), id, false);
+        break;
 
 // inline elements
     case ID_BR:
-        return new HTMLBRElementImpl(docPtr());
+        n = new HTMLBRElementImpl(docPtr());
+        break;
     case ID_Q:
-        return new HTMLGenericElementImpl(docPtr(), tagID);
+        n = new HTMLGenericElementImpl(docPtr(), id);
+        break;
 
 // elements with no special representation in the DOM
 
 // block:
     case ID_ADDRESS:
     case ID_CENTER:
-
+        n = new HTMLGenericElementImpl(docPtr(), id);
+        break;
 // inline
         // %fontstyle
     case ID_TT:
@@ -918,21 +974,25 @@ ElementImpl *DocumentImpl::createHTMLElement(unsigned short tagID)
     case ID_SPAN:
     case ID_NOBR:
     case ID_WBR:
-
-    case ID_BDO:
-    default:
-        return new HTMLGenericElementImpl(docPtr(), tagID);
+        n = new HTMLGenericElementImpl(docPtr(), id);
+        break;
 
     case ID_MARQUEE:
-        return new HTMLMarqueeElementImpl(docPtr());
+        n = new HTMLMarqueeElementImpl(docPtr());
+        break;
         
+    case ID_BDO: // FIXME: make an element here. "bdo" with dir adds the CSS direction and unicode-bidi with override.
+        break;
+
 // text
     case ID_TEXT:
         kdDebug( 6020 ) << "Use document->createTextNode()" << endl;
-        return 0;
-    }
+        break;
 
-    return 0;
+    default:
+        break;
+    }
+    return n;
 }
 
 QString DocumentImpl::nextState()
@@ -1911,6 +1971,7 @@ bool DocumentImpl::childTypeAllowed( unsigned short type )
         case Node::COMMENT_NODE:
         case Node::DOCUMENT_TYPE_NODE:
             return true;
+            break;
         default:
             return false;
     }
@@ -1936,10 +1997,10 @@ NodeImpl::Id DocumentImpl::attrId(DOMStringImpl* _namespaceURI, DOMStringImpl *_
     if (!_namespaceURI || !strcasecmp(_namespaceURI, XHTML_NAMESPACE)) {
         // we're in HTML namespace if we know the tag.
         // xhtml is lower case - case sensitive, easy to implement
-        if ( htmlMode() == XHtml && (id = getAttrID(n.string().ascii(), _name->l)) )
+        if ( htmlMode() == XHtml && (id = khtml::getAttrID(n.string().ascii(), _name->l)) )
             return id;
         // compatibility: upper case - case insensitive
-        if ( htmlMode() != XHtml && (id = getAttrID(n.string().lower().ascii(), _name->l )) )
+        if ( htmlMode() != XHtml && (id = khtml::getAttrID(n.string().lower().ascii(), _name->l )) )
             return id;
 
         // ok, the fast path didn't work out, we need the full check
@@ -2016,10 +2077,10 @@ NodeImpl::Id DocumentImpl::tagId(DOMStringImpl* _namespaceURI, DOMStringImpl *_n
     if (!_namespaceURI || !strcasecmp(_namespaceURI, XHTML_NAMESPACE)) {
         // we're in HTML namespace if we know the tag.
         // xhtml is lower case - case sensitive, easy to implement
-        if ( htmlMode() == XHtml && (id = getTagID(n.string().ascii(), _name->l)) )
+        if ( htmlMode() == XHtml && (id = khtml::getTagID(n.string().ascii(), _name->l)) )
             return id;
         // compatibility: upper case - case insensitive
-        if ( htmlMode() != XHtml && (id = getTagID(n.string().lower().ascii(), _name->l )) )
+        if ( htmlMode() != XHtml && (id = khtml::getTagID(n.string().lower().ascii(), _name->l )) )
             return id;
 
         // ok, the fast path didn't work out, we need the full check
@@ -3169,6 +3230,7 @@ bool DocumentFragmentImpl::childTypeAllowed( unsigned short type )
         case Node::CDATA_SECTION_NODE:
         case Node::ENTITY_REFERENCE_NODE:
             return true;
+            break;
         default:
             return false;
     }
index 021ef3397df4d6661ddf24239716e39eb43a545a..2df10b615dbbf1f8c70feb91a35c253d61149dd9 100644 (file)
@@ -211,8 +211,7 @@ public:
     virtual bool isDocumentNode() const { return true; }
     virtual bool isHTMLDocument() const { return false; }
 
-    ElementImpl *createHTMLElement(const DOMString &tagName, int &exceptioncode);
-    ElementImpl *createHTMLElement(unsigned short tagID);
+    virtual ElementImpl *createHTMLElement ( const DOMString &tagName, int &exceptioncode );
 
     khtml::CSSStyleSelector *styleSelector() { return m_styleSelector; }
 
index 270836bbedfebee852d4a6b709163e7adaa532e8..5336048d8b1140166435c4658b827ba7b8d157af 100644 (file)
@@ -1381,9 +1381,9 @@ void NodeImpl::displayNode(const char *prefix)
     if (!prefix)
         prefix = "";
     if (isTextNode())
-        fprintf(stderr, "%s%s\t%p %s\n", prefix, nodeName().string().latin1(), this, nodeValue().string().latin1());
+        fprintf(stderr, "%s%s\t%p %s\n", prefix, getTagName(id()).string().latin1(), this, nodeValue().ascii());
     else
-        fprintf(stderr, "%s%s\t%p\n", prefix, nodeName().string().latin1(), this);
+        fprintf(stderr, "%s%s\t%p\n", prefix, getTagName(id()).string().latin1(), this);
 }
 
 void NodeImpl::displayTree()
index 681be7acc82daa358e9e605dc6f0a860e1c3234a..e062ba1cfc286134f3e24a5b7f185a58b72e1259 100644 (file)
@@ -779,7 +779,7 @@ void Position::debugPosition(const char *msg) const
     if (isNull())
         fprintf(stderr, "Position [%s]: null\n", msg);
     else
-        fprintf(stderr, "Position [%s]: %s [%p] at %d\n", msg, node()->nodeName().string().latin1(), node(), offset());
+        fprintf(stderr, "Position [%s]: %s [%p] at %d\n", msg, getTagName(node()->id()).string().latin1(), node(), offset());
 }
 
 #ifndef NDEBUG
index f1e19679a7bed941c67016acf23aed8b93d03bc9..02cb0b0a71854eaf54be074ed6554be3b50f96f7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -111,15 +111,6 @@ static void printBorderStyle(QTextStream &ts, const RenderObject &o, const EBord
     ts << " ";
 }
 
-static QString getTagName(NodeImpl *n)
-{
-    if (n->isDocumentNode())
-        return "";
-    if (n->id() <= ID_LAST_TAG)
-        return getTagName(n->id()).string();
-    return n->nodeName().string();
-}
-
 static QTextStream &operator<<(QTextStream &ts, const RenderObject &o)
 {
     ts << o.renderName();
@@ -129,7 +120,7 @@ static QTextStream &operator<<(QTextStream &ts, const RenderObject &o)
     }
     
     if (o.element()) {
-        QString tagName = getTagName(o.element());
+        QString tagName(getTagName(o.element()->id()).string());
         if (!tagName.isEmpty()) {
             ts << " {" << tagName << "}";
         }
@@ -366,7 +357,7 @@ static QString nodePositionRelativeToRoot(NodeImpl *node, NodeImpl *root)
     while (1) {
         NodeImpl *p = n->parentNode();
         if (!p || n == root) {
-            result += " of root {" + getTagName(n) + "}";
+            result += " of root {" + getTagName(n->id()).string() + "}";
             break;
         }
         if (n != node)
@@ -374,7 +365,7 @@ static QString nodePositionRelativeToRoot(NodeImpl *node, NodeImpl *root)
         int count = 1;
         for (NodeImpl *search = p->firstChild(); search != n; search = search->nextSibling())
             count++;
-        result +=  "child " + QString::number(count) + " {" + getTagName(n) + "}";
+        result +=  "child " + QString::number(count) + " {" + getTagName(n->id()).string() + "}";
         n = p;
     }
     
@@ -401,8 +392,8 @@ static void writeSelection(QTextStream &ts, const RenderObject *o)
     Position startPosition = selection.start();
     Position endPosition = selection.end();
 
-    QString startNodeTagName(getTagName(startPosition.node()));
-    QString endNodeTagName(getTagName(endPosition.node()));
+    QString startNodeTagName(getTagName(startPosition.node()->id()).string());
+    QString endNodeTagName(getTagName(endPosition.node()->id()).string());
     
     NodeImpl *rootNode = doc->getElementById("root");