parser/html/nsHtml5Tokenizer.cpp

Fri, 16 Jan 2015 18:13:44 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 18:13:44 +0100
branch
TOR_BUG_9701
changeset 14
925c144e1f1f
permissions
-rw-r--r--

Integrate suggestion from review to improve consistency with existing code.

     1 /*
     2  * Copyright (c) 2005-2007 Henri Sivonen
     3  * Copyright (c) 2007-2013 Mozilla Foundation
     4  * Portions of comments Copyright 2004-2010 Apple Computer, Inc., Mozilla 
     5  * Foundation, and Opera Software ASA.
     6  *
     7  * Permission is hereby granted, free of charge, to any person obtaining a 
     8  * copy of this software and associated documentation files (the "Software"), 
     9  * to deal in the Software without restriction, including without limitation 
    10  * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
    11  * and/or sell copies of the Software, and to permit persons to whom the 
    12  * Software is furnished to do so, subject to the following conditions:
    13  *
    14  * The above copyright notice and this permission notice shall be included in 
    15  * all copies or substantial portions of the Software.
    16  *
    17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
    18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
    19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
    20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
    21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
    22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
    23  * DEALINGS IN THE SOFTWARE.
    24  */
    26 /*
    27  * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
    28  * Please edit Tokenizer.java instead and regenerate.
    29  */
    31 #define nsHtml5Tokenizer_cpp__
    33 #include "nsIAtom.h"
    34 #include "nsHtml5AtomTable.h"
    35 #include "nsString.h"
    36 #include "nsIContent.h"
    37 #include "nsTraceRefcnt.h"
    38 #include "jArray.h"
    39 #include "nsHtml5DocumentMode.h"
    40 #include "nsHtml5ArrayCopy.h"
    41 #include "nsHtml5NamedCharacters.h"
    42 #include "nsHtml5NamedCharactersAccel.h"
    43 #include "nsHtml5Atoms.h"
    44 #include "nsAHtml5TreeBuilderState.h"
    45 #include "nsHtml5Macros.h"
    46 #include "nsHtml5Highlighter.h"
    47 #include "nsHtml5TokenizerLoopPolicies.h"
    49 #include "nsHtml5TreeBuilder.h"
    50 #include "nsHtml5MetaScanner.h"
    51 #include "nsHtml5AttributeName.h"
    52 #include "nsHtml5ElementName.h"
    53 #include "nsHtml5HtmlAttributes.h"
    54 #include "nsHtml5StackNode.h"
    55 #include "nsHtml5UTF16Buffer.h"
    56 #include "nsHtml5StateSnapshot.h"
    57 #include "nsHtml5Portability.h"
    59 #include "nsHtml5Tokenizer.h"
    61 char16_t nsHtml5Tokenizer::LT_GT[] = { '<', '>' };
    62 char16_t nsHtml5Tokenizer::LT_SOLIDUS[] = { '<', '/' };
    63 char16_t nsHtml5Tokenizer::RSQB_RSQB[] = { ']', ']' };
    64 char16_t nsHtml5Tokenizer::REPLACEMENT_CHARACTER[] = { 0xfffd };
    65 char16_t nsHtml5Tokenizer::LF[] = { '\n' };
    66 char16_t nsHtml5Tokenizer::CDATA_LSQB[] = { 'C', 'D', 'A', 'T', 'A', '[' };
    67 char16_t nsHtml5Tokenizer::OCTYPE[] = { 'o', 'c', 't', 'y', 'p', 'e' };
    68 char16_t nsHtml5Tokenizer::UBLIC[] = { 'u', 'b', 'l', 'i', 'c' };
    69 char16_t nsHtml5Tokenizer::YSTEM[] = { 'y', 's', 't', 'e', 'm' };
    70 static char16_t const TITLE_ARR_DATA[] = { 't', 'i', 't', 'l', 'e' };
    71 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::TITLE_ARR = { TITLE_ARR_DATA, MOZ_ARRAY_LENGTH(TITLE_ARR_DATA) };
    72 static char16_t const SCRIPT_ARR_DATA[] = { 's', 'c', 'r', 'i', 'p', 't' };
    73 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::SCRIPT_ARR = { SCRIPT_ARR_DATA, MOZ_ARRAY_LENGTH(SCRIPT_ARR_DATA) };
    74 static char16_t const STYLE_ARR_DATA[] = { 's', 't', 'y', 'l', 'e' };
    75 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::STYLE_ARR = { STYLE_ARR_DATA, MOZ_ARRAY_LENGTH(STYLE_ARR_DATA) };
    76 static char16_t const PLAINTEXT_ARR_DATA[] = { 'p', 'l', 'a', 'i', 'n', 't', 'e', 'x', 't' };
    77 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::PLAINTEXT_ARR = { PLAINTEXT_ARR_DATA, MOZ_ARRAY_LENGTH(PLAINTEXT_ARR_DATA) };
    78 static char16_t const XMP_ARR_DATA[] = { 'x', 'm', 'p' };
    79 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::XMP_ARR = { XMP_ARR_DATA, MOZ_ARRAY_LENGTH(XMP_ARR_DATA) };
    80 static char16_t const TEXTAREA_ARR_DATA[] = { 't', 'e', 'x', 't', 'a', 'r', 'e', 'a' };
    81 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::TEXTAREA_ARR = { TEXTAREA_ARR_DATA, MOZ_ARRAY_LENGTH(TEXTAREA_ARR_DATA) };
    82 static char16_t const IFRAME_ARR_DATA[] = { 'i', 'f', 'r', 'a', 'm', 'e' };
    83 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::IFRAME_ARR = { IFRAME_ARR_DATA, MOZ_ARRAY_LENGTH(IFRAME_ARR_DATA) };
    84 static char16_t const NOEMBED_ARR_DATA[] = { 'n', 'o', 'e', 'm', 'b', 'e', 'd' };
    85 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOEMBED_ARR = { NOEMBED_ARR_DATA, MOZ_ARRAY_LENGTH(NOEMBED_ARR_DATA) };
    86 static char16_t const NOSCRIPT_ARR_DATA[] = { 'n', 'o', 's', 'c', 'r', 'i', 'p', 't' };
    87 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOSCRIPT_ARR = { NOSCRIPT_ARR_DATA, MOZ_ARRAY_LENGTH(NOSCRIPT_ARR_DATA) };
    88 static char16_t const NOFRAMES_ARR_DATA[] = { 'n', 'o', 'f', 'r', 'a', 'm', 'e', 's' };
    89 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOFRAMES_ARR = { NOFRAMES_ARR_DATA, MOZ_ARRAY_LENGTH(NOFRAMES_ARR_DATA) };
    91 nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder* tokenHandler, bool viewingXmlSource)
    92   : tokenHandler(tokenHandler),
    93     encodingDeclarationHandler(nullptr),
    94     bmpChar(jArray<char16_t,int32_t>::newJArray(1)),
    95     astralChar(jArray<char16_t,int32_t>::newJArray(2)),
    96     tagName(nullptr),
    97     attributeName(nullptr),
    98     doctypeName(nullptr),
    99     publicIdentifier(nullptr),
   100     systemIdentifier(nullptr),
   101     attributes(tokenHandler->HasBuilder() ? new nsHtml5HtmlAttributes(0) : nullptr),
   102     newAttributesEachTime(!tokenHandler->HasBuilder()),
   103     viewingXmlSource(viewingXmlSource)
   104 {
   105   MOZ_COUNT_CTOR(nsHtml5Tokenizer);
   106 }
   108 void 
   109 nsHtml5Tokenizer::setInterner(nsHtml5AtomTable* interner)
   110 {
   111   this->interner = interner;
   112 }
   114 void 
   115 nsHtml5Tokenizer::initLocation(nsString* newPublicId, nsString* newSystemId)
   116 {
   117   this->systemId = newSystemId;
   118   this->publicId = newPublicId;
   119 }
   121 bool 
   122 nsHtml5Tokenizer::isViewingXmlSource()
   123 {
   124   return viewingXmlSource;
   125 }
   127 void 
   128 nsHtml5Tokenizer::setStateAndEndTagExpectation(int32_t specialTokenizerState, nsIAtom* endTagExpectation)
   129 {
   130   this->stateSave = specialTokenizerState;
   131   if (specialTokenizerState == NS_HTML5TOKENIZER_DATA) {
   132     return;
   133   }
   134   autoJArray<char16_t,int32_t> asArray = nsHtml5Portability::newCharArrayFromLocal(endTagExpectation);
   135   this->endTagExpectation = nsHtml5ElementName::elementNameByBuffer(asArray, 0, asArray.length, interner);
   136   endTagExpectationToArray();
   137 }
   139 void 
   140 nsHtml5Tokenizer::setStateAndEndTagExpectation(int32_t specialTokenizerState, nsHtml5ElementName* endTagExpectation)
   141 {
   142   this->stateSave = specialTokenizerState;
   143   this->endTagExpectation = endTagExpectation;
   144   endTagExpectationToArray();
   145 }
   147 void 
   148 nsHtml5Tokenizer::endTagExpectationToArray()
   149 {
   150   switch(endTagExpectation->getGroup()) {
   151     case NS_HTML5TREE_BUILDER_TITLE: {
   152       endTagExpectationAsArray = TITLE_ARR;
   153       return;
   154     }
   155     case NS_HTML5TREE_BUILDER_SCRIPT: {
   156       endTagExpectationAsArray = SCRIPT_ARR;
   157       return;
   158     }
   159     case NS_HTML5TREE_BUILDER_STYLE: {
   160       endTagExpectationAsArray = STYLE_ARR;
   161       return;
   162     }
   163     case NS_HTML5TREE_BUILDER_PLAINTEXT: {
   164       endTagExpectationAsArray = PLAINTEXT_ARR;
   165       return;
   166     }
   167     case NS_HTML5TREE_BUILDER_XMP: {
   168       endTagExpectationAsArray = XMP_ARR;
   169       return;
   170     }
   171     case NS_HTML5TREE_BUILDER_TEXTAREA: {
   172       endTagExpectationAsArray = TEXTAREA_ARR;
   173       return;
   174     }
   175     case NS_HTML5TREE_BUILDER_IFRAME: {
   176       endTagExpectationAsArray = IFRAME_ARR;
   177       return;
   178     }
   179     case NS_HTML5TREE_BUILDER_NOEMBED: {
   180       endTagExpectationAsArray = NOEMBED_ARR;
   181       return;
   182     }
   183     case NS_HTML5TREE_BUILDER_NOSCRIPT: {
   184       endTagExpectationAsArray = NOSCRIPT_ARR;
   185       return;
   186     }
   187     case NS_HTML5TREE_BUILDER_NOFRAMES: {
   188       endTagExpectationAsArray = NOFRAMES_ARR;
   189       return;
   190     }
   191     default: {
   192       MOZ_ASSERT(false, "Bad end tag expectation.");
   193       return;
   194     }
   195   }
   196 }
   198 void 
   199 nsHtml5Tokenizer::setLineNumber(int32_t line)
   200 {
   201   this->line = line;
   202 }
   204 nsHtml5HtmlAttributes* 
   205 nsHtml5Tokenizer::emptyAttributes()
   206 {
   207   return nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES;
   208 }
   210 void 
   211 nsHtml5Tokenizer::appendStrBuf(char16_t c)
   212 {
   213   if (strBufLen == strBuf.length) {
   214     jArray<char16_t,int32_t> newBuf = jArray<char16_t,int32_t>::newJArray(strBuf.length + NS_HTML5TOKENIZER_BUFFER_GROW_BY);
   215     nsHtml5ArrayCopy::arraycopy(strBuf, newBuf, strBuf.length);
   216     strBuf = newBuf;
   217   }
   218   strBuf[strBufLen++] = c;
   219 }
   221 nsString* 
   222 nsHtml5Tokenizer::strBufToString()
   223 {
   224   return nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen);
   225 }
   227 void 
   228 nsHtml5Tokenizer::strBufToDoctypeName()
   229 {
   230   doctypeName = nsHtml5Portability::newLocalNameFromBuffer(strBuf, 0, strBufLen, interner);
   231 }
   233 void 
   234 nsHtml5Tokenizer::emitStrBuf()
   235 {
   236   if (strBufLen > 0) {
   237     tokenHandler->characters(strBuf, 0, strBufLen);
   238   }
   239 }
   241 void 
   242 nsHtml5Tokenizer::appendLongStrBuf(char16_t c)
   243 {
   244   if (longStrBufLen == longStrBuf.length) {
   245     jArray<char16_t,int32_t> newBuf = jArray<char16_t,int32_t>::newJArray(longStrBufLen + (longStrBufLen >> 1));
   246     nsHtml5ArrayCopy::arraycopy(longStrBuf, newBuf, longStrBuf.length);
   247     longStrBuf = newBuf;
   248   }
   249   longStrBuf[longStrBufLen++] = c;
   250 }
   252 void 
   253 nsHtml5Tokenizer::appendLongStrBuf(char16_t* buffer, int32_t offset, int32_t length)
   254 {
   255   int32_t reqLen = longStrBufLen + length;
   256   if (longStrBuf.length < reqLen) {
   257     jArray<char16_t,int32_t> newBuf = jArray<char16_t,int32_t>::newJArray(reqLen + (reqLen >> 1));
   258     nsHtml5ArrayCopy::arraycopy(longStrBuf, newBuf, longStrBuf.length);
   259     longStrBuf = newBuf;
   260   }
   261   nsHtml5ArrayCopy::arraycopy(buffer, offset, longStrBuf, longStrBufLen, length);
   262   longStrBufLen = reqLen;
   263 }
   265 nsString* 
   266 nsHtml5Tokenizer::longStrBufToString()
   267 {
   268   return nsHtml5Portability::newStringFromBuffer(longStrBuf, 0, longStrBufLen);
   269 }
   271 void 
   272 nsHtml5Tokenizer::emitComment(int32_t provisionalHyphens, int32_t pos)
   273 {
   274   tokenHandler->comment(longStrBuf, 0, longStrBufLen - provisionalHyphens);
   275   cstart = pos + 1;
   276 }
   278 void 
   279 nsHtml5Tokenizer::flushChars(char16_t* buf, int32_t pos)
   280 {
   281   if (pos > cstart) {
   282     tokenHandler->characters(buf, cstart, pos - cstart);
   283   }
   284   cstart = INT32_MAX;
   285 }
   287 void 
   288 nsHtml5Tokenizer::strBufToElementNameString()
   289 {
   290   tagName = nsHtml5ElementName::elementNameByBuffer(strBuf, 0, strBufLen, interner);
   291 }
   293 int32_t 
   294 nsHtml5Tokenizer::emitCurrentTagToken(bool selfClosing, int32_t pos)
   295 {
   296   cstart = pos + 1;
   297   maybeErrSlashInEndTag(selfClosing);
   298   stateSave = NS_HTML5TOKENIZER_DATA;
   299   nsHtml5HtmlAttributes* attrs = (!attributes ? nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES : attributes);
   300   if (endTag) {
   301     maybeErrAttributesOnEndTag(attrs);
   302     if (!viewingXmlSource) {
   303       tokenHandler->endTag(tagName);
   304     }
   305     if (newAttributesEachTime) {
   306       delete attributes;
   307       attributes = nullptr;
   308     }
   309   } else {
   310     if (viewingXmlSource) {
   311       MOZ_ASSERT(newAttributesEachTime);
   312       delete attributes;
   313       attributes = nullptr;
   314     } else {
   315       tokenHandler->startTag(tagName, attrs, selfClosing);
   316     }
   317   }
   318   tagName->release();
   319   tagName = nullptr;
   320   if (newAttributesEachTime) {
   321     attributes = nullptr;
   322   } else {
   323     attributes->clear(0);
   324   }
   325   return stateSave;
   326 }
   328 void 
   329 nsHtml5Tokenizer::attributeNameComplete()
   330 {
   331   attributeName = nsHtml5AttributeName::nameByBuffer(strBuf, 0, strBufLen, interner);
   332   if (!attributes) {
   333     attributes = new nsHtml5HtmlAttributes(0);
   334   }
   335   if (attributes->contains(attributeName)) {
   336     errDuplicateAttribute();
   337     attributeName->release();
   338     attributeName = nullptr;
   339   }
   340 }
   342 void 
   343 nsHtml5Tokenizer::addAttributeWithoutValue()
   344 {
   346   if (attributeName) {
   347     attributes->addAttribute(attributeName, nsHtml5Portability::newEmptyString());
   348     attributeName = nullptr;
   349   }
   350 }
   352 void 
   353 nsHtml5Tokenizer::addAttributeWithValue()
   354 {
   355   if (attributeName) {
   356     nsString* val = longStrBufToString();
   357     if (mViewSource) {
   358       mViewSource->MaybeLinkifyAttributeValue(attributeName, val);
   359     }
   360     attributes->addAttribute(attributeName, val);
   361     attributeName = nullptr;
   362   }
   363 }
   365 void 
   366 nsHtml5Tokenizer::start()
   367 {
   368   initializeWithoutStarting();
   369   tokenHandler->startTokenization(this);
   370 }
   372 bool 
   373 nsHtml5Tokenizer::tokenizeBuffer(nsHtml5UTF16Buffer* buffer)
   374 {
   375   int32_t state = stateSave;
   376   int32_t returnState = returnStateSave;
   377   char16_t c = '\0';
   378   shouldSuspend = false;
   379   lastCR = false;
   380   int32_t start = buffer->getStart();
   381   int32_t pos = start - 1;
   382   switch(state) {
   383     case NS_HTML5TOKENIZER_DATA:
   384     case NS_HTML5TOKENIZER_RCDATA:
   385     case NS_HTML5TOKENIZER_SCRIPT_DATA:
   386     case NS_HTML5TOKENIZER_PLAINTEXT:
   387     case NS_HTML5TOKENIZER_RAWTEXT:
   388     case NS_HTML5TOKENIZER_CDATA_SECTION:
   389     case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED:
   390     case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPE_START:
   391     case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPE_START_DASH:
   392     case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_DASH:
   393     case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_DASH_DASH:
   394     case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPE_START:
   395     case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED:
   396     case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:
   397     case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_DASH:
   398     case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:
   399     case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPE_END: {
   400       cstart = start;
   401       break;
   402     }
   403     default: {
   404       cstart = INT32_MAX;
   405       break;
   406     }
   407   }
   408   if (mViewSource) {
   409     mViewSource->SetBuffer(buffer);
   410     pos = stateLoop<nsHtml5ViewSourcePolicy>(state, c, pos, buffer->getBuffer(), false, returnState, buffer->getEnd());
   411     mViewSource->DropBuffer((pos == buffer->getEnd()) ? pos : pos + 1);
   412   } else {
   413     pos = stateLoop<nsHtml5SilentPolicy>(state, c, pos, buffer->getBuffer(), false, returnState, buffer->getEnd());
   414   }
   415   if (pos == buffer->getEnd()) {
   416     buffer->setStart(pos);
   417   } else {
   418     buffer->setStart(pos + 1);
   419   }
   420   return lastCR;
   421 }
   423 template<class P>
   424 int32_t 
   425 nsHtml5Tokenizer::stateLoop(int32_t state, char16_t c, int32_t pos, char16_t* buf, bool reconsume, int32_t returnState, int32_t endPos)
   426 {
   427   stateloop: for (; ; ) {
   428     switch(state) {
   429       case NS_HTML5TOKENIZER_DATA: {
   430         for (; ; ) {
   431           if (reconsume) {
   432             reconsume = false;
   433           } else {
   434             if (++pos == endPos) {
   435               NS_HTML5_BREAK(stateloop);
   436             }
   437             c = checkChar(buf, pos);
   438           }
   439           switch(c) {
   440             case '&': {
   441               flushChars(buf, pos);
   442               clearStrBufAndAppend(c);
   443               setAdditionalAndRememberAmpersandLocation('\0');
   444               returnState = state;
   445               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE, reconsume, pos);
   446               NS_HTML5_CONTINUE(stateloop);
   447             }
   448             case '<': {
   449               flushChars(buf, pos);
   450               state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_OPEN, reconsume, pos);
   451               NS_HTML5_BREAK(dataloop);
   452             }
   453             case '\0': {
   454               emitReplacementCharacter(buf, pos);
   455               continue;
   456             }
   457             case '\r': {
   458               emitCarriageReturn(buf, pos);
   459               NS_HTML5_BREAK(stateloop);
   460             }
   461             case '\n': {
   462               silentLineFeed();
   463             }
   464             default: {
   465               continue;
   466             }
   467           }
   468         }
   469         dataloop_end: ;
   470       }
   471       case NS_HTML5TOKENIZER_TAG_OPEN: {
   472         for (; ; ) {
   473           if (++pos == endPos) {
   474             NS_HTML5_BREAK(stateloop);
   475           }
   476           c = checkChar(buf, pos);
   477           if (c >= 'A' && c <= 'Z') {
   478             endTag = false;
   479             clearStrBufAndAppend((char16_t) (c + 0x20));
   480             state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos);
   481             NS_HTML5_BREAK(tagopenloop);
   482           } else if (c >= 'a' && c <= 'z') {
   483             endTag = false;
   484             clearStrBufAndAppend(c);
   485             state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos);
   486             NS_HTML5_BREAK(tagopenloop);
   487           }
   488           switch(c) {
   489             case '!': {
   490               state = P::transition(mViewSource, NS_HTML5TOKENIZER_MARKUP_DECLARATION_OPEN, reconsume, pos);
   491               NS_HTML5_CONTINUE(stateloop);
   492             }
   493             case '/': {
   494               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CLOSE_TAG_OPEN, reconsume, pos);
   495               NS_HTML5_CONTINUE(stateloop);
   496             }
   497             case '\?': {
   498               if (viewingXmlSource) {
   499                 state = P::transition(mViewSource, NS_HTML5TOKENIZER_PROCESSING_INSTRUCTION, reconsume, pos);
   500                 NS_HTML5_CONTINUE(stateloop);
   501               }
   502               if (P::reportErrors) {
   503                 errProcessingInstruction();
   504               }
   505               clearLongStrBufAndAppend(c);
   506               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
   507               NS_HTML5_CONTINUE(stateloop);
   508             }
   509             case '>': {
   510               if (P::reportErrors) {
   511                 errLtGt();
   512               }
   513               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 2);
   514               cstart = pos + 1;
   515               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
   516               NS_HTML5_CONTINUE(stateloop);
   517             }
   518             default: {
   519               if (P::reportErrors) {
   520                 errBadCharAfterLt(c);
   521               }
   522               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
   523               cstart = pos;
   524               reconsume = true;
   525               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
   526               NS_HTML5_CONTINUE(stateloop);
   527             }
   528           }
   529         }
   530         tagopenloop_end: ;
   531       }
   532       case NS_HTML5TOKENIZER_TAG_NAME: {
   533         for (; ; ) {
   534           if (++pos == endPos) {
   535             NS_HTML5_BREAK(stateloop);
   536           }
   537           c = checkChar(buf, pos);
   538           switch(c) {
   539             case '\r': {
   540               silentCarriageReturn();
   541               strBufToElementNameString();
   542               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
   543               NS_HTML5_BREAK(stateloop);
   544             }
   545             case '\n': {
   546               silentLineFeed();
   547             }
   548             case ' ':
   549             case '\t':
   550             case '\f': {
   551               strBufToElementNameString();
   552               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
   553               NS_HTML5_BREAK(tagnameloop);
   554             }
   555             case '/': {
   556               strBufToElementNameString();
   557               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG, reconsume, pos);
   558               NS_HTML5_CONTINUE(stateloop);
   559             }
   560             case '>': {
   561               strBufToElementNameString();
   562               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
   563               if (shouldSuspend) {
   564                 NS_HTML5_BREAK(stateloop);
   565               }
   566               NS_HTML5_CONTINUE(stateloop);
   567             }
   568             case '\0': {
   569               c = 0xfffd;
   570             }
   571             default: {
   572               if (c >= 'A' && c <= 'Z') {
   573                 c += 0x20;
   574               }
   575               appendStrBuf(c);
   576               continue;
   577             }
   578           }
   579         }
   580         tagnameloop_end: ;
   581       }
   582       case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME: {
   583         for (; ; ) {
   584           if (reconsume) {
   585             reconsume = false;
   586           } else {
   587             if (++pos == endPos) {
   588               NS_HTML5_BREAK(stateloop);
   589             }
   590             c = checkChar(buf, pos);
   591           }
   592           switch(c) {
   593             case '\r': {
   594               silentCarriageReturn();
   595               NS_HTML5_BREAK(stateloop);
   596             }
   597             case '\n': {
   598               silentLineFeed();
   599             }
   600             case ' ':
   601             case '\t':
   602             case '\f': {
   603               continue;
   604             }
   605             case '/': {
   606               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG, reconsume, pos);
   607               NS_HTML5_CONTINUE(stateloop);
   608             }
   609             case '>': {
   610               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
   611               if (shouldSuspend) {
   612                 NS_HTML5_BREAK(stateloop);
   613               }
   614               NS_HTML5_CONTINUE(stateloop);
   615             }
   616             case '\0': {
   617               c = 0xfffd;
   618             }
   619             case '\"':
   620             case '\'':
   621             case '<':
   622             case '=': {
   623               if (P::reportErrors) {
   624                 errBadCharBeforeAttributeNameOrNull(c);
   625               }
   626             }
   627             default: {
   628               if (c >= 'A' && c <= 'Z') {
   629                 c += 0x20;
   630               }
   631               clearStrBufAndAppend(c);
   632               state = P::transition(mViewSource, NS_HTML5TOKENIZER_ATTRIBUTE_NAME, reconsume, pos);
   633               NS_HTML5_BREAK(beforeattributenameloop);
   634             }
   635           }
   636         }
   637         beforeattributenameloop_end: ;
   638       }
   639       case NS_HTML5TOKENIZER_ATTRIBUTE_NAME: {
   640         for (; ; ) {
   641           if (++pos == endPos) {
   642             NS_HTML5_BREAK(stateloop);
   643           }
   644           c = checkChar(buf, pos);
   645           switch(c) {
   646             case '\r': {
   647               silentCarriageReturn();
   648               attributeNameComplete();
   649               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_NAME, reconsume, pos);
   650               NS_HTML5_BREAK(stateloop);
   651             }
   652             case '\n': {
   653               silentLineFeed();
   654             }
   655             case ' ':
   656             case '\t':
   657             case '\f': {
   658               attributeNameComplete();
   659               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_NAME, reconsume, pos);
   660               NS_HTML5_CONTINUE(stateloop);
   661             }
   662             case '/': {
   663               attributeNameComplete();
   664               addAttributeWithoutValue();
   665               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG, reconsume, pos);
   666               NS_HTML5_CONTINUE(stateloop);
   667             }
   668             case '=': {
   669               attributeNameComplete();
   670               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_VALUE, reconsume, pos);
   671               NS_HTML5_BREAK(attributenameloop);
   672             }
   673             case '>': {
   674               attributeNameComplete();
   675               addAttributeWithoutValue();
   676               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
   677               if (shouldSuspend) {
   678                 NS_HTML5_BREAK(stateloop);
   679               }
   680               NS_HTML5_CONTINUE(stateloop);
   681             }
   682             case '\0': {
   683               c = 0xfffd;
   684             }
   685             case '\"':
   686             case '\'':
   687             case '<': {
   688               if (P::reportErrors) {
   689                 errQuoteOrLtInAttributeNameOrNull(c);
   690               }
   691             }
   692             default: {
   693               if (c >= 'A' && c <= 'Z') {
   694                 c += 0x20;
   695               }
   696               appendStrBuf(c);
   697               continue;
   698             }
   699           }
   700         }
   701         attributenameloop_end: ;
   702       }
   703       case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_VALUE: {
   704         for (; ; ) {
   705           if (++pos == endPos) {
   706             NS_HTML5_BREAK(stateloop);
   707           }
   708           c = checkChar(buf, pos);
   709           switch(c) {
   710             case '\r': {
   711               silentCarriageReturn();
   712               NS_HTML5_BREAK(stateloop);
   713             }
   714             case '\n': {
   715               silentLineFeed();
   716             }
   717             case ' ':
   718             case '\t':
   719             case '\f': {
   720               continue;
   721             }
   722             case '\"': {
   723               clearLongStrBuf();
   724               state = P::transition(mViewSource, NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_DOUBLE_QUOTED, reconsume, pos);
   725               NS_HTML5_BREAK(beforeattributevalueloop);
   726             }
   727             case '&': {
   728               clearLongStrBuf();
   729               reconsume = true;
   730               state = P::transition(mViewSource, NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_UNQUOTED, reconsume, pos);
   732               NS_HTML5_CONTINUE(stateloop);
   733             }
   734             case '\'': {
   735               clearLongStrBuf();
   736               state = P::transition(mViewSource, NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_SINGLE_QUOTED, reconsume, pos);
   737               NS_HTML5_CONTINUE(stateloop);
   738             }
   739             case '>': {
   740               if (P::reportErrors) {
   741                 errAttributeValueMissing();
   742               }
   743               addAttributeWithoutValue();
   744               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
   745               if (shouldSuspend) {
   746                 NS_HTML5_BREAK(stateloop);
   747               }
   748               NS_HTML5_CONTINUE(stateloop);
   749             }
   750             case '\0': {
   751               c = 0xfffd;
   752             }
   753             case '<':
   754             case '=':
   755             case '`': {
   756               if (P::reportErrors) {
   757                 errLtOrEqualsOrGraveInUnquotedAttributeOrNull(c);
   758               }
   759             }
   760             default: {
   761               clearLongStrBufAndAppend(c);
   762               state = P::transition(mViewSource, NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_UNQUOTED, reconsume, pos);
   764               NS_HTML5_CONTINUE(stateloop);
   765             }
   766           }
   767         }
   768         beforeattributevalueloop_end: ;
   769       }
   770       case NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
   771         for (; ; ) {
   772           if (reconsume) {
   773             reconsume = false;
   774           } else {
   775             if (++pos == endPos) {
   776               NS_HTML5_BREAK(stateloop);
   777             }
   778             c = checkChar(buf, pos);
   779           }
   780           switch(c) {
   781             case '\"': {
   782               addAttributeWithValue();
   783               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_VALUE_QUOTED, reconsume, pos);
   784               NS_HTML5_BREAK(attributevaluedoublequotedloop);
   785             }
   786             case '&': {
   787               clearStrBufAndAppend(c);
   788               setAdditionalAndRememberAmpersandLocation('\"');
   789               returnState = state;
   790               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE, reconsume, pos);
   791               NS_HTML5_CONTINUE(stateloop);
   792             }
   793             case '\r': {
   794               appendLongStrBufCarriageReturn();
   795               NS_HTML5_BREAK(stateloop);
   796             }
   797             case '\n': {
   798               appendLongStrBufLineFeed();
   799               continue;
   800             }
   801             case '\0': {
   802               c = 0xfffd;
   803             }
   804             default: {
   805               appendLongStrBuf(c);
   806               continue;
   807             }
   808           }
   809         }
   810         attributevaluedoublequotedloop_end: ;
   811       }
   812       case NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_VALUE_QUOTED: {
   813         for (; ; ) {
   814           if (++pos == endPos) {
   815             NS_HTML5_BREAK(stateloop);
   816           }
   817           c = checkChar(buf, pos);
   818           switch(c) {
   819             case '\r': {
   820               silentCarriageReturn();
   821               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
   822               NS_HTML5_BREAK(stateloop);
   823             }
   824             case '\n': {
   825               silentLineFeed();
   826             }
   827             case ' ':
   828             case '\t':
   829             case '\f': {
   830               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
   831               NS_HTML5_CONTINUE(stateloop);
   832             }
   833             case '/': {
   834               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG, reconsume, pos);
   835               NS_HTML5_BREAK(afterattributevaluequotedloop);
   836             }
   837             case '>': {
   838               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
   839               if (shouldSuspend) {
   840                 NS_HTML5_BREAK(stateloop);
   841               }
   842               NS_HTML5_CONTINUE(stateloop);
   843             }
   844             default: {
   845               if (P::reportErrors) {
   846                 errNoSpaceBetweenAttributes();
   847               }
   848               reconsume = true;
   849               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
   850               NS_HTML5_CONTINUE(stateloop);
   851             }
   852           }
   853         }
   854         afterattributevaluequotedloop_end: ;
   855       }
   856       case NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG: {
   857         if (++pos == endPos) {
   858           NS_HTML5_BREAK(stateloop);
   859         }
   860         c = checkChar(buf, pos);
   861         switch(c) {
   862           case '>': {
   863             state = P::transition(mViewSource, emitCurrentTagToken(true, pos), reconsume, pos);
   864             if (shouldSuspend) {
   865               NS_HTML5_BREAK(stateloop);
   866             }
   867             NS_HTML5_CONTINUE(stateloop);
   868           }
   869           default: {
   870             if (P::reportErrors) {
   871               errSlashNotFollowedByGt();
   872             }
   873             reconsume = true;
   874             state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
   875             NS_HTML5_CONTINUE(stateloop);
   876           }
   877         }
   878       }
   879       case NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_UNQUOTED: {
   880         for (; ; ) {
   881           if (reconsume) {
   882             reconsume = false;
   883           } else {
   884             if (++pos == endPos) {
   885               NS_HTML5_BREAK(stateloop);
   886             }
   887             c = checkChar(buf, pos);
   888           }
   889           switch(c) {
   890             case '\r': {
   891               silentCarriageReturn();
   892               addAttributeWithValue();
   893               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
   894               NS_HTML5_BREAK(stateloop);
   895             }
   896             case '\n': {
   897               silentLineFeed();
   898             }
   899             case ' ':
   900             case '\t':
   901             case '\f': {
   902               addAttributeWithValue();
   903               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
   904               NS_HTML5_CONTINUE(stateloop);
   905             }
   906             case '&': {
   907               clearStrBufAndAppend(c);
   908               setAdditionalAndRememberAmpersandLocation('>');
   909               returnState = state;
   910               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE, reconsume, pos);
   911               NS_HTML5_CONTINUE(stateloop);
   912             }
   913             case '>': {
   914               addAttributeWithValue();
   915               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
   916               if (shouldSuspend) {
   917                 NS_HTML5_BREAK(stateloop);
   918               }
   919               NS_HTML5_CONTINUE(stateloop);
   920             }
   921             case '\0': {
   922               c = 0xfffd;
   923             }
   924             case '<':
   925             case '\"':
   926             case '\'':
   927             case '=':
   928             case '`': {
   929               if (P::reportErrors) {
   930                 errUnquotedAttributeValOrNull(c);
   931               }
   932             }
   933             default: {
   935               appendLongStrBuf(c);
   936               continue;
   937             }
   938           }
   939         }
   940       }
   941       case NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_NAME: {
   942         for (; ; ) {
   943           if (++pos == endPos) {
   944             NS_HTML5_BREAK(stateloop);
   945           }
   946           c = checkChar(buf, pos);
   947           switch(c) {
   948             case '\r': {
   949               silentCarriageReturn();
   950               NS_HTML5_BREAK(stateloop);
   951             }
   952             case '\n': {
   953               silentLineFeed();
   954             }
   955             case ' ':
   956             case '\t':
   957             case '\f': {
   958               continue;
   959             }
   960             case '/': {
   961               addAttributeWithoutValue();
   962               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG, reconsume, pos);
   963               NS_HTML5_CONTINUE(stateloop);
   964             }
   965             case '=': {
   966               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_VALUE, reconsume, pos);
   967               NS_HTML5_CONTINUE(stateloop);
   968             }
   969             case '>': {
   970               addAttributeWithoutValue();
   971               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
   972               if (shouldSuspend) {
   973                 NS_HTML5_BREAK(stateloop);
   974               }
   975               NS_HTML5_CONTINUE(stateloop);
   976             }
   977             case '\0': {
   978               c = 0xfffd;
   979             }
   980             case '\"':
   981             case '\'':
   982             case '<': {
   983               if (P::reportErrors) {
   984                 errQuoteOrLtInAttributeNameOrNull(c);
   985               }
   986             }
   987             default: {
   988               addAttributeWithoutValue();
   989               if (c >= 'A' && c <= 'Z') {
   990                 c += 0x20;
   991               }
   992               clearStrBufAndAppend(c);
   993               state = P::transition(mViewSource, NS_HTML5TOKENIZER_ATTRIBUTE_NAME, reconsume, pos);
   994               NS_HTML5_CONTINUE(stateloop);
   995             }
   996           }
   997         }
   998       }
   999       case NS_HTML5TOKENIZER_MARKUP_DECLARATION_OPEN: {
  1000         for (; ; ) {
  1001           if (++pos == endPos) {
  1002             NS_HTML5_BREAK(stateloop);
  1004           c = checkChar(buf, pos);
  1005           switch(c) {
  1006             case '-': {
  1007               clearLongStrBufAndAppend(c);
  1008               state = P::transition(mViewSource, NS_HTML5TOKENIZER_MARKUP_DECLARATION_HYPHEN, reconsume, pos);
  1009               NS_HTML5_BREAK(markupdeclarationopenloop);
  1011             case 'd':
  1012             case 'D': {
  1013               clearLongStrBufAndAppend(c);
  1014               index = 0;
  1015               state = P::transition(mViewSource, NS_HTML5TOKENIZER_MARKUP_DECLARATION_OCTYPE, reconsume, pos);
  1016               NS_HTML5_CONTINUE(stateloop);
  1018             case '[': {
  1019               if (tokenHandler->cdataSectionAllowed()) {
  1020                 clearLongStrBufAndAppend(c);
  1021                 index = 0;
  1022                 state = P::transition(mViewSource, NS_HTML5TOKENIZER_CDATA_START, reconsume, pos);
  1023                 NS_HTML5_CONTINUE(stateloop);
  1026             default: {
  1027               if (P::reportErrors) {
  1028                 errBogusComment();
  1030               clearLongStrBuf();
  1031               reconsume = true;
  1032               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  1033               NS_HTML5_CONTINUE(stateloop);
  1037         markupdeclarationopenloop_end: ;
  1039       case NS_HTML5TOKENIZER_MARKUP_DECLARATION_HYPHEN: {
  1040         for (; ; ) {
  1041           if (++pos == endPos) {
  1042             NS_HTML5_BREAK(stateloop);
  1044           c = checkChar(buf, pos);
  1045           switch(c) {
  1046             case '\0': {
  1047               NS_HTML5_BREAK(stateloop);
  1049             case '-': {
  1050               clearLongStrBuf();
  1051               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT_START, reconsume, pos);
  1052               NS_HTML5_BREAK(markupdeclarationhyphenloop);
  1054             default: {
  1055               if (P::reportErrors) {
  1056                 errBogusComment();
  1058               reconsume = true;
  1059               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  1060               NS_HTML5_CONTINUE(stateloop);
  1064         markupdeclarationhyphenloop_end: ;
  1066       case NS_HTML5TOKENIZER_COMMENT_START: {
  1067         for (; ; ) {
  1068           if (++pos == endPos) {
  1069             NS_HTML5_BREAK(stateloop);
  1071           c = checkChar(buf, pos);
  1072           switch(c) {
  1073             case '-': {
  1074               appendLongStrBuf(c);
  1075               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT_START_DASH, reconsume, pos);
  1076               NS_HTML5_CONTINUE(stateloop);
  1078             case '>': {
  1079               if (P::reportErrors) {
  1080                 errPrematureEndOfComment();
  1082               emitComment(0, pos);
  1083               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  1084               NS_HTML5_CONTINUE(stateloop);
  1086             case '\r': {
  1087               appendLongStrBufCarriageReturn();
  1088               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1089               NS_HTML5_BREAK(stateloop);
  1091             case '\n': {
  1092               appendLongStrBufLineFeed();
  1093               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1094               NS_HTML5_BREAK(commentstartloop);
  1096             case '\0': {
  1097               c = 0xfffd;
  1099             default: {
  1100               appendLongStrBuf(c);
  1101               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1102               NS_HTML5_BREAK(commentstartloop);
  1106         commentstartloop_end: ;
  1108       case NS_HTML5TOKENIZER_COMMENT: {
  1109         for (; ; ) {
  1110           if (++pos == endPos) {
  1111             NS_HTML5_BREAK(stateloop);
  1113           c = checkChar(buf, pos);
  1114           switch(c) {
  1115             case '-': {
  1116               appendLongStrBuf(c);
  1117               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT_END_DASH, reconsume, pos);
  1118               NS_HTML5_BREAK(commentloop);
  1120             case '\r': {
  1121               appendLongStrBufCarriageReturn();
  1122               NS_HTML5_BREAK(stateloop);
  1124             case '\n': {
  1125               appendLongStrBufLineFeed();
  1126               continue;
  1128             case '\0': {
  1129               c = 0xfffd;
  1131             default: {
  1132               appendLongStrBuf(c);
  1133               continue;
  1137         commentloop_end: ;
  1139       case NS_HTML5TOKENIZER_COMMENT_END_DASH: {
  1140         for (; ; ) {
  1141           if (++pos == endPos) {
  1142             NS_HTML5_BREAK(stateloop);
  1144           c = checkChar(buf, pos);
  1145           switch(c) {
  1146             case '-': {
  1147               appendLongStrBuf(c);
  1148               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT_END, reconsume, pos);
  1149               NS_HTML5_BREAK(commentenddashloop);
  1151             case '\r': {
  1152               appendLongStrBufCarriageReturn();
  1153               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1154               NS_HTML5_BREAK(stateloop);
  1156             case '\n': {
  1157               appendLongStrBufLineFeed();
  1158               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1159               NS_HTML5_CONTINUE(stateloop);
  1161             case '\0': {
  1162               c = 0xfffd;
  1164             default: {
  1165               appendLongStrBuf(c);
  1166               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1167               NS_HTML5_CONTINUE(stateloop);
  1171         commentenddashloop_end: ;
  1173       case NS_HTML5TOKENIZER_COMMENT_END: {
  1174         for (; ; ) {
  1175           if (++pos == endPos) {
  1176             NS_HTML5_BREAK(stateloop);
  1178           c = checkChar(buf, pos);
  1179           switch(c) {
  1180             case '>': {
  1181               emitComment(2, pos);
  1182               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  1183               NS_HTML5_CONTINUE(stateloop);
  1185             case '-': {
  1186               adjustDoubleHyphenAndAppendToLongStrBufAndErr(c);
  1187               continue;
  1189             case '\r': {
  1190               adjustDoubleHyphenAndAppendToLongStrBufCarriageReturn();
  1191               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1192               NS_HTML5_BREAK(stateloop);
  1194             case '\n': {
  1195               adjustDoubleHyphenAndAppendToLongStrBufLineFeed();
  1196               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1197               NS_HTML5_CONTINUE(stateloop);
  1199             case '!': {
  1200               if (P::reportErrors) {
  1201                 errHyphenHyphenBang();
  1203               appendLongStrBuf(c);
  1204               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT_END_BANG, reconsume, pos);
  1205               NS_HTML5_CONTINUE(stateloop);
  1207             case '\0': {
  1208               c = 0xfffd;
  1210             default: {
  1211               adjustDoubleHyphenAndAppendToLongStrBufAndErr(c);
  1212               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1213               NS_HTML5_CONTINUE(stateloop);
  1219       case NS_HTML5TOKENIZER_COMMENT_END_BANG: {
  1220         for (; ; ) {
  1221           if (++pos == endPos) {
  1222             NS_HTML5_BREAK(stateloop);
  1224           c = checkChar(buf, pos);
  1225           switch(c) {
  1226             case '>': {
  1227               emitComment(3, pos);
  1228               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  1229               NS_HTML5_CONTINUE(stateloop);
  1231             case '-': {
  1232               appendLongStrBuf(c);
  1233               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT_END_DASH, reconsume, pos);
  1234               NS_HTML5_CONTINUE(stateloop);
  1236             case '\r': {
  1237               appendLongStrBufCarriageReturn();
  1238               NS_HTML5_BREAK(stateloop);
  1240             case '\n': {
  1241               appendLongStrBufLineFeed();
  1242               continue;
  1244             case '\0': {
  1245               c = 0xfffd;
  1247             default: {
  1248               appendLongStrBuf(c);
  1249               state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1250               NS_HTML5_CONTINUE(stateloop);
  1255       case NS_HTML5TOKENIZER_COMMENT_START_DASH: {
  1256         if (++pos == endPos) {
  1257           NS_HTML5_BREAK(stateloop);
  1259         c = checkChar(buf, pos);
  1260         switch(c) {
  1261           case '-': {
  1262             appendLongStrBuf(c);
  1263             state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT_END, reconsume, pos);
  1264             NS_HTML5_CONTINUE(stateloop);
  1266           case '>': {
  1267             if (P::reportErrors) {
  1268               errPrematureEndOfComment();
  1270             emitComment(1, pos);
  1271             state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  1272             NS_HTML5_CONTINUE(stateloop);
  1274           case '\r': {
  1275             appendLongStrBufCarriageReturn();
  1276             state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1277             NS_HTML5_BREAK(stateloop);
  1279           case '\n': {
  1280             appendLongStrBufLineFeed();
  1281             state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1282             NS_HTML5_CONTINUE(stateloop);
  1284           case '\0': {
  1285             c = 0xfffd;
  1287           default: {
  1288             appendLongStrBuf(c);
  1289             state = P::transition(mViewSource, NS_HTML5TOKENIZER_COMMENT, reconsume, pos);
  1290             NS_HTML5_CONTINUE(stateloop);
  1294       case NS_HTML5TOKENIZER_CDATA_START: {
  1295         for (; ; ) {
  1296           if (++pos == endPos) {
  1297             NS_HTML5_BREAK(stateloop);
  1299           c = checkChar(buf, pos);
  1300           if (index < 6) {
  1301             if (c == nsHtml5Tokenizer::CDATA_LSQB[index]) {
  1302               appendLongStrBuf(c);
  1303             } else {
  1304               if (P::reportErrors) {
  1305                 errBogusComment();
  1307               reconsume = true;
  1308               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  1309               NS_HTML5_CONTINUE(stateloop);
  1311             index++;
  1312             continue;
  1313           } else {
  1314             cstart = pos;
  1315             reconsume = true;
  1316             state = P::transition(mViewSource, NS_HTML5TOKENIZER_CDATA_SECTION, reconsume, pos);
  1317             break;
  1321       case NS_HTML5TOKENIZER_CDATA_SECTION: {
  1322         for (; ; ) {
  1323           if (reconsume) {
  1324             reconsume = false;
  1325           } else {
  1326             if (++pos == endPos) {
  1327               NS_HTML5_BREAK(stateloop);
  1329             c = checkChar(buf, pos);
  1331           switch(c) {
  1332             case ']': {
  1333               flushChars(buf, pos);
  1334               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CDATA_RSQB, reconsume, pos);
  1335               NS_HTML5_BREAK(cdatasectionloop);
  1337             case '\0': {
  1338               emitReplacementCharacter(buf, pos);
  1339               continue;
  1341             case '\r': {
  1342               emitCarriageReturn(buf, pos);
  1343               NS_HTML5_BREAK(stateloop);
  1345             case '\n': {
  1346               silentLineFeed();
  1348             default: {
  1349               continue;
  1353         cdatasectionloop_end: ;
  1355       case NS_HTML5TOKENIZER_CDATA_RSQB: {
  1356         for (; ; ) {
  1357           if (++pos == endPos) {
  1358             NS_HTML5_BREAK(stateloop);
  1360           c = checkChar(buf, pos);
  1361           switch(c) {
  1362             case ']': {
  1363               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CDATA_RSQB_RSQB, reconsume, pos);
  1364               NS_HTML5_BREAK(cdatarsqb);
  1366             default: {
  1367               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
  1368               cstart = pos;
  1369               reconsume = true;
  1370               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CDATA_SECTION, reconsume, pos);
  1371               NS_HTML5_CONTINUE(stateloop);
  1375         cdatarsqb_end: ;
  1377       case NS_HTML5TOKENIZER_CDATA_RSQB_RSQB: {
  1378         for (; ; ) {
  1379           if (++pos == endPos) {
  1380             NS_HTML5_BREAK(stateloop);
  1382           c = checkChar(buf, pos);
  1383           switch(c) {
  1384             case ']': {
  1385               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
  1386               continue;
  1388             case '>': {
  1389               cstart = pos + 1;
  1390               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  1391               NS_HTML5_CONTINUE(stateloop);
  1393             default: {
  1394               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
  1395               cstart = pos;
  1396               reconsume = true;
  1397               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CDATA_SECTION, reconsume, pos);
  1398               NS_HTML5_CONTINUE(stateloop);
  1404       case NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_SINGLE_QUOTED: {
  1405         for (; ; ) {
  1406           if (reconsume) {
  1407             reconsume = false;
  1408           } else {
  1409             if (++pos == endPos) {
  1410               NS_HTML5_BREAK(stateloop);
  1412             c = checkChar(buf, pos);
  1414           switch(c) {
  1415             case '\'': {
  1416               addAttributeWithValue();
  1417               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_VALUE_QUOTED, reconsume, pos);
  1418               NS_HTML5_CONTINUE(stateloop);
  1420             case '&': {
  1421               clearStrBufAndAppend(c);
  1422               setAdditionalAndRememberAmpersandLocation('\'');
  1423               returnState = state;
  1424               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE, reconsume, pos);
  1425               NS_HTML5_BREAK(attributevaluesinglequotedloop);
  1427             case '\r': {
  1428               appendLongStrBufCarriageReturn();
  1429               NS_HTML5_BREAK(stateloop);
  1431             case '\n': {
  1432               appendLongStrBufLineFeed();
  1433               continue;
  1435             case '\0': {
  1436               c = 0xfffd;
  1438             default: {
  1439               appendLongStrBuf(c);
  1440               continue;
  1444         attributevaluesinglequotedloop_end: ;
  1446       case NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE: {
  1447         if (++pos == endPos) {
  1448           NS_HTML5_BREAK(stateloop);
  1450         c = checkChar(buf, pos);
  1451         if (c == '\0') {
  1452           NS_HTML5_BREAK(stateloop);
  1454         switch(c) {
  1455           case ' ':
  1456           case '\t':
  1457           case '\n':
  1458           case '\r':
  1459           case '\f':
  1460           case '<':
  1461           case '&': {
  1462             emitOrAppendStrBuf(returnState);
  1463             if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1464               cstart = pos;
  1466             reconsume = true;
  1467             state = P::transition(mViewSource, returnState, reconsume, pos);
  1468             NS_HTML5_CONTINUE(stateloop);
  1470           case '#': {
  1471             appendStrBuf('#');
  1472             state = P::transition(mViewSource, NS_HTML5TOKENIZER_CONSUME_NCR, reconsume, pos);
  1473             NS_HTML5_CONTINUE(stateloop);
  1475           default: {
  1476             if (c == additional) {
  1477               emitOrAppendStrBuf(returnState);
  1478               reconsume = true;
  1479               state = P::transition(mViewSource, returnState, reconsume, pos);
  1480               NS_HTML5_CONTINUE(stateloop);
  1482             if (c >= 'a' && c <= 'z') {
  1483               firstCharKey = c - 'a' + 26;
  1484             } else if (c >= 'A' && c <= 'Z') {
  1485               firstCharKey = c - 'A';
  1486             } else {
  1487               if (P::reportErrors) {
  1488                 errNoNamedCharacterMatch();
  1490               emitOrAppendStrBuf(returnState);
  1491               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1492                 cstart = pos;
  1494               reconsume = true;
  1495               state = P::transition(mViewSource, returnState, reconsume, pos);
  1496               NS_HTML5_CONTINUE(stateloop);
  1498             appendStrBuf(c);
  1499             state = P::transition(mViewSource, NS_HTML5TOKENIZER_CHARACTER_REFERENCE_HILO_LOOKUP, reconsume, pos);
  1503       case NS_HTML5TOKENIZER_CHARACTER_REFERENCE_HILO_LOOKUP: {
  1505           if (++pos == endPos) {
  1506             NS_HTML5_BREAK(stateloop);
  1508           c = checkChar(buf, pos);
  1509           if (c == '\0') {
  1510             NS_HTML5_BREAK(stateloop);
  1512           int32_t hilo = 0;
  1513           if (c <= 'z') {
  1514             const int32_t* row = nsHtml5NamedCharactersAccel::HILO_ACCEL[c];
  1515             if (row) {
  1516               hilo = row[firstCharKey];
  1519           if (!hilo) {
  1520             if (P::reportErrors) {
  1521               errNoNamedCharacterMatch();
  1523             emitOrAppendStrBuf(returnState);
  1524             if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1525               cstart = pos;
  1527             reconsume = true;
  1528             state = P::transition(mViewSource, returnState, reconsume, pos);
  1529             NS_HTML5_CONTINUE(stateloop);
  1531           appendStrBuf(c);
  1532           lo = hilo & 0xFFFF;
  1533           hi = hilo >> 16;
  1534           entCol = -1;
  1535           candidate = -1;
  1536           strBufMark = 0;
  1537           state = P::transition(mViewSource, NS_HTML5TOKENIZER_CHARACTER_REFERENCE_TAIL, reconsume, pos);
  1540       case NS_HTML5TOKENIZER_CHARACTER_REFERENCE_TAIL: {
  1541         for (; ; ) {
  1542           if (++pos == endPos) {
  1543             NS_HTML5_BREAK(stateloop);
  1545           c = checkChar(buf, pos);
  1546           if (c == '\0') {
  1547             NS_HTML5_BREAK(stateloop);
  1549           entCol++;
  1550           for (; ; ) {
  1551             if (hi < lo) {
  1552               NS_HTML5_BREAK(outer);
  1554             if (entCol == nsHtml5NamedCharacters::NAMES[lo].length()) {
  1555               candidate = lo;
  1556               strBufMark = strBufLen;
  1557               lo++;
  1558             } else if (entCol > nsHtml5NamedCharacters::NAMES[lo].length()) {
  1559               NS_HTML5_BREAK(outer);
  1560             } else if (c > nsHtml5NamedCharacters::NAMES[lo].charAt(entCol)) {
  1561               lo++;
  1562             } else {
  1563               NS_HTML5_BREAK(loloop);
  1566           loloop_end: ;
  1567           for (; ; ) {
  1568             if (hi < lo) {
  1569               NS_HTML5_BREAK(outer);
  1571             if (entCol == nsHtml5NamedCharacters::NAMES[hi].length()) {
  1572               NS_HTML5_BREAK(hiloop);
  1574             if (entCol > nsHtml5NamedCharacters::NAMES[hi].length()) {
  1575               NS_HTML5_BREAK(outer);
  1576             } else if (c < nsHtml5NamedCharacters::NAMES[hi].charAt(entCol)) {
  1577               hi--;
  1578             } else {
  1579               NS_HTML5_BREAK(hiloop);
  1582           hiloop_end: ;
  1583           if (c == ';') {
  1584             if (entCol + 1 == nsHtml5NamedCharacters::NAMES[lo].length()) {
  1585               candidate = lo;
  1586               strBufMark = strBufLen;
  1588             NS_HTML5_BREAK(outer);
  1590           if (hi < lo) {
  1591             NS_HTML5_BREAK(outer);
  1593           appendStrBuf(c);
  1594           continue;
  1596         outer_end: ;
  1597         if (candidate == -1) {
  1598           if (P::reportErrors) {
  1599             errNoNamedCharacterMatch();
  1601           emitOrAppendStrBuf(returnState);
  1602           if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1603             cstart = pos;
  1605           reconsume = true;
  1606           state = P::transition(mViewSource, returnState, reconsume, pos);
  1607           NS_HTML5_CONTINUE(stateloop);
  1608         } else {
  1609           const nsHtml5CharacterName& candidateName = nsHtml5NamedCharacters::NAMES[candidate];
  1610           if (!candidateName.length() || candidateName.charAt(candidateName.length() - 1) != ';') {
  1611             if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1612               char16_t ch;
  1613               if (strBufMark == strBufLen) {
  1614                 ch = c;
  1615               } else {
  1616                 ch = strBuf[strBufMark];
  1618               if (ch == '=' || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
  1619                 if (P::reportErrors) {
  1620                   errNoNamedCharacterMatch();
  1622                 appendStrBufToLongStrBuf();
  1623                 reconsume = true;
  1624                 state = P::transition(mViewSource, returnState, reconsume, pos);
  1625                 NS_HTML5_CONTINUE(stateloop);
  1628             if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1629               if (P::reportErrors) {
  1630                 errUnescapedAmpersandInterpretedAsCharacterReference();
  1632             } else {
  1633               if (P::reportErrors) {
  1634                 errNotSemicolonTerminated();
  1638           P::completedNamedCharacterReference(mViewSource);
  1639           const char16_t* val = nsHtml5NamedCharacters::VALUES[candidate];
  1640           if (!val[1]) {
  1641             emitOrAppendOne(val, returnState);
  1642           } else {
  1643             emitOrAppendTwo(val, returnState);
  1645           if (strBufMark < strBufLen) {
  1646             if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1647               for (int32_t i = strBufMark; i < strBufLen; i++) {
  1648                 appendLongStrBuf(strBuf[i]);
  1650             } else {
  1651               tokenHandler->characters(strBuf, strBufMark, strBufLen - strBufMark);
  1654           bool earlyBreak = (c == ';' && strBufMark == strBufLen);
  1655           if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1656             cstart = earlyBreak ? pos + 1 : pos;
  1658           reconsume = !earlyBreak;
  1659           state = P::transition(mViewSource, returnState, reconsume, pos);
  1660           NS_HTML5_CONTINUE(stateloop);
  1663       case NS_HTML5TOKENIZER_CONSUME_NCR: {
  1664         if (++pos == endPos) {
  1665           NS_HTML5_BREAK(stateloop);
  1667         c = checkChar(buf, pos);
  1668         prevValue = -1;
  1669         value = 0;
  1670         seenDigits = false;
  1671         switch(c) {
  1672           case 'x':
  1673           case 'X': {
  1674             appendStrBuf(c);
  1675             state = P::transition(mViewSource, NS_HTML5TOKENIZER_HEX_NCR_LOOP, reconsume, pos);
  1676             NS_HTML5_CONTINUE(stateloop);
  1678           default: {
  1679             reconsume = true;
  1680             state = P::transition(mViewSource, NS_HTML5TOKENIZER_DECIMAL_NRC_LOOP, reconsume, pos);
  1684       case NS_HTML5TOKENIZER_DECIMAL_NRC_LOOP: {
  1685         for (; ; ) {
  1686           if (reconsume) {
  1687             reconsume = false;
  1688           } else {
  1689             if (++pos == endPos) {
  1690               NS_HTML5_BREAK(stateloop);
  1692             c = checkChar(buf, pos);
  1694           if (value < prevValue) {
  1695             value = 0x110000;
  1697           prevValue = value;
  1698           if (c >= '0' && c <= '9') {
  1699             seenDigits = true;
  1700             value *= 10;
  1701             value += c - '0';
  1702             continue;
  1703           } else if (c == ';') {
  1704             if (seenDigits) {
  1705               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1706                 cstart = pos + 1;
  1708               state = P::transition(mViewSource, NS_HTML5TOKENIZER_HANDLE_NCR_VALUE, reconsume, pos);
  1709               NS_HTML5_BREAK(decimalloop);
  1710             } else {
  1711               if (P::reportErrors) {
  1712                 errNoDigitsInNCR();
  1714               appendStrBuf(';');
  1715               emitOrAppendStrBuf(returnState);
  1716               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1717                 cstart = pos + 1;
  1719               state = P::transition(mViewSource, returnState, reconsume, pos);
  1720               NS_HTML5_CONTINUE(stateloop);
  1722           } else {
  1723             if (!seenDigits) {
  1724               if (P::reportErrors) {
  1725                 errNoDigitsInNCR();
  1727               emitOrAppendStrBuf(returnState);
  1728               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1729                 cstart = pos;
  1731               reconsume = true;
  1732               state = P::transition(mViewSource, returnState, reconsume, pos);
  1733               NS_HTML5_CONTINUE(stateloop);
  1734             } else {
  1735               if (P::reportErrors) {
  1736                 errCharRefLacksSemicolon();
  1738               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1739                 cstart = pos;
  1741               reconsume = true;
  1742               state = P::transition(mViewSource, NS_HTML5TOKENIZER_HANDLE_NCR_VALUE, reconsume, pos);
  1743               NS_HTML5_BREAK(decimalloop);
  1747         decimalloop_end: ;
  1749       case NS_HTML5TOKENIZER_HANDLE_NCR_VALUE: {
  1750         handleNcrValue(returnState);
  1751         state = P::transition(mViewSource, returnState, reconsume, pos);
  1752         NS_HTML5_CONTINUE(stateloop);
  1754       case NS_HTML5TOKENIZER_HEX_NCR_LOOP: {
  1755         for (; ; ) {
  1756           if (++pos == endPos) {
  1757             NS_HTML5_BREAK(stateloop);
  1759           c = checkChar(buf, pos);
  1760           if (value < prevValue) {
  1761             value = 0x110000;
  1763           prevValue = value;
  1764           if (c >= '0' && c <= '9') {
  1765             seenDigits = true;
  1766             value *= 16;
  1767             value += c - '0';
  1768             continue;
  1769           } else if (c >= 'A' && c <= 'F') {
  1770             seenDigits = true;
  1771             value *= 16;
  1772             value += c - 'A' + 10;
  1773             continue;
  1774           } else if (c >= 'a' && c <= 'f') {
  1775             seenDigits = true;
  1776             value *= 16;
  1777             value += c - 'a' + 10;
  1778             continue;
  1779           } else if (c == ';') {
  1780             if (seenDigits) {
  1781               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1782                 cstart = pos + 1;
  1784               state = P::transition(mViewSource, NS_HTML5TOKENIZER_HANDLE_NCR_VALUE, reconsume, pos);
  1785               NS_HTML5_CONTINUE(stateloop);
  1786             } else {
  1787               if (P::reportErrors) {
  1788                 errNoDigitsInNCR();
  1790               appendStrBuf(';');
  1791               emitOrAppendStrBuf(returnState);
  1792               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1793                 cstart = pos + 1;
  1795               state = P::transition(mViewSource, returnState, reconsume, pos);
  1796               NS_HTML5_CONTINUE(stateloop);
  1798           } else {
  1799             if (!seenDigits) {
  1800               if (P::reportErrors) {
  1801                 errNoDigitsInNCR();
  1803               emitOrAppendStrBuf(returnState);
  1804               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1805                 cstart = pos;
  1807               reconsume = true;
  1808               state = P::transition(mViewSource, returnState, reconsume, pos);
  1809               NS_HTML5_CONTINUE(stateloop);
  1810             } else {
  1811               if (P::reportErrors) {
  1812                 errCharRefLacksSemicolon();
  1814               if (!(returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  1815                 cstart = pos;
  1817               reconsume = true;
  1818               state = P::transition(mViewSource, NS_HTML5TOKENIZER_HANDLE_NCR_VALUE, reconsume, pos);
  1819               NS_HTML5_CONTINUE(stateloop);
  1824       case NS_HTML5TOKENIZER_PLAINTEXT: {
  1825         for (; ; ) {
  1826           if (reconsume) {
  1827             reconsume = false;
  1828           } else {
  1829             if (++pos == endPos) {
  1830               NS_HTML5_BREAK(stateloop);
  1832             c = checkChar(buf, pos);
  1834           switch(c) {
  1835             case '\0': {
  1836               emitPlaintextReplacementCharacter(buf, pos);
  1837               continue;
  1839             case '\r': {
  1840               emitCarriageReturn(buf, pos);
  1841               NS_HTML5_BREAK(stateloop);
  1843             case '\n': {
  1844               silentLineFeed();
  1846             default: {
  1847               continue;
  1853       case NS_HTML5TOKENIZER_CLOSE_TAG_OPEN: {
  1854         if (++pos == endPos) {
  1855           NS_HTML5_BREAK(stateloop);
  1857         c = checkChar(buf, pos);
  1858         switch(c) {
  1859           case '>': {
  1860             if (P::reportErrors) {
  1861               errLtSlashGt();
  1863             cstart = pos + 1;
  1864             state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  1865             NS_HTML5_CONTINUE(stateloop);
  1867           case '\r': {
  1868             silentCarriageReturn();
  1869             if (P::reportErrors) {
  1870               errGarbageAfterLtSlash();
  1872             clearLongStrBufAndAppend('\n');
  1873             state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  1874             NS_HTML5_BREAK(stateloop);
  1876           case '\n': {
  1877             silentLineFeed();
  1878             if (P::reportErrors) {
  1879               errGarbageAfterLtSlash();
  1881             clearLongStrBufAndAppend('\n');
  1882             state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  1883             NS_HTML5_CONTINUE(stateloop);
  1885           case '\0': {
  1886             c = 0xfffd;
  1888           default: {
  1889             if (c >= 'A' && c <= 'Z') {
  1890               c += 0x20;
  1892             if (c >= 'a' && c <= 'z') {
  1893               endTag = true;
  1894               clearStrBufAndAppend(c);
  1895               state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos);
  1896               NS_HTML5_CONTINUE(stateloop);
  1897             } else {
  1898               if (P::reportErrors) {
  1899                 errGarbageAfterLtSlash();
  1901               clearLongStrBufAndAppend(c);
  1902               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  1903               NS_HTML5_CONTINUE(stateloop);
  1908       case NS_HTML5TOKENIZER_RCDATA: {
  1909         for (; ; ) {
  1910           if (reconsume) {
  1911             reconsume = false;
  1912           } else {
  1913             if (++pos == endPos) {
  1914               NS_HTML5_BREAK(stateloop);
  1916             c = checkChar(buf, pos);
  1918           switch(c) {
  1919             case '&': {
  1920               flushChars(buf, pos);
  1921               clearStrBufAndAppend(c);
  1922               additional = '\0';
  1923               returnState = state;
  1924               state = P::transition(mViewSource, NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE, reconsume, pos);
  1925               NS_HTML5_CONTINUE(stateloop);
  1927             case '<': {
  1928               flushChars(buf, pos);
  1929               returnState = state;
  1930               state = P::transition(mViewSource, NS_HTML5TOKENIZER_RAWTEXT_RCDATA_LESS_THAN_SIGN, reconsume, pos);
  1931               NS_HTML5_CONTINUE(stateloop);
  1933             case '\0': {
  1934               emitReplacementCharacter(buf, pos);
  1935               continue;
  1937             case '\r': {
  1938               emitCarriageReturn(buf, pos);
  1939               NS_HTML5_BREAK(stateloop);
  1941             case '\n': {
  1942               silentLineFeed();
  1944             default: {
  1945               continue;
  1951       case NS_HTML5TOKENIZER_RAWTEXT: {
  1952         for (; ; ) {
  1953           if (reconsume) {
  1954             reconsume = false;
  1955           } else {
  1956             if (++pos == endPos) {
  1957               NS_HTML5_BREAK(stateloop);
  1959             c = checkChar(buf, pos);
  1961           switch(c) {
  1962             case '<': {
  1963               flushChars(buf, pos);
  1964               returnState = state;
  1965               state = P::transition(mViewSource, NS_HTML5TOKENIZER_RAWTEXT_RCDATA_LESS_THAN_SIGN, reconsume, pos);
  1966               NS_HTML5_BREAK(rawtextloop);
  1968             case '\0': {
  1969               emitReplacementCharacter(buf, pos);
  1970               continue;
  1972             case '\r': {
  1973               emitCarriageReturn(buf, pos);
  1974               NS_HTML5_BREAK(stateloop);
  1976             case '\n': {
  1977               silentLineFeed();
  1979             default: {
  1980               continue;
  1984         rawtextloop_end: ;
  1986       case NS_HTML5TOKENIZER_RAWTEXT_RCDATA_LESS_THAN_SIGN: {
  1987         for (; ; ) {
  1988           if (++pos == endPos) {
  1989             NS_HTML5_BREAK(stateloop);
  1991           c = checkChar(buf, pos);
  1992           switch(c) {
  1993             case '/': {
  1994               index = 0;
  1995               clearStrBuf();
  1996               state = P::transition(mViewSource, NS_HTML5TOKENIZER_NON_DATA_END_TAG_NAME, reconsume, pos);
  1997               NS_HTML5_BREAK(rawtextrcdatalessthansignloop);
  1999             default: {
  2000               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
  2001               cstart = pos;
  2002               reconsume = true;
  2003               state = P::transition(mViewSource, returnState, reconsume, pos);
  2004               NS_HTML5_CONTINUE(stateloop);
  2008         rawtextrcdatalessthansignloop_end: ;
  2010       case NS_HTML5TOKENIZER_NON_DATA_END_TAG_NAME: {
  2011         for (; ; ) {
  2012           if (++pos == endPos) {
  2013             NS_HTML5_BREAK(stateloop);
  2015           c = checkChar(buf, pos);
  2016           if (index < endTagExpectationAsArray.length) {
  2017             char16_t e = endTagExpectationAsArray[index];
  2018             char16_t folded = c;
  2019             if (c >= 'A' && c <= 'Z') {
  2020               folded += 0x20;
  2022             if (folded != e) {
  2023               tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
  2024               emitStrBuf();
  2025               cstart = pos;
  2026               reconsume = true;
  2027               state = P::transition(mViewSource, returnState, reconsume, pos);
  2028               NS_HTML5_CONTINUE(stateloop);
  2030             appendStrBuf(c);
  2031             index++;
  2032             continue;
  2033           } else {
  2034             endTag = true;
  2035             tagName = endTagExpectation;
  2036             switch(c) {
  2037               case '\r': {
  2038                 silentCarriageReturn();
  2039                 state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
  2040                 NS_HTML5_BREAK(stateloop);
  2042               case '\n': {
  2043                 silentLineFeed();
  2045               case ' ':
  2046               case '\t':
  2047               case '\f': {
  2048                 state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME, reconsume, pos);
  2049                 NS_HTML5_CONTINUE(stateloop);
  2051               case '/': {
  2052                 state = P::transition(mViewSource, NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG, reconsume, pos);
  2053                 NS_HTML5_CONTINUE(stateloop);
  2055               case '>': {
  2056                 state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
  2057                 if (shouldSuspend) {
  2058                   NS_HTML5_BREAK(stateloop);
  2060                 NS_HTML5_CONTINUE(stateloop);
  2062               default: {
  2063                 tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
  2064                 emitStrBuf();
  2065                 if (c == '\0') {
  2066                   emitReplacementCharacter(buf, pos);
  2067                 } else {
  2068                   cstart = pos;
  2070                 state = P::transition(mViewSource, returnState, reconsume, pos);
  2071                 NS_HTML5_CONTINUE(stateloop);
  2077       case NS_HTML5TOKENIZER_BOGUS_COMMENT: {
  2078         for (; ; ) {
  2079           if (reconsume) {
  2080             reconsume = false;
  2081           } else {
  2082             if (++pos == endPos) {
  2083               NS_HTML5_BREAK(stateloop);
  2085             c = checkChar(buf, pos);
  2087           switch(c) {
  2088             case '>': {
  2089               emitComment(0, pos);
  2090               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  2091               NS_HTML5_CONTINUE(stateloop);
  2093             case '-': {
  2094               appendLongStrBuf(c);
  2095               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT_HYPHEN, reconsume, pos);
  2096               NS_HTML5_BREAK(boguscommentloop);
  2098             case '\r': {
  2099               appendLongStrBufCarriageReturn();
  2100               NS_HTML5_BREAK(stateloop);
  2102             case '\n': {
  2103               appendLongStrBufLineFeed();
  2104               continue;
  2106             case '\0': {
  2107               c = 0xfffd;
  2109             default: {
  2110               appendLongStrBuf(c);
  2111               continue;
  2115         boguscommentloop_end: ;
  2117       case NS_HTML5TOKENIZER_BOGUS_COMMENT_HYPHEN: {
  2118         boguscommenthyphenloop: for (; ; ) {
  2119           if (++pos == endPos) {
  2120             NS_HTML5_BREAK(stateloop);
  2122           c = checkChar(buf, pos);
  2123           switch(c) {
  2124             case '>': {
  2125               emitComment(0, pos);
  2126               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  2127               NS_HTML5_CONTINUE(stateloop);
  2129             case '-': {
  2130               appendSecondHyphenToBogusComment();
  2131               NS_HTML5_CONTINUE(boguscommenthyphenloop);
  2133             case '\r': {
  2134               appendLongStrBufCarriageReturn();
  2135               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  2136               NS_HTML5_BREAK(stateloop);
  2138             case '\n': {
  2139               appendLongStrBufLineFeed();
  2140               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  2141               NS_HTML5_CONTINUE(stateloop);
  2143             case '\0': {
  2144               c = 0xfffd;
  2146             default: {
  2147               appendLongStrBuf(c);
  2148               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  2149               NS_HTML5_CONTINUE(stateloop);
  2155       case NS_HTML5TOKENIZER_SCRIPT_DATA: {
  2156         for (; ; ) {
  2157           if (reconsume) {
  2158             reconsume = false;
  2159           } else {
  2160             if (++pos == endPos) {
  2161               NS_HTML5_BREAK(stateloop);
  2163             c = checkChar(buf, pos);
  2165           switch(c) {
  2166             case '<': {
  2167               flushChars(buf, pos);
  2168               returnState = state;
  2169               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_LESS_THAN_SIGN, reconsume, pos);
  2170               NS_HTML5_BREAK(scriptdataloop);
  2172             case '\0': {
  2173               emitReplacementCharacter(buf, pos);
  2174               continue;
  2176             case '\r': {
  2177               emitCarriageReturn(buf, pos);
  2178               NS_HTML5_BREAK(stateloop);
  2180             case '\n': {
  2181               silentLineFeed();
  2183             default: {
  2184               continue;
  2188         scriptdataloop_end: ;
  2190       case NS_HTML5TOKENIZER_SCRIPT_DATA_LESS_THAN_SIGN: {
  2191         for (; ; ) {
  2192           if (++pos == endPos) {
  2193             NS_HTML5_BREAK(stateloop);
  2195           c = checkChar(buf, pos);
  2196           switch(c) {
  2197             case '/': {
  2198               index = 0;
  2199               clearStrBuf();
  2200               state = P::transition(mViewSource, NS_HTML5TOKENIZER_NON_DATA_END_TAG_NAME, reconsume, pos);
  2201               NS_HTML5_CONTINUE(stateloop);
  2203             case '!': {
  2204               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
  2205               cstart = pos;
  2206               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPE_START, reconsume, pos);
  2207               NS_HTML5_BREAK(scriptdatalessthansignloop);
  2209             default: {
  2210               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
  2211               cstart = pos;
  2212               reconsume = true;
  2213               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA, reconsume, pos);
  2214               NS_HTML5_CONTINUE(stateloop);
  2218         scriptdatalessthansignloop_end: ;
  2220       case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPE_START: {
  2221         for (; ; ) {
  2222           if (++pos == endPos) {
  2223             NS_HTML5_BREAK(stateloop);
  2225           c = checkChar(buf, pos);
  2226           switch(c) {
  2227             case '-': {
  2228               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPE_START_DASH, reconsume, pos);
  2229               NS_HTML5_BREAK(scriptdataescapestartloop);
  2231             default: {
  2232               reconsume = true;
  2233               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA, reconsume, pos);
  2234               NS_HTML5_CONTINUE(stateloop);
  2238         scriptdataescapestartloop_end: ;
  2240       case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPE_START_DASH: {
  2241         for (; ; ) {
  2242           if (++pos == endPos) {
  2243             NS_HTML5_BREAK(stateloop);
  2245           c = checkChar(buf, pos);
  2246           switch(c) {
  2247             case '-': {
  2248               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_DASH_DASH, reconsume, pos);
  2249               NS_HTML5_BREAK(scriptdataescapestartdashloop);
  2251             default: {
  2252               reconsume = true;
  2253               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA, reconsume, pos);
  2254               NS_HTML5_CONTINUE(stateloop);
  2258         scriptdataescapestartdashloop_end: ;
  2260       case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_DASH_DASH: {
  2261         for (; ; ) {
  2262           if (++pos == endPos) {
  2263             NS_HTML5_BREAK(stateloop);
  2265           c = checkChar(buf, pos);
  2266           switch(c) {
  2267             case '-': {
  2268               continue;
  2270             case '<': {
  2271               flushChars(buf, pos);
  2272               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
  2273               NS_HTML5_CONTINUE(stateloop);
  2275             case '>': {
  2276               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA, reconsume, pos);
  2277               NS_HTML5_CONTINUE(stateloop);
  2279             case '\0': {
  2280               emitReplacementCharacter(buf, pos);
  2281               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2282               NS_HTML5_BREAK(scriptdataescapeddashdashloop);
  2284             case '\r': {
  2285               emitCarriageReturn(buf, pos);
  2286               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2287               NS_HTML5_BREAK(stateloop);
  2289             case '\n': {
  2290               silentLineFeed();
  2292             default: {
  2293               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2294               NS_HTML5_BREAK(scriptdataescapeddashdashloop);
  2298         scriptdataescapeddashdashloop_end: ;
  2300       case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED: {
  2301         for (; ; ) {
  2302           if (reconsume) {
  2303             reconsume = false;
  2304           } else {
  2305             if (++pos == endPos) {
  2306               NS_HTML5_BREAK(stateloop);
  2308             c = checkChar(buf, pos);
  2310           switch(c) {
  2311             case '-': {
  2312               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_DASH, reconsume, pos);
  2313               NS_HTML5_BREAK(scriptdataescapedloop);
  2315             case '<': {
  2316               flushChars(buf, pos);
  2317               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
  2318               NS_HTML5_CONTINUE(stateloop);
  2320             case '\0': {
  2321               emitReplacementCharacter(buf, pos);
  2322               continue;
  2324             case '\r': {
  2325               emitCarriageReturn(buf, pos);
  2326               NS_HTML5_BREAK(stateloop);
  2328             case '\n': {
  2329               silentLineFeed();
  2331             default: {
  2332               continue;
  2336         scriptdataescapedloop_end: ;
  2338       case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_DASH: {
  2339         for (; ; ) {
  2340           if (++pos == endPos) {
  2341             NS_HTML5_BREAK(stateloop);
  2343           c = checkChar(buf, pos);
  2344           switch(c) {
  2345             case '-': {
  2346               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_DASH_DASH, reconsume, pos);
  2347               NS_HTML5_CONTINUE(stateloop);
  2349             case '<': {
  2350               flushChars(buf, pos);
  2351               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
  2352               NS_HTML5_BREAK(scriptdataescapeddashloop);
  2354             case '\0': {
  2355               emitReplacementCharacter(buf, pos);
  2356               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2357               NS_HTML5_CONTINUE(stateloop);
  2359             case '\r': {
  2360               emitCarriageReturn(buf, pos);
  2361               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2362               NS_HTML5_BREAK(stateloop);
  2364             case '\n': {
  2365               silentLineFeed();
  2367             default: {
  2368               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2369               NS_HTML5_CONTINUE(stateloop);
  2373         scriptdataescapeddashloop_end: ;
  2375       case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
  2376         for (; ; ) {
  2377           if (++pos == endPos) {
  2378             NS_HTML5_BREAK(stateloop);
  2380           c = checkChar(buf, pos);
  2381           switch(c) {
  2382             case '/': {
  2383               index = 0;
  2384               clearStrBuf();
  2385               returnState = NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED;
  2386               state = P::transition(mViewSource, NS_HTML5TOKENIZER_NON_DATA_END_TAG_NAME, reconsume, pos);
  2387               NS_HTML5_CONTINUE(stateloop);
  2389             case 'S':
  2390             case 's': {
  2391               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
  2392               cstart = pos;
  2393               index = 1;
  2394               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPE_START, reconsume, pos);
  2395               NS_HTML5_BREAK(scriptdataescapedlessthanloop);
  2397             default: {
  2398               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
  2399               cstart = pos;
  2400               reconsume = true;
  2401               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2402               NS_HTML5_CONTINUE(stateloop);
  2406         scriptdataescapedlessthanloop_end: ;
  2408       case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPE_START: {
  2409         for (; ; ) {
  2410           if (++pos == endPos) {
  2411             NS_HTML5_BREAK(stateloop);
  2413           c = checkChar(buf, pos);
  2414           MOZ_ASSERT(index > 0);
  2415           if (index < 6) {
  2416             char16_t folded = c;
  2417             if (c >= 'A' && c <= 'Z') {
  2418               folded += 0x20;
  2420             if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
  2421               reconsume = true;
  2422               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2423               NS_HTML5_CONTINUE(stateloop);
  2425             index++;
  2426             continue;
  2428           switch(c) {
  2429             case '\r': {
  2430               emitCarriageReturn(buf, pos);
  2431               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2432               NS_HTML5_BREAK(stateloop);
  2434             case '\n': {
  2435               silentLineFeed();
  2437             case ' ':
  2438             case '\t':
  2439             case '\f':
  2440             case '/':
  2441             case '>': {
  2442               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2443               NS_HTML5_BREAK(scriptdatadoubleescapestartloop);
  2445             default: {
  2446               reconsume = true;
  2447               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2448               NS_HTML5_CONTINUE(stateloop);
  2452         scriptdatadoubleescapestartloop_end: ;
  2454       case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED: {
  2455         for (; ; ) {
  2456           if (reconsume) {
  2457             reconsume = false;
  2458           } else {
  2459             if (++pos == endPos) {
  2460               NS_HTML5_BREAK(stateloop);
  2462             c = checkChar(buf, pos);
  2464           switch(c) {
  2465             case '-': {
  2466               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_DASH, reconsume, pos);
  2467               NS_HTML5_BREAK(scriptdatadoubleescapedloop);
  2469             case '<': {
  2470               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
  2471               NS_HTML5_CONTINUE(stateloop);
  2473             case '\0': {
  2474               emitReplacementCharacter(buf, pos);
  2475               continue;
  2477             case '\r': {
  2478               emitCarriageReturn(buf, pos);
  2479               NS_HTML5_BREAK(stateloop);
  2481             case '\n': {
  2482               silentLineFeed();
  2484             default: {
  2485               continue;
  2489         scriptdatadoubleescapedloop_end: ;
  2491       case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_DASH: {
  2492         for (; ; ) {
  2493           if (++pos == endPos) {
  2494             NS_HTML5_BREAK(stateloop);
  2496           c = checkChar(buf, pos);
  2497           switch(c) {
  2498             case '-': {
  2499               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH, reconsume, pos);
  2500               NS_HTML5_BREAK(scriptdatadoubleescapeddashloop);
  2502             case '<': {
  2503               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
  2504               NS_HTML5_CONTINUE(stateloop);
  2506             case '\0': {
  2507               emitReplacementCharacter(buf, pos);
  2508               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2509               NS_HTML5_CONTINUE(stateloop);
  2511             case '\r': {
  2512               emitCarriageReturn(buf, pos);
  2513               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2514               NS_HTML5_BREAK(stateloop);
  2516             case '\n': {
  2517               silentLineFeed();
  2519             default: {
  2520               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2521               NS_HTML5_CONTINUE(stateloop);
  2525         scriptdatadoubleescapeddashloop_end: ;
  2527       case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH: {
  2528         for (; ; ) {
  2529           if (++pos == endPos) {
  2530             NS_HTML5_BREAK(stateloop);
  2532           c = checkChar(buf, pos);
  2533           switch(c) {
  2534             case '-': {
  2535               continue;
  2537             case '<': {
  2538               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
  2539               NS_HTML5_BREAK(scriptdatadoubleescapeddashdashloop);
  2541             case '>': {
  2542               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA, reconsume, pos);
  2543               NS_HTML5_CONTINUE(stateloop);
  2545             case '\0': {
  2546               emitReplacementCharacter(buf, pos);
  2547               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2548               NS_HTML5_CONTINUE(stateloop);
  2550             case '\r': {
  2551               emitCarriageReturn(buf, pos);
  2552               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2553               NS_HTML5_BREAK(stateloop);
  2555             case '\n': {
  2556               silentLineFeed();
  2558             default: {
  2559               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2560               NS_HTML5_CONTINUE(stateloop);
  2564         scriptdatadoubleescapeddashdashloop_end: ;
  2566       case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN: {
  2567         for (; ; ) {
  2568           if (++pos == endPos) {
  2569             NS_HTML5_BREAK(stateloop);
  2571           c = checkChar(buf, pos);
  2572           switch(c) {
  2573             case '/': {
  2574               index = 0;
  2575               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPE_END, reconsume, pos);
  2576               NS_HTML5_BREAK(scriptdatadoubleescapedlessthanloop);
  2578             default: {
  2579               reconsume = true;
  2580               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2581               NS_HTML5_CONTINUE(stateloop);
  2585         scriptdatadoubleescapedlessthanloop_end: ;
  2587       case NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPE_END: {
  2588         for (; ; ) {
  2589           if (++pos == endPos) {
  2590             NS_HTML5_BREAK(stateloop);
  2592           c = checkChar(buf, pos);
  2593           if (index < 6) {
  2594             char16_t folded = c;
  2595             if (c >= 'A' && c <= 'Z') {
  2596               folded += 0x20;
  2598             if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
  2599               reconsume = true;
  2600               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2601               NS_HTML5_CONTINUE(stateloop);
  2603             index++;
  2604             continue;
  2606           switch(c) {
  2607             case '\r': {
  2608               emitCarriageReturn(buf, pos);
  2609               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2610               NS_HTML5_BREAK(stateloop);
  2612             case '\n': {
  2613               silentLineFeed();
  2615             case ' ':
  2616             case '\t':
  2617             case '\f':
  2618             case '/':
  2619             case '>': {
  2620               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED, reconsume, pos);
  2621               NS_HTML5_CONTINUE(stateloop);
  2623             default: {
  2624               reconsume = true;
  2625               state = P::transition(mViewSource, NS_HTML5TOKENIZER_SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
  2626               NS_HTML5_CONTINUE(stateloop);
  2632       case NS_HTML5TOKENIZER_MARKUP_DECLARATION_OCTYPE: {
  2633         for (; ; ) {
  2634           if (++pos == endPos) {
  2635             NS_HTML5_BREAK(stateloop);
  2637           c = checkChar(buf, pos);
  2638           if (index < 6) {
  2639             char16_t folded = c;
  2640             if (c >= 'A' && c <= 'Z') {
  2641               folded += 0x20;
  2643             if (folded == nsHtml5Tokenizer::OCTYPE[index]) {
  2644               appendLongStrBuf(c);
  2645             } else {
  2646               if (P::reportErrors) {
  2647                 errBogusComment();
  2649               reconsume = true;
  2650               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_COMMENT, reconsume, pos);
  2651               NS_HTML5_CONTINUE(stateloop);
  2653             index++;
  2654             continue;
  2655           } else {
  2656             reconsume = true;
  2657             state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE, reconsume, pos);
  2658             NS_HTML5_BREAK(markupdeclarationdoctypeloop);
  2661         markupdeclarationdoctypeloop_end: ;
  2663       case NS_HTML5TOKENIZER_DOCTYPE: {
  2664         for (; ; ) {
  2665           if (reconsume) {
  2666             reconsume = false;
  2667           } else {
  2668             if (++pos == endPos) {
  2669               NS_HTML5_BREAK(stateloop);
  2671             c = checkChar(buf, pos);
  2673           initDoctypeFields();
  2674           switch(c) {
  2675             case '\r': {
  2676               silentCarriageReturn();
  2677               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_DOCTYPE_NAME, reconsume, pos);
  2678               NS_HTML5_BREAK(stateloop);
  2680             case '\n': {
  2681               silentLineFeed();
  2683             case ' ':
  2684             case '\t':
  2685             case '\f': {
  2686               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_DOCTYPE_NAME, reconsume, pos);
  2687               NS_HTML5_BREAK(doctypeloop);
  2689             default: {
  2690               if (P::reportErrors) {
  2691                 errMissingSpaceBeforeDoctypeName();
  2693               reconsume = true;
  2694               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_DOCTYPE_NAME, reconsume, pos);
  2695               NS_HTML5_BREAK(doctypeloop);
  2699         doctypeloop_end: ;
  2701       case NS_HTML5TOKENIZER_BEFORE_DOCTYPE_NAME: {
  2702         for (; ; ) {
  2703           if (reconsume) {
  2704             reconsume = false;
  2705           } else {
  2706             if (++pos == endPos) {
  2707               NS_HTML5_BREAK(stateloop);
  2709             c = checkChar(buf, pos);
  2711           switch(c) {
  2712             case '\r': {
  2713               silentCarriageReturn();
  2714               NS_HTML5_BREAK(stateloop);
  2716             case '\n': {
  2717               silentLineFeed();
  2719             case ' ':
  2720             case '\t':
  2721             case '\f': {
  2722               continue;
  2724             case '>': {
  2725               if (P::reportErrors) {
  2726                 errNamelessDoctype();
  2728               forceQuirks = true;
  2729               emitDoctypeToken(pos);
  2730               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  2731               NS_HTML5_CONTINUE(stateloop);
  2733             case '\0': {
  2734               c = 0xfffd;
  2736             default: {
  2737               if (c >= 'A' && c <= 'Z') {
  2738                 c += 0x20;
  2740               clearStrBufAndAppend(c);
  2741               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_NAME, reconsume, pos);
  2742               NS_HTML5_BREAK(beforedoctypenameloop);
  2746         beforedoctypenameloop_end: ;
  2748       case NS_HTML5TOKENIZER_DOCTYPE_NAME: {
  2749         for (; ; ) {
  2750           if (++pos == endPos) {
  2751             NS_HTML5_BREAK(stateloop);
  2753           c = checkChar(buf, pos);
  2754           switch(c) {
  2755             case '\r': {
  2756               silentCarriageReturn();
  2757               strBufToDoctypeName();
  2758               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_DOCTYPE_NAME, reconsume, pos);
  2759               NS_HTML5_BREAK(stateloop);
  2761             case '\n': {
  2762               silentLineFeed();
  2764             case ' ':
  2765             case '\t':
  2766             case '\f': {
  2767               strBufToDoctypeName();
  2768               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_DOCTYPE_NAME, reconsume, pos);
  2769               NS_HTML5_BREAK(doctypenameloop);
  2771             case '>': {
  2772               strBufToDoctypeName();
  2773               emitDoctypeToken(pos);
  2774               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  2775               NS_HTML5_CONTINUE(stateloop);
  2777             case '\0': {
  2778               c = 0xfffd;
  2780             default: {
  2781               if (c >= 'A' && c <= 'Z') {
  2782                 c += 0x0020;
  2784               appendStrBuf(c);
  2785               continue;
  2789         doctypenameloop_end: ;
  2791       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_NAME: {
  2792         for (; ; ) {
  2793           if (++pos == endPos) {
  2794             NS_HTML5_BREAK(stateloop);
  2796           c = checkChar(buf, pos);
  2797           switch(c) {
  2798             case '\r': {
  2799               silentCarriageReturn();
  2800               NS_HTML5_BREAK(stateloop);
  2802             case '\n': {
  2803               silentLineFeed();
  2805             case ' ':
  2806             case '\t':
  2807             case '\f': {
  2808               continue;
  2810             case '>': {
  2811               emitDoctypeToken(pos);
  2812               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  2813               NS_HTML5_CONTINUE(stateloop);
  2815             case 'p':
  2816             case 'P': {
  2817               index = 0;
  2818               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_UBLIC, reconsume, pos);
  2819               NS_HTML5_BREAK(afterdoctypenameloop);
  2821             case 's':
  2822             case 'S': {
  2823               index = 0;
  2824               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_YSTEM, reconsume, pos);
  2825               NS_HTML5_CONTINUE(stateloop);
  2827             default: {
  2828               bogusDoctype();
  2829               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  2830               NS_HTML5_CONTINUE(stateloop);
  2834         afterdoctypenameloop_end: ;
  2836       case NS_HTML5TOKENIZER_DOCTYPE_UBLIC: {
  2837         for (; ; ) {
  2838           if (++pos == endPos) {
  2839             NS_HTML5_BREAK(stateloop);
  2841           c = checkChar(buf, pos);
  2842           if (index < 5) {
  2843             char16_t folded = c;
  2844             if (c >= 'A' && c <= 'Z') {
  2845               folded += 0x20;
  2847             if (folded != nsHtml5Tokenizer::UBLIC[index]) {
  2848               bogusDoctype();
  2849               reconsume = true;
  2850               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  2851               NS_HTML5_CONTINUE(stateloop);
  2853             index++;
  2854             continue;
  2855           } else {
  2856             reconsume = true;
  2857             state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_DOCTYPE_PUBLIC_KEYWORD, reconsume, pos);
  2858             NS_HTML5_BREAK(doctypeublicloop);
  2861         doctypeublicloop_end: ;
  2863       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_PUBLIC_KEYWORD: {
  2864         for (; ; ) {
  2865           if (reconsume) {
  2866             reconsume = false;
  2867           } else {
  2868             if (++pos == endPos) {
  2869               NS_HTML5_BREAK(stateloop);
  2871             c = checkChar(buf, pos);
  2873           switch(c) {
  2874             case '\r': {
  2875               silentCarriageReturn();
  2876               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
  2877               NS_HTML5_BREAK(stateloop);
  2879             case '\n': {
  2880               silentLineFeed();
  2882             case ' ':
  2883             case '\t':
  2884             case '\f': {
  2885               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
  2886               NS_HTML5_BREAK(afterdoctypepublickeywordloop);
  2888             case '\"': {
  2889               if (P::reportErrors) {
  2890                 errNoSpaceBetweenDoctypePublicKeywordAndQuote();
  2892               clearLongStrBuf();
  2893               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
  2894               NS_HTML5_CONTINUE(stateloop);
  2896             case '\'': {
  2897               if (P::reportErrors) {
  2898                 errNoSpaceBetweenDoctypePublicKeywordAndQuote();
  2900               clearLongStrBuf();
  2901               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
  2902               NS_HTML5_CONTINUE(stateloop);
  2904             case '>': {
  2905               if (P::reportErrors) {
  2906                 errExpectedPublicId();
  2908               forceQuirks = true;
  2909               emitDoctypeToken(pos);
  2910               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  2911               NS_HTML5_CONTINUE(stateloop);
  2913             default: {
  2914               bogusDoctype();
  2915               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  2916               NS_HTML5_CONTINUE(stateloop);
  2920         afterdoctypepublickeywordloop_end: ;
  2922       case NS_HTML5TOKENIZER_BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
  2923         for (; ; ) {
  2924           if (++pos == endPos) {
  2925             NS_HTML5_BREAK(stateloop);
  2927           c = checkChar(buf, pos);
  2928           switch(c) {
  2929             case '\r': {
  2930               silentCarriageReturn();
  2931               NS_HTML5_BREAK(stateloop);
  2933             case '\n': {
  2934               silentLineFeed();
  2936             case ' ':
  2937             case '\t':
  2938             case '\f': {
  2939               continue;
  2941             case '\"': {
  2942               clearLongStrBuf();
  2943               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
  2944               NS_HTML5_BREAK(beforedoctypepublicidentifierloop);
  2946             case '\'': {
  2947               clearLongStrBuf();
  2948               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
  2949               NS_HTML5_CONTINUE(stateloop);
  2951             case '>': {
  2952               if (P::reportErrors) {
  2953                 errExpectedPublicId();
  2955               forceQuirks = true;
  2956               emitDoctypeToken(pos);
  2957               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  2958               NS_HTML5_CONTINUE(stateloop);
  2960             default: {
  2961               bogusDoctype();
  2962               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  2963               NS_HTML5_CONTINUE(stateloop);
  2967         beforedoctypepublicidentifierloop_end: ;
  2969       case NS_HTML5TOKENIZER_DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED: {
  2970         for (; ; ) {
  2971           if (++pos == endPos) {
  2972             NS_HTML5_BREAK(stateloop);
  2974           c = checkChar(buf, pos);
  2975           switch(c) {
  2976             case '\"': {
  2977               publicIdentifier = longStrBufToString();
  2978               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
  2979               NS_HTML5_BREAK(doctypepublicidentifierdoublequotedloop);
  2981             case '>': {
  2982               if (P::reportErrors) {
  2983                 errGtInPublicId();
  2985               forceQuirks = true;
  2986               publicIdentifier = longStrBufToString();
  2987               emitDoctypeToken(pos);
  2988               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  2989               NS_HTML5_CONTINUE(stateloop);
  2991             case '\r': {
  2992               appendLongStrBufCarriageReturn();
  2993               NS_HTML5_BREAK(stateloop);
  2995             case '\n': {
  2996               appendLongStrBufLineFeed();
  2997               continue;
  2999             case '\0': {
  3000               c = 0xfffd;
  3002             default: {
  3003               appendLongStrBuf(c);
  3004               continue;
  3008         doctypepublicidentifierdoublequotedloop_end: ;
  3010       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_PUBLIC_IDENTIFIER: {
  3011         for (; ; ) {
  3012           if (++pos == endPos) {
  3013             NS_HTML5_BREAK(stateloop);
  3015           c = checkChar(buf, pos);
  3016           switch(c) {
  3017             case '\r': {
  3018               silentCarriageReturn();
  3019               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS, reconsume, pos);
  3020               NS_HTML5_BREAK(stateloop);
  3022             case '\n': {
  3023               silentLineFeed();
  3025             case ' ':
  3026             case '\t':
  3027             case '\f': {
  3028               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS, reconsume, pos);
  3029               NS_HTML5_BREAK(afterdoctypepublicidentifierloop);
  3031             case '>': {
  3032               emitDoctypeToken(pos);
  3033               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3034               NS_HTML5_CONTINUE(stateloop);
  3036             case '\"': {
  3037               if (P::reportErrors) {
  3038                 errNoSpaceBetweenPublicAndSystemIds();
  3040               clearLongStrBuf();
  3041               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
  3042               NS_HTML5_CONTINUE(stateloop);
  3044             case '\'': {
  3045               if (P::reportErrors) {
  3046                 errNoSpaceBetweenPublicAndSystemIds();
  3048               clearLongStrBuf();
  3049               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
  3050               NS_HTML5_CONTINUE(stateloop);
  3052             default: {
  3053               bogusDoctype();
  3054               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  3055               NS_HTML5_CONTINUE(stateloop);
  3059         afterdoctypepublicidentifierloop_end: ;
  3061       case NS_HTML5TOKENIZER_BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
  3062         for (; ; ) {
  3063           if (++pos == endPos) {
  3064             NS_HTML5_BREAK(stateloop);
  3066           c = checkChar(buf, pos);
  3067           switch(c) {
  3068             case '\r': {
  3069               silentCarriageReturn();
  3070               NS_HTML5_BREAK(stateloop);
  3072             case '\n': {
  3073               silentLineFeed();
  3075             case ' ':
  3076             case '\t':
  3077             case '\f': {
  3078               continue;
  3080             case '>': {
  3081               emitDoctypeToken(pos);
  3082               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3083               NS_HTML5_CONTINUE(stateloop);
  3085             case '\"': {
  3086               clearLongStrBuf();
  3087               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
  3088               NS_HTML5_BREAK(betweendoctypepublicandsystemidentifiersloop);
  3090             case '\'': {
  3091               clearLongStrBuf();
  3092               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
  3093               NS_HTML5_CONTINUE(stateloop);
  3095             default: {
  3096               bogusDoctype();
  3097               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  3098               NS_HTML5_CONTINUE(stateloop);
  3102         betweendoctypepublicandsystemidentifiersloop_end: ;
  3104       case NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED: {
  3105         for (; ; ) {
  3106           if (++pos == endPos) {
  3107             NS_HTML5_BREAK(stateloop);
  3109           c = checkChar(buf, pos);
  3110           switch(c) {
  3111             case '\"': {
  3112               systemIdentifier = longStrBufToString();
  3113               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
  3114               NS_HTML5_CONTINUE(stateloop);
  3116             case '>': {
  3117               if (P::reportErrors) {
  3118                 errGtInSystemId();
  3120               forceQuirks = true;
  3121               systemIdentifier = longStrBufToString();
  3122               emitDoctypeToken(pos);
  3123               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3124               NS_HTML5_CONTINUE(stateloop);
  3126             case '\r': {
  3127               appendLongStrBufCarriageReturn();
  3128               NS_HTML5_BREAK(stateloop);
  3130             case '\n': {
  3131               appendLongStrBufLineFeed();
  3132               continue;
  3134             case '\0': {
  3135               c = 0xfffd;
  3137             default: {
  3138               appendLongStrBuf(c);
  3139               continue;
  3145       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
  3146         for (; ; ) {
  3147           if (++pos == endPos) {
  3148             NS_HTML5_BREAK(stateloop);
  3150           c = checkChar(buf, pos);
  3151           switch(c) {
  3152             case '\r': {
  3153               silentCarriageReturn();
  3154               NS_HTML5_BREAK(stateloop);
  3156             case '\n': {
  3157               silentLineFeed();
  3159             case ' ':
  3160             case '\t':
  3161             case '\f': {
  3162               continue;
  3164             case '>': {
  3165               emitDoctypeToken(pos);
  3166               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3167               NS_HTML5_CONTINUE(stateloop);
  3169             default: {
  3170               bogusDoctypeWithoutQuirks();
  3171               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  3172               NS_HTML5_BREAK(afterdoctypesystemidentifierloop);
  3176         afterdoctypesystemidentifierloop_end: ;
  3178       case NS_HTML5TOKENIZER_BOGUS_DOCTYPE: {
  3179         for (; ; ) {
  3180           if (reconsume) {
  3181             reconsume = false;
  3182           } else {
  3183             if (++pos == endPos) {
  3184               NS_HTML5_BREAK(stateloop);
  3186             c = checkChar(buf, pos);
  3188           switch(c) {
  3189             case '>': {
  3190               emitDoctypeToken(pos);
  3191               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3192               NS_HTML5_CONTINUE(stateloop);
  3194             case '\r': {
  3195               silentCarriageReturn();
  3196               NS_HTML5_BREAK(stateloop);
  3198             case '\n': {
  3199               silentLineFeed();
  3201             default: {
  3202               continue;
  3207       case NS_HTML5TOKENIZER_DOCTYPE_YSTEM: {
  3208         for (; ; ) {
  3209           if (++pos == endPos) {
  3210             NS_HTML5_BREAK(stateloop);
  3212           c = checkChar(buf, pos);
  3213           if (index < 5) {
  3214             char16_t folded = c;
  3215             if (c >= 'A' && c <= 'Z') {
  3216               folded += 0x20;
  3218             if (folded != nsHtml5Tokenizer::YSTEM[index]) {
  3219               bogusDoctype();
  3220               reconsume = true;
  3221               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  3222               NS_HTML5_CONTINUE(stateloop);
  3224             index++;
  3225             NS_HTML5_CONTINUE(stateloop);
  3226           } else {
  3227             reconsume = true;
  3228             state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_DOCTYPE_SYSTEM_KEYWORD, reconsume, pos);
  3229             NS_HTML5_BREAK(doctypeystemloop);
  3232         doctypeystemloop_end: ;
  3234       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_SYSTEM_KEYWORD: {
  3235         for (; ; ) {
  3236           if (reconsume) {
  3237             reconsume = false;
  3238           } else {
  3239             if (++pos == endPos) {
  3240               NS_HTML5_BREAK(stateloop);
  3242             c = checkChar(buf, pos);
  3244           switch(c) {
  3245             case '\r': {
  3246               silentCarriageReturn();
  3247               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
  3248               NS_HTML5_BREAK(stateloop);
  3250             case '\n': {
  3251               silentLineFeed();
  3253             case ' ':
  3254             case '\t':
  3255             case '\f': {
  3256               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BEFORE_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
  3257               NS_HTML5_BREAK(afterdoctypesystemkeywordloop);
  3259             case '\"': {
  3260               if (P::reportErrors) {
  3261                 errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
  3263               clearLongStrBuf();
  3264               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
  3265               NS_HTML5_CONTINUE(stateloop);
  3267             case '\'': {
  3268               if (P::reportErrors) {
  3269                 errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
  3271               clearLongStrBuf();
  3272               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
  3273               NS_HTML5_CONTINUE(stateloop);
  3275             case '>': {
  3276               if (P::reportErrors) {
  3277                 errExpectedPublicId();
  3279               forceQuirks = true;
  3280               emitDoctypeToken(pos);
  3281               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3282               NS_HTML5_CONTINUE(stateloop);
  3284             default: {
  3285               bogusDoctype();
  3286               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  3287               NS_HTML5_CONTINUE(stateloop);
  3291         afterdoctypesystemkeywordloop_end: ;
  3293       case NS_HTML5TOKENIZER_BEFORE_DOCTYPE_SYSTEM_IDENTIFIER: {
  3294         for (; ; ) {
  3295           if (++pos == endPos) {
  3296             NS_HTML5_BREAK(stateloop);
  3298           c = checkChar(buf, pos);
  3299           switch(c) {
  3300             case '\r': {
  3301               silentCarriageReturn();
  3302               NS_HTML5_BREAK(stateloop);
  3304             case '\n': {
  3305               silentLineFeed();
  3307             case ' ':
  3308             case '\t':
  3309             case '\f': {
  3310               continue;
  3312             case '\"': {
  3313               clearLongStrBuf();
  3314               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
  3315               NS_HTML5_CONTINUE(stateloop);
  3317             case '\'': {
  3318               clearLongStrBuf();
  3319               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
  3320               NS_HTML5_BREAK(beforedoctypesystemidentifierloop);
  3322             case '>': {
  3323               if (P::reportErrors) {
  3324                 errExpectedSystemId();
  3326               forceQuirks = true;
  3327               emitDoctypeToken(pos);
  3328               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3329               NS_HTML5_CONTINUE(stateloop);
  3331             default: {
  3332               bogusDoctype();
  3333               state = P::transition(mViewSource, NS_HTML5TOKENIZER_BOGUS_DOCTYPE, reconsume, pos);
  3334               NS_HTML5_CONTINUE(stateloop);
  3338         beforedoctypesystemidentifierloop_end: ;
  3340       case NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
  3341         for (; ; ) {
  3342           if (++pos == endPos) {
  3343             NS_HTML5_BREAK(stateloop);
  3345           c = checkChar(buf, pos);
  3346           switch(c) {
  3347             case '\'': {
  3348               systemIdentifier = longStrBufToString();
  3349               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
  3350               NS_HTML5_CONTINUE(stateloop);
  3352             case '>': {
  3353               if (P::reportErrors) {
  3354                 errGtInSystemId();
  3356               forceQuirks = true;
  3357               systemIdentifier = longStrBufToString();
  3358               emitDoctypeToken(pos);
  3359               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3360               NS_HTML5_CONTINUE(stateloop);
  3362             case '\r': {
  3363               appendLongStrBufCarriageReturn();
  3364               NS_HTML5_BREAK(stateloop);
  3366             case '\n': {
  3367               appendLongStrBufLineFeed();
  3368               continue;
  3370             case '\0': {
  3371               c = 0xfffd;
  3373             default: {
  3374               appendLongStrBuf(c);
  3375               continue;
  3380       case NS_HTML5TOKENIZER_DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
  3381         for (; ; ) {
  3382           if (++pos == endPos) {
  3383             NS_HTML5_BREAK(stateloop);
  3385           c = checkChar(buf, pos);
  3386           switch(c) {
  3387             case '\'': {
  3388               publicIdentifier = longStrBufToString();
  3389               state = P::transition(mViewSource, NS_HTML5TOKENIZER_AFTER_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
  3390               NS_HTML5_CONTINUE(stateloop);
  3392             case '>': {
  3393               if (P::reportErrors) {
  3394                 errGtInPublicId();
  3396               forceQuirks = true;
  3397               publicIdentifier = longStrBufToString();
  3398               emitDoctypeToken(pos);
  3399               state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3400               NS_HTML5_CONTINUE(stateloop);
  3402             case '\r': {
  3403               appendLongStrBufCarriageReturn();
  3404               NS_HTML5_BREAK(stateloop);
  3406             case '\n': {
  3407               appendLongStrBufLineFeed();
  3408               continue;
  3410             case '\0': {
  3411               c = 0xfffd;
  3413             default: {
  3414               appendLongStrBuf(c);
  3415               continue;
  3420       case NS_HTML5TOKENIZER_PROCESSING_INSTRUCTION: {
  3421         for (; ; ) {
  3422           if (++pos == endPos) {
  3423             NS_HTML5_BREAK(stateloop);
  3425           c = checkChar(buf, pos);
  3426           switch(c) {
  3427             case '\?': {
  3428               state = P::transition(mViewSource, NS_HTML5TOKENIZER_PROCESSING_INSTRUCTION_QUESTION_MARK, reconsume, pos);
  3429               NS_HTML5_BREAK(processinginstructionloop);
  3431             default: {
  3432               continue;
  3436         processinginstructionloop_end: ;
  3438       case NS_HTML5TOKENIZER_PROCESSING_INSTRUCTION_QUESTION_MARK: {
  3439         if (++pos == endPos) {
  3440           NS_HTML5_BREAK(stateloop);
  3442         c = checkChar(buf, pos);
  3443         switch(c) {
  3444           case '>': {
  3445             state = P::transition(mViewSource, NS_HTML5TOKENIZER_DATA, reconsume, pos);
  3446             NS_HTML5_CONTINUE(stateloop);
  3448           default: {
  3449             state = P::transition(mViewSource, NS_HTML5TOKENIZER_PROCESSING_INSTRUCTION, reconsume, pos);
  3450             NS_HTML5_CONTINUE(stateloop);
  3456   stateloop_end: ;
  3457   flushChars(buf, pos);
  3458   stateSave = state;
  3459   returnStateSave = returnState;
  3460   return pos;
  3463 void 
  3464 nsHtml5Tokenizer::initDoctypeFields()
  3466   doctypeName = nsHtml5Atoms::emptystring;
  3467   if (systemIdentifier) {
  3468     nsHtml5Portability::releaseString(systemIdentifier);
  3469     systemIdentifier = nullptr;
  3471   if (publicIdentifier) {
  3472     nsHtml5Portability::releaseString(publicIdentifier);
  3473     publicIdentifier = nullptr;
  3475   forceQuirks = false;
  3478 void 
  3479 nsHtml5Tokenizer::emitCarriageReturn(char16_t* buf, int32_t pos)
  3481   silentCarriageReturn();
  3482   flushChars(buf, pos);
  3483   tokenHandler->characters(nsHtml5Tokenizer::LF, 0, 1);
  3484   cstart = INT32_MAX;
  3487 void 
  3488 nsHtml5Tokenizer::emitReplacementCharacter(char16_t* buf, int32_t pos)
  3490   flushChars(buf, pos);
  3491   tokenHandler->zeroOriginatingReplacementCharacter();
  3492   cstart = pos + 1;
  3495 void 
  3496 nsHtml5Tokenizer::emitPlaintextReplacementCharacter(char16_t* buf, int32_t pos)
  3498   flushChars(buf, pos);
  3499   tokenHandler->characters(REPLACEMENT_CHARACTER, 0, 1);
  3500   cstart = pos + 1;
  3503 void 
  3504 nsHtml5Tokenizer::setAdditionalAndRememberAmpersandLocation(char16_t add)
  3506   additional = add;
  3509 void 
  3510 nsHtml5Tokenizer::bogusDoctype()
  3512   errBogusDoctype();
  3513   forceQuirks = true;
  3516 void 
  3517 nsHtml5Tokenizer::bogusDoctypeWithoutQuirks()
  3519   errBogusDoctype();
  3520   forceQuirks = false;
  3523 void 
  3524 nsHtml5Tokenizer::emitOrAppendStrBuf(int32_t returnState)
  3526   if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  3527     appendStrBufToLongStrBuf();
  3528   } else {
  3529     emitStrBuf();
  3533 void 
  3534 nsHtml5Tokenizer::handleNcrValue(int32_t returnState)
  3536   if (value <= 0xFFFF) {
  3537     if (value >= 0x80 && value <= 0x9f) {
  3538       errNcrInC1Range();
  3539       char16_t* val = nsHtml5NamedCharacters::WINDOWS_1252[value - 0x80];
  3540       emitOrAppendOne(val, returnState);
  3541     } else if (value == 0x0) {
  3542       errNcrZero();
  3543       emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
  3544     } else if ((value & 0xF800) == 0xD800) {
  3545       errNcrSurrogate();
  3546       emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
  3547     } else {
  3548       char16_t ch = (char16_t) value;
  3549       bmpChar[0] = ch;
  3550       emitOrAppendOne(bmpChar, returnState);
  3552   } else if (value <= 0x10FFFF) {
  3553     astralChar[0] = (char16_t) (NS_HTML5TOKENIZER_LEAD_OFFSET + (value >> 10));
  3554     astralChar[1] = (char16_t) (0xDC00 + (value & 0x3FF));
  3555     emitOrAppendTwo(astralChar, returnState);
  3556   } else {
  3557     errNcrOutOfRange();
  3558     emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
  3562 void 
  3563 nsHtml5Tokenizer::eof()
  3565   int32_t state = stateSave;
  3566   int32_t returnState = returnStateSave;
  3567   eofloop: for (; ; ) {
  3568     switch(state) {
  3569       case NS_HTML5TOKENIZER_SCRIPT_DATA_LESS_THAN_SIGN:
  3570       case NS_HTML5TOKENIZER_SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
  3571         tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
  3572         NS_HTML5_BREAK(eofloop);
  3574       case NS_HTML5TOKENIZER_TAG_OPEN: {
  3575         errEofAfterLt();
  3576         tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
  3577         NS_HTML5_BREAK(eofloop);
  3579       case NS_HTML5TOKENIZER_RAWTEXT_RCDATA_LESS_THAN_SIGN: {
  3580         tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
  3581         NS_HTML5_BREAK(eofloop);
  3583       case NS_HTML5TOKENIZER_NON_DATA_END_TAG_NAME: {
  3584         tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
  3585         emitStrBuf();
  3586         NS_HTML5_BREAK(eofloop);
  3588       case NS_HTML5TOKENIZER_CLOSE_TAG_OPEN: {
  3589         errEofAfterLt();
  3590         tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
  3591         NS_HTML5_BREAK(eofloop);
  3593       case NS_HTML5TOKENIZER_TAG_NAME: {
  3594         errEofInTagName();
  3595         NS_HTML5_BREAK(eofloop);
  3597       case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_NAME:
  3598       case NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_VALUE_QUOTED:
  3599       case NS_HTML5TOKENIZER_SELF_CLOSING_START_TAG: {
  3600         errEofWithoutGt();
  3601         NS_HTML5_BREAK(eofloop);
  3603       case NS_HTML5TOKENIZER_ATTRIBUTE_NAME: {
  3604         errEofInAttributeName();
  3605         NS_HTML5_BREAK(eofloop);
  3607       case NS_HTML5TOKENIZER_AFTER_ATTRIBUTE_NAME:
  3608       case NS_HTML5TOKENIZER_BEFORE_ATTRIBUTE_VALUE: {
  3609         errEofWithoutGt();
  3610         NS_HTML5_BREAK(eofloop);
  3612       case NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_DOUBLE_QUOTED:
  3613       case NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_SINGLE_QUOTED:
  3614       case NS_HTML5TOKENIZER_ATTRIBUTE_VALUE_UNQUOTED: {
  3615         errEofInAttributeValue();
  3616         NS_HTML5_BREAK(eofloop);
  3618       case NS_HTML5TOKENIZER_BOGUS_COMMENT: {
  3619         emitComment(0, 0);
  3620         NS_HTML5_BREAK(eofloop);
  3622       case NS_HTML5TOKENIZER_BOGUS_COMMENT_HYPHEN: {
  3623         emitComment(0, 0);
  3624         NS_HTML5_BREAK(eofloop);
  3626       case NS_HTML5TOKENIZER_MARKUP_DECLARATION_OPEN: {
  3627         errBogusComment();
  3628         clearLongStrBuf();
  3629         emitComment(0, 0);
  3630         NS_HTML5_BREAK(eofloop);
  3632       case NS_HTML5TOKENIZER_MARKUP_DECLARATION_HYPHEN: {
  3633         errBogusComment();
  3634         emitComment(0, 0);
  3635         NS_HTML5_BREAK(eofloop);
  3637       case NS_HTML5TOKENIZER_MARKUP_DECLARATION_OCTYPE: {
  3638         if (index < 6) {
  3639           errBogusComment();
  3640           emitComment(0, 0);
  3641         } else {
  3642           errEofInDoctype();
  3643           doctypeName = nsHtml5Atoms::emptystring;
  3644           if (systemIdentifier) {
  3645             nsHtml5Portability::releaseString(systemIdentifier);
  3646             systemIdentifier = nullptr;
  3648           if (publicIdentifier) {
  3649             nsHtml5Portability::releaseString(publicIdentifier);
  3650             publicIdentifier = nullptr;
  3652           forceQuirks = true;
  3653           emitDoctypeToken(0);
  3654           NS_HTML5_BREAK(eofloop);
  3656         NS_HTML5_BREAK(eofloop);
  3658       case NS_HTML5TOKENIZER_COMMENT_START:
  3659       case NS_HTML5TOKENIZER_COMMENT: {
  3660         errEofInComment();
  3661         emitComment(0, 0);
  3662         NS_HTML5_BREAK(eofloop);
  3664       case NS_HTML5TOKENIZER_COMMENT_END: {
  3665         errEofInComment();
  3666         emitComment(2, 0);
  3667         NS_HTML5_BREAK(eofloop);
  3669       case NS_HTML5TOKENIZER_COMMENT_END_DASH:
  3670       case NS_HTML5TOKENIZER_COMMENT_START_DASH: {
  3671         errEofInComment();
  3672         emitComment(1, 0);
  3673         NS_HTML5_BREAK(eofloop);
  3675       case NS_HTML5TOKENIZER_COMMENT_END_BANG: {
  3676         errEofInComment();
  3677         emitComment(3, 0);
  3678         NS_HTML5_BREAK(eofloop);
  3680       case NS_HTML5TOKENIZER_DOCTYPE:
  3681       case NS_HTML5TOKENIZER_BEFORE_DOCTYPE_NAME: {
  3682         errEofInDoctype();
  3683         forceQuirks = true;
  3684         emitDoctypeToken(0);
  3685         NS_HTML5_BREAK(eofloop);
  3687       case NS_HTML5TOKENIZER_DOCTYPE_NAME: {
  3688         errEofInDoctype();
  3689         strBufToDoctypeName();
  3690         forceQuirks = true;
  3691         emitDoctypeToken(0);
  3692         NS_HTML5_BREAK(eofloop);
  3694       case NS_HTML5TOKENIZER_DOCTYPE_UBLIC:
  3695       case NS_HTML5TOKENIZER_DOCTYPE_YSTEM:
  3696       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_NAME:
  3697       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_PUBLIC_KEYWORD:
  3698       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_SYSTEM_KEYWORD:
  3699       case NS_HTML5TOKENIZER_BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
  3700         errEofInDoctype();
  3701         forceQuirks = true;
  3702         emitDoctypeToken(0);
  3703         NS_HTML5_BREAK(eofloop);
  3705       case NS_HTML5TOKENIZER_DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:
  3706       case NS_HTML5TOKENIZER_DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
  3707         errEofInPublicId();
  3708         forceQuirks = true;
  3709         publicIdentifier = longStrBufToString();
  3710         emitDoctypeToken(0);
  3711         NS_HTML5_BREAK(eofloop);
  3713       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_PUBLIC_IDENTIFIER:
  3714       case NS_HTML5TOKENIZER_BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:
  3715       case NS_HTML5TOKENIZER_BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
  3716         errEofInDoctype();
  3717         forceQuirks = true;
  3718         emitDoctypeToken(0);
  3719         NS_HTML5_BREAK(eofloop);
  3721       case NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:
  3722       case NS_HTML5TOKENIZER_DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
  3723         errEofInSystemId();
  3724         forceQuirks = true;
  3725         systemIdentifier = longStrBufToString();
  3726         emitDoctypeToken(0);
  3727         NS_HTML5_BREAK(eofloop);
  3729       case NS_HTML5TOKENIZER_AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
  3730         errEofInDoctype();
  3731         forceQuirks = true;
  3732         emitDoctypeToken(0);
  3733         NS_HTML5_BREAK(eofloop);
  3735       case NS_HTML5TOKENIZER_BOGUS_DOCTYPE: {
  3736         emitDoctypeToken(0);
  3737         NS_HTML5_BREAK(eofloop);
  3739       case NS_HTML5TOKENIZER_CONSUME_CHARACTER_REFERENCE: {
  3740         emitOrAppendStrBuf(returnState);
  3741         state = returnState;
  3742         continue;
  3744       case NS_HTML5TOKENIZER_CHARACTER_REFERENCE_HILO_LOOKUP: {
  3745         errNoNamedCharacterMatch();
  3746         emitOrAppendStrBuf(returnState);
  3747         state = returnState;
  3748         continue;
  3750       case NS_HTML5TOKENIZER_CHARACTER_REFERENCE_TAIL: {
  3751         for (; ; ) {
  3752           char16_t c = '\0';
  3753           entCol++;
  3754           for (; ; ) {
  3755             if (hi == -1) {
  3756               NS_HTML5_BREAK(hiloop);
  3758             if (entCol == nsHtml5NamedCharacters::NAMES[hi].length()) {
  3759               NS_HTML5_BREAK(hiloop);
  3761             if (entCol > nsHtml5NamedCharacters::NAMES[hi].length()) {
  3762               NS_HTML5_BREAK(outer);
  3763             } else if (c < nsHtml5NamedCharacters::NAMES[hi].charAt(entCol)) {
  3764               hi--;
  3765             } else {
  3766               NS_HTML5_BREAK(hiloop);
  3769           hiloop_end: ;
  3770           for (; ; ) {
  3771             if (hi < lo) {
  3772               NS_HTML5_BREAK(outer);
  3774             if (entCol == nsHtml5NamedCharacters::NAMES[lo].length()) {
  3775               candidate = lo;
  3776               strBufMark = strBufLen;
  3777               lo++;
  3778             } else if (entCol > nsHtml5NamedCharacters::NAMES[lo].length()) {
  3779               NS_HTML5_BREAK(outer);
  3780             } else if (c > nsHtml5NamedCharacters::NAMES[lo].charAt(entCol)) {
  3781               lo++;
  3782             } else {
  3783               NS_HTML5_BREAK(loloop);
  3786           loloop_end: ;
  3787           if (hi < lo) {
  3788             NS_HTML5_BREAK(outer);
  3790           continue;
  3792         outer_end: ;
  3793         if (candidate == -1) {
  3794           errNoNamedCharacterMatch();
  3795           emitOrAppendStrBuf(returnState);
  3796           state = returnState;
  3797           NS_HTML5_CONTINUE(eofloop);
  3798         } else {
  3799           const nsHtml5CharacterName& candidateName = nsHtml5NamedCharacters::NAMES[candidate];
  3800           if (!candidateName.length() || candidateName.charAt(candidateName.length() - 1) != ';') {
  3801             if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  3802               char16_t ch;
  3803               if (strBufMark == strBufLen) {
  3804                 ch = '\0';
  3805               } else {
  3806                 ch = strBuf[strBufMark];
  3808               if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
  3809                 errNoNamedCharacterMatch();
  3810                 appendStrBufToLongStrBuf();
  3811                 state = returnState;
  3812                 NS_HTML5_CONTINUE(eofloop);
  3815             if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  3816               errUnescapedAmpersandInterpretedAsCharacterReference();
  3817             } else {
  3818               errNotSemicolonTerminated();
  3821           const char16_t* val = nsHtml5NamedCharacters::VALUES[candidate];
  3822           if (!val[1]) {
  3823             emitOrAppendOne(val, returnState);
  3824           } else {
  3825             emitOrAppendTwo(val, returnState);
  3827           if (strBufMark < strBufLen) {
  3828             if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  3829               for (int32_t i = strBufMark; i < strBufLen; i++) {
  3830                 appendLongStrBuf(strBuf[i]);
  3832             } else {
  3833               tokenHandler->characters(strBuf, strBufMark, strBufLen - strBufMark);
  3836           state = returnState;
  3837           NS_HTML5_CONTINUE(eofloop);
  3840       case NS_HTML5TOKENIZER_CONSUME_NCR:
  3841       case NS_HTML5TOKENIZER_DECIMAL_NRC_LOOP:
  3842       case NS_HTML5TOKENIZER_HEX_NCR_LOOP: {
  3843         if (!seenDigits) {
  3844           errNoDigitsInNCR();
  3845           emitOrAppendStrBuf(returnState);
  3846           state = returnState;
  3847           continue;
  3848         } else {
  3849           errCharRefLacksSemicolon();
  3851         handleNcrValue(returnState);
  3852         state = returnState;
  3853         continue;
  3855       case NS_HTML5TOKENIZER_CDATA_RSQB: {
  3856         tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
  3857         NS_HTML5_BREAK(eofloop);
  3859       case NS_HTML5TOKENIZER_CDATA_RSQB_RSQB: {
  3860         tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
  3861         NS_HTML5_BREAK(eofloop);
  3863       case NS_HTML5TOKENIZER_DATA:
  3864       default: {
  3865         NS_HTML5_BREAK(eofloop);
  3869   eofloop_end: ;
  3870   tokenHandler->eof();
  3871   return;
  3874 void 
  3875 nsHtml5Tokenizer::emitDoctypeToken(int32_t pos)
  3877   cstart = pos + 1;
  3878   tokenHandler->doctype(doctypeName, publicIdentifier, systemIdentifier, forceQuirks);
  3879   doctypeName = nullptr;
  3880   nsHtml5Portability::releaseString(publicIdentifier);
  3881   publicIdentifier = nullptr;
  3882   nsHtml5Portability::releaseString(systemIdentifier);
  3883   systemIdentifier = nullptr;
  3886 bool 
  3887 nsHtml5Tokenizer::internalEncodingDeclaration(nsString* internalCharset)
  3889   if (encodingDeclarationHandler) {
  3890     return encodingDeclarationHandler->internalEncodingDeclaration(internalCharset);
  3892   return false;
  3895 void 
  3896 nsHtml5Tokenizer::emitOrAppendTwo(const char16_t* val, int32_t returnState)
  3898   if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  3899     appendLongStrBuf(val[0]);
  3900     appendLongStrBuf(val[1]);
  3901   } else {
  3902     tokenHandler->characters(val, 0, 2);
  3906 void 
  3907 nsHtml5Tokenizer::emitOrAppendOne(const char16_t* val, int32_t returnState)
  3909   if ((returnState & NS_HTML5TOKENIZER_DATA_AND_RCDATA_MASK)) {
  3910     appendLongStrBuf(val[0]);
  3911   } else {
  3912     tokenHandler->characters(val, 0, 1);
  3916 void 
  3917 nsHtml5Tokenizer::end()
  3919   strBuf = nullptr;
  3920   longStrBuf = nullptr;
  3921   doctypeName = nullptr;
  3922   if (systemIdentifier) {
  3923     nsHtml5Portability::releaseString(systemIdentifier);
  3924     systemIdentifier = nullptr;
  3926   if (publicIdentifier) {
  3927     nsHtml5Portability::releaseString(publicIdentifier);
  3928     publicIdentifier = nullptr;
  3930   if (tagName) {
  3931     tagName->release();
  3932     tagName = nullptr;
  3934   if (attributeName) {
  3935     attributeName->release();
  3936     attributeName = nullptr;
  3938   tokenHandler->endTokenization();
  3939   if (attributes) {
  3940     attributes->clear(0);
  3944 void 
  3945 nsHtml5Tokenizer::requestSuspension()
  3947   shouldSuspend = true;
  3950 bool 
  3951 nsHtml5Tokenizer::isInDataState()
  3953   return (stateSave == NS_HTML5TOKENIZER_DATA);
  3956 void 
  3957 nsHtml5Tokenizer::resetToDataState()
  3959   strBufLen = 0;
  3960   longStrBufLen = 0;
  3961   stateSave = NS_HTML5TOKENIZER_DATA;
  3962   lastCR = false;
  3963   index = 0;
  3964   forceQuirks = false;
  3965   additional = '\0';
  3966   entCol = -1;
  3967   firstCharKey = -1;
  3968   lo = 0;
  3969   hi = 0;
  3970   candidate = -1;
  3971   strBufMark = 0;
  3972   prevValue = -1;
  3973   value = 0;
  3974   seenDigits = false;
  3975   endTag = false;
  3976   shouldSuspend = false;
  3977   initDoctypeFields();
  3978   if (tagName) {
  3979     tagName->release();
  3980     tagName = nullptr;
  3982   if (attributeName) {
  3983     attributeName->release();
  3984     attributeName = nullptr;
  3986   if (newAttributesEachTime) {
  3987     if (attributes) {
  3988       delete attributes;
  3989       attributes = nullptr;
  3994 void 
  3995 nsHtml5Tokenizer::loadState(nsHtml5Tokenizer* other)
  3997   strBufLen = other->strBufLen;
  3998   if (strBufLen > strBuf.length) {
  3999     strBuf = jArray<char16_t,int32_t>::newJArray(strBufLen);
  4001   nsHtml5ArrayCopy::arraycopy(other->strBuf, strBuf, strBufLen);
  4002   longStrBufLen = other->longStrBufLen;
  4003   if (longStrBufLen > longStrBuf.length) {
  4004     longStrBuf = jArray<char16_t,int32_t>::newJArray(longStrBufLen);
  4006   nsHtml5ArrayCopy::arraycopy(other->longStrBuf, longStrBuf, longStrBufLen);
  4007   stateSave = other->stateSave;
  4008   returnStateSave = other->returnStateSave;
  4009   endTagExpectation = other->endTagExpectation;
  4010   endTagExpectationAsArray = other->endTagExpectationAsArray;
  4011   lastCR = other->lastCR;
  4012   index = other->index;
  4013   forceQuirks = other->forceQuirks;
  4014   additional = other->additional;
  4015   entCol = other->entCol;
  4016   firstCharKey = other->firstCharKey;
  4017   lo = other->lo;
  4018   hi = other->hi;
  4019   candidate = other->candidate;
  4020   strBufMark = other->strBufMark;
  4021   prevValue = other->prevValue;
  4022   value = other->value;
  4023   seenDigits = other->seenDigits;
  4024   endTag = other->endTag;
  4025   shouldSuspend = false;
  4026   if (!other->doctypeName) {
  4027     doctypeName = nullptr;
  4028   } else {
  4029     doctypeName = nsHtml5Portability::newLocalFromLocal(other->doctypeName, interner);
  4031   nsHtml5Portability::releaseString(systemIdentifier);
  4032   if (!other->systemIdentifier) {
  4033     systemIdentifier = nullptr;
  4034   } else {
  4035     systemIdentifier = nsHtml5Portability::newStringFromString(other->systemIdentifier);
  4037   nsHtml5Portability::releaseString(publicIdentifier);
  4038   if (!other->publicIdentifier) {
  4039     publicIdentifier = nullptr;
  4040   } else {
  4041     publicIdentifier = nsHtml5Portability::newStringFromString(other->publicIdentifier);
  4043   if (tagName) {
  4044     tagName->release();
  4046   if (!other->tagName) {
  4047     tagName = nullptr;
  4048   } else {
  4049     tagName = other->tagName->cloneElementName(interner);
  4051   if (attributeName) {
  4052     attributeName->release();
  4054   if (!other->attributeName) {
  4055     attributeName = nullptr;
  4056   } else {
  4057     attributeName = other->attributeName->cloneAttributeName(interner);
  4059   delete attributes;
  4060   if (!other->attributes) {
  4061     attributes = nullptr;
  4062   } else {
  4063     attributes = other->attributes->cloneAttributes(interner);
  4067 void 
  4068 nsHtml5Tokenizer::initializeWithoutStarting()
  4070   confident = false;
  4071   strBuf = jArray<char16_t,int32_t>::newJArray(64);
  4072   longStrBuf = jArray<char16_t,int32_t>::newJArray(1024);
  4073   line = 1;
  4074   resetToDataState();
  4077 void 
  4078 nsHtml5Tokenizer::setEncodingDeclarationHandler(nsHtml5StreamParser* encodingDeclarationHandler)
  4080   this->encodingDeclarationHandler = encodingDeclarationHandler;
  4084 nsHtml5Tokenizer::~nsHtml5Tokenizer()
  4086   MOZ_COUNT_DTOR(nsHtml5Tokenizer);
  4087   delete attributes;
  4088   attributes = nullptr;
  4091 void
  4092 nsHtml5Tokenizer::initializeStatics()
  4096 void
  4097 nsHtml5Tokenizer::releaseStatics()
  4102 #include "nsHtml5TokenizerCppSupplement.h"

mercurial