Changeset 62168 in webkit


Ignore:
Timestamp:
Jun 30, 2010 1:28:31 AM (14 years ago)
Author:
eric@webkit.org
Message:

2010-06-29 Eric Seidel <eric@webkit.org>

Reviewed by Adam Barth.

HTMLTokenizer needs EndOfFile support
https://bugs.webkit.org/show_bug.cgi?id=41344

We now pass an additional 60 subtests for the
html5lib test suite. Boo-ya.

  • html5lib/runner-expected.txt:

2010-06-29 Eric Seidel <eric@webkit.org>

Reviewed by Adam Barth.

HTMLTokenizer needs EndOfFile support
https://bugs.webkit.org/show_bug.cgi?id=41344

We're using \0 as the EndOfFile marker as HTML5 replaces
all other \0 with \0xFFFD. Added some special case logic
to InputStreamPreprocessor::peek not to replace \0 when
its being used at the end of a stream.

This fixed 60 subtests in html5lib/runner.html.

There are still at least two states (BogusCommentState and
CDATASectionState) which do not have proper EOF support.

  • html/HTMLDocumentParser.cpp: (WebCore::HTMLDocumentParser::finish): (WebCore::HTMLDocumentParser::finishWasCalled):
  • html/HTMLInputStream.h: (WebCore::HTMLInputStream::markEndOfFile): (WebCore::HTMLInputStream::haveSeenEndOfFile):
  • html/HTMLToken.h: (WebCore::HTMLToken::makeEndOfFile):
  • html/HTMLTokenizer.cpp: (WebCore::HTMLTokenizer::nextToken): (WebCore::HTMLTokenizer::emitEndOfFile):
  • html/HTMLTokenizer.h: (WebCore::HTMLTokenizer::InputStreamPreprocessor::peek): (WebCore::HTMLTokenizer::InputStreamPreprocessor::shouldTreatNullAsEndOfFileMarker):
  • html/HTMLTreeBuilder.cpp: (WebCore::HTMLTreeBuilder::passTokenToLegacyParser):
Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r62166 r62168  
     12010-06-29  Eric Seidel  <eric@webkit.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        HTMLTokenizer needs EndOfFile support
     6        https://bugs.webkit.org/show_bug.cgi?id=41344
     7
     8        We now pass an additional 60 subtests for the
     9        html5lib test suite.  Boo-ya.
     10
     11        * html5lib/runner-expected.txt:
     12
    1132010-06-28  Eric Seidel  <eric@webkit.org>
    214
  • trunk/LayoutTests/html5lib/runner-expected-html5.txt

    r62166 r62168  
    191933
    202034
    21 35
    22 37
    232141
    242250
     
    75738
    76749
    77 10
    78 11
    79 13
    80 17
    81 18
    82 19
    83 20
    84 21
    85 22
     7511
     7613
    867724
    877825
     
    898027
    908128
    91 29
    928232
    93 33
    948334
    958435
     
    978637
    988738
    99 40
    1008842
    1018946
     
    1069453
    1079554
    108 57
    1099658
    11097
     
    137124resources/tests6.dat:
    1381251
    139 6
    1401268
    1411279
     
    290276
    291277resources/tests16.dat:
    292 3
    293 4
    294 5
    295 6
    296 7
    297 8
    298 9
    299 10
    300 12
    301 13
    302 14
    303 15
    304 16
    305 17
    306 25
    307 27
    308 28
    309 42
    310 44
    311 45
    312 56
    313 57
    314 58
    315 97
    316 98
    317 99
    318 100
    319 101
    320 102
    321 103
    322 104
    323 106
    324 107
    325 108
    326 109
    327 110
    328 111
    329 119
    330 121
    331 122
    332 136
    333 138
    334 139
    335 148
    336 149
    337 150
    338278187
    339279188
  • trunk/LayoutTests/html5lib/runner-expected.txt

    r61956 r62168  
    101033
    111134
    12 35
    13 37
    141241
    151350
     
    42408
    43419
    44 10
    45 11
    46 17
    47 18
    48 19
    49 20
    50 21
    51 22
    52 29
     4211
    534332
    54 33
    554436
    56 40
    574542
    584644
     
    604853
    614954
    62 57
    6350
    6451resources/tests3.dat:
     
    8471resources/tests6.dat:
    85721
    86 6
    87738
    88749
     
    211197
    212198resources/tests16.dat:
    213 3
    214 4
    215 5
    216 6
    217 7
    218 8
    219 9
    220 10
    221 12
    222 13
    223 14
    224 15
    225 16
    226 17
    227 25
    228 27
    229 28
    230 42
    231 44
    232 45
    233 56
    234 57
    235 58
    23619984
    23720085
     
    24020388
    24120494
    242 97
    243 98
    244 99
    245 100
    246 101
    247 102
    248 103
    249 104
    250 106
    251 107
    252 108
    253 109
    254 110
    255 111
    256 119
    257 121
    258 122
    259 136
    260 138
    261 139
    262 148
    263 149
    264 150
    265205176
    266206177
  • trunk/WebCore/ChangeLog

    r62166 r62168  
     12010-06-29  Eric Seidel  <eric@webkit.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        HTMLTokenizer needs EndOfFile support
     6        https://bugs.webkit.org/show_bug.cgi?id=41344
     7
     8        We're using \0 as the EndOfFile marker as HTML5 replaces
     9        all other \0 with \0xFFFD.  Added some special case logic
     10        to InputStreamPreprocessor::peek not to replace \0 when
     11        its being used at the end of a stream.
     12
     13        This fixed 60 subtests in html5lib/runner.html.
     14
     15        There are still at least two states (BogusCommentState and
     16        CDATASectionState) which do not have proper EOF support.
     17
     18        * html/HTMLDocumentParser.cpp:
     19        (WebCore::HTMLDocumentParser::finish):
     20        (WebCore::HTMLDocumentParser::finishWasCalled):
     21        * html/HTMLInputStream.h:
     22        (WebCore::HTMLInputStream::markEndOfFile):
     23        (WebCore::HTMLInputStream::haveSeenEndOfFile):
     24        * html/HTMLToken.h:
     25        (WebCore::HTMLToken::makeEndOfFile):
     26        * html/HTMLTokenizer.cpp:
     27        (WebCore::HTMLTokenizer::nextToken):
     28        (WebCore::HTMLTokenizer::emitEndOfFile):
     29        * html/HTMLTokenizer.h:
     30        (WebCore::HTMLTokenizer::InputStreamPreprocessor::peek):
     31        (WebCore::HTMLTokenizer::InputStreamPreprocessor::shouldTreatNullAsEndOfFileMarker):
     32        * html/HTMLTreeBuilder.cpp:
     33        (WebCore::HTMLTreeBuilder::passTokenToLegacyParser):
     34
    1352010-06-28  Eric Seidel  <eric@webkit.org>
    236
  • trunk/WebCore/html/HTMLDocumentParser.cpp

    r62033 r62168  
    290290void HTMLDocumentParser::finish()
    291291{
    292     // We're not going to get any more data off the network, so we close the
    293     // input stream to indicate EOF.
    294     m_input.close();
     292    // We're not going to get any more data off the network, so we tell the
     293    // input stream we've reached the end of file.
     294    m_input.markEndOfFile();
    295295    attemptToEnd();
    296296}
     
    298298bool HTMLDocumentParser::finishWasCalled()
    299299{
    300     return m_input.isClosed();
     300    return m_input.haveSeenEndOfFile();
    301301}
    302302
  • trunk/WebCore/html/HTMLInputStream.h

    r61608 r62168  
    6565    }
    6666
    67     void close() { m_last->close(); }
    68     bool isClosed() { return m_last->isClosed(); }
     67    void markEndOfFile()
     68    {
     69        // FIXME: This should use InputStreamPreprocessor::endOfFileMarker
     70        // once InputStreamPreprocessor is split off into its own header.
     71        static const UChar endOfFileMarker = 0;
     72        m_last->append(SegmentedString(String(&endOfFileMarker, 1)));
     73        m_last->close();
     74    }
     75
     76    bool haveSeenEndOfFile()
     77    {
     78        return m_last->isClosed();
     79    }
    6980
    7081    SegmentedString& current() { return m_first; }
  • trunk/WebCore/html/HTMLToken.h

    r61971 r62168  
    6161    }
    6262
     63    void makeEndOfFile()
     64    {
     65        ASSERT(m_type == Uninitialized);
     66        m_type = EndOfFile;
     67    }
     68
    6369    void beginStartTag(UChar character)
    6470    {
  • trunk/WebCore/html/HTMLTokenizer.cpp

    r61673 r62168  
    4545using namespace HTMLNames;
    4646
     47const UChar HTMLTokenizer::InputStreamPreprocessor::endOfFileMarker = 0;
     48
    4749namespace {
    4850
     
    170172        source.advance(m_lineNumber);                                      \
    171173        emitCurrentToken();                                                \
     174        return true;                                                       \
     175    } while (false)
     176
     177// Identical to EMIT_AND_RESUME_IN, except does not advance.
     178#define EMIT_AND_RECONSUME_IN(stateName)                                   \
     179    do {                                                                   \
     180        m_state = stateName;                                               \
     181        emitCurrentToken();                                                \
     182        return true;                                                       \
     183    } while (false)
     184
     185// Used to emit the EndOfFile token.
     186// Check if we have buffered characters to emit first before emitting the EOF.
     187#define EMIT_END_OF_FILE()                                                 \
     188    do {                                                                   \
     189        if (shouldEmitBufferedCharacterToken(source))                      \
     190            return true;                                                   \
     191        m_state = DataState;                                               \
     192        source.advance(m_lineNumber);                                      \
     193        emitEndOfFile();                                                   \
    172194        return true;                                                       \
    173195    } while (false)
     
    253275            }
    254276            ADVANCE_TO(TagOpenState);
    255         } else {
     277        } else if (cc == InputStreamPreprocessor::endOfFileMarker)
     278            EMIT_END_OF_FILE();
     279        else {
    256280            emitCharacter(cc);
    257281            ADVANCE_TO(DataState);
     
    272296        else if (cc == '<')
    273297            ADVANCE_TO(RCDATALessThanSignState);
     298        else if (cc == InputStreamPreprocessor::endOfFileMarker)
     299            EMIT_END_OF_FILE();
    274300        else {
    275301            emitCharacter(cc);
     
    289315        if (cc == '<')
    290316            ADVANCE_TO(RAWTEXTLessThanSignState);
     317        else if (cc == InputStreamPreprocessor::endOfFileMarker)
     318            EMIT_END_OF_FILE();
    291319        else {
    292320            emitCharacter(cc);
     
    299327        if (cc == '<')
    300328            ADVANCE_TO(ScriptDataLessThanSignState);
     329        else if (cc == InputStreamPreprocessor::endOfFileMarker)
     330            EMIT_END_OF_FILE();
    301331        else {
    302332            emitCharacter(cc);
     
    307337
    308338    BEGIN_STATE(PLAINTEXTState) {
    309         emitCharacter(cc);
     339        if (cc == InputStreamPreprocessor::endOfFileMarker)
     340            EMIT_END_OF_FILE();
     341        else
     342            emitCharacter(cc);
    310343        ADVANCE_TO(PLAINTEXTState);
    311344    }
     
    347380            emitParseError();
    348381            ADVANCE_TO(DataState);
     382        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     383            emitParseError();
     384            emitCharacter('<');
     385            emitCharacter('/');
     386            RECONSUME_IN(DataState);
    349387        } else {
    350388            emitParseError();
    351389            RECONSUME_IN(BogusCommentState);
    352390        }
    353         // FIXME: Handle EOF properly.
    354391    }
    355392    END_STATE()
     
    365402            m_token->appendToName(toLowerCase(cc));
    366403            ADVANCE_TO(TagNameState);
     404        } if (cc == InputStreamPreprocessor::endOfFileMarker) {
     405            emitParseError();
     406            RECONSUME_IN(DataState);
    367407        } else {
    368408            m_token->appendToName(cc);
    369409            ADVANCE_TO(TagNameState);
    370410        }
    371         // FIXME: Handle EOF properly.
    372411    }
    373412    END_STATE()
     
    575614        } else if (cc == '<')
    576615            ADVANCE_TO(ScriptDataEscapedLessThanSignState);
    577         else {
     616        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     617            emitParseError();
     618            RECONSUME_IN(DataState);
     619        } else {
    578620            emitCharacter(cc);
    579621            ADVANCE_TO(ScriptDataEscapedState);
    580622        }
    581         // FIXME: Handle EOF properly.
    582623    }
    583624    END_STATE()
     
    589630        } else if (cc == '<')
    590631            ADVANCE_TO(ScriptDataEscapedLessThanSignState);
    591         else {
     632        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     633            emitParseError();
     634            RECONSUME_IN(DataState);
     635        } else {
    592636            emitCharacter(cc);
    593637            ADVANCE_TO(ScriptDataEscapedState);
    594638        }
    595         // FIXME: Handle EOF properly.
    596639    }
    597640    END_STATE()
     
    606649            emitCharacter(cc);
    607650            ADVANCE_TO(ScriptDataState);
     651        } if (cc == InputStreamPreprocessor::endOfFileMarker) {
     652            emitParseError();
     653            RECONSUME_IN(DataState);
    608654        } else {
    609655            emitCharacter(cc);
    610656            ADVANCE_TO(ScriptDataEscapedState);
    611657        }
    612         // FIXME: Handle EOF properly.
    613658    }
    614659    END_STATE()
     
    711756            emitCharacter(cc);
    712757            ADVANCE_TO(ScriptDataDoubleEscapedLessThanSignState);
     758        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     759            emitParseError();
     760            RECONSUME_IN(DataState);
    713761        } else {
    714762            emitCharacter(cc);
    715763            ADVANCE_TO(ScriptDataDoubleEscapedState);
    716764        }
    717         // FIXME: Handle EOF properly.
    718765    }
    719766    END_STATE()
     
    726773            emitCharacter(cc);
    727774            ADVANCE_TO(ScriptDataDoubleEscapedLessThanSignState);
     775        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     776            emitParseError();
     777            RECONSUME_IN(DataState);
    728778        } else {
    729779            emitCharacter(cc);
    730780            ADVANCE_TO(ScriptDataDoubleEscapedState);
    731781        }
    732         // FIXME: Handle EOF properly.
    733782    }
    734783    END_STATE()
     
    744793            emitCharacter(cc);
    745794            ADVANCE_TO(ScriptDataState);
     795        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     796            emitParseError();
     797            RECONSUME_IN(DataState);
    746798        } else {
    747799            emitCharacter(cc);
    748800            ADVANCE_TO(ScriptDataDoubleEscapedState);
    749801        }
    750         // FIXME: Handle EOF properly.
    751802    }
    752803    END_STATE()
     
    793844            m_token->appendToAttributeName(toLowerCase(cc));
    794845            ADVANCE_TO(AttributeNameState);
     846        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     847            emitParseError();
     848            RECONSUME_IN(DataState);
    795849        } else {
    796850            if (cc == '"' || cc == '\'' || cc == '<' || cc == '=')
     
    800854            ADVANCE_TO(AttributeNameState);
    801855        }
    802         // FIXME: Handle EOF properly.
    803856    }
    804857    END_STATE()
     
    816869            m_token->appendToAttributeName(toLowerCase(cc));
    817870            ADVANCE_TO(AttributeNameState);
     871        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     872            emitParseError();
     873            RECONSUME_IN(DataState);
    818874        } else {
    819875            if (cc == '"' || cc == '\'' || cc == '<' || cc == '=')
     
    822878            ADVANCE_TO(AttributeNameState);
    823879        }
    824         // FIXME: Handle EOF properly.
    825880    }
    826881    END_STATE()
     
    839894            m_token->appendToAttributeName(toLowerCase(cc));
    840895            ADVANCE_TO(AttributeNameState);
     896        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     897            emitParseError();
     898            RECONSUME_IN(DataState);
    841899        } else {
    842900            if (cc == '"' || cc == '\'' || cc == '<')
     
    846904            ADVANCE_TO(AttributeNameState);
    847905        }
    848         // FIXME: Handle EOF properly.
    849906    }
    850907    END_STATE()
     
    862919            emitParseError();
    863920            EMIT_AND_RESUME_IN(DataState);
     921        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     922            emitParseError();
     923            RECONSUME_IN(DataState);
    864924        } else {
    865925            if (cc == '<' || cc == '=' || cc == '`')
     
    877937            m_additionalAllowedCharacter = '"';
    878938            ADVANCE_TO(CharacterReferenceInAttributeValueState);
     939        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     940            emitParseError();
     941            RECONSUME_IN(DataState);
    879942        } else {
    880943            m_token->appendToAttributeValue(cc);
    881944            ADVANCE_TO(AttributeValueDoubleQuotedState);
    882945        }
    883         // FIXME: Handle EOF properly.
    884946    }
    885947    END_STATE()
     
    891953            m_additionalAllowedCharacter = '\'';
    892954            ADVANCE_TO(CharacterReferenceInAttributeValueState);
     955        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     956            emitParseError();
     957            RECONSUME_IN(DataState);
    893958        } else {
    894959            m_token->appendToAttributeValue(cc);
    895960            ADVANCE_TO(AttributeValueSingleQuotedState);
    896961        }
    897         // FIXME: Handle EOF properly.
    898962    }
    899963    END_STATE()
     
    907971        } else if (cc == '>')
    908972            EMIT_AND_RESUME_IN(DataState);
    909         else {
     973        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     974            emitParseError();
     975            RECONSUME_IN(DataState);
     976        } else {
    910977            if (cc == '"' || cc == '\'' || cc == '<' || cc == '=' || cc == '`')
    911978                emitParseError();
     
    913980            ADVANCE_TO(AttributeValueUnquotedState);
    914981        }
    915         // FIXME: Handle EOF properly.
    916982    }
    917983    END_STATE()
     
    9521018        else if (cc == '>')
    9531019            EMIT_AND_RESUME_IN(DataState);
    954         else {
     1020        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1021            emitParseError();
     1022            RECONSUME_IN(DataState);
     1023        } else {
    9551024            emitParseError();
    9561025            RECONSUME_IN(BeforeAttributeNameState);
    9571026        }
    958         // FIXME: Handle EOF properly.
    9591027    }
    9601028    END_STATE()
     
    9641032            notImplemented();
    9651033            EMIT_AND_RESUME_IN(DataState);
     1034        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1035            emitParseError();
     1036            RECONSUME_IN(DataState);
    9661037        } else {
    9671038            emitParseError();
    9681039            RECONSUME_IN(BeforeAttributeNameState);
    9691040        }
    970         // FIXME: Handle EOF properly.
    9711041    }
    9721042    END_STATE()
     
    10251095            emitParseError();
    10261096            EMIT_AND_RESUME_IN(DataState);
     1097        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1098            emitParseError();
     1099            EMIT_AND_RECONSUME_IN(DataState);
    10271100        } else {
    10281101            m_token->appendToComment(cc);
    10291102            ADVANCE_TO(CommentState);
    10301103        }
    1031         // FIXME: Handle EOF properly.
    10321104    }
    10331105    END_STATE()
     
    10391111            emitParseError();
    10401112            EMIT_AND_RESUME_IN(DataState);
     1113        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1114            emitParseError();
     1115            EMIT_AND_RECONSUME_IN(DataState);
    10411116        } else {
    10421117            m_token->appendToComment('-');
     
    10441119            ADVANCE_TO(CommentState);
    10451120        }
    1046         // FIXME: Handle EOF properly.
    10471121    }
    10481122    END_STATE()
     
    10511125        if (cc == '-')
    10521126            ADVANCE_TO(CommentEndDashState);
    1053         else {
     1127        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1128            emitParseError();
     1129            EMIT_AND_RECONSUME_IN(DataState);
     1130        } else {
    10541131            m_token->appendToComment(cc);
    10551132            ADVANCE_TO(CommentState);
    10561133        }
    1057         // FIXME: Handle EOF properly.
    10581134    }
    10591135    END_STATE()
     
    10621138        if (cc == '-')
    10631139            ADVANCE_TO(CommentEndState);
    1064         else {
     1140        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1141            emitParseError();
     1142            EMIT_AND_RECONSUME_IN(DataState);
     1143        } else {
    10651144            m_token->appendToComment('-');
    10661145            m_token->appendToComment(cc);
    10671146            ADVANCE_TO(CommentState);
    10681147        }
    1069         // FIXME: Handle EOF properly.
    10701148    }
    10711149    END_STATE()
     
    10881166            m_token->appendToComment(cc);
    10891167            ADVANCE_TO(CommentEndState);
     1168        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1169            emitParseError();
     1170            EMIT_AND_RECONSUME_IN(DataState);
    10901171        } else {
    10911172            emitParseError();
     
    10951176            ADVANCE_TO(CommentState);
    10961177        }
    1097         // FIXME: Handle EOF properly.
    10981178    }
    10991179    END_STATE()
     
    11071187        } else if (cc == '>')
    11081188            EMIT_AND_RESUME_IN(DataState);
    1109         else {
     1189        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1190            emitParseError();
     1191            EMIT_AND_RECONSUME_IN(DataState);
     1192        } else {
    11101193            m_token->appendToComment('-');
    11111194            m_token->appendToComment('-');
     
    11141197            ADVANCE_TO(CommentState);
    11151198        }
    1116         // FIXME: Handle EOF properly.
    11171199    }
    11181200    END_STATE()
     
    11261208        else if (cc == '>')
    11271209            EMIT_AND_RESUME_IN(DataState);
    1128         else {
     1210        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1211            emitParseError();
     1212            EMIT_AND_RECONSUME_IN(DataState);
     1213        } else {
    11291214            m_token->appendToComment(cc);
    11301215            ADVANCE_TO(CommentState);
    11311216        }
    1132         // FIXME: Handle EOF properly.
    11331217    }
    11341218    END_STATE()
     
    11371221        if (cc == '\x09' || cc == '\x0A' || cc == '\x0C' || cc == ' ')
    11381222            ADVANCE_TO(BeforeDOCTYPENameState);
    1139         else {
     1223        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1224            emitParseError();
     1225            m_token->beginDOCTYPE();
     1226            m_token->setForceQuirks();
     1227            EMIT_AND_RECONSUME_IN(DataState);
     1228        } else {
    11401229            emitParseError();
    11411230            RECONSUME_IN(BeforeDOCTYPENameState);
    11421231        }
    1143         // FIXME: Handle EOF properly.
    11441232    }
    11451233    END_STATE()
     
    11561244            m_token->setForceQuirks();
    11571245            EMIT_AND_RESUME_IN(DataState);
     1246        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1247            emitParseError();
     1248            m_token->beginDOCTYPE();
     1249            m_token->setForceQuirks();
     1250            EMIT_AND_RECONSUME_IN(DataState);
    11581251        } else {
    11591252            m_token->beginDOCTYPE(cc);
    11601253            ADVANCE_TO(DOCTYPENameState);
    11611254        }
    1162         // FIXME: Handle EOF properly.
    11631255    }
    11641256    END_STATE()
     
    11721264            m_token->appendToName(toLowerCase(cc));
    11731265            ADVANCE_TO(DOCTYPENameState);
     1266        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1267            emitParseError();
     1268            m_token->setForceQuirks();
     1269            EMIT_AND_RECONSUME_IN(DataState);
    11741270        } else {
    11751271            m_token->appendToName(cc);
    11761272            ADVANCE_TO(DOCTYPENameState);
    11771273        }
    1178         // FIXME: Handle EOF properly.
    11791274    }
    11801275    END_STATE()
     
    11851280        if (cc == '>')
    11861281            EMIT_AND_RESUME_IN(DataState);
    1187         else {
     1282        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1283            emitParseError();
     1284            m_token->setForceQuirks();
     1285            EMIT_AND_RECONSUME_IN(DataState);
     1286        } else {
    11881287            DEFINE_STATIC_LOCAL(String, publicString, ("public"));
    11891288            DEFINE_STATIC_LOCAL(String, systemString, ("system"));
     
    12071306            ADVANCE_TO(BogusDOCTYPEState);
    12081307        }
    1209         // FIXME: Handle EOF properly.
    12101308    }
    12111309    END_STATE()
     
    12261324            m_token->setForceQuirks();
    12271325            EMIT_AND_RESUME_IN(DataState);
     1326        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1327            emitParseError();
     1328            m_token->setForceQuirks();
     1329            EMIT_AND_RECONSUME_IN(DataState);
    12281330        } else {
    12291331            emitParseError();
     
    12311333            ADVANCE_TO(BogusDOCTYPEState);
    12321334        }
    1233         // FIXME: Handle EOF properly.
    12341335    }
    12351336    END_STATE()
     
    12481349            m_token->setForceQuirks();
    12491350            EMIT_AND_RESUME_IN(DataState);
     1351        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1352            emitParseError();
     1353            m_token->setForceQuirks();
     1354            EMIT_AND_RECONSUME_IN(DataState);
    12501355        } else {
    12511356            emitParseError();
     
    12531358            ADVANCE_TO(BogusDOCTYPEState);
    12541359        }
    1255         // FIXME: Handle EOF properly.
    12561360    }
    12571361    END_STATE()
     
    12641368            m_token->setForceQuirks();
    12651369            EMIT_AND_RESUME_IN(DataState);
     1370        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1371            emitParseError();
     1372            m_token->setForceQuirks();
     1373            EMIT_AND_RECONSUME_IN(DataState);
    12661374        } else {
    12671375            m_token->appendToPublicIdentifier(cc);
    12681376            ADVANCE_TO(DOCTYPEPublicIdentifierDoubleQuotedState);
    12691377        }
    1270         // FIXME: Handle EOF properly.
    12711378    }
    12721379    END_STATE()
     
    12791386            m_token->setForceQuirks();
    12801387            EMIT_AND_RESUME_IN(DataState);
     1388        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1389            emitParseError();
     1390            m_token->setForceQuirks();
     1391            EMIT_AND_RECONSUME_IN(DataState);
    12811392        } else {
    12821393            m_token->appendToPublicIdentifier(cc);
    12831394            ADVANCE_TO(DOCTYPEPublicIdentifierSingleQuotedState);
    12841395        }
    1285         // FIXME: Handle EOF properly.
    12861396    }
    12871397    END_STATE()
     
    13001410            m_token->setSystemIdentifierToEmptyString();
    13011411            ADVANCE_TO(DOCTYPESystemIdentifierSingleQuotedState);
     1412        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1413            emitParseError();
     1414            m_token->setForceQuirks();
     1415            EMIT_AND_RECONSUME_IN(DataState);
    13021416        } else {
    13031417            emitParseError();
     
    13051419            ADVANCE_TO(BogusDOCTYPEState);
    13061420        }
    1307         // FIXME: Handle EOF properly.
    13081421    }
    13091422    END_STATE()
     
    13201433            m_token->setSystemIdentifierToEmptyString();
    13211434            ADVANCE_TO(DOCTYPESystemIdentifierSingleQuotedState);
     1435        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1436            emitParseError();
     1437            m_token->setForceQuirks();
     1438            EMIT_AND_RECONSUME_IN(DataState);
    13221439        } else {
    13231440            emitParseError();
     
    13251442            ADVANCE_TO(BogusDOCTYPEState);
    13261443        }
    1327         // FIXME: Handle EOF properly.
    13281444    }
    13291445    END_STATE()
     
    13441460            m_token->setForceQuirks();
    13451461            EMIT_AND_RESUME_IN(DataState);
     1462        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1463            emitParseError();
     1464            m_token->setForceQuirks();
     1465            EMIT_AND_RECONSUME_IN(DataState);
    13461466        } else {
    13471467            emitParseError();
     
    13491469            ADVANCE_TO(BogusDOCTYPEState);
    13501470        }
    1351         // FIXME: Handle EOF properly.
    13521471    }
    13531472    END_STATE()
     
    13661485            m_token->setForceQuirks();
    13671486            EMIT_AND_RESUME_IN(DataState);
     1487        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1488            emitParseError();
     1489            m_token->setForceQuirks();
     1490            EMIT_AND_RECONSUME_IN(DataState);
    13681491        } else {
    13691492            emitParseError();
     
    13711494            ADVANCE_TO(BogusDOCTYPEState);
    13721495        }
    1373         // FIXME: Handle EOF properly.
    13741496    }
    13751497    END_STATE()
     
    13821504            m_token->setForceQuirks();
    13831505            EMIT_AND_RESUME_IN(DataState);
     1506        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1507            emitParseError();
     1508            m_token->setForceQuirks();
     1509            EMIT_AND_RECONSUME_IN(DataState);
    13841510        } else {
    13851511            m_token->appendToSystemIdentifier(cc);
    13861512            ADVANCE_TO(DOCTYPESystemIdentifierDoubleQuotedState);
    13871513        }
    1388         // FIXME: Handle EOF properly.
    13891514    }
    13901515    END_STATE()
     
    13971522            m_token->setForceQuirks();
    13981523            EMIT_AND_RESUME_IN(DataState);
     1524        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1525            emitParseError();
     1526            m_token->setForceQuirks();
     1527            EMIT_AND_RECONSUME_IN(DataState);
    13991528        } else {
    14001529            m_token->appendToSystemIdentifier(cc);
    14011530            ADVANCE_TO(DOCTYPESystemIdentifierSingleQuotedState);
    14021531        }
    1403         // FIXME: Handle EOF properly.
    14041532    }
    14051533    END_STATE()
     
    14101538        else if (cc == '>')
    14111539            EMIT_AND_RESUME_IN(DataState);
    1412         else {
     1540        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
     1541            emitParseError();
     1542            m_token->setForceQuirks();
     1543            EMIT_AND_RECONSUME_IN(DataState);
     1544        } else {
    14131545            emitParseError();
    14141546            ADVANCE_TO(BogusDOCTYPEState);
    14151547        }
    1416         // FIXME: Handle EOF properly.
    14171548    }
    14181549    END_STATE()
     
    14211552        if (cc == '>')
    14221553            EMIT_AND_RESUME_IN(DataState);
     1554        else if (cc == InputStreamPreprocessor::endOfFileMarker)
     1555            EMIT_AND_RECONSUME_IN(DataState);
    14231556        ADVANCE_TO(BogusDOCTYPEState);
    1424         // FIXME: Handle EOF properly.
    14251557    }
    14261558    END_STATE()
     
    14291561        notImplemented();
    14301562        ADVANCE_TO(CDATASectionState);
     1563        // FIXME: Handle EOF properly.
    14311564    }
    14321565    END_STATE()
     
    14561589inline void HTMLTokenizer::emitCharacter(UChar character)
    14571590{
     1591    ASSERT(character != InputStreamPreprocessor::endOfFileMarker);
    14581592    if (m_token->type() != HTMLToken::Character) {
    14591593        m_token->beginCharacter(character);
     
    14851619}
    14861620
     1621inline void HTMLTokenizer::emitEndOfFile()
     1622{
     1623    // Discard any in-progress token before setting up an EOF token.
     1624    m_token->clear();
     1625    m_token->makeEndOfFile();
     1626}
     1627
    14871628inline bool HTMLTokenizer::shouldEmitBufferedCharacterToken(const SegmentedString& source)
    14881629{
  • trunk/WebCore/html/HTMLTokenizer.h

    r61678 r62168  
    165165                // by the replacement character. We suspect this is a problem with the spec as doing
    166166                // that filtering breaks surrogate pair handling and causes us not to match Minefield.
    167                 if (m_nextInputCharacter == '\0')
     167                if (m_nextInputCharacter == '\0' && !shouldTreatNullAsEndOfFileMarker(source))
    168168                    m_nextInputCharacter = 0xFFFD;
    169169            }
     
    180180        }
    181181
     182        static const UChar endOfFileMarker;
     183
    182184    private:
     185        bool shouldTreatNullAsEndOfFileMarker(SegmentedString& source) const
     186        {
     187            return source.isClosed() && source.length() == 1;
     188        }
     189
    183190        // http://www.whatwg.org/specs/web-apps/current-work/#next-input-character
    184191        UChar m_nextInputCharacter;
     
    190197    inline void emitCurrentToken();
    191198    inline void emitCodePoint(unsigned);
     199    inline void emitEndOfFile();
    192200
    193201    inline bool processEntity(SegmentedString& source);
  • trunk/WebCore/html/HTMLTreeBuilder.cpp

    r62166 r62168  
    195195        return;
    196196    }
     197
     198    if (token.type() == HTMLToken::EndOfFile)
     199        return;
    197200
    198201    // For now, we translate into an old-style token for testing.
Note: See TracChangeset for help on using the changeset viewer.