Changeset 61793 in webkit


Ignore:
Timestamp:
Jun 24, 2010 3:39:59 PM (14 years ago)
Author:
abarth@webkit.org
Message:

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

Reviewed by Eric Seidel.

Sketch out BeforeHTMLMode state
https://bugs.webkit.org/show_bug.cgi?id=41133

In this patch, we switch the TreeBuidler over to using AtomicHTMLTokens
and sketch out another state. These states don't actually do anything
yet, I'm still just getting the structure of the spec into the code so
we can implement the details incrementally.

  • html/HTMLTreeBuilder.cpp: (WebCore::HTMLTreeBuilder::constructTreeFromToken): (WebCore::HTMLTreeBuilder::processToken): (WebCore::HTMLTreeBuilder::insertDoctype): (WebCore::HTMLTreeBuilder::insertComment):
  • html/HTMLTreeBuilder.h: (WebCore::HTMLTreeBuilder::parseError):
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r61791 r61793  
     12010-06-24  Adam Barth  <abarth@webkit.org>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Sketch out BeforeHTMLMode state
     6        https://bugs.webkit.org/show_bug.cgi?id=41133
     7
     8        In this patch, we switch the TreeBuidler over to using AtomicHTMLTokens
     9        and sketch out another state.  These states don't actually do anything
     10        yet, I'm still just getting the structure of the spec into the code so
     11        we can implement the details incrementally.
     12
     13        * html/HTMLTreeBuilder.cpp:
     14        (WebCore::HTMLTreeBuilder::constructTreeFromToken):
     15        (WebCore::HTMLTreeBuilder::processToken):
     16        (WebCore::HTMLTreeBuilder::insertDoctype):
     17        (WebCore::HTMLTreeBuilder::insertComment):
     18        * html/HTMLTreeBuilder.h:
     19        (WebCore::HTMLTreeBuilder::parseError):
     20
    1212010-06-24  Adam Barth  <abarth@webkit.org>
    222
  • trunk/WebCore/html/HTMLTreeBuilder.cpp

    r61791 r61793  
    207207}
    208208
    209 PassRefPtr<Node> HTMLTreeBuilder::constructTreeFromToken(HTMLToken& token)
     209PassRefPtr<Node> HTMLTreeBuilder::constructTreeFromToken(HTMLToken& rawToken)
    210210{
    211211    // Make MSVC ignore our unreachable code for now.
    212212    if (true)
    213         return passTokenToLegacyParser(token);
     213        return passTokenToLegacyParser(rawToken);
     214
     215    AtomicHTMLToken token(rawToken);
    214216
    215217    // HTML5 expects the tokenizer to call the parser every time a character is
     
    218220    // the spec in only handling one character at a time.
    219221    if (token.type() == HTMLToken::Character) {
    220         HTMLToken::DataVector characters = token.characters();
    221         HTMLToken::DataVector::const_iterator itr = characters.begin();
    222         for (;itr; ++itr)
    223             processToken(token, *itr);
     222        StringImpl* characters = token.characters().impl();
     223        // FIXME: Calling processToken for each character is probably slow.
     224        for (unsigned i = 0; i < characters->length(); ++i)
     225            processToken(token, (*characters)[i]);
    224226        return 0; // FIXME: Should we be returning the Text node?
    225227    }
     
    227229}
    228230
    229 PassRefPtr<Node> HTMLTreeBuilder::processToken(HTMLToken& token, UChar cc)
     231PassRefPtr<Node> HTMLTreeBuilder::processToken(AtomicHTMLToken& token, UChar cc)
    230232{
    231233reprocessToken:
     
    243245            if (cc == '\t' || cc == '\x0A' || cc == '\x0C' || cc == '\x0D' || cc == ' ')
    244246                return 0;
    245             // Fall through
     247            break;
    246248        case HTMLToken::StartTag:
    247249        case HTMLToken::EndTag:
    248250        case HTMLToken::EndOfFile:
    249             notImplemented();
    250             setInsertionMode(BeforeHTMLMode);
    251             goto reprocessToken;
     251            break;
    252252        }
    253         ASSERT_NOT_REACHED();
    254         break;
    255     }
    256     case BeforeHTMLMode:
     253        notImplemented();
     254        parseError(token);
     255        setInsertionMode(BeforeHTMLMode);
     256        goto reprocessToken;
     257    }
     258    case BeforeHTMLMode: {
     259        switch (token.type()) {
     260        case HTMLToken::Uninitialized:
     261            ASSERT_NOT_REACHED();
     262            break;
     263        case HTMLToken::DOCTYPE:
     264            parseError(token);
     265            return 0;
     266        case HTMLToken::Comment:
     267            return insertComment(token);
     268        case HTMLToken::Character:
     269            if (cc == '\t' || cc == '\x0A' || cc == '\x0C' || cc == '\x0D' || cc == ' ')
     270                return 0;
     271            break;
     272        case HTMLToken::StartTag:
     273            if (token.name() == htmlTag) {
     274                notImplemented();
     275                setInsertionMode(BeforeHeadMode);
     276                return 0;
     277            }
     278            break;
     279        case HTMLToken::EndTag:
     280            if (token.name() == headTag || token.name() == bodyTag || token.name() == htmlTag || token.name() == brTag)
     281                break;
     282            parseError(token);
     283            return 0;
     284        case HTMLToken::EndOfFile:
     285            break;
     286        }
     287        notImplemented();
     288        setInsertionMode(BeforeHeadMode);
     289        goto reprocessToken;
     290    }
    257291    case BeforeHeadMode:
    258292    case InHeadMode:
     
    283317}
    284318
    285 PassRefPtr<Node> HTMLTreeBuilder::insertDoctype(HTMLToken& token)
     319PassRefPtr<Node> HTMLTreeBuilder::insertDoctype(AtomicHTMLToken& token)
    286320{
    287321    ASSERT_UNUSED(token, token.type() == HTMLToken::DOCTYPE);
     
    289323}
    290324
    291 PassRefPtr<Node> HTMLTreeBuilder::insertComment(HTMLToken& token)
     325PassRefPtr<Node> HTMLTreeBuilder::insertComment(AtomicHTMLToken& token)
    292326{
    293327    ASSERT_UNUSED(token, token.type() == HTMLToken::Comment);
  • trunk/WebCore/html/HTMLTreeBuilder.h

    r61742 r61793  
    3737namespace WebCore {
    3838
     39class AtomicHTMLToken;
    3940class Document;
    4041class DocumentFragment;
     
    100101
    101102    PassRefPtr<Node> passTokenToLegacyParser(HTMLToken&);
    102     PassRefPtr<Node> processToken(HTMLToken&, UChar cc = 0);
     103    PassRefPtr<Node> processToken(AtomicHTMLToken&, UChar cc = 0);
    103104
    104     PassRefPtr<Node> insertDoctype(HTMLToken&);
    105     PassRefPtr<Node> insertComment(HTMLToken&);
     105    PassRefPtr<Node> insertDoctype(AtomicHTMLToken&);
     106    PassRefPtr<Node> insertComment(AtomicHTMLToken&);
     107
     108    // FIXME: Implement error reporting.
     109    void parseError(AtomicHTMLToken&) { }
    106110
    107111    void handleScriptStartTag();
Note: See TracChangeset for help on using the changeset viewer.