Changeset 61823 in webkit


Ignore:
Timestamp:
Jun 24, 2010 10:33:35 PM (14 years ago)
Author:
abarth@webkit.org
Message:

2010-06-24 Adam Barth <abarth@webkit.org>

Reviewed by Eric Seidel.

Sketch out InHeadMode for tree builder
https://bugs.webkit.org/show_bug.cgi?id=41184

This state is relatively straightforward. We introduce the stack of
open elements to track that notion in the spec. The old tree builder
has a nice data structure for that, which we'll probably steal, but I'd
like to see what the full API is first.

  • html/HTMLTreeBuilder.cpp: (WebCore::HTMLTreeBuilder::processToken): (WebCore::HTMLTreeBuilder::insertCharacter): (WebCore::HTMLTreeBuilder::insertGenericRCDATAElement): (WebCore::HTMLTreeBuilder::insertGenericRawTextElement): (WebCore::HTMLTreeBuilder::insertScriptElement):
  • html/HTMLTreeBuilder.h: (WebCore::HTMLTreeBuilder::ElementStack::pop): (WebCore::HTMLTreeBuilder::ElementStack::top):
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r61822 r61823  
     12010-06-24  Adam Barth  <abarth@webkit.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Sketch out InHeadMode for tree builder
     6        https://bugs.webkit.org/show_bug.cgi?id=41184
     7
     8        This state is relatively straightforward.  We introduce the stack of
     9        open elements to track that notion in the spec.  The old tree builder
     10        has a nice data structure for that, which we'll probably steal, but I'd
     11        like to see what the full API is first.
     12
     13        * html/HTMLTreeBuilder.cpp:
     14        (WebCore::HTMLTreeBuilder::processToken):
     15        (WebCore::HTMLTreeBuilder::insertCharacter):
     16        (WebCore::HTMLTreeBuilder::insertGenericRCDATAElement):
     17        (WebCore::HTMLTreeBuilder::insertGenericRawTextElement):
     18        (WebCore::HTMLTreeBuilder::insertScriptElement):
     19        * html/HTMLTreeBuilder.h:
     20        (WebCore::HTMLTreeBuilder::ElementStack::pop):
     21        (WebCore::HTMLTreeBuilder::ElementStack::top):
     22
    1232010-06-24  Adam Barth  <abarth@webkit.org>
    224
  • trunk/WebCore/html/HTMLTreeBuilder.cpp

    r61822 r61823  
    338338        goto reprocessToken;
    339339    }
    340     case InHeadMode:
     340    case InHeadMode: {
     341        switch (token.type()) {
     342        case HTMLToken::Uninitialized:
     343            ASSERT_NOT_REACHED();
     344            break;
     345        case HTMLToken::Character:
     346            insertCharacter(cc);
     347            break;
     348        case HTMLToken::Comment:
     349            return insertComment(token);
     350        case HTMLToken::DOCTYPE:
     351            parseError(token);
     352            return 0;
     353        case HTMLToken::StartTag:
     354            if (token.name() == htmlTag) {
     355                notImplemented();
     356                return 0;
     357            }
     358            // FIXME: Atomize "command".
     359            if (token.name() == baseTag || token.name() == "command" || token.name() == linkTag) {
     360                PassRefPtr<Node> node = insertElement(token);
     361                m_openElements.pop();
     362                notImplemented();
     363                return node;
     364            }
     365            if (token.name() == metaTag) {
     366                PassRefPtr<Node> node = insertElement(token);
     367                m_openElements.pop();
     368                notImplemented();
     369                return node;
     370            }
     371            if (token.name() == titleTag)
     372                return insertGenericRCDATAElement(token);
     373            if (token.name() == noscriptTag) {
     374                if (isScriptingFlagEnabled(m_document->frame()))
     375                    return insertGenericRawTextElement(token);
     376                PassRefPtr<Node> node = insertElement(token);
     377                setInsertionMode(InHeadNoscriptMode);
     378                return node;
     379            }
     380            if (token.name() == noframesTag || token.name() == styleTag)
     381                return insertGenericRawTextElement(token);
     382            if (token.name() == scriptTag)
     383                return insertScriptElement(token);
     384            if (token.name() == headTag) {
     385                notImplemented();
     386                return 0;
     387            }
     388            break;
     389        case HTMLToken::EndTag:
     390            if (token.name() == headTag) {
     391                ASSERT(m_openElements.top()->tagQName() == headTag);
     392                m_openElements.pop();
     393                setInsertionMode(AfterHeadMode);
     394                return 0;
     395            }
     396            if (token.name() == bodyTag || token.name() == htmlTag || token.name() == brTag)
     397                break;
     398            parseError(token);
     399            return 0;
     400            break;
     401        case HTMLToken::EndOfFile:
     402            break;
     403        }
     404        AtomicHTMLToken fakeHead(HTMLToken::EndTag, headTag.localName());
     405        processToken(fakeHead);
     406        goto reprocessToken;
     407    }
    341408    case InHeadNoscriptMode:
    342409    case AfterHeadMode:
     
    383450}
    384451
     452void HTMLTreeBuilder::insertCharacter(UChar cc)
     453{
     454    ASSERT_UNUSED(cc, cc);
     455}
     456
     457PassRefPtr<Node> HTMLTreeBuilder::insertGenericRCDATAElement(AtomicHTMLToken& token)
     458{
     459    ASSERT_UNUSED(token, token.type() == HTMLToken::StartTag);
     460    return 0;
     461}
     462
     463PassRefPtr<Node> HTMLTreeBuilder::insertGenericRawTextElement(AtomicHTMLToken& token)
     464{
     465    ASSERT_UNUSED(token, token.type() == HTMLToken::StartTag);
     466    return 0;
     467}
     468
     469PassRefPtr<Node> HTMLTreeBuilder::insertScriptElement(AtomicHTMLToken& token)
     470{
     471    ASSERT_UNUSED(token, token.type() == HTMLToken::StartTag);
     472    return 0;
     473}
     474
    385475void HTMLTreeBuilder::finished()
    386476{
  • trunk/WebCore/html/HTMLTreeBuilder.h

    r61822 r61823  
    100100    };
    101101
     102    class ElementStack : public Noncopyable {
     103    public:
     104        void pop() { }
     105        Element* top() const { return 0; }
     106    };
     107
    102108    PassRefPtr<Node> passTokenToLegacyParser(HTMLToken&);
    103109    PassRefPtr<Node> processToken(AtomicHTMLToken&, UChar cc = 0);
     
    106112    PassRefPtr<Node> insertComment(AtomicHTMLToken&);
    107113    PassRefPtr<Node> insertElement(AtomicHTMLToken&);
     114    void insertCharacter(UChar cc);
     115    PassRefPtr<Node> insertGenericRCDATAElement(AtomicHTMLToken&);
     116    PassRefPtr<Node> insertGenericRawTextElement(AtomicHTMLToken&);
     117    PassRefPtr<Node> insertScriptElement(AtomicHTMLToken&);
    108118
    109119    RefPtr<Node> m_headElement;
     120    ElementStack m_openElements;
    110121
    111122    // FIXME: Implement error reporting.
Note: See TracChangeset for help on using the changeset viewer.