LCOV - code coverage report
Current view: top level - parser/html - nsHtml5Tokenizer.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 497 2198 22.6 %
Date: 2017-07-14 16:53:18 Functions: 30 48 62.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2005-2007 Henri Sivonen
       3             :  * Copyright (c) 2007-2015 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             :  */
      25             : 
      26             : /*
      27             :  * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
      28             :  * Please edit Tokenizer.java instead and regenerate.
      29             :  */
      30             : 
      31             : #define nsHtml5Tokenizer_cpp__
      32             : 
      33             : #include "nsIAtom.h"
      34             : #include "nsHtml5AtomTable.h"
      35             : #include "nsHtml5String.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 "nsGkAtoms.h"
      44             : #include "nsAHtml5TreeBuilderState.h"
      45             : #include "nsHtml5Macros.h"
      46             : #include "nsHtml5Highlighter.h"
      47             : #include "nsHtml5TokenizerLoopPolicies.h"
      48             : 
      49             : #include "nsHtml5AttributeName.h"
      50             : #include "nsHtml5ElementName.h"
      51             : #include "nsHtml5TreeBuilder.h"
      52             : #include "nsHtml5MetaScanner.h"
      53             : #include "nsHtml5StackNode.h"
      54             : #include "nsHtml5UTF16Buffer.h"
      55             : #include "nsHtml5StateSnapshot.h"
      56             : #include "nsHtml5Portability.h"
      57             : 
      58             : #include "nsHtml5Tokenizer.h"
      59             : 
      60             : char16_t nsHtml5Tokenizer::LT_GT[] = { '<', '>' };
      61             : char16_t nsHtml5Tokenizer::LT_SOLIDUS[] = { '<', '/' };
      62             : char16_t nsHtml5Tokenizer::RSQB_RSQB[] = { ']', ']' };
      63             : char16_t nsHtml5Tokenizer::REPLACEMENT_CHARACTER[] = { 0xfffd };
      64             : char16_t nsHtml5Tokenizer::LF[] = { '\n' };
      65             : char16_t nsHtml5Tokenizer::CDATA_LSQB[] = { 'C', 'D', 'A', 'T', 'A', '[' };
      66             : char16_t nsHtml5Tokenizer::OCTYPE[] = { 'o', 'c', 't', 'y', 'p', 'e' };
      67             : char16_t nsHtml5Tokenizer::UBLIC[] = { 'u', 'b', 'l', 'i', 'c' };
      68             : char16_t nsHtml5Tokenizer::YSTEM[] = { 'y', 's', 't', 'e', 'm' };
      69             : static char16_t const TITLE_ARR_DATA[] = { 't', 'i', 't', 'l', 'e' };
      70             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::TITLE_ARR = { TITLE_ARR_DATA, MOZ_ARRAY_LENGTH(TITLE_ARR_DATA) };
      71             : static char16_t const SCRIPT_ARR_DATA[] = { 's', 'c', 'r', 'i', 'p', 't' };
      72             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::SCRIPT_ARR = { SCRIPT_ARR_DATA, MOZ_ARRAY_LENGTH(SCRIPT_ARR_DATA) };
      73             : static char16_t const STYLE_ARR_DATA[] = { 's', 't', 'y', 'l', 'e' };
      74             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::STYLE_ARR = { STYLE_ARR_DATA, MOZ_ARRAY_LENGTH(STYLE_ARR_DATA) };
      75             : static char16_t const PLAINTEXT_ARR_DATA[] = { 'p', 'l', 'a', 'i', 'n', 't', 'e', 'x', 't' };
      76             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::PLAINTEXT_ARR = { PLAINTEXT_ARR_DATA, MOZ_ARRAY_LENGTH(PLAINTEXT_ARR_DATA) };
      77             : static char16_t const XMP_ARR_DATA[] = { 'x', 'm', 'p' };
      78             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::XMP_ARR = { XMP_ARR_DATA, MOZ_ARRAY_LENGTH(XMP_ARR_DATA) };
      79             : static char16_t const TEXTAREA_ARR_DATA[] = { 't', 'e', 'x', 't', 'a', 'r', 'e', 'a' };
      80             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::TEXTAREA_ARR = { TEXTAREA_ARR_DATA, MOZ_ARRAY_LENGTH(TEXTAREA_ARR_DATA) };
      81             : static char16_t const IFRAME_ARR_DATA[] = { 'i', 'f', 'r', 'a', 'm', 'e' };
      82             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::IFRAME_ARR = { IFRAME_ARR_DATA, MOZ_ARRAY_LENGTH(IFRAME_ARR_DATA) };
      83             : static char16_t const NOEMBED_ARR_DATA[] = { 'n', 'o', 'e', 'm', 'b', 'e', 'd' };
      84             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOEMBED_ARR = { NOEMBED_ARR_DATA, MOZ_ARRAY_LENGTH(NOEMBED_ARR_DATA) };
      85             : static char16_t const NOSCRIPT_ARR_DATA[] = { 'n', 'o', 's', 'c', 'r', 'i', 'p', 't' };
      86             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOSCRIPT_ARR = { NOSCRIPT_ARR_DATA, MOZ_ARRAY_LENGTH(NOSCRIPT_ARR_DATA) };
      87             : static char16_t const NOFRAMES_ARR_DATA[] = { 'n', 'o', 'f', 'r', 'a', 'm', 'e', 's' };
      88             : staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOFRAMES_ARR = { NOFRAMES_ARR_DATA, MOZ_ARRAY_LENGTH(NOFRAMES_ARR_DATA) };
      89             : 
      90           4 : nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder* tokenHandler,
      91           4 :                                    bool viewingXmlSource)
      92             :   : tokenHandler(tokenHandler)
      93             :   , encodingDeclarationHandler(nullptr)
      94           8 :   , charRefBuf(jArray<char16_t, int32_t>::newJArray(32))
      95           8 :   , bmpChar(jArray<char16_t, int32_t>::newJArray(1))
      96           8 :   , astralChar(jArray<char16_t, int32_t>::newJArray(2))
      97             :   , containsHyphen(false)
      98             :   , tagName(nullptr)
      99           4 :   , nonInternedTagName(new nsHtml5ElementName())
     100             :   , attributeName(nullptr)
     101           4 :   , nonInternedAttributeName(new nsHtml5AttributeName())
     102             :   , doctypeName(nullptr)
     103             :   , publicIdentifier(nullptr)
     104             :   , systemIdentifier(nullptr)
     105           4 :   , attributes(tokenHandler->HasBuilder() ? new nsHtml5HtmlAttributes(0)
     106             :                                           : nullptr)
     107           4 :   , newAttributesEachTime(!tokenHandler->HasBuilder())
     108          36 :   , viewingXmlSource(viewingXmlSource)
     109             : {
     110           4 :   MOZ_COUNT_CTOR(nsHtml5Tokenizer);
     111           4 : }
     112             : 
     113             : void 
     114           4 : nsHtml5Tokenizer::setInterner(nsHtml5AtomTable* interner)
     115             : {
     116           4 :   this->interner = interner;
     117           4 : }
     118             : 
     119             : void
     120           0 : nsHtml5Tokenizer::initLocation(nsHtml5String newPublicId,
     121             :                                nsHtml5String newSystemId)
     122             : {
     123           0 :   this->systemId = newSystemId;
     124           0 :   this->publicId = newPublicId;
     125           0 : }
     126             : 
     127             : bool 
     128          27 : nsHtml5Tokenizer::isViewingXmlSource()
     129             : {
     130          27 :   return viewingXmlSource;
     131             : }
     132             : 
     133             : void 
     134           0 : nsHtml5Tokenizer::setStateAndEndTagExpectation(int32_t specialTokenizerState, nsIAtom* endTagExpectation)
     135             : {
     136           0 :   this->stateSave = specialTokenizerState;
     137           0 :   if (specialTokenizerState == nsHtml5Tokenizer::DATA) {
     138           0 :     return;
     139             :   }
     140           0 :   autoJArray<char16_t,int32_t> asArray = nsHtml5Portability::newCharArrayFromLocal(endTagExpectation);
     141           0 :   this->endTagExpectation = nsHtml5ElementName::elementNameByBuffer(asArray, 0, asArray.length, interner);
     142           0 :   MOZ_ASSERT(!!this->endTagExpectation);
     143           0 :   endTagExpectationToArray();
     144             : }
     145             : 
     146             : void 
     147           6 : nsHtml5Tokenizer::setStateAndEndTagExpectation(int32_t specialTokenizerState, nsHtml5ElementName* endTagExpectation)
     148             : {
     149           6 :   this->stateSave = specialTokenizerState;
     150           6 :   this->endTagExpectation = endTagExpectation;
     151           6 :   endTagExpectationToArray();
     152           6 : }
     153             : 
     154             : void 
     155           6 : nsHtml5Tokenizer::endTagExpectationToArray()
     156             : {
     157           6 :   switch(endTagExpectation->getGroup()) {
     158             :     case nsHtml5TreeBuilder::TITLE: {
     159           1 :       endTagExpectationAsArray = TITLE_ARR;
     160           1 :       return;
     161             :     }
     162             :     case nsHtml5TreeBuilder::SCRIPT: {
     163           5 :       endTagExpectationAsArray = SCRIPT_ARR;
     164           5 :       return;
     165             :     }
     166             :     case nsHtml5TreeBuilder::STYLE: {
     167           0 :       endTagExpectationAsArray = STYLE_ARR;
     168           0 :       return;
     169             :     }
     170             :     case nsHtml5TreeBuilder::PLAINTEXT: {
     171           0 :       endTagExpectationAsArray = PLAINTEXT_ARR;
     172           0 :       return;
     173             :     }
     174             :     case nsHtml5TreeBuilder::XMP: {
     175           0 :       endTagExpectationAsArray = XMP_ARR;
     176           0 :       return;
     177             :     }
     178             :     case nsHtml5TreeBuilder::TEXTAREA: {
     179           0 :       endTagExpectationAsArray = TEXTAREA_ARR;
     180           0 :       return;
     181             :     }
     182             :     case nsHtml5TreeBuilder::IFRAME: {
     183           0 :       endTagExpectationAsArray = IFRAME_ARR;
     184           0 :       return;
     185             :     }
     186             :     case nsHtml5TreeBuilder::NOEMBED: {
     187           0 :       endTagExpectationAsArray = NOEMBED_ARR;
     188           0 :       return;
     189             :     }
     190             :     case nsHtml5TreeBuilder::NOSCRIPT: {
     191           0 :       endTagExpectationAsArray = NOSCRIPT_ARR;
     192           0 :       return;
     193             :     }
     194             :     case nsHtml5TreeBuilder::NOFRAMES: {
     195           0 :       endTagExpectationAsArray = NOFRAMES_ARR;
     196           0 :       return;
     197             :     }
     198             :     default: {
     199           0 :       MOZ_ASSERT(false, "Bad end tag expectation.");
     200             :       return;
     201             :     }
     202             :   }
     203             : }
     204             : 
     205             : void 
     206           5 : nsHtml5Tokenizer::setLineNumber(int32_t line)
     207             : {
     208           5 :   this->attributeLine = line;
     209           5 :   this->line = line;
     210           5 : }
     211             : 
     212             : nsHtml5HtmlAttributes* 
     213           4 : nsHtml5Tokenizer::emptyAttributes()
     214             : {
     215           4 :   return nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES;
     216             : }
     217             : 
     218             : void 
     219           0 : nsHtml5Tokenizer::emitOrAppendCharRefBuf(int32_t returnState)
     220             : {
     221           0 :   if ((returnState & DATA_AND_RCDATA_MASK)) {
     222           0 :     appendCharRefBufToStrBuf();
     223             :   } else {
     224           0 :     if (charRefBufLen > 0) {
     225           0 :       tokenHandler->characters(charRefBuf, 0, charRefBufLen);
     226           0 :       charRefBufLen = 0;
     227             :     }
     228             :   }
     229           0 : }
     230             : 
     231             : nsHtml5String
     232          17 : nsHtml5Tokenizer::strBufToString()
     233             : {
     234             :   nsHtml5String str =
     235          17 :     nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen, tokenHandler);
     236          17 :   clearStrBufAfterUse();
     237          17 :   return str;
     238             : }
     239             : 
     240             : void 
     241           1 : nsHtml5Tokenizer::strBufToDoctypeName()
     242             : {
     243           1 :   doctypeName = nsHtml5Portability::newLocalNameFromBuffer(strBuf, 0, strBufLen, interner);
     244           1 :   clearStrBufAfterUse();
     245           1 : }
     246             : 
     247             : void 
     248           0 : nsHtml5Tokenizer::emitStrBuf()
     249             : {
     250           0 :   if (strBufLen > 0) {
     251           0 :     tokenHandler->characters(strBuf, 0, strBufLen);
     252           0 :     clearStrBufAfterUse();
     253             :   }
     254           0 : }
     255             : 
     256             : void 
     257           0 : nsHtml5Tokenizer::appendStrBuf(char16_t* buffer, int32_t offset, int32_t length)
     258             : {
     259           0 :   int32_t newLen = strBufLen + length;
     260           0 :   MOZ_ASSERT(newLen <= strBuf.length, "Previous buffer length insufficient.");
     261           0 :   if (MOZ_UNLIKELY(strBuf.length < newLen)) {
     262           0 :     if (MOZ_UNLIKELY(!EnsureBufferSpace(length))) {
     263           0 :       MOZ_CRASH("Unable to recover from buffer reallocation failure");
     264             :     }
     265             :   }
     266           0 :   nsHtml5ArrayCopy::arraycopy(buffer, offset, strBuf, strBufLen, length);
     267           0 :   strBufLen = newLen;
     268           0 : }
     269             : 
     270             : void 
     271           5 : nsHtml5Tokenizer::emitComment(int32_t provisionalHyphens, int32_t pos)
     272             : {
     273           5 :   tokenHandler->comment(strBuf, 0, strBufLen - provisionalHyphens);
     274           5 :   clearStrBufAfterUse();
     275           5 :   cstart = pos + 1;
     276           5 : }
     277             : 
     278             : void 
     279          42 : nsHtml5Tokenizer::flushChars(char16_t* buf, int32_t pos)
     280             : {
     281          42 :   if (pos > cstart) {
     282          20 :     tokenHandler->characters(buf, cstart, pos - cstart);
     283             :   }
     284          42 :   cstart = INT32_MAX;
     285          42 : }
     286             : 
     287             : void 
     288          18 : nsHtml5Tokenizer::strBufToElementNameString()
     289             : {
     290          18 :   if (containsHyphen) {
     291           0 :     nsIAtom* annotationName = nsHtml5ElementName::ELT_ANNOTATION_XML->getName();
     292           0 :     if (nsHtml5Portability::localEqualsBuffer(
     293             :           annotationName, strBuf, 0, strBufLen)) {
     294           0 :       tagName = nsHtml5ElementName::ELT_ANNOTATION_XML;
     295             :     } else {
     296           0 :       nonInternedTagName->setNameForNonInterned(
     297             :         nsHtml5Portability::newLocalNameFromBuffer(
     298           0 :           strBuf, 0, strBufLen, interner));
     299           0 :       tagName = nonInternedTagName;
     300             :     }
     301             :   } else {
     302          18 :     tagName =
     303          18 :       nsHtml5ElementName::elementNameByBuffer(strBuf, 0, strBufLen, interner);
     304          18 :     if (!tagName) {
     305           0 :       nonInternedTagName->setNameForNonInterned(
     306             :         nsHtml5Portability::newLocalNameFromBuffer(
     307           0 :           strBuf, 0, strBufLen, interner));
     308           0 :       tagName = nonInternedTagName;
     309             :     }
     310             :   }
     311          18 :   containsHyphen = false;
     312          18 :   clearStrBufAfterUse();
     313          18 : }
     314             : 
     315             : int32_t 
     316          24 : nsHtml5Tokenizer::emitCurrentTagToken(bool selfClosing, int32_t pos)
     317             : {
     318          24 :   cstart = pos + 1;
     319          24 :   maybeErrSlashInEndTag(selfClosing);
     320          24 :   stateSave = nsHtml5Tokenizer::DATA;
     321          24 :   nsHtml5HtmlAttributes* attrs = (!attributes ? nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES : attributes);
     322          24 :   if (endTag) {
     323          11 :     maybeErrAttributesOnEndTag(attrs);
     324          11 :     if (!viewingXmlSource) {
     325          11 :       tokenHandler->endTag(tagName);
     326             :     }
     327          11 :     if (newAttributesEachTime) {
     328          11 :       delete attributes;
     329          11 :       attributes = nullptr;
     330             :     }
     331             :   } else {
     332          13 :     if (viewingXmlSource) {
     333           0 :       MOZ_ASSERT(newAttributesEachTime);
     334           0 :       delete attributes;
     335           0 :       attributes = nullptr;
     336             :     } else {
     337          13 :       tokenHandler->startTag(tagName, attrs, selfClosing);
     338             :     }
     339             :   }
     340          24 :   tagName = nullptr;
     341          24 :   if (newAttributesEachTime) {
     342          24 :     attributes = nullptr;
     343             :   } else {
     344           0 :     attributes->clear(0);
     345             :   }
     346          24 :   return stateSave;
     347             : }
     348             : 
     349             : void 
     350          16 : nsHtml5Tokenizer::attributeNameComplete()
     351             : {
     352          16 :   attributeName = nsHtml5AttributeName::nameByBuffer(strBuf, 0, strBufLen, interner);
     353          16 :   if (!attributeName) {
     354           0 :     nonInternedAttributeName->setNameForNonInterned(
     355             :       nsHtml5Portability::newLocalNameFromBuffer(
     356           0 :         strBuf, 0, strBufLen, interner));
     357           0 :     attributeName = nonInternedAttributeName;
     358             :   }
     359          16 :   clearStrBufAfterUse();
     360          16 :   if (!attributes) {
     361           7 :     attributes = new nsHtml5HtmlAttributes(0);
     362             :   }
     363          16 :   if (attributes->contains(attributeName)) {
     364           0 :     errDuplicateAttribute();
     365           0 :     attributeName = nullptr;
     366             :   }
     367          16 : }
     368             : 
     369             : void 
     370           0 : nsHtml5Tokenizer::addAttributeWithoutValue()
     371             : {
     372             : 
     373           0 :   if (attributeName) {
     374           0 :     attributes->addAttribute(attributeName, nsHtml5Portability::newEmptyString(), attributeLine);
     375           0 :     attributeName = nullptr;
     376             :   } else {
     377           0 :     clearStrBufAfterUse();
     378             :   }
     379           0 : }
     380             : 
     381             : void 
     382          16 : nsHtml5Tokenizer::addAttributeWithValue()
     383             : {
     384          16 :   if (attributeName) {
     385          16 :     nsHtml5String val = strBufToString();
     386          16 :     if (mViewSource) {
     387           0 :       mViewSource->MaybeLinkifyAttributeValue(attributeName, val);
     388             :     }
     389          16 :     attributes->addAttribute(attributeName, val, attributeLine);
     390          16 :     attributeName = nullptr;
     391             :   } else {
     392           0 :     clearStrBufAfterUse();
     393             :   }
     394          16 : }
     395             : 
     396             : void 
     397           4 : nsHtml5Tokenizer::start()
     398             : {
     399           4 :   initializeWithoutStarting();
     400           4 :   tokenHandler->startTokenization(this);
     401           4 : }
     402             : 
     403             : bool 
     404           9 : nsHtml5Tokenizer::tokenizeBuffer(nsHtml5UTF16Buffer* buffer)
     405             : {
     406           9 :   int32_t state = stateSave;
     407           9 :   int32_t returnState = returnStateSave;
     408           9 :   char16_t c = '\0';
     409           9 :   shouldSuspend = false;
     410           9 :   lastCR = false;
     411           9 :   int32_t start = buffer->getStart();
     412           9 :   int32_t end = buffer->getEnd();
     413           9 :   int32_t pos = start - 1;
     414           9 :   switch(state) {
     415             :     case DATA:
     416             :     case RCDATA:
     417             :     case SCRIPT_DATA:
     418             :     case PLAINTEXT:
     419             :     case RAWTEXT:
     420             :     case CDATA_SECTION:
     421             :     case SCRIPT_DATA_ESCAPED:
     422             :     case SCRIPT_DATA_ESCAPE_START:
     423             :     case SCRIPT_DATA_ESCAPE_START_DASH:
     424             :     case SCRIPT_DATA_ESCAPED_DASH:
     425             :     case SCRIPT_DATA_ESCAPED_DASH_DASH:
     426             :     case SCRIPT_DATA_DOUBLE_ESCAPE_START:
     427             :     case SCRIPT_DATA_DOUBLE_ESCAPED:
     428             :     case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:
     429             :     case SCRIPT_DATA_DOUBLE_ESCAPED_DASH:
     430             :     case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:
     431             :     case SCRIPT_DATA_DOUBLE_ESCAPE_END: {
     432           9 :       cstart = start;
     433           9 :       break;
     434             :     }
     435             :     default: {
     436           0 :       cstart = INT32_MAX;
     437           0 :       break;
     438             :     }
     439             :   }
     440           9 :   if (mViewSource) {
     441           0 :     mViewSource->SetBuffer(buffer);
     442           0 :     pos = stateLoop<nsHtml5ViewSourcePolicy>(state, c, pos, buffer->getBuffer(), false, returnState, buffer->getEnd());
     443           0 :     mViewSource->DropBuffer((pos == buffer->getEnd()) ? pos : pos + 1);
     444             :   } else {
     445           9 :     pos = stateLoop<nsHtml5SilentPolicy>(state, c, pos, buffer->getBuffer(), false, returnState, buffer->getEnd());
     446             :   }
     447           9 :   if (pos == end) {
     448           4 :     buffer->setStart(pos);
     449             :   } else {
     450           5 :     buffer->setStart(pos + 1);
     451             :   }
     452           9 :   return lastCR;
     453             : }
     454             : 
     455             : template<class P>
     456             : int32_t 
     457          75 : nsHtml5Tokenizer::stateLoop(int32_t state, char16_t c, int32_t pos, char16_t* buf, bool reconsume, int32_t returnState, int32_t endPos)
     458             : {
     459           0 :   stateloop: for (; ; ) {
     460          75 :     switch(state) {
     461             :       case DATA: {
     462             :         for (; ; ) {
     463          56 :           if (reconsume) {
     464           0 :             reconsume = false;
     465             :           } else {
     466          41 :             if (++pos == endPos) {
     467           2 :               NS_HTML5_BREAK(stateloop);
     468             :             }
     469          39 :             c = checkChar(buf, pos);
     470             :           }
     471          39 :           switch(c) {
     472             :             case '&': {
     473           0 :               flushChars(buf, pos);
     474           0 :               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
     475           0 :               appendCharRefBuf(c);
     476           0 :               setAdditionalAndRememberAmpersandLocation('\0');
     477           0 :               returnState = state;
     478           0 :               state =
     479           0 :                 P::transition(mViewSource,
     480             :                               nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
     481             :                               reconsume,
     482             :                               pos);
     483           0 :               NS_HTML5_CONTINUE(stateloop);
     484             :             }
     485             :             case '<': {
     486          24 :               flushChars(buf, pos);
     487          24 :               state = P::transition(
     488             :                 mViewSource, nsHtml5Tokenizer::TAG_OPEN, reconsume, pos);
     489          24 :               NS_HTML5_BREAK(dataloop);
     490             :             }
     491             :             case '\0': {
     492           0 :               emitReplacementCharacter(buf, pos);
     493           0 :               continue;
     494             :             }
     495             :             case '\r': {
     496           0 :               emitCarriageReturn(buf, pos);
     497           0 :               NS_HTML5_BREAK(stateloop);
     498             :             }
     499             :             case '\n': {
     500          15 :               silentLineFeed();
     501             :             }
     502             :             default: {
     503          15 :               continue;
     504             :             }
     505             :           }
     506             :         }
     507             :         dataloop_end: ;
     508             :       }
     509             :       case TAG_OPEN: {
     510             :         for (; ; ) {
     511          24 :           if (++pos == endPos) {
     512           0 :             NS_HTML5_BREAK(stateloop);
     513             :           }
     514          24 :           c = checkChar(buf, pos);
     515          24 :           if (c >= 'A' && c <= 'Z') {
     516           0 :             endTag = false;
     517           0 :             clearStrBufBeforeUse();
     518           0 :             appendStrBuf((char16_t) (c + 0x20));
     519           0 :             containsHyphen = false;
     520           0 :             state = P::transition(
     521             :               mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
     522           0 :             NS_HTML5_BREAK(tagopenloop);
     523          24 :           } else if (c >= 'a' && c <= 'z') {
     524          13 :             endTag = false;
     525          13 :             clearStrBufBeforeUse();
     526          13 :             appendStrBuf(c);
     527          13 :             containsHyphen = false;
     528          13 :             state = P::transition(
     529             :               mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
     530          13 :             NS_HTML5_BREAK(tagopenloop);
     531             :           }
     532          11 :           switch(c) {
     533             :             case '!': {
     534           6 :               state = P::transition(mViewSource,
     535             :                                     nsHtml5Tokenizer::MARKUP_DECLARATION_OPEN,
     536             :                                     reconsume,
     537             :                                     pos);
     538           6 :               NS_HTML5_CONTINUE(stateloop);
     539             :             }
     540             :             case '/': {
     541           5 :               state = P::transition(
     542             :                 mViewSource, nsHtml5Tokenizer::CLOSE_TAG_OPEN, reconsume, pos);
     543           5 :               NS_HTML5_CONTINUE(stateloop);
     544             :             }
     545             :             case '\?': {
     546           0 :               if (viewingXmlSource) {
     547           0 :                 state = P::transition(mViewSource,
     548             :                                       nsHtml5Tokenizer::PROCESSING_INSTRUCTION,
     549             :                                       reconsume,
     550             :                                       pos);
     551           0 :                 NS_HTML5_CONTINUE(stateloop);
     552             :               }
     553             :               if (P::reportErrors) {
     554           0 :                 errProcessingInstruction();
     555             :               }
     556           0 :               clearStrBufBeforeUse();
     557           0 :               appendStrBuf(c);
     558           0 :               state = P::transition(
     559             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
     560           0 :               NS_HTML5_CONTINUE(stateloop);
     561             :             }
     562             :             case '>': {
     563             :               if (P::reportErrors) {
     564           0 :                 errLtGt();
     565             :               }
     566           0 :               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 2);
     567           0 :               cstart = pos + 1;
     568           0 :               state = P::transition(
     569             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
     570           0 :               NS_HTML5_CONTINUE(stateloop);
     571             :             }
     572             :             default: {
     573             :               if (P::reportErrors) {
     574           0 :                 errBadCharAfterLt(c);
     575             :               }
     576           0 :               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
     577           0 :               cstart = pos;
     578           0 :               reconsume = true;
     579           0 :               state = P::transition(
     580             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
     581           0 :               NS_HTML5_CONTINUE(stateloop);
     582             :             }
     583             :           }
     584             :         }
     585             :         tagopenloop_end: ;
     586             :       }
     587             :       case TAG_NAME: {
     588             :         for (; ; ) {
     589         148 :           if (++pos == endPos) {
     590           0 :             NS_HTML5_BREAK(stateloop);
     591             :           }
     592          83 :           c = checkChar(buf, pos);
     593          83 :           switch(c) {
     594             :             case '\r': {
     595           0 :               silentCarriageReturn();
     596           0 :               strBufToElementNameString();
     597           0 :               state = P::transition(mViewSource,
     598             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
     599             :                                     reconsume,
     600             :                                     pos);
     601           0 :               NS_HTML5_BREAK(stateloop);
     602             :             }
     603             :             case '\n': {
     604           0 :               silentLineFeed();
     605             :             }
     606             :             case ' ':
     607             :             case '\t':
     608             :             case '\f': {
     609           7 :               strBufToElementNameString();
     610           7 :               state = P::transition(mViewSource,
     611             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
     612             :                                     reconsume,
     613             :                                     pos);
     614           7 :               NS_HTML5_BREAK(tagnameloop);
     615             :             }
     616             :             case '/': {
     617           0 :               strBufToElementNameString();
     618           0 :               state = P::transition(mViewSource,
     619             :                                     nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
     620             :                                     reconsume,
     621             :                                     pos);
     622           0 :               NS_HTML5_CONTINUE(stateloop);
     623             :             }
     624             :             case '>': {
     625          11 :               strBufToElementNameString();
     626          11 :               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
     627          11 :               if (shouldSuspend) {
     628           0 :                 NS_HTML5_BREAK(stateloop);
     629             :               }
     630          11 :               NS_HTML5_CONTINUE(stateloop);
     631             :             }
     632             :             case '\0': {
     633           0 :               c = 0xfffd;
     634             :             }
     635             :             default: {
     636          65 :               if (c >= 'A' && c <= 'Z') {
     637           0 :                 c += 0x20;
     638          65 :               } else if (c == '-') {
     639           0 :                 containsHyphen = true;
     640             :               }
     641          65 :               appendStrBuf(c);
     642          65 :               continue;
     643             :             }
     644             :           }
     645             :         }
     646             :         tagnameloop_end: ;
     647             :       }
     648             :       case BEFORE_ATTRIBUTE_NAME: {
     649             :         for (; ; ) {
     650          16 :           if (reconsume) {
     651           0 :             reconsume = false;
     652             :           } else {
     653          16 :             if (++pos == endPos) {
     654           0 :               NS_HTML5_BREAK(stateloop);
     655             :             }
     656          16 :             c = checkChar(buf, pos);
     657             :           }
     658          16 :           switch(c) {
     659             :             case '\r': {
     660           0 :               silentCarriageReturn();
     661           0 :               NS_HTML5_BREAK(stateloop);
     662             :             }
     663             :             case '\n': {
     664           0 :               silentLineFeed();
     665             :             }
     666             :             case ' ':
     667             :             case '\t':
     668             :             case '\f': {
     669           0 :               continue;
     670             :             }
     671             :             case '/': {
     672           0 :               state = P::transition(mViewSource,
     673             :                                     nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
     674             :                                     reconsume,
     675             :                                     pos);
     676           0 :               NS_HTML5_CONTINUE(stateloop);
     677             :             }
     678             :             case '>': {
     679           0 :               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
     680           0 :               if (shouldSuspend) {
     681           0 :                 NS_HTML5_BREAK(stateloop);
     682             :               }
     683           0 :               NS_HTML5_CONTINUE(stateloop);
     684             :             }
     685             :             case '\0': {
     686           0 :               c = 0xfffd;
     687             :             }
     688             :             case '\"':
     689             :             case '\'':
     690             :             case '<':
     691             :             case '=': {
     692             :               if (P::reportErrors) {
     693           0 :                 errBadCharBeforeAttributeNameOrNull(c);
     694             :               }
     695             :             }
     696             :             default: {
     697          16 :               if (c >= 'A' && c <= 'Z') {
     698           0 :                 c += 0x20;
     699             :               }
     700          16 :               attributeLine = line;
     701          16 :               clearStrBufBeforeUse();
     702          16 :               appendStrBuf(c);
     703          16 :               state = P::transition(
     704             :                 mViewSource, nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume, pos);
     705          16 :               NS_HTML5_BREAK(beforeattributenameloop);
     706             :             }
     707             :           }
     708             :         }
     709             :         beforeattributenameloop_end: ;
     710             :       }
     711             :       case ATTRIBUTE_NAME: {
     712             :         for (; ; ) {
     713         156 :           if (++pos == endPos) {
     714           0 :             NS_HTML5_BREAK(stateloop);
     715             :           }
     716          86 :           c = checkChar(buf, pos);
     717          86 :           switch(c) {
     718             :             case '\r': {
     719           0 :               silentCarriageReturn();
     720           0 :               attributeNameComplete();
     721           0 :               state = P::transition(mViewSource,
     722             :                                     nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME,
     723             :                                     reconsume,
     724             :                                     pos);
     725           0 :               NS_HTML5_BREAK(stateloop);
     726             :             }
     727             :             case '\n': {
     728           0 :               silentLineFeed();
     729             :             }
     730             :             case ' ':
     731             :             case '\t':
     732             :             case '\f': {
     733           0 :               attributeNameComplete();
     734           0 :               state = P::transition(mViewSource,
     735             :                                     nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME,
     736             :                                     reconsume,
     737             :                                     pos);
     738           0 :               NS_HTML5_CONTINUE(stateloop);
     739             :             }
     740             :             case '/': {
     741           0 :               attributeNameComplete();
     742           0 :               addAttributeWithoutValue();
     743           0 :               state = P::transition(mViewSource,
     744             :                                     nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
     745             :                                     reconsume,
     746             :                                     pos);
     747           0 :               NS_HTML5_CONTINUE(stateloop);
     748             :             }
     749             :             case '=': {
     750          16 :               attributeNameComplete();
     751          16 :               state = P::transition(mViewSource,
     752             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE,
     753             :                                     reconsume,
     754             :                                     pos);
     755          16 :               NS_HTML5_BREAK(attributenameloop);
     756             :             }
     757             :             case '>': {
     758           0 :               attributeNameComplete();
     759           0 :               addAttributeWithoutValue();
     760           0 :               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
     761           0 :               if (shouldSuspend) {
     762           0 :                 NS_HTML5_BREAK(stateloop);
     763             :               }
     764           0 :               NS_HTML5_CONTINUE(stateloop);
     765             :             }
     766             :             case '\0': {
     767           0 :               c = 0xfffd;
     768             :             }
     769             :             case '\"':
     770             :             case '\'':
     771             :             case '<': {
     772             :               if (P::reportErrors) {
     773           0 :                 errQuoteOrLtInAttributeNameOrNull(c);
     774             :               }
     775             :             }
     776             :             default: {
     777          70 :               if (c >= 'A' && c <= 'Z') {
     778           0 :                 c += 0x20;
     779             :               }
     780          70 :               appendStrBuf(c);
     781          70 :               continue;
     782             :             }
     783             :           }
     784             :         }
     785             :         attributenameloop_end: ;
     786             :       }
     787             :       case BEFORE_ATTRIBUTE_VALUE: {
     788             :         for (; ; ) {
     789          16 :           if (++pos == endPos) {
     790           0 :             NS_HTML5_BREAK(stateloop);
     791             :           }
     792          16 :           c = checkChar(buf, pos);
     793          16 :           switch(c) {
     794             :             case '\r': {
     795           0 :               silentCarriageReturn();
     796           0 :               NS_HTML5_BREAK(stateloop);
     797             :             }
     798             :             case '\n': {
     799           0 :               silentLineFeed();
     800             :             }
     801             :             case ' ':
     802             :             case '\t':
     803             :             case '\f': {
     804           0 :               continue;
     805             :             }
     806             :             case '\"': {
     807          16 :               attributeLine = line;
     808          16 :               clearStrBufBeforeUse();
     809          16 :               state =
     810          16 :                 P::transition(mViewSource,
     811             :                               nsHtml5Tokenizer::ATTRIBUTE_VALUE_DOUBLE_QUOTED,
     812             :                               reconsume,
     813             :                               pos);
     814          16 :               NS_HTML5_BREAK(beforeattributevalueloop);
     815             :             }
     816             :             case '&': {
     817           0 :               attributeLine = line;
     818           0 :               clearStrBufBeforeUse();
     819           0 :               reconsume = true;
     820           0 :               state = P::transition(mViewSource,
     821             :                                     nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED,
     822             :                                     reconsume,
     823             :                                     pos);
     824             : 
     825           0 :               NS_HTML5_CONTINUE(stateloop);
     826             :             }
     827             :             case '\'': {
     828           0 :               attributeLine = line;
     829           0 :               clearStrBufBeforeUse();
     830           0 :               state =
     831           0 :                 P::transition(mViewSource,
     832             :                               nsHtml5Tokenizer::ATTRIBUTE_VALUE_SINGLE_QUOTED,
     833             :                               reconsume,
     834             :                               pos);
     835           0 :               NS_HTML5_CONTINUE(stateloop);
     836             :             }
     837             :             case '>': {
     838             :               if (P::reportErrors) {
     839           0 :                 errAttributeValueMissing();
     840             :               }
     841           0 :               addAttributeWithoutValue();
     842           0 :               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
     843           0 :               if (shouldSuspend) {
     844           0 :                 NS_HTML5_BREAK(stateloop);
     845             :               }
     846           0 :               NS_HTML5_CONTINUE(stateloop);
     847             :             }
     848             :             case '\0': {
     849           0 :               c = 0xfffd;
     850             :             }
     851             :             case '<':
     852             :             case '=':
     853             :             case '`': {
     854             :               if (P::reportErrors) {
     855           0 :                 errLtOrEqualsOrGraveInUnquotedAttributeOrNull(c);
     856             :               }
     857             :             }
     858             :             default: {
     859           0 :               attributeLine = line;
     860           0 :               clearStrBufBeforeUse();
     861           0 :               appendStrBuf(c);
     862           0 :               state = P::transition(mViewSource,
     863             :                                     nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED,
     864             :                                     reconsume,
     865             :                                     pos);
     866             : 
     867           0 :               NS_HTML5_CONTINUE(stateloop);
     868             :             }
     869             :           }
     870             :         }
     871             :         beforeattributevalueloop_end: ;
     872             :       }
     873             :       case ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
     874             :         for (; ; ) {
     875         620 :           if (reconsume) {
     876           0 :             reconsume = false;
     877             :           } else {
     878         318 :             if (++pos == endPos) {
     879           0 :               NS_HTML5_BREAK(stateloop);
     880             :             }
     881         318 :             c = checkChar(buf, pos);
     882             :           }
     883         318 :           switch(c) {
     884             :             case '\"': {
     885          16 :               addAttributeWithValue();
     886          16 :               state =
     887          16 :                 P::transition(mViewSource,
     888             :                               nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED,
     889             :                               reconsume,
     890             :                               pos);
     891          16 :               NS_HTML5_BREAK(attributevaluedoublequotedloop);
     892             :             }
     893             :             case '&': {
     894           0 :               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
     895           0 :               appendCharRefBuf(c);
     896           0 :               setAdditionalAndRememberAmpersandLocation('\"');
     897           0 :               returnState = state;
     898           0 :               state =
     899           0 :                 P::transition(mViewSource,
     900             :                               nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
     901             :                               reconsume,
     902             :                               pos);
     903           0 :               NS_HTML5_CONTINUE(stateloop);
     904             :             }
     905             :             case '\r': {
     906           0 :               appendStrBufCarriageReturn();
     907           0 :               NS_HTML5_BREAK(stateloop);
     908             :             }
     909             :             case '\n': {
     910           0 :               appendStrBufLineFeed();
     911           0 :               continue;
     912             :             }
     913             :             case '\0': {
     914           0 :               c = 0xfffd;
     915             :             }
     916             :             default: {
     917         302 :               appendStrBuf(c);
     918         302 :               continue;
     919             :             }
     920             :           }
     921             :         }
     922             :         attributevaluedoublequotedloop_end: ;
     923             :       }
     924             :       case AFTER_ATTRIBUTE_VALUE_QUOTED: {
     925             :         for (; ; ) {
     926          16 :           if (++pos == endPos) {
     927           0 :             NS_HTML5_BREAK(stateloop);
     928             :           }
     929          16 :           c = checkChar(buf, pos);
     930          16 :           switch(c) {
     931             :             case '\r': {
     932           0 :               silentCarriageReturn();
     933           0 :               state = P::transition(mViewSource,
     934             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
     935             :                                     reconsume,
     936             :                                     pos);
     937           0 :               NS_HTML5_BREAK(stateloop);
     938             :             }
     939             :             case '\n': {
     940           0 :               silentLineFeed();
     941             :             }
     942             :             case ' ':
     943             :             case '\t':
     944             :             case '\f': {
     945           9 :               state = P::transition(mViewSource,
     946             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
     947             :                                     reconsume,
     948             :                                     pos);
     949           9 :               NS_HTML5_CONTINUE(stateloop);
     950             :             }
     951             :             case '/': {
     952           0 :               state = P::transition(mViewSource,
     953             :                                     nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
     954             :                                     reconsume,
     955             :                                     pos);
     956           0 :               NS_HTML5_BREAK(afterattributevaluequotedloop);
     957             :             }
     958             :             case '>': {
     959           7 :               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
     960           7 :               if (shouldSuspend) {
     961           0 :                 NS_HTML5_BREAK(stateloop);
     962             :               }
     963           7 :               NS_HTML5_CONTINUE(stateloop);
     964             :             }
     965             :             default: {
     966             :               if (P::reportErrors) {
     967           0 :                 errNoSpaceBetweenAttributes();
     968             :               }
     969           0 :               reconsume = true;
     970           0 :               state = P::transition(mViewSource,
     971             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
     972             :                                     reconsume,
     973             :                                     pos);
     974           0 :               NS_HTML5_CONTINUE(stateloop);
     975             :             }
     976             :           }
     977             :         }
     978             :         afterattributevaluequotedloop_end: ;
     979             :       }
     980             :       case SELF_CLOSING_START_TAG: {
     981           0 :         if (++pos == endPos) {
     982           0 :           NS_HTML5_BREAK(stateloop);
     983             :         }
     984           0 :         c = checkChar(buf, pos);
     985           0 :         switch(c) {
     986             :           case '>': {
     987           0 :             state = P::transition(mViewSource, emitCurrentTagToken(true, pos), reconsume, pos);
     988           0 :             if (shouldSuspend) {
     989           0 :               NS_HTML5_BREAK(stateloop);
     990             :             }
     991           0 :             NS_HTML5_CONTINUE(stateloop);
     992             :           }
     993             :           default: {
     994             :             if (P::reportErrors) {
     995           0 :               errSlashNotFollowedByGt();
     996             :             }
     997           0 :             reconsume = true;
     998           0 :             state = P::transition(mViewSource,
     999             :                                   nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
    1000             :                                   reconsume,
    1001             :                                   pos);
    1002           0 :             NS_HTML5_CONTINUE(stateloop);
    1003             :           }
    1004             :         }
    1005             :       }
    1006             :       case ATTRIBUTE_VALUE_UNQUOTED: {
    1007             :         for (; ; ) {
    1008           0 :           if (reconsume) {
    1009           0 :             reconsume = false;
    1010             :           } else {
    1011           0 :             if (++pos == endPos) {
    1012           0 :               NS_HTML5_BREAK(stateloop);
    1013             :             }
    1014           0 :             c = checkChar(buf, pos);
    1015             :           }
    1016           0 :           switch(c) {
    1017             :             case '\r': {
    1018           0 :               silentCarriageReturn();
    1019           0 :               addAttributeWithValue();
    1020           0 :               state = P::transition(mViewSource,
    1021             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
    1022             :                                     reconsume,
    1023             :                                     pos);
    1024           0 :               NS_HTML5_BREAK(stateloop);
    1025             :             }
    1026             :             case '\n': {
    1027           0 :               silentLineFeed();
    1028             :             }
    1029             :             case ' ':
    1030             :             case '\t':
    1031             :             case '\f': {
    1032           0 :               addAttributeWithValue();
    1033           0 :               state = P::transition(mViewSource,
    1034             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
    1035             :                                     reconsume,
    1036             :                                     pos);
    1037           0 :               NS_HTML5_CONTINUE(stateloop);
    1038             :             }
    1039             :             case '&': {
    1040           0 :               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
    1041           0 :               appendCharRefBuf(c);
    1042           0 :               setAdditionalAndRememberAmpersandLocation('>');
    1043           0 :               returnState = state;
    1044           0 :               state =
    1045           0 :                 P::transition(mViewSource,
    1046             :                               nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
    1047             :                               reconsume,
    1048             :                               pos);
    1049           0 :               NS_HTML5_CONTINUE(stateloop);
    1050             :             }
    1051             :             case '>': {
    1052           0 :               addAttributeWithValue();
    1053           0 :               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
    1054           0 :               if (shouldSuspend) {
    1055           0 :                 NS_HTML5_BREAK(stateloop);
    1056             :               }
    1057           0 :               NS_HTML5_CONTINUE(stateloop);
    1058             :             }
    1059             :             case '\0': {
    1060           0 :               c = 0xfffd;
    1061             :             }
    1062             :             case '<':
    1063             :             case '\"':
    1064             :             case '\'':
    1065             :             case '=':
    1066             :             case '`': {
    1067             :               if (P::reportErrors) {
    1068           0 :                 errUnquotedAttributeValOrNull(c);
    1069             :               }
    1070             :             }
    1071             :             default: {
    1072             : 
    1073           0 :               appendStrBuf(c);
    1074           0 :               continue;
    1075             :             }
    1076             :           }
    1077             :         }
    1078             :       }
    1079             :       case AFTER_ATTRIBUTE_NAME: {
    1080             :         for (; ; ) {
    1081           0 :           if (++pos == endPos) {
    1082           0 :             NS_HTML5_BREAK(stateloop);
    1083             :           }
    1084           0 :           c = checkChar(buf, pos);
    1085           0 :           switch(c) {
    1086             :             case '\r': {
    1087           0 :               silentCarriageReturn();
    1088           0 :               NS_HTML5_BREAK(stateloop);
    1089             :             }
    1090             :             case '\n': {
    1091           0 :               silentLineFeed();
    1092             :             }
    1093             :             case ' ':
    1094             :             case '\t':
    1095             :             case '\f': {
    1096           0 :               continue;
    1097             :             }
    1098             :             case '/': {
    1099           0 :               addAttributeWithoutValue();
    1100           0 :               state = P::transition(mViewSource,
    1101             :                                     nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
    1102             :                                     reconsume,
    1103             :                                     pos);
    1104           0 :               NS_HTML5_CONTINUE(stateloop);
    1105             :             }
    1106             :             case '=': {
    1107           0 :               state = P::transition(mViewSource,
    1108             :                                     nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE,
    1109             :                                     reconsume,
    1110             :                                     pos);
    1111           0 :               NS_HTML5_CONTINUE(stateloop);
    1112             :             }
    1113             :             case '>': {
    1114           0 :               addAttributeWithoutValue();
    1115           0 :               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
    1116           0 :               if (shouldSuspend) {
    1117           0 :                 NS_HTML5_BREAK(stateloop);
    1118             :               }
    1119           0 :               NS_HTML5_CONTINUE(stateloop);
    1120             :             }
    1121             :             case '\0': {
    1122           0 :               c = 0xfffd;
    1123             :             }
    1124             :             case '\"':
    1125             :             case '\'':
    1126             :             case '<': {
    1127             :               if (P::reportErrors) {
    1128           0 :                 errQuoteOrLtInAttributeNameOrNull(c);
    1129             :               }
    1130             :             }
    1131             :             default: {
    1132           0 :               addAttributeWithoutValue();
    1133           0 :               if (c >= 'A' && c <= 'Z') {
    1134           0 :                 c += 0x20;
    1135             :               }
    1136           0 :               clearStrBufBeforeUse();
    1137           0 :               appendStrBuf(c);
    1138           0 :               state = P::transition(
    1139             :                 mViewSource, nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume, pos);
    1140           0 :               NS_HTML5_CONTINUE(stateloop);
    1141             :             }
    1142             :           }
    1143             :         }
    1144             :       }
    1145             :       case MARKUP_DECLARATION_OPEN: {
    1146             :         for (; ; ) {
    1147           6 :           if (++pos == endPos) {
    1148           0 :             NS_HTML5_BREAK(stateloop);
    1149             :           }
    1150           6 :           c = checkChar(buf, pos);
    1151           6 :           switch(c) {
    1152             :             case '-': {
    1153           5 :               clearStrBufBeforeUse();
    1154           5 :               appendStrBuf(c);
    1155           5 :               state = P::transition(mViewSource,
    1156             :                                     nsHtml5Tokenizer::MARKUP_DECLARATION_HYPHEN,
    1157             :                                     reconsume,
    1158             :                                     pos);
    1159           5 :               NS_HTML5_BREAK(markupdeclarationopenloop);
    1160             :             }
    1161             :             case 'd':
    1162             :             case 'D': {
    1163           1 :               clearStrBufBeforeUse();
    1164           1 :               appendStrBuf(c);
    1165           1 :               index = 0;
    1166           1 :               state = P::transition(mViewSource,
    1167             :                                     nsHtml5Tokenizer::MARKUP_DECLARATION_OCTYPE,
    1168             :                                     reconsume,
    1169             :                                     pos);
    1170           1 :               NS_HTML5_CONTINUE(stateloop);
    1171             :             }
    1172             :             case '[': {
    1173           0 :               if (tokenHandler->cdataSectionAllowed()) {
    1174           0 :                 clearStrBufBeforeUse();
    1175           0 :                 appendStrBuf(c);
    1176           0 :                 index = 0;
    1177           0 :                 state = P::transition(
    1178             :                   mViewSource, nsHtml5Tokenizer::CDATA_START, reconsume, pos);
    1179           0 :                 NS_HTML5_CONTINUE(stateloop);
    1180             :               }
    1181             :             }
    1182             :             default: {
    1183             :               if (P::reportErrors) {
    1184           0 :                 errBogusComment();
    1185             :               }
    1186           0 :               clearStrBufBeforeUse();
    1187           0 :               reconsume = true;
    1188           0 :               state = P::transition(
    1189             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    1190           0 :               NS_HTML5_CONTINUE(stateloop);
    1191             :             }
    1192             :           }
    1193             :         }
    1194             :         markupdeclarationopenloop_end: ;
    1195             :       }
    1196             :       case MARKUP_DECLARATION_HYPHEN: {
    1197             :         for (; ; ) {
    1198           5 :           if (++pos == endPos) {
    1199           0 :             NS_HTML5_BREAK(stateloop);
    1200             :           }
    1201           5 :           c = checkChar(buf, pos);
    1202           5 :           switch(c) {
    1203             :             case '\0': {
    1204           0 :               NS_HTML5_BREAK(stateloop);
    1205             :             }
    1206             :             case '-': {
    1207           5 :               clearStrBufAfterOneHyphen();
    1208           5 :               state = P::transition(
    1209             :                 mViewSource, nsHtml5Tokenizer::COMMENT_START, reconsume, pos);
    1210           5 :               NS_HTML5_BREAK(markupdeclarationhyphenloop);
    1211             :             }
    1212             :             default: {
    1213             :               if (P::reportErrors) {
    1214           0 :                 errBogusComment();
    1215             :               }
    1216           0 :               reconsume = true;
    1217           0 :               state = P::transition(
    1218             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    1219           0 :               NS_HTML5_CONTINUE(stateloop);
    1220             :             }
    1221             :           }
    1222             :         }
    1223             :         markupdeclarationhyphenloop_end: ;
    1224             :       }
    1225             :       case COMMENT_START: {
    1226             :         for (; ; ) {
    1227           5 :           if (++pos == endPos) {
    1228           0 :             NS_HTML5_BREAK(stateloop);
    1229             :           }
    1230           5 :           c = checkChar(buf, pos);
    1231           5 :           switch(c) {
    1232             :             case '-': {
    1233           0 :               appendStrBuf(c);
    1234           0 :               state = P::transition(mViewSource,
    1235             :                                     nsHtml5Tokenizer::COMMENT_START_DASH,
    1236             :                                     reconsume,
    1237             :                                     pos);
    1238           0 :               NS_HTML5_CONTINUE(stateloop);
    1239             :             }
    1240             :             case '>': {
    1241             :               if (P::reportErrors) {
    1242           0 :                 errPrematureEndOfComment();
    1243             :               }
    1244           0 :               emitComment(0, pos);
    1245           0 :               state = P::transition(
    1246             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    1247           0 :               NS_HTML5_CONTINUE(stateloop);
    1248             :             }
    1249             :             case '\r': {
    1250           0 :               appendStrBufCarriageReturn();
    1251           0 :               state = P::transition(
    1252             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1253           0 :               NS_HTML5_BREAK(stateloop);
    1254             :             }
    1255             :             case '\n': {
    1256           0 :               appendStrBufLineFeed();
    1257           0 :               state = P::transition(
    1258             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1259           0 :               NS_HTML5_BREAK(commentstartloop);
    1260             :             }
    1261             :             case '\0': {
    1262           0 :               c = 0xfffd;
    1263             :             }
    1264             :             default: {
    1265           5 :               appendStrBuf(c);
    1266           5 :               state = P::transition(
    1267             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1268           5 :               NS_HTML5_BREAK(commentstartloop);
    1269             :             }
    1270             :           }
    1271             :         }
    1272             :         commentstartloop_end: ;
    1273             :       }
    1274             :       case COMMENT: {
    1275             :         for (; ; ) {
    1276        1125 :           if (++pos == endPos) {
    1277           0 :             NS_HTML5_BREAK(stateloop);
    1278             :           }
    1279         568 :           c = checkChar(buf, pos);
    1280         568 :           switch(c) {
    1281             :             case '-': {
    1282          11 :               appendStrBuf(c);
    1283          11 :               state = P::transition(mViewSource,
    1284             :                                     nsHtml5Tokenizer::COMMENT_END_DASH,
    1285             :                                     reconsume,
    1286             :                                     pos);
    1287          11 :               NS_HTML5_BREAK(commentloop);
    1288             :             }
    1289             :             case '\r': {
    1290           0 :               appendStrBufCarriageReturn();
    1291           0 :               NS_HTML5_BREAK(stateloop);
    1292             :             }
    1293             :             case '\n': {
    1294           4 :               appendStrBufLineFeed();
    1295           4 :               continue;
    1296             :             }
    1297             :             case '\0': {
    1298           0 :               c = 0xfffd;
    1299             :             }
    1300             :             default: {
    1301         553 :               appendStrBuf(c);
    1302         553 :               continue;
    1303             :             }
    1304             :           }
    1305             :         }
    1306             :         commentloop_end: ;
    1307             :       }
    1308             :       case COMMENT_END_DASH: {
    1309             :         for (; ; ) {
    1310          11 :           if (++pos == endPos) {
    1311           0 :             NS_HTML5_BREAK(stateloop);
    1312             :           }
    1313          11 :           c = checkChar(buf, pos);
    1314          11 :           switch(c) {
    1315             :             case '-': {
    1316           5 :               appendStrBuf(c);
    1317           5 :               state = P::transition(
    1318             :                 mViewSource, nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
    1319           5 :               NS_HTML5_BREAK(commentenddashloop);
    1320             :             }
    1321             :             case '\r': {
    1322           0 :               appendStrBufCarriageReturn();
    1323           0 :               state = P::transition(
    1324             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1325           0 :               NS_HTML5_BREAK(stateloop);
    1326             :             }
    1327             :             case '\n': {
    1328           0 :               appendStrBufLineFeed();
    1329           0 :               state = P::transition(
    1330             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1331           0 :               NS_HTML5_CONTINUE(stateloop);
    1332             :             }
    1333             :             case '\0': {
    1334           0 :               c = 0xfffd;
    1335             :             }
    1336             :             default: {
    1337           6 :               appendStrBuf(c);
    1338           6 :               state = P::transition(
    1339             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1340           6 :               NS_HTML5_CONTINUE(stateloop);
    1341             :             }
    1342             :           }
    1343             :         }
    1344             :         commentenddashloop_end: ;
    1345             :       }
    1346             :       case COMMENT_END: {
    1347             :         for (; ; ) {
    1348           5 :           if (++pos == endPos) {
    1349           0 :             NS_HTML5_BREAK(stateloop);
    1350             :           }
    1351           5 :           c = checkChar(buf, pos);
    1352           5 :           switch(c) {
    1353             :             case '>': {
    1354           5 :               emitComment(2, pos);
    1355           5 :               state = P::transition(
    1356             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    1357           5 :               NS_HTML5_CONTINUE(stateloop);
    1358             :             }
    1359             :             case '-': {
    1360           0 :               adjustDoubleHyphenAndAppendToStrBufAndErr(c);
    1361           0 :               continue;
    1362             :             }
    1363             :             case '\r': {
    1364           0 :               adjustDoubleHyphenAndAppendToStrBufCarriageReturn();
    1365           0 :               state = P::transition(
    1366             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1367           0 :               NS_HTML5_BREAK(stateloop);
    1368             :             }
    1369             :             case '\n': {
    1370           0 :               adjustDoubleHyphenAndAppendToStrBufLineFeed();
    1371           0 :               state = P::transition(
    1372             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1373           0 :               NS_HTML5_CONTINUE(stateloop);
    1374             :             }
    1375             :             case '!': {
    1376             :               if (P::reportErrors) {
    1377           0 :                 errHyphenHyphenBang();
    1378             :               }
    1379           0 :               appendStrBuf(c);
    1380           0 :               state = P::transition(mViewSource,
    1381             :                                     nsHtml5Tokenizer::COMMENT_END_BANG,
    1382             :                                     reconsume,
    1383             :                                     pos);
    1384           0 :               NS_HTML5_CONTINUE(stateloop);
    1385             :             }
    1386             :             case '\0': {
    1387           0 :               c = 0xfffd;
    1388             :             }
    1389             :             default: {
    1390           0 :               adjustDoubleHyphenAndAppendToStrBufAndErr(c);
    1391           0 :               state = P::transition(
    1392             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1393           0 :               NS_HTML5_CONTINUE(stateloop);
    1394             :             }
    1395             :           }
    1396             :         }
    1397             : 
    1398             :       }
    1399             :       case COMMENT_END_BANG: {
    1400             :         for (; ; ) {
    1401           0 :           if (++pos == endPos) {
    1402           0 :             NS_HTML5_BREAK(stateloop);
    1403             :           }
    1404           0 :           c = checkChar(buf, pos);
    1405           0 :           switch(c) {
    1406             :             case '>': {
    1407           0 :               emitComment(3, pos);
    1408           0 :               state = P::transition(
    1409             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    1410           0 :               NS_HTML5_CONTINUE(stateloop);
    1411             :             }
    1412             :             case '-': {
    1413           0 :               appendStrBuf(c);
    1414           0 :               state = P::transition(mViewSource,
    1415             :                                     nsHtml5Tokenizer::COMMENT_END_DASH,
    1416             :                                     reconsume,
    1417             :                                     pos);
    1418           0 :               NS_HTML5_CONTINUE(stateloop);
    1419             :             }
    1420             :             case '\r': {
    1421           0 :               appendStrBufCarriageReturn();
    1422           0 :               NS_HTML5_BREAK(stateloop);
    1423             :             }
    1424             :             case '\n': {
    1425           0 :               appendStrBufLineFeed();
    1426           0 :               continue;
    1427             :             }
    1428             :             case '\0': {
    1429           0 :               c = 0xfffd;
    1430             :             }
    1431             :             default: {
    1432           0 :               appendStrBuf(c);
    1433           0 :               state = P::transition(
    1434             :                 mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1435           0 :               NS_HTML5_CONTINUE(stateloop);
    1436             :             }
    1437             :           }
    1438             :         }
    1439             :       }
    1440             :       case COMMENT_START_DASH: {
    1441           0 :         if (++pos == endPos) {
    1442           0 :           NS_HTML5_BREAK(stateloop);
    1443             :         }
    1444           0 :         c = checkChar(buf, pos);
    1445           0 :         switch(c) {
    1446             :           case '-': {
    1447           0 :             appendStrBuf(c);
    1448           0 :             state = P::transition(
    1449             :               mViewSource, nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
    1450           0 :             NS_HTML5_CONTINUE(stateloop);
    1451             :           }
    1452             :           case '>': {
    1453             :             if (P::reportErrors) {
    1454           0 :               errPrematureEndOfComment();
    1455             :             }
    1456           0 :             emitComment(1, pos);
    1457           0 :             state = P::transition(
    1458             :               mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    1459           0 :             NS_HTML5_CONTINUE(stateloop);
    1460             :           }
    1461             :           case '\r': {
    1462           0 :             appendStrBufCarriageReturn();
    1463           0 :             state = P::transition(
    1464             :               mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1465           0 :             NS_HTML5_BREAK(stateloop);
    1466             :           }
    1467             :           case '\n': {
    1468           0 :             appendStrBufLineFeed();
    1469           0 :             state = P::transition(
    1470             :               mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1471           0 :             NS_HTML5_CONTINUE(stateloop);
    1472             :           }
    1473             :           case '\0': {
    1474           0 :             c = 0xfffd;
    1475             :           }
    1476             :           default: {
    1477           0 :             appendStrBuf(c);
    1478           0 :             state = P::transition(
    1479             :               mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
    1480           0 :             NS_HTML5_CONTINUE(stateloop);
    1481             :           }
    1482             :         }
    1483             :       }
    1484             :       case CDATA_START: {
    1485             :         for (; ; ) {
    1486           0 :           if (++pos == endPos) {
    1487           0 :             NS_HTML5_BREAK(stateloop);
    1488             :           }
    1489           0 :           c = checkChar(buf, pos);
    1490           0 :           if (index < 6) {
    1491           0 :             if (c == nsHtml5Tokenizer::CDATA_LSQB[index]) {
    1492           0 :               appendStrBuf(c);
    1493             :             } else {
    1494             :               if (P::reportErrors) {
    1495           0 :                 errBogusComment();
    1496             :               }
    1497           0 :               reconsume = true;
    1498           0 :               state = P::transition(
    1499             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    1500           0 :               NS_HTML5_CONTINUE(stateloop);
    1501             :             }
    1502           0 :             index++;
    1503           0 :             continue;
    1504             :           } else {
    1505           0 :             clearStrBufAfterUse();
    1506           0 :             cstart = pos;
    1507           0 :             reconsume = true;
    1508           0 :             state = P::transition(
    1509             :               mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
    1510           0 :             break;
    1511             :           }
    1512             :         }
    1513             :       }
    1514             :       case CDATA_SECTION: {
    1515             :         for (; ; ) {
    1516           0 :           if (reconsume) {
    1517           0 :             reconsume = false;
    1518             :           } else {
    1519           0 :             if (++pos == endPos) {
    1520           0 :               NS_HTML5_BREAK(stateloop);
    1521             :             }
    1522           0 :             c = checkChar(buf, pos);
    1523             :           }
    1524           0 :           switch(c) {
    1525             :             case ']': {
    1526           0 :               flushChars(buf, pos);
    1527           0 :               state = P::transition(
    1528             :                 mViewSource, nsHtml5Tokenizer::CDATA_RSQB, reconsume, pos);
    1529           0 :               NS_HTML5_BREAK(cdatasectionloop);
    1530             :             }
    1531             :             case '\0': {
    1532           0 :               emitReplacementCharacter(buf, pos);
    1533           0 :               continue;
    1534             :             }
    1535             :             case '\r': {
    1536           0 :               emitCarriageReturn(buf, pos);
    1537           0 :               NS_HTML5_BREAK(stateloop);
    1538             :             }
    1539             :             case '\n': {
    1540           0 :               silentLineFeed();
    1541             :             }
    1542             :             default: {
    1543           0 :               continue;
    1544             :             }
    1545             :           }
    1546             :         }
    1547             :         cdatasectionloop_end: ;
    1548             :       }
    1549             :       case CDATA_RSQB: {
    1550             :         for (; ; ) {
    1551           0 :           if (++pos == endPos) {
    1552           0 :             NS_HTML5_BREAK(stateloop);
    1553             :           }
    1554           0 :           c = checkChar(buf, pos);
    1555           0 :           switch(c) {
    1556             :             case ']': {
    1557           0 :               state = P::transition(
    1558             :                 mViewSource, nsHtml5Tokenizer::CDATA_RSQB_RSQB, reconsume, pos);
    1559           0 :               NS_HTML5_BREAK(cdatarsqb);
    1560             :             }
    1561             :             default: {
    1562           0 :               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
    1563           0 :               cstart = pos;
    1564           0 :               reconsume = true;
    1565           0 :               state = P::transition(
    1566             :                 mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
    1567           0 :               NS_HTML5_CONTINUE(stateloop);
    1568             :             }
    1569             :           }
    1570             :         }
    1571             :         cdatarsqb_end: ;
    1572             :       }
    1573             :       case CDATA_RSQB_RSQB: {
    1574             :         for (; ; ) {
    1575           0 :           if (++pos == endPos) {
    1576           0 :             NS_HTML5_BREAK(stateloop);
    1577             :           }
    1578           0 :           c = checkChar(buf, pos);
    1579           0 :           switch(c) {
    1580             :             case ']': {
    1581           0 :               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
    1582           0 :               continue;
    1583             :             }
    1584             :             case '>': {
    1585           0 :               cstart = pos + 1;
    1586           0 :               state = P::transition(
    1587             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    1588           0 :               NS_HTML5_CONTINUE(stateloop);
    1589             :             }
    1590             :             default: {
    1591           0 :               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
    1592           0 :               cstart = pos;
    1593           0 :               reconsume = true;
    1594           0 :               state = P::transition(
    1595             :                 mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
    1596           0 :               NS_HTML5_CONTINUE(stateloop);
    1597             :             }
    1598             :           }
    1599             :         }
    1600             : 
    1601             :       }
    1602             :       case ATTRIBUTE_VALUE_SINGLE_QUOTED: {
    1603             :         for (; ; ) {
    1604           0 :           if (reconsume) {
    1605           0 :             reconsume = false;
    1606             :           } else {
    1607           0 :             if (++pos == endPos) {
    1608           0 :               NS_HTML5_BREAK(stateloop);
    1609             :             }
    1610           0 :             c = checkChar(buf, pos);
    1611             :           }
    1612           0 :           switch(c) {
    1613             :             case '\'': {
    1614           0 :               addAttributeWithValue();
    1615           0 :               state =
    1616           0 :                 P::transition(mViewSource,
    1617             :                               nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED,
    1618             :                               reconsume,
    1619             :                               pos);
    1620           0 :               NS_HTML5_CONTINUE(stateloop);
    1621             :             }
    1622             :             case '&': {
    1623           0 :               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
    1624           0 :               appendCharRefBuf(c);
    1625           0 :               setAdditionalAndRememberAmpersandLocation('\'');
    1626           0 :               returnState = state;
    1627           0 :               state =
    1628           0 :                 P::transition(mViewSource,
    1629             :                               nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
    1630             :                               reconsume,
    1631             :                               pos);
    1632           0 :               NS_HTML5_BREAK(attributevaluesinglequotedloop);
    1633             :             }
    1634             :             case '\r': {
    1635           0 :               appendStrBufCarriageReturn();
    1636           0 :               NS_HTML5_BREAK(stateloop);
    1637             :             }
    1638             :             case '\n': {
    1639           0 :               appendStrBufLineFeed();
    1640           0 :               continue;
    1641             :             }
    1642             :             case '\0': {
    1643           0 :               c = 0xfffd;
    1644             :             }
    1645             :             default: {
    1646           0 :               appendStrBuf(c);
    1647           0 :               continue;
    1648             :             }
    1649             :           }
    1650             :         }
    1651             :         attributevaluesinglequotedloop_end: ;
    1652             :       }
    1653             :       case CONSUME_CHARACTER_REFERENCE: {
    1654           0 :         if (++pos == endPos) {
    1655           0 :           NS_HTML5_BREAK(stateloop);
    1656             :         }
    1657           0 :         c = checkChar(buf, pos);
    1658           0 :         if (c == '\0') {
    1659           0 :           NS_HTML5_BREAK(stateloop);
    1660             :         }
    1661           0 :         switch(c) {
    1662             :           case ' ':
    1663             :           case '\t':
    1664             :           case '\n':
    1665             :           case '\r':
    1666             :           case '\f':
    1667             :           case '<':
    1668             :           case '&': {
    1669           0 :             emitOrAppendCharRefBuf(returnState);
    1670           0 :             if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1671           0 :               cstart = pos;
    1672             :             }
    1673           0 :             reconsume = true;
    1674           0 :             state = P::transition(mViewSource, returnState, reconsume, pos);
    1675           0 :             NS_HTML5_CONTINUE(stateloop);
    1676             :           }
    1677             :           case '#': {
    1678           0 :             appendCharRefBuf('#');
    1679           0 :             state = P::transition(
    1680             :               mViewSource, nsHtml5Tokenizer::CONSUME_NCR, reconsume, pos);
    1681           0 :             NS_HTML5_CONTINUE(stateloop);
    1682             :           }
    1683             :           default: {
    1684           0 :             if (c == additional) {
    1685           0 :               emitOrAppendCharRefBuf(returnState);
    1686           0 :               reconsume = true;
    1687           0 :               state = P::transition(mViewSource, returnState, reconsume, pos);
    1688           0 :               NS_HTML5_CONTINUE(stateloop);
    1689             :             }
    1690           0 :             if (c >= 'a' && c <= 'z') {
    1691           0 :               firstCharKey = c - 'a' + 26;
    1692           0 :             } else if (c >= 'A' && c <= 'Z') {
    1693           0 :               firstCharKey = c - 'A';
    1694             :             } else {
    1695             :               if (P::reportErrors) {
    1696           0 :                 errNoNamedCharacterMatch();
    1697             :               }
    1698           0 :               emitOrAppendCharRefBuf(returnState);
    1699           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1700           0 :                 cstart = pos;
    1701             :               }
    1702           0 :               reconsume = true;
    1703           0 :               state = P::transition(mViewSource, returnState, reconsume, pos);
    1704           0 :               NS_HTML5_CONTINUE(stateloop);
    1705             :             }
    1706           0 :             appendCharRefBuf(c);
    1707           0 :             state =
    1708           0 :               P::transition(mViewSource,
    1709             :                             nsHtml5Tokenizer::CHARACTER_REFERENCE_HILO_LOOKUP,
    1710             :                             reconsume,
    1711             :                             pos);
    1712             :           }
    1713             :         }
    1714             :       }
    1715             :       case CHARACTER_REFERENCE_HILO_LOOKUP: {
    1716             :         {
    1717           0 :           if (++pos == endPos) {
    1718           0 :             NS_HTML5_BREAK(stateloop);
    1719             :           }
    1720           0 :           c = checkChar(buf, pos);
    1721           0 :           if (c == '\0') {
    1722           0 :             NS_HTML5_BREAK(stateloop);
    1723             :           }
    1724           0 :           int32_t hilo = 0;
    1725           0 :           if (c <= 'z') {
    1726           0 :             const int32_t* row = nsHtml5NamedCharactersAccel::HILO_ACCEL[c];
    1727           0 :             if (row) {
    1728           0 :               hilo = row[firstCharKey];
    1729             :             }
    1730             :           }
    1731           0 :           if (!hilo) {
    1732             :             if (P::reportErrors) {
    1733           0 :               errNoNamedCharacterMatch();
    1734             :             }
    1735           0 :             emitOrAppendCharRefBuf(returnState);
    1736           0 :             if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1737           0 :               cstart = pos;
    1738             :             }
    1739           0 :             reconsume = true;
    1740           0 :             state = P::transition(mViewSource, returnState, reconsume, pos);
    1741           0 :             NS_HTML5_CONTINUE(stateloop);
    1742             :           }
    1743           0 :           appendCharRefBuf(c);
    1744           0 :           lo = hilo & 0xFFFF;
    1745           0 :           hi = hilo >> 16;
    1746           0 :           entCol = -1;
    1747           0 :           candidate = -1;
    1748           0 :           charRefBufMark = 0;
    1749           0 :           state = P::transition(mViewSource,
    1750             :                                 nsHtml5Tokenizer::CHARACTER_REFERENCE_TAIL,
    1751             :                                 reconsume,
    1752             :                                 pos);
    1753             :         }
    1754             :       }
    1755             :       case CHARACTER_REFERENCE_TAIL: {
    1756             :         for (; ; ) {
    1757           0 :           if (++pos == endPos) {
    1758           0 :             NS_HTML5_BREAK(stateloop);
    1759             :           }
    1760           0 :           c = checkChar(buf, pos);
    1761           0 :           if (c == '\0') {
    1762           0 :             NS_HTML5_BREAK(stateloop);
    1763             :           }
    1764           0 :           entCol++;
    1765             :           for (; ; ) {
    1766           0 :             if (hi < lo) {
    1767           0 :               NS_HTML5_BREAK(outer);
    1768             :             }
    1769           0 :             if (entCol == nsHtml5NamedCharacters::NAMES[lo].length()) {
    1770           0 :               candidate = lo;
    1771           0 :               charRefBufMark = charRefBufLen;
    1772           0 :               lo++;
    1773           0 :             } else if (entCol > nsHtml5NamedCharacters::NAMES[lo].length()) {
    1774           0 :               NS_HTML5_BREAK(outer);
    1775           0 :             } else if (c > nsHtml5NamedCharacters::NAMES[lo].charAt(entCol)) {
    1776           0 :               lo++;
    1777             :             } else {
    1778           0 :               NS_HTML5_BREAK(loloop);
    1779             :             }
    1780             :           }
    1781             :           loloop_end: ;
    1782             :           for (; ; ) {
    1783           0 :             if (hi < lo) {
    1784           0 :               NS_HTML5_BREAK(outer);
    1785             :             }
    1786           0 :             if (entCol == nsHtml5NamedCharacters::NAMES[hi].length()) {
    1787           0 :               NS_HTML5_BREAK(hiloop);
    1788             :             }
    1789           0 :             if (entCol > nsHtml5NamedCharacters::NAMES[hi].length()) {
    1790           0 :               NS_HTML5_BREAK(outer);
    1791           0 :             } else if (c < nsHtml5NamedCharacters::NAMES[hi].charAt(entCol)) {
    1792           0 :               hi--;
    1793             :             } else {
    1794           0 :               NS_HTML5_BREAK(hiloop);
    1795             :             }
    1796             :           }
    1797             :           hiloop_end: ;
    1798           0 :           if (c == ';') {
    1799           0 :             if (entCol + 1 == nsHtml5NamedCharacters::NAMES[lo].length()) {
    1800           0 :               candidate = lo;
    1801           0 :               charRefBufMark = charRefBufLen;
    1802             :             }
    1803           0 :             NS_HTML5_BREAK(outer);
    1804             :           }
    1805           0 :           if (hi < lo) {
    1806           0 :             NS_HTML5_BREAK(outer);
    1807             :           }
    1808           0 :           appendCharRefBuf(c);
    1809           0 :           continue;
    1810             :         }
    1811             :         outer_end: ;
    1812           0 :         if (candidate == -1) {
    1813             :           if (P::reportErrors) {
    1814           0 :             errNoNamedCharacterMatch();
    1815             :           }
    1816           0 :           emitOrAppendCharRefBuf(returnState);
    1817           0 :           if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1818           0 :             cstart = pos;
    1819             :           }
    1820           0 :           reconsume = true;
    1821           0 :           state = P::transition(mViewSource, returnState, reconsume, pos);
    1822           0 :           NS_HTML5_CONTINUE(stateloop);
    1823             :         } else {
    1824           0 :           const nsHtml5CharacterName& candidateName = nsHtml5NamedCharacters::NAMES[candidate];
    1825           0 :           if (!candidateName.length() || candidateName.charAt(candidateName.length() - 1) != ';') {
    1826           0 :             if ((returnState & DATA_AND_RCDATA_MASK)) {
    1827             :               char16_t ch;
    1828           0 :               if (charRefBufMark == charRefBufLen) {
    1829           0 :                 ch = c;
    1830             :               } else {
    1831           0 :                 ch = charRefBuf[charRefBufMark];
    1832             :               }
    1833           0 :               if (ch == '=' || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
    1834             :                 if (P::reportErrors) {
    1835           0 :                   errNoNamedCharacterMatch();
    1836             :                 }
    1837           0 :                 appendCharRefBufToStrBuf();
    1838           0 :                 reconsume = true;
    1839           0 :                 state = P::transition(mViewSource, returnState, reconsume, pos);
    1840           0 :                 NS_HTML5_CONTINUE(stateloop);
    1841             :               }
    1842             :             }
    1843           0 :             if ((returnState & DATA_AND_RCDATA_MASK)) {
    1844             :               if (P::reportErrors) {
    1845           0 :                 errUnescapedAmpersandInterpretedAsCharacterReference();
    1846             :               }
    1847             :             } else {
    1848             :               if (P::reportErrors) {
    1849           0 :                 errNotSemicolonTerminated();
    1850             :               }
    1851             :             }
    1852             :           }
    1853           0 :           P::completedNamedCharacterReference(mViewSource);
    1854           0 :           const char16_t* val = nsHtml5NamedCharacters::VALUES[candidate];
    1855           0 :           if (!val[1]) {
    1856           0 :             emitOrAppendOne(val, returnState);
    1857             :           } else {
    1858           0 :             emitOrAppendTwo(val, returnState);
    1859             :           }
    1860           0 :           if (charRefBufMark < charRefBufLen) {
    1861           0 :             if ((returnState & DATA_AND_RCDATA_MASK)) {
    1862           0 :               appendStrBuf(charRefBuf, charRefBufMark, charRefBufLen - charRefBufMark);
    1863             :             } else {
    1864           0 :               tokenHandler->characters(charRefBuf, charRefBufMark, charRefBufLen - charRefBufMark);
    1865             :             }
    1866             :           }
    1867           0 :           bool earlyBreak = (c == ';' && charRefBufMark == charRefBufLen);
    1868           0 :           charRefBufLen = 0;
    1869           0 :           if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1870           0 :             cstart = earlyBreak ? pos + 1 : pos;
    1871             :           }
    1872           0 :           reconsume = !earlyBreak;
    1873           0 :           state = P::transition(mViewSource, returnState, reconsume, pos);
    1874           0 :           NS_HTML5_CONTINUE(stateloop);
    1875             :         }
    1876             :       }
    1877             :       case CONSUME_NCR: {
    1878           0 :         if (++pos == endPos) {
    1879           0 :           NS_HTML5_BREAK(stateloop);
    1880             :         }
    1881           0 :         c = checkChar(buf, pos);
    1882           0 :         value = 0;
    1883           0 :         seenDigits = false;
    1884           0 :         switch(c) {
    1885             :           case 'x':
    1886             :           case 'X': {
    1887           0 :             appendCharRefBuf(c);
    1888           0 :             state = P::transition(
    1889             :               mViewSource, nsHtml5Tokenizer::HEX_NCR_LOOP, reconsume, pos);
    1890           0 :             NS_HTML5_CONTINUE(stateloop);
    1891             :           }
    1892             :           default: {
    1893           0 :             reconsume = true;
    1894           0 :             state = P::transition(
    1895             :               mViewSource, nsHtml5Tokenizer::DECIMAL_NRC_LOOP, reconsume, pos);
    1896             :           }
    1897             :         }
    1898             :       }
    1899             :       case DECIMAL_NRC_LOOP: {
    1900             :         for (; ; ) {
    1901           0 :           if (reconsume) {
    1902           0 :             reconsume = false;
    1903             :           } else {
    1904           0 :             if (++pos == endPos) {
    1905           0 :               NS_HTML5_BREAK(stateloop);
    1906             :             }
    1907           0 :             c = checkChar(buf, pos);
    1908             :           }
    1909           0 :           MOZ_ASSERT(value >= 0, "value must not become negative.");
    1910           0 :           if (c >= '0' && c <= '9') {
    1911           0 :             seenDigits = true;
    1912           0 :             if (value <= 0x10FFFF) {
    1913           0 :               value *= 10;
    1914           0 :               value += c - '0';
    1915             :             }
    1916           0 :             continue;
    1917           0 :           } else if (c == ';') {
    1918           0 :             if (seenDigits) {
    1919           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1920           0 :                 cstart = pos + 1;
    1921             :               }
    1922           0 :               state = P::transition(mViewSource,
    1923             :                                     nsHtml5Tokenizer::HANDLE_NCR_VALUE,
    1924             :                                     reconsume,
    1925             :                                     pos);
    1926           0 :               NS_HTML5_BREAK(decimalloop);
    1927             :             } else {
    1928             :               if (P::reportErrors) {
    1929           0 :                 errNoDigitsInNCR();
    1930             :               }
    1931           0 :               appendCharRefBuf(';');
    1932           0 :               emitOrAppendCharRefBuf(returnState);
    1933           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1934           0 :                 cstart = pos + 1;
    1935             :               }
    1936           0 :               state = P::transition(mViewSource, returnState, reconsume, pos);
    1937           0 :               NS_HTML5_CONTINUE(stateloop);
    1938             :             }
    1939             :           } else {
    1940           0 :             if (!seenDigits) {
    1941             :               if (P::reportErrors) {
    1942           0 :                 errNoDigitsInNCR();
    1943             :               }
    1944           0 :               emitOrAppendCharRefBuf(returnState);
    1945           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1946           0 :                 cstart = pos;
    1947             :               }
    1948           0 :               reconsume = true;
    1949           0 :               state = P::transition(mViewSource, returnState, reconsume, pos);
    1950           0 :               NS_HTML5_CONTINUE(stateloop);
    1951             :             } else {
    1952             :               if (P::reportErrors) {
    1953           0 :                 errCharRefLacksSemicolon();
    1954             :               }
    1955           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    1956           0 :                 cstart = pos;
    1957             :               }
    1958           0 :               reconsume = true;
    1959           0 :               state = P::transition(mViewSource,
    1960             :                                     nsHtml5Tokenizer::HANDLE_NCR_VALUE,
    1961             :                                     reconsume,
    1962             :                                     pos);
    1963           0 :               NS_HTML5_BREAK(decimalloop);
    1964             :             }
    1965             :           }
    1966             :         }
    1967             :         decimalloop_end: ;
    1968             :       }
    1969             :       case HANDLE_NCR_VALUE: {
    1970           0 :         charRefBufLen = 0;
    1971           0 :         handleNcrValue(returnState);
    1972           0 :         state = P::transition(mViewSource, returnState, reconsume, pos);
    1973           0 :         NS_HTML5_CONTINUE(stateloop);
    1974             :       }
    1975             :       case HEX_NCR_LOOP: {
    1976             :         for (; ; ) {
    1977           0 :           if (++pos == endPos) {
    1978           0 :             NS_HTML5_BREAK(stateloop);
    1979             :           }
    1980           0 :           c = checkChar(buf, pos);
    1981           0 :           MOZ_ASSERT(value >= 0, "value must not become negative.");
    1982           0 :           if (c >= '0' && c <= '9') {
    1983           0 :             seenDigits = true;
    1984           0 :             if (value <= 0x10FFFF) {
    1985           0 :               value *= 16;
    1986           0 :               value += c - '0';
    1987             :             }
    1988           0 :             continue;
    1989           0 :           } else if (c >= 'A' && c <= 'F') {
    1990           0 :             seenDigits = true;
    1991           0 :             if (value <= 0x10FFFF) {
    1992           0 :               value *= 16;
    1993           0 :               value += c - 'A' + 10;
    1994             :             }
    1995           0 :             continue;
    1996           0 :           } else if (c >= 'a' && c <= 'f') {
    1997           0 :             seenDigits = true;
    1998           0 :             if (value <= 0x10FFFF) {
    1999           0 :               value *= 16;
    2000           0 :               value += c - 'a' + 10;
    2001             :             }
    2002           0 :             continue;
    2003           0 :           } else if (c == ';') {
    2004           0 :             if (seenDigits) {
    2005           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    2006           0 :                 cstart = pos + 1;
    2007             :               }
    2008           0 :               state = P::transition(mViewSource,
    2009             :                                     nsHtml5Tokenizer::HANDLE_NCR_VALUE,
    2010             :                                     reconsume,
    2011             :                                     pos);
    2012           0 :               NS_HTML5_CONTINUE(stateloop);
    2013             :             } else {
    2014             :               if (P::reportErrors) {
    2015           0 :                 errNoDigitsInNCR();
    2016             :               }
    2017           0 :               appendCharRefBuf(';');
    2018           0 :               emitOrAppendCharRefBuf(returnState);
    2019           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    2020           0 :                 cstart = pos + 1;
    2021             :               }
    2022           0 :               state = P::transition(mViewSource, returnState, reconsume, pos);
    2023           0 :               NS_HTML5_CONTINUE(stateloop);
    2024             :             }
    2025             :           } else {
    2026           0 :             if (!seenDigits) {
    2027             :               if (P::reportErrors) {
    2028           0 :                 errNoDigitsInNCR();
    2029             :               }
    2030           0 :               emitOrAppendCharRefBuf(returnState);
    2031           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    2032           0 :                 cstart = pos;
    2033             :               }
    2034           0 :               reconsume = true;
    2035           0 :               state = P::transition(mViewSource, returnState, reconsume, pos);
    2036           0 :               NS_HTML5_CONTINUE(stateloop);
    2037             :             } else {
    2038             :               if (P::reportErrors) {
    2039           0 :                 errCharRefLacksSemicolon();
    2040             :               }
    2041           0 :               if (!(returnState & DATA_AND_RCDATA_MASK)) {
    2042           0 :                 cstart = pos;
    2043             :               }
    2044           0 :               reconsume = true;
    2045           0 :               state = P::transition(mViewSource,
    2046             :                                     nsHtml5Tokenizer::HANDLE_NCR_VALUE,
    2047             :                                     reconsume,
    2048             :                                     pos);
    2049           0 :               NS_HTML5_CONTINUE(stateloop);
    2050             :             }
    2051             :           }
    2052             :         }
    2053             :       }
    2054             :       case PLAINTEXT: {
    2055             :         for (; ; ) {
    2056           0 :           if (reconsume) {
    2057           0 :             reconsume = false;
    2058             :           } else {
    2059           0 :             if (++pos == endPos) {
    2060           0 :               NS_HTML5_BREAK(stateloop);
    2061             :             }
    2062           0 :             c = checkChar(buf, pos);
    2063             :           }
    2064           0 :           switch(c) {
    2065             :             case '\0': {
    2066           0 :               emitPlaintextReplacementCharacter(buf, pos);
    2067           0 :               continue;
    2068             :             }
    2069             :             case '\r': {
    2070           0 :               emitCarriageReturn(buf, pos);
    2071           0 :               NS_HTML5_BREAK(stateloop);
    2072             :             }
    2073             :             case '\n': {
    2074           0 :               silentLineFeed();
    2075             :             }
    2076             :             default: {
    2077           0 :               continue;
    2078             :             }
    2079             :           }
    2080             :         }
    2081             : 
    2082             :       }
    2083             :       case CLOSE_TAG_OPEN: {
    2084           5 :         if (++pos == endPos) {
    2085           0 :           NS_HTML5_BREAK(stateloop);
    2086             :         }
    2087           5 :         c = checkChar(buf, pos);
    2088           5 :         switch(c) {
    2089             :           case '>': {
    2090             :             if (P::reportErrors) {
    2091           0 :               errLtSlashGt();
    2092             :             }
    2093           0 :             cstart = pos + 1;
    2094           0 :             state = P::transition(
    2095             :               mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    2096           0 :             NS_HTML5_CONTINUE(stateloop);
    2097             :           }
    2098             :           case '\r': {
    2099           0 :             silentCarriageReturn();
    2100             :             if (P::reportErrors) {
    2101           0 :               errGarbageAfterLtSlash();
    2102             :             }
    2103           0 :             clearStrBufBeforeUse();
    2104           0 :             appendStrBuf('\n');
    2105           0 :             state = P::transition(
    2106             :               mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    2107           0 :             NS_HTML5_BREAK(stateloop);
    2108             :           }
    2109             :           case '\n': {
    2110           0 :             silentLineFeed();
    2111             :             if (P::reportErrors) {
    2112           0 :               errGarbageAfterLtSlash();
    2113             :             }
    2114           0 :             clearStrBufBeforeUse();
    2115           0 :             appendStrBuf(c);
    2116           0 :             state = P::transition(
    2117             :               mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    2118           0 :             NS_HTML5_CONTINUE(stateloop);
    2119             :           }
    2120             :           case '\0': {
    2121           0 :             c = 0xfffd;
    2122             :           }
    2123             :           default: {
    2124           5 :             if (c >= 'A' && c <= 'Z') {
    2125           0 :               c += 0x20;
    2126             :             }
    2127           5 :             if (c >= 'a' && c <= 'z') {
    2128           5 :               endTag = true;
    2129           5 :               clearStrBufBeforeUse();
    2130           5 :               appendStrBuf(c);
    2131           5 :               containsHyphen = false;
    2132           5 :               state = P::transition(
    2133             :                 mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
    2134           5 :               NS_HTML5_CONTINUE(stateloop);
    2135             :             } else {
    2136             :               if (P::reportErrors) {
    2137           0 :                 errGarbageAfterLtSlash();
    2138             :               }
    2139           0 :               clearStrBufBeforeUse();
    2140           0 :               appendStrBuf(c);
    2141           0 :               state = P::transition(
    2142             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    2143           0 :               NS_HTML5_CONTINUE(stateloop);
    2144             :             }
    2145             :           }
    2146             :         }
    2147             :       }
    2148             :       case RCDATA: {
    2149             :         for (; ; ) {
    2150           1 :           if (reconsume) {
    2151           0 :             reconsume = false;
    2152             :           } else {
    2153           1 :             if (++pos == endPos) {
    2154           0 :               NS_HTML5_BREAK(stateloop);
    2155             :             }
    2156           1 :             c = checkChar(buf, pos);
    2157             :           }
    2158           1 :           switch(c) {
    2159             :             case '&': {
    2160           0 :               flushChars(buf, pos);
    2161           0 :               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
    2162           0 :               appendCharRefBuf(c);
    2163           0 :               setAdditionalAndRememberAmpersandLocation('\0');
    2164           0 :               returnState = state;
    2165           0 :               state =
    2166           0 :                 P::transition(mViewSource,
    2167             :                               nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
    2168             :                               reconsume,
    2169             :                               pos);
    2170           0 :               NS_HTML5_CONTINUE(stateloop);
    2171             :             }
    2172             :             case '<': {
    2173           1 :               flushChars(buf, pos);
    2174           1 :               returnState = state;
    2175           1 :               state =
    2176           1 :                 P::transition(mViewSource,
    2177             :                               nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN,
    2178             :                               reconsume,
    2179             :                               pos);
    2180           1 :               NS_HTML5_CONTINUE(stateloop);
    2181             :             }
    2182             :             case '\0': {
    2183           0 :               emitReplacementCharacter(buf, pos);
    2184           0 :               continue;
    2185             :             }
    2186             :             case '\r': {
    2187           0 :               emitCarriageReturn(buf, pos);
    2188           0 :               NS_HTML5_BREAK(stateloop);
    2189             :             }
    2190             :             case '\n': {
    2191           0 :               silentLineFeed();
    2192             :             }
    2193             :             default: {
    2194           0 :               continue;
    2195             :             }
    2196             :           }
    2197             :         }
    2198             : 
    2199             :       }
    2200             :       case RAWTEXT: {
    2201             :         for (; ; ) {
    2202           0 :           if (reconsume) {
    2203           0 :             reconsume = false;
    2204             :           } else {
    2205           0 :             if (++pos == endPos) {
    2206           0 :               NS_HTML5_BREAK(stateloop);
    2207             :             }
    2208           0 :             c = checkChar(buf, pos);
    2209             :           }
    2210           0 :           switch(c) {
    2211             :             case '<': {
    2212           0 :               flushChars(buf, pos);
    2213           0 :               returnState = state;
    2214           0 :               state =
    2215           0 :                 P::transition(mViewSource,
    2216             :                               nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN,
    2217             :                               reconsume,
    2218             :                               pos);
    2219           0 :               NS_HTML5_BREAK(rawtextloop);
    2220             :             }
    2221             :             case '\0': {
    2222           0 :               emitReplacementCharacter(buf, pos);
    2223           0 :               continue;
    2224             :             }
    2225             :             case '\r': {
    2226           0 :               emitCarriageReturn(buf, pos);
    2227           0 :               NS_HTML5_BREAK(stateloop);
    2228             :             }
    2229             :             case '\n': {
    2230           0 :               silentLineFeed();
    2231             :             }
    2232             :             default: {
    2233           0 :               continue;
    2234             :             }
    2235             :           }
    2236             :         }
    2237             :         rawtextloop_end: ;
    2238             :       }
    2239             :       case RAWTEXT_RCDATA_LESS_THAN_SIGN: {
    2240             :         for (; ; ) {
    2241           1 :           if (++pos == endPos) {
    2242           0 :             NS_HTML5_BREAK(stateloop);
    2243             :           }
    2244           1 :           c = checkChar(buf, pos);
    2245           1 :           switch(c) {
    2246             :             case '/': {
    2247           1 :               index = 0;
    2248           1 :               clearStrBufBeforeUse();
    2249           1 :               state = P::transition(mViewSource,
    2250             :                                     nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
    2251             :                                     reconsume,
    2252             :                                     pos);
    2253           1 :               NS_HTML5_BREAK(rawtextrcdatalessthansignloop);
    2254             :             }
    2255             :             default: {
    2256           0 :               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
    2257           0 :               cstart = pos;
    2258           0 :               reconsume = true;
    2259           0 :               state = P::transition(mViewSource, returnState, reconsume, pos);
    2260           0 :               NS_HTML5_CONTINUE(stateloop);
    2261             :             }
    2262             :           }
    2263             :         }
    2264             :         rawtextrcdatalessthansignloop_end: ;
    2265             :       }
    2266             :       case NON_DATA_END_TAG_NAME: {
    2267          35 :         for (; ; ) {
    2268          41 :           if (++pos == endPos) {
    2269           0 :             NS_HTML5_BREAK(stateloop);
    2270             :           }
    2271          41 :           c = checkChar(buf, pos);
    2272          41 :           if (index < endTagExpectationAsArray.length) {
    2273          35 :             char16_t e = endTagExpectationAsArray[index];
    2274          35 :             char16_t folded = c;
    2275          35 :             if (c >= 'A' && c <= 'Z') {
    2276           0 :               folded += 0x20;
    2277             :             }
    2278          35 :             if (folded != e) {
    2279           0 :               tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
    2280           0 :               emitStrBuf();
    2281           0 :               cstart = pos;
    2282           0 :               reconsume = true;
    2283           0 :               state = P::transition(mViewSource, returnState, reconsume, pos);
    2284           0 :               NS_HTML5_CONTINUE(stateloop);
    2285             :             }
    2286          35 :             appendStrBuf(c);
    2287          35 :             index++;
    2288          35 :             continue;
    2289             :           } else {
    2290           6 :             endTag = true;
    2291           6 :             tagName = endTagExpectation;
    2292           6 :             switch(c) {
    2293             :               case '\r': {
    2294           0 :                 silentCarriageReturn();
    2295           0 :                 clearStrBufAfterUse();
    2296           0 :                 state = P::transition(mViewSource,
    2297             :                                       nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
    2298             :                                       reconsume,
    2299             :                                       pos);
    2300           0 :                 NS_HTML5_BREAK(stateloop);
    2301             :               }
    2302             :               case '\n': {
    2303           0 :                 silentLineFeed();
    2304             :               }
    2305             :               case ' ':
    2306             :               case '\t':
    2307             :               case '\f': {
    2308           0 :                 clearStrBufAfterUse();
    2309           0 :                 state = P::transition(mViewSource,
    2310             :                                       nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
    2311             :                                       reconsume,
    2312             :                                       pos);
    2313           0 :                 NS_HTML5_CONTINUE(stateloop);
    2314             :               }
    2315             :               case '/': {
    2316           0 :                 clearStrBufAfterUse();
    2317           0 :                 state = P::transition(mViewSource,
    2318             :                                       nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
    2319             :                                       reconsume,
    2320             :                                       pos);
    2321           0 :                 NS_HTML5_CONTINUE(stateloop);
    2322             :               }
    2323             :               case '>': {
    2324           6 :                 clearStrBufAfterUse();
    2325           6 :                 state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
    2326           6 :                 if (shouldSuspend) {
    2327           5 :                   NS_HTML5_BREAK(stateloop);
    2328             :                 }
    2329           1 :                 NS_HTML5_CONTINUE(stateloop);
    2330             :               }
    2331             :               default: {
    2332           0 :                 tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
    2333           0 :                 emitStrBuf();
    2334           0 :                 if (c == '\0') {
    2335           0 :                   emitReplacementCharacter(buf, pos);
    2336             :                 } else {
    2337           0 :                   cstart = pos;
    2338             :                 }
    2339           0 :                 state = P::transition(mViewSource, returnState, reconsume, pos);
    2340           0 :                 NS_HTML5_CONTINUE(stateloop);
    2341             :               }
    2342             :             }
    2343             :           }
    2344             :         }
    2345             :       }
    2346             :       case BOGUS_COMMENT: {
    2347             :         for (; ; ) {
    2348           0 :           if (reconsume) {
    2349           0 :             reconsume = false;
    2350             :           } else {
    2351           0 :             if (++pos == endPos) {
    2352           0 :               NS_HTML5_BREAK(stateloop);
    2353             :             }
    2354           0 :             c = checkChar(buf, pos);
    2355             :           }
    2356           0 :           switch(c) {
    2357             :             case '>': {
    2358           0 :               emitComment(0, pos);
    2359           0 :               state = P::transition(
    2360             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    2361           0 :               NS_HTML5_CONTINUE(stateloop);
    2362             :             }
    2363             :             case '-': {
    2364           0 :               appendStrBuf(c);
    2365           0 :               state = P::transition(mViewSource,
    2366             :                                     nsHtml5Tokenizer::BOGUS_COMMENT_HYPHEN,
    2367             :                                     reconsume,
    2368             :                                     pos);
    2369           0 :               NS_HTML5_BREAK(boguscommentloop);
    2370             :             }
    2371             :             case '\r': {
    2372           0 :               appendStrBufCarriageReturn();
    2373           0 :               NS_HTML5_BREAK(stateloop);
    2374             :             }
    2375             :             case '\n': {
    2376           0 :               appendStrBufLineFeed();
    2377           0 :               continue;
    2378             :             }
    2379             :             case '\0': {
    2380           0 :               c = 0xfffd;
    2381             :             }
    2382             :             default: {
    2383           0 :               appendStrBuf(c);
    2384           0 :               continue;
    2385             :             }
    2386             :           }
    2387             :         }
    2388             :         boguscommentloop_end: ;
    2389             :       }
    2390             :       case BOGUS_COMMENT_HYPHEN: {
    2391             :       boguscommenthyphenloop:
    2392             :         for (;;) {
    2393           0 :           if (++pos == endPos) {
    2394           0 :             NS_HTML5_BREAK(stateloop);
    2395             :           }
    2396           0 :           c = checkChar(buf, pos);
    2397           0 :           switch(c) {
    2398             :             case '>': {
    2399           0 :               emitComment(0, pos);
    2400           0 :               state = P::transition(
    2401             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    2402           0 :               NS_HTML5_CONTINUE(stateloop);
    2403             :             }
    2404             :             case '-': {
    2405           0 :               appendSecondHyphenToBogusComment();
    2406           0 :               NS_HTML5_CONTINUE(boguscommenthyphenloop);
    2407             :             }
    2408             :             case '\r': {
    2409           0 :               appendStrBufCarriageReturn();
    2410           0 :               state = P::transition(
    2411             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    2412           0 :               NS_HTML5_BREAK(stateloop);
    2413             :             }
    2414             :             case '\n': {
    2415           0 :               appendStrBufLineFeed();
    2416           0 :               state = P::transition(
    2417             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    2418           0 :               NS_HTML5_CONTINUE(stateloop);
    2419             :             }
    2420             :             case '\0': {
    2421           0 :               c = 0xfffd;
    2422             :             }
    2423             :             default: {
    2424           0 :               appendStrBuf(c);
    2425           0 :               state = P::transition(
    2426             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    2427           0 :               NS_HTML5_CONTINUE(stateloop);
    2428             :             }
    2429             :           }
    2430             :         }
    2431             : 
    2432             :       }
    2433             :       case SCRIPT_DATA: {
    2434             :         for (; ; ) {
    2435        3584 :           if (reconsume) {
    2436           3 :             reconsume = false;
    2437             :           } else {
    2438        1794 :             if (++pos == endPos) {
    2439           2 :               NS_HTML5_BREAK(stateloop);
    2440             :             }
    2441        1792 :             c = checkChar(buf, pos);
    2442             :           }
    2443        1795 :           switch(c) {
    2444             :             case '<': {
    2445           8 :               flushChars(buf, pos);
    2446           8 :               returnState = state;
    2447           8 :               state =
    2448           8 :                 P::transition(mViewSource,
    2449             :                               nsHtml5Tokenizer::SCRIPT_DATA_LESS_THAN_SIGN,
    2450             :                               reconsume,
    2451             :                               pos);
    2452           8 :               NS_HTML5_BREAK(scriptdataloop);
    2453             :             }
    2454             :             case '\0': {
    2455           0 :               emitReplacementCharacter(buf, pos);
    2456           0 :               continue;
    2457             :             }
    2458             :             case '\r': {
    2459           0 :               emitCarriageReturn(buf, pos);
    2460           0 :               NS_HTML5_BREAK(stateloop);
    2461             :             }
    2462             :             case '\n': {
    2463          62 :               silentLineFeed();
    2464             :             }
    2465             :             default: {
    2466        1787 :               continue;
    2467             :             }
    2468             :           }
    2469             :         }
    2470             :         scriptdataloop_end: ;
    2471             :       }
    2472             :       case SCRIPT_DATA_LESS_THAN_SIGN: {
    2473             :         for (; ; ) {
    2474           8 :           if (++pos == endPos) {
    2475           0 :             NS_HTML5_BREAK(stateloop);
    2476             :           }
    2477           8 :           c = checkChar(buf, pos);
    2478           8 :           switch(c) {
    2479             :             case '/': {
    2480           5 :               index = 0;
    2481           5 :               clearStrBufBeforeUse();
    2482           5 :               state = P::transition(mViewSource,
    2483             :                                     nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
    2484             :                                     reconsume,
    2485             :                                     pos);
    2486           5 :               NS_HTML5_CONTINUE(stateloop);
    2487             :             }
    2488             :             case '!': {
    2489           0 :               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
    2490           0 :               cstart = pos;
    2491           0 :               state = P::transition(mViewSource,
    2492             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START,
    2493             :                                     reconsume,
    2494             :                                     pos);
    2495           0 :               NS_HTML5_BREAK(scriptdatalessthansignloop);
    2496             :             }
    2497             :             default: {
    2498           3 :               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
    2499           3 :               cstart = pos;
    2500           3 :               reconsume = true;
    2501           3 :               state = P::transition(
    2502             :                 mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
    2503           3 :               NS_HTML5_CONTINUE(stateloop);
    2504             :             }
    2505             :           }
    2506             :         }
    2507             :         scriptdatalessthansignloop_end: ;
    2508             :       }
    2509             :       case SCRIPT_DATA_ESCAPE_START: {
    2510             :         for (; ; ) {
    2511           0 :           if (++pos == endPos) {
    2512           0 :             NS_HTML5_BREAK(stateloop);
    2513             :           }
    2514           0 :           c = checkChar(buf, pos);
    2515           0 :           switch(c) {
    2516             :             case '-': {
    2517           0 :               state =
    2518           0 :                 P::transition(mViewSource,
    2519             :                               nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START_DASH,
    2520             :                               reconsume,
    2521             :                               pos);
    2522           0 :               NS_HTML5_BREAK(scriptdataescapestartloop);
    2523             :             }
    2524             :             default: {
    2525           0 :               reconsume = true;
    2526           0 :               state = P::transition(
    2527             :                 mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
    2528           0 :               NS_HTML5_CONTINUE(stateloop);
    2529             :             }
    2530             :           }
    2531             :         }
    2532             :         scriptdataescapestartloop_end: ;
    2533             :       }
    2534             :       case SCRIPT_DATA_ESCAPE_START_DASH: {
    2535             :         for (; ; ) {
    2536           0 :           if (++pos == endPos) {
    2537           0 :             NS_HTML5_BREAK(stateloop);
    2538             :           }
    2539           0 :           c = checkChar(buf, pos);
    2540           0 :           switch(c) {
    2541             :             case '-': {
    2542           0 :               state =
    2543           0 :                 P::transition(mViewSource,
    2544             :                               nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH,
    2545             :                               reconsume,
    2546             :                               pos);
    2547           0 :               NS_HTML5_BREAK(scriptdataescapestartdashloop);
    2548             :             }
    2549             :             default: {
    2550           0 :               reconsume = true;
    2551           0 :               state = P::transition(
    2552             :                 mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
    2553           0 :               NS_HTML5_CONTINUE(stateloop);
    2554             :             }
    2555             :           }
    2556             :         }
    2557             :         scriptdataescapestartdashloop_end: ;
    2558             :       }
    2559             :       case SCRIPT_DATA_ESCAPED_DASH_DASH: {
    2560             :         for (; ; ) {
    2561           0 :           if (++pos == endPos) {
    2562           0 :             NS_HTML5_BREAK(stateloop);
    2563             :           }
    2564           0 :           c = checkChar(buf, pos);
    2565           0 :           switch(c) {
    2566             :             case '-': {
    2567           0 :               continue;
    2568             :             }
    2569             :             case '<': {
    2570           0 :               flushChars(buf, pos);
    2571           0 :               state = P::transition(
    2572             :                 mViewSource,
    2573             :                 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
    2574             :                 reconsume,
    2575             :                 pos);
    2576           0 :               NS_HTML5_CONTINUE(stateloop);
    2577             :             }
    2578             :             case '>': {
    2579           0 :               state = P::transition(
    2580             :                 mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
    2581           0 :               NS_HTML5_CONTINUE(stateloop);
    2582             :             }
    2583             :             case '\0': {
    2584           0 :               emitReplacementCharacter(buf, pos);
    2585           0 :               state = P::transition(mViewSource,
    2586             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2587             :                                     reconsume,
    2588             :                                     pos);
    2589           0 :               NS_HTML5_BREAK(scriptdataescapeddashdashloop);
    2590             :             }
    2591             :             case '\r': {
    2592           0 :               emitCarriageReturn(buf, pos);
    2593           0 :               state = P::transition(mViewSource,
    2594             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2595             :                                     reconsume,
    2596             :                                     pos);
    2597           0 :               NS_HTML5_BREAK(stateloop);
    2598             :             }
    2599             :             case '\n': {
    2600           0 :               silentLineFeed();
    2601             :             }
    2602             :             default: {
    2603           0 :               state = P::transition(mViewSource,
    2604             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2605             :                                     reconsume,
    2606             :                                     pos);
    2607           0 :               NS_HTML5_BREAK(scriptdataescapeddashdashloop);
    2608             :             }
    2609             :           }
    2610             :         }
    2611             :         scriptdataescapeddashdashloop_end: ;
    2612             :       }
    2613             :       case SCRIPT_DATA_ESCAPED: {
    2614             :         for (; ; ) {
    2615           0 :           if (reconsume) {
    2616           0 :             reconsume = false;
    2617             :           } else {
    2618           0 :             if (++pos == endPos) {
    2619           0 :               NS_HTML5_BREAK(stateloop);
    2620             :             }
    2621           0 :             c = checkChar(buf, pos);
    2622             :           }
    2623           0 :           switch(c) {
    2624             :             case '-': {
    2625           0 :               state = P::transition(mViewSource,
    2626             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH,
    2627             :                                     reconsume,
    2628             :                                     pos);
    2629           0 :               NS_HTML5_BREAK(scriptdataescapedloop);
    2630             :             }
    2631             :             case '<': {
    2632           0 :               flushChars(buf, pos);
    2633           0 :               state = P::transition(
    2634             :                 mViewSource,
    2635             :                 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
    2636             :                 reconsume,
    2637             :                 pos);
    2638           0 :               NS_HTML5_CONTINUE(stateloop);
    2639             :             }
    2640             :             case '\0': {
    2641           0 :               emitReplacementCharacter(buf, pos);
    2642           0 :               continue;
    2643             :             }
    2644             :             case '\r': {
    2645           0 :               emitCarriageReturn(buf, pos);
    2646           0 :               NS_HTML5_BREAK(stateloop);
    2647             :             }
    2648             :             case '\n': {
    2649           0 :               silentLineFeed();
    2650             :             }
    2651             :             default: {
    2652           0 :               continue;
    2653             :             }
    2654             :           }
    2655             :         }
    2656             :         scriptdataescapedloop_end: ;
    2657             :       }
    2658             :       case SCRIPT_DATA_ESCAPED_DASH: {
    2659             :         for (; ; ) {
    2660           0 :           if (++pos == endPos) {
    2661           0 :             NS_HTML5_BREAK(stateloop);
    2662             :           }
    2663           0 :           c = checkChar(buf, pos);
    2664           0 :           switch(c) {
    2665             :             case '-': {
    2666           0 :               state =
    2667           0 :                 P::transition(mViewSource,
    2668             :                               nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH,
    2669             :                               reconsume,
    2670             :                               pos);
    2671           0 :               NS_HTML5_CONTINUE(stateloop);
    2672             :             }
    2673             :             case '<': {
    2674           0 :               flushChars(buf, pos);
    2675           0 :               state = P::transition(
    2676             :                 mViewSource,
    2677             :                 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
    2678             :                 reconsume,
    2679             :                 pos);
    2680           0 :               NS_HTML5_BREAK(scriptdataescapeddashloop);
    2681             :             }
    2682             :             case '\0': {
    2683           0 :               emitReplacementCharacter(buf, pos);
    2684           0 :               state = P::transition(mViewSource,
    2685             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2686             :                                     reconsume,
    2687             :                                     pos);
    2688           0 :               NS_HTML5_CONTINUE(stateloop);
    2689             :             }
    2690             :             case '\r': {
    2691           0 :               emitCarriageReturn(buf, pos);
    2692           0 :               state = P::transition(mViewSource,
    2693             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2694             :                                     reconsume,
    2695             :                                     pos);
    2696           0 :               NS_HTML5_BREAK(stateloop);
    2697             :             }
    2698             :             case '\n': {
    2699           0 :               silentLineFeed();
    2700             :             }
    2701             :             default: {
    2702           0 :               state = P::transition(mViewSource,
    2703             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2704             :                                     reconsume,
    2705             :                                     pos);
    2706           0 :               NS_HTML5_CONTINUE(stateloop);
    2707             :             }
    2708             :           }
    2709             :         }
    2710             :         scriptdataescapeddashloop_end: ;
    2711             :       }
    2712             :       case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
    2713             :         for (; ; ) {
    2714           0 :           if (++pos == endPos) {
    2715           0 :             NS_HTML5_BREAK(stateloop);
    2716             :           }
    2717           0 :           c = checkChar(buf, pos);
    2718           0 :           switch(c) {
    2719             :             case '/': {
    2720           0 :               index = 0;
    2721           0 :               clearStrBufBeforeUse();
    2722           0 :               returnState = nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED;
    2723           0 :               state = P::transition(mViewSource,
    2724             :                                     nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
    2725             :                                     reconsume,
    2726             :                                     pos);
    2727           0 :               NS_HTML5_CONTINUE(stateloop);
    2728             :             }
    2729             :             case 'S':
    2730             :             case 's': {
    2731           0 :               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
    2732           0 :               cstart = pos;
    2733           0 :               index = 1;
    2734           0 :               state =
    2735           0 :                 P::transition(mViewSource,
    2736             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_START,
    2737             :                               reconsume,
    2738             :                               pos);
    2739           0 :               NS_HTML5_BREAK(scriptdataescapedlessthanloop);
    2740             :             }
    2741             :             default: {
    2742           0 :               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
    2743           0 :               cstart = pos;
    2744           0 :               reconsume = true;
    2745           0 :               state = P::transition(mViewSource,
    2746             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2747             :                                     reconsume,
    2748             :                                     pos);
    2749           0 :               NS_HTML5_CONTINUE(stateloop);
    2750             :             }
    2751             :           }
    2752             :         }
    2753             :         scriptdataescapedlessthanloop_end: ;
    2754             :       }
    2755             :       case SCRIPT_DATA_DOUBLE_ESCAPE_START: {
    2756           0 :         for (; ; ) {
    2757           0 :           if (++pos == endPos) {
    2758           0 :             NS_HTML5_BREAK(stateloop);
    2759             :           }
    2760           0 :           c = checkChar(buf, pos);
    2761           0 :           MOZ_ASSERT(index > 0);
    2762           0 :           if (index < 6) {
    2763           0 :             char16_t folded = c;
    2764           0 :             if (c >= 'A' && c <= 'Z') {
    2765           0 :               folded += 0x20;
    2766             :             }
    2767           0 :             if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
    2768           0 :               reconsume = true;
    2769           0 :               state = P::transition(mViewSource,
    2770             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2771             :                                     reconsume,
    2772             :                                     pos);
    2773           0 :               NS_HTML5_CONTINUE(stateloop);
    2774             :             }
    2775           0 :             index++;
    2776           0 :             continue;
    2777             :           }
    2778           0 :           switch(c) {
    2779             :             case '\r': {
    2780           0 :               emitCarriageReturn(buf, pos);
    2781           0 :               state =
    2782           0 :                 P::transition(mViewSource,
    2783             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2784             :                               reconsume,
    2785             :                               pos);
    2786           0 :               NS_HTML5_BREAK(stateloop);
    2787             :             }
    2788             :             case '\n': {
    2789           0 :               silentLineFeed();
    2790             :             }
    2791             :             case ' ':
    2792             :             case '\t':
    2793             :             case '\f':
    2794             :             case '/':
    2795             :             case '>': {
    2796           0 :               state =
    2797           0 :                 P::transition(mViewSource,
    2798             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2799             :                               reconsume,
    2800             :                               pos);
    2801           0 :               NS_HTML5_BREAK(scriptdatadoubleescapestartloop);
    2802             :             }
    2803             :             default: {
    2804           0 :               reconsume = true;
    2805           0 :               state = P::transition(mViewSource,
    2806             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    2807             :                                     reconsume,
    2808             :                                     pos);
    2809           0 :               NS_HTML5_CONTINUE(stateloop);
    2810             :             }
    2811             :           }
    2812             :         }
    2813             :         scriptdatadoubleescapestartloop_end: ;
    2814             :       }
    2815             :       case SCRIPT_DATA_DOUBLE_ESCAPED: {
    2816             :         for (; ; ) {
    2817           0 :           if (reconsume) {
    2818           0 :             reconsume = false;
    2819             :           } else {
    2820           0 :             if (++pos == endPos) {
    2821           0 :               NS_HTML5_BREAK(stateloop);
    2822             :             }
    2823           0 :             c = checkChar(buf, pos);
    2824             :           }
    2825           0 :           switch(c) {
    2826             :             case '-': {
    2827           0 :               state =
    2828           0 :                 P::transition(mViewSource,
    2829             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH,
    2830             :                               reconsume,
    2831             :                               pos);
    2832           0 :               NS_HTML5_BREAK(scriptdatadoubleescapedloop);
    2833             :             }
    2834             :             case '<': {
    2835           0 :               state = P::transition(
    2836             :                 mViewSource,
    2837             :                 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
    2838             :                 reconsume,
    2839             :                 pos);
    2840           0 :               NS_HTML5_CONTINUE(stateloop);
    2841             :             }
    2842             :             case '\0': {
    2843           0 :               emitReplacementCharacter(buf, pos);
    2844           0 :               continue;
    2845             :             }
    2846             :             case '\r': {
    2847           0 :               emitCarriageReturn(buf, pos);
    2848           0 :               NS_HTML5_BREAK(stateloop);
    2849             :             }
    2850             :             case '\n': {
    2851           0 :               silentLineFeed();
    2852             :             }
    2853             :             default: {
    2854           0 :               continue;
    2855             :             }
    2856             :           }
    2857             :         }
    2858             :         scriptdatadoubleescapedloop_end: ;
    2859             :       }
    2860             :       case SCRIPT_DATA_DOUBLE_ESCAPED_DASH: {
    2861             :         for (; ; ) {
    2862           0 :           if (++pos == endPos) {
    2863           0 :             NS_HTML5_BREAK(stateloop);
    2864             :           }
    2865           0 :           c = checkChar(buf, pos);
    2866           0 :           switch(c) {
    2867             :             case '-': {
    2868           0 :               state = P::transition(
    2869             :                 mViewSource,
    2870             :                 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH,
    2871             :                 reconsume,
    2872             :                 pos);
    2873           0 :               NS_HTML5_BREAK(scriptdatadoubleescapeddashloop);
    2874             :             }
    2875             :             case '<': {
    2876           0 :               state = P::transition(
    2877             :                 mViewSource,
    2878             :                 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
    2879             :                 reconsume,
    2880             :                 pos);
    2881           0 :               NS_HTML5_CONTINUE(stateloop);
    2882             :             }
    2883             :             case '\0': {
    2884           0 :               emitReplacementCharacter(buf, pos);
    2885           0 :               state =
    2886           0 :                 P::transition(mViewSource,
    2887             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2888             :                               reconsume,
    2889             :                               pos);
    2890           0 :               NS_HTML5_CONTINUE(stateloop);
    2891             :             }
    2892             :             case '\r': {
    2893           0 :               emitCarriageReturn(buf, pos);
    2894           0 :               state =
    2895           0 :                 P::transition(mViewSource,
    2896             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2897             :                               reconsume,
    2898             :                               pos);
    2899           0 :               NS_HTML5_BREAK(stateloop);
    2900             :             }
    2901             :             case '\n': {
    2902           0 :               silentLineFeed();
    2903             :             }
    2904             :             default: {
    2905           0 :               state =
    2906           0 :                 P::transition(mViewSource,
    2907             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2908             :                               reconsume,
    2909             :                               pos);
    2910           0 :               NS_HTML5_CONTINUE(stateloop);
    2911             :             }
    2912             :           }
    2913             :         }
    2914             :         scriptdatadoubleescapeddashloop_end: ;
    2915             :       }
    2916             :       case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH: {
    2917             :         for (; ; ) {
    2918           0 :           if (++pos == endPos) {
    2919           0 :             NS_HTML5_BREAK(stateloop);
    2920             :           }
    2921           0 :           c = checkChar(buf, pos);
    2922           0 :           switch(c) {
    2923             :             case '-': {
    2924           0 :               continue;
    2925             :             }
    2926             :             case '<': {
    2927           0 :               state = P::transition(
    2928             :                 mViewSource,
    2929             :                 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
    2930             :                 reconsume,
    2931             :                 pos);
    2932           0 :               NS_HTML5_BREAK(scriptdatadoubleescapeddashdashloop);
    2933             :             }
    2934             :             case '>': {
    2935           0 :               state = P::transition(
    2936             :                 mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
    2937           0 :               NS_HTML5_CONTINUE(stateloop);
    2938             :             }
    2939             :             case '\0': {
    2940           0 :               emitReplacementCharacter(buf, pos);
    2941           0 :               state =
    2942           0 :                 P::transition(mViewSource,
    2943             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2944             :                               reconsume,
    2945             :                               pos);
    2946           0 :               NS_HTML5_CONTINUE(stateloop);
    2947             :             }
    2948             :             case '\r': {
    2949           0 :               emitCarriageReturn(buf, pos);
    2950           0 :               state =
    2951           0 :                 P::transition(mViewSource,
    2952             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2953             :                               reconsume,
    2954             :                               pos);
    2955           0 :               NS_HTML5_BREAK(stateloop);
    2956             :             }
    2957             :             case '\n': {
    2958           0 :               silentLineFeed();
    2959             :             }
    2960             :             default: {
    2961           0 :               state =
    2962           0 :                 P::transition(mViewSource,
    2963             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2964             :                               reconsume,
    2965             :                               pos);
    2966           0 :               NS_HTML5_CONTINUE(stateloop);
    2967             :             }
    2968             :           }
    2969             :         }
    2970             :         scriptdatadoubleescapeddashdashloop_end: ;
    2971             :       }
    2972             :       case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN: {
    2973             :         for (; ; ) {
    2974           0 :           if (++pos == endPos) {
    2975           0 :             NS_HTML5_BREAK(stateloop);
    2976             :           }
    2977           0 :           c = checkChar(buf, pos);
    2978           0 :           switch(c) {
    2979             :             case '/': {
    2980           0 :               index = 0;
    2981           0 :               state =
    2982           0 :                 P::transition(mViewSource,
    2983             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_END,
    2984             :                               reconsume,
    2985             :                               pos);
    2986           0 :               NS_HTML5_BREAK(scriptdatadoubleescapedlessthanloop);
    2987             :             }
    2988             :             default: {
    2989           0 :               reconsume = true;
    2990           0 :               state =
    2991           0 :                 P::transition(mViewSource,
    2992             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    2993             :                               reconsume,
    2994             :                               pos);
    2995           0 :               NS_HTML5_CONTINUE(stateloop);
    2996             :             }
    2997             :           }
    2998             :         }
    2999             :         scriptdatadoubleescapedlessthanloop_end: ;
    3000             :       }
    3001             :       case SCRIPT_DATA_DOUBLE_ESCAPE_END: {
    3002           0 :         for (; ; ) {
    3003           0 :           if (++pos == endPos) {
    3004           0 :             NS_HTML5_BREAK(stateloop);
    3005             :           }
    3006           0 :           c = checkChar(buf, pos);
    3007           0 :           if (index < 6) {
    3008           0 :             char16_t folded = c;
    3009           0 :             if (c >= 'A' && c <= 'Z') {
    3010           0 :               folded += 0x20;
    3011             :             }
    3012           0 :             if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
    3013           0 :               reconsume = true;
    3014           0 :               state =
    3015           0 :                 P::transition(mViewSource,
    3016             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    3017             :                               reconsume,
    3018             :                               pos);
    3019           0 :               NS_HTML5_CONTINUE(stateloop);
    3020             :             }
    3021           0 :             index++;
    3022           0 :             continue;
    3023             :           }
    3024           0 :           switch(c) {
    3025             :             case '\r': {
    3026           0 :               emitCarriageReturn(buf, pos);
    3027           0 :               state = P::transition(mViewSource,
    3028             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    3029             :                                     reconsume,
    3030             :                                     pos);
    3031           0 :               NS_HTML5_BREAK(stateloop);
    3032             :             }
    3033             :             case '\n': {
    3034           0 :               silentLineFeed();
    3035             :             }
    3036             :             case ' ':
    3037             :             case '\t':
    3038             :             case '\f':
    3039             :             case '/':
    3040             :             case '>': {
    3041           0 :               state = P::transition(mViewSource,
    3042             :                                     nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
    3043             :                                     reconsume,
    3044             :                                     pos);
    3045           0 :               NS_HTML5_CONTINUE(stateloop);
    3046             :             }
    3047             :             default: {
    3048           0 :               reconsume = true;
    3049           0 :               state =
    3050           0 :                 P::transition(mViewSource,
    3051             :                               nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
    3052             :                               reconsume,
    3053             :                               pos);
    3054           0 :               NS_HTML5_CONTINUE(stateloop);
    3055             :             }
    3056             :           }
    3057             :         }
    3058             : 
    3059             :       }
    3060             :       case MARKUP_DECLARATION_OCTYPE: {
    3061           6 :         for (; ; ) {
    3062           7 :           if (++pos == endPos) {
    3063           0 :             NS_HTML5_BREAK(stateloop);
    3064             :           }
    3065           7 :           c = checkChar(buf, pos);
    3066           7 :           if (index < 6) {
    3067           6 :             char16_t folded = c;
    3068           6 :             if (c >= 'A' && c <= 'Z') {
    3069           6 :               folded += 0x20;
    3070             :             }
    3071           6 :             if (folded == nsHtml5Tokenizer::OCTYPE[index]) {
    3072           6 :               appendStrBuf(c);
    3073             :             } else {
    3074             :               if (P::reportErrors) {
    3075           0 :                 errBogusComment();
    3076             :               }
    3077           0 :               reconsume = true;
    3078           0 :               state = P::transition(
    3079             :                 mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
    3080           0 :               NS_HTML5_CONTINUE(stateloop);
    3081             :             }
    3082           6 :             index++;
    3083           6 :             continue;
    3084             :           } else {
    3085           1 :             reconsume = true;
    3086           1 :             state = P::transition(
    3087             :               mViewSource, nsHtml5Tokenizer::DOCTYPE, reconsume, pos);
    3088           1 :             NS_HTML5_BREAK(markupdeclarationdoctypeloop);
    3089             :           }
    3090             :         }
    3091             :         markupdeclarationdoctypeloop_end: ;
    3092             :       }
    3093             :       case DOCTYPE: {
    3094             :         for (; ; ) {
    3095           1 :           if (reconsume) {
    3096           1 :             reconsume = false;
    3097             :           } else {
    3098           0 :             if (++pos == endPos) {
    3099           0 :               NS_HTML5_BREAK(stateloop);
    3100             :             }
    3101           0 :             c = checkChar(buf, pos);
    3102             :           }
    3103           1 :           initDoctypeFields();
    3104           1 :           switch(c) {
    3105             :             case '\r': {
    3106           0 :               silentCarriageReturn();
    3107           0 :               state = P::transition(mViewSource,
    3108             :                                     nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
    3109             :                                     reconsume,
    3110             :                                     pos);
    3111           0 :               NS_HTML5_BREAK(stateloop);
    3112             :             }
    3113             :             case '\n': {
    3114           0 :               silentLineFeed();
    3115             :             }
    3116             :             case ' ':
    3117             :             case '\t':
    3118             :             case '\f': {
    3119           1 :               state = P::transition(mViewSource,
    3120             :                                     nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
    3121             :                                     reconsume,
    3122             :                                     pos);
    3123           1 :               NS_HTML5_BREAK(doctypeloop);
    3124             :             }
    3125             :             default: {
    3126             :               if (P::reportErrors) {
    3127           0 :                 errMissingSpaceBeforeDoctypeName();
    3128             :               }
    3129           0 :               reconsume = true;
    3130           0 :               state = P::transition(mViewSource,
    3131             :                                     nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
    3132             :                                     reconsume,
    3133             :                                     pos);
    3134           0 :               NS_HTML5_BREAK(doctypeloop);
    3135             :             }
    3136             :           }
    3137             :         }
    3138             :         doctypeloop_end: ;
    3139             :       }
    3140             :       case BEFORE_DOCTYPE_NAME: {
    3141             :         for (; ; ) {
    3142           1 :           if (reconsume) {
    3143           0 :             reconsume = false;
    3144             :           } else {
    3145           1 :             if (++pos == endPos) {
    3146           0 :               NS_HTML5_BREAK(stateloop);
    3147             :             }
    3148           1 :             c = checkChar(buf, pos);
    3149             :           }
    3150           1 :           switch(c) {
    3151             :             case '\r': {
    3152           0 :               silentCarriageReturn();
    3153           0 :               NS_HTML5_BREAK(stateloop);
    3154             :             }
    3155             :             case '\n': {
    3156           0 :               silentLineFeed();
    3157             :             }
    3158             :             case ' ':
    3159             :             case '\t':
    3160             :             case '\f': {
    3161           0 :               continue;
    3162             :             }
    3163             :             case '>': {
    3164             :               if (P::reportErrors) {
    3165           0 :                 errNamelessDoctype();
    3166             :               }
    3167           0 :               forceQuirks = true;
    3168           0 :               emitDoctypeToken(pos);
    3169           0 :               state = P::transition(
    3170             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3171           0 :               NS_HTML5_CONTINUE(stateloop);
    3172             :             }
    3173             :             case '\0': {
    3174           0 :               c = 0xfffd;
    3175             :             }
    3176             :             default: {
    3177           1 :               if (c >= 'A' && c <= 'Z') {
    3178           0 :                 c += 0x20;
    3179             :               }
    3180           1 :               clearStrBufBeforeUse();
    3181           1 :               appendStrBuf(c);
    3182           1 :               state = P::transition(
    3183             :                 mViewSource, nsHtml5Tokenizer::DOCTYPE_NAME, reconsume, pos);
    3184           1 :               NS_HTML5_BREAK(beforedoctypenameloop);
    3185             :             }
    3186             :           }
    3187             :         }
    3188             :         beforedoctypenameloop_end: ;
    3189             :       }
    3190             :       case DOCTYPE_NAME: {
    3191             :         for (; ; ) {
    3192           7 :           if (++pos == endPos) {
    3193           0 :             NS_HTML5_BREAK(stateloop);
    3194             :           }
    3195           4 :           c = checkChar(buf, pos);
    3196           4 :           switch(c) {
    3197             :             case '\r': {
    3198           0 :               silentCarriageReturn();
    3199           0 :               strBufToDoctypeName();
    3200           0 :               state = P::transition(mViewSource,
    3201             :                                     nsHtml5Tokenizer::AFTER_DOCTYPE_NAME,
    3202             :                                     reconsume,
    3203             :                                     pos);
    3204           0 :               NS_HTML5_BREAK(stateloop);
    3205             :             }
    3206             :             case '\n': {
    3207           0 :               silentLineFeed();
    3208             :             }
    3209             :             case ' ':
    3210             :             case '\t':
    3211             :             case '\f': {
    3212           1 :               strBufToDoctypeName();
    3213           1 :               state = P::transition(mViewSource,
    3214             :                                     nsHtml5Tokenizer::AFTER_DOCTYPE_NAME,
    3215             :                                     reconsume,
    3216             :                                     pos);
    3217           1 :               NS_HTML5_BREAK(doctypenameloop);
    3218             :             }
    3219             :             case '>': {
    3220           0 :               strBufToDoctypeName();
    3221           0 :               emitDoctypeToken(pos);
    3222           0 :               state = P::transition(
    3223             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3224           0 :               NS_HTML5_CONTINUE(stateloop);
    3225             :             }
    3226             :             case '\0': {
    3227           0 :               c = 0xfffd;
    3228             :             }
    3229             :             default: {
    3230           3 :               if (c >= 'A' && c <= 'Z') {
    3231           0 :                 c += 0x0020;
    3232             :               }
    3233           3 :               appendStrBuf(c);
    3234           3 :               continue;
    3235             :             }
    3236             :           }
    3237             :         }
    3238             :         doctypenameloop_end: ;
    3239             :       }
    3240             :       case AFTER_DOCTYPE_NAME: {
    3241             :         for (; ; ) {
    3242           1 :           if (++pos == endPos) {
    3243           0 :             NS_HTML5_BREAK(stateloop);
    3244             :           }
    3245           1 :           c = checkChar(buf, pos);
    3246           1 :           switch(c) {
    3247             :             case '\r': {
    3248           0 :               silentCarriageReturn();
    3249           0 :               NS_HTML5_BREAK(stateloop);
    3250             :             }
    3251             :             case '\n': {
    3252           0 :               silentLineFeed();
    3253             :             }
    3254             :             case ' ':
    3255             :             case '\t':
    3256             :             case '\f': {
    3257           0 :               continue;
    3258             :             }
    3259             :             case '>': {
    3260           0 :               emitDoctypeToken(pos);
    3261           0 :               state = P::transition(
    3262             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3263           0 :               NS_HTML5_CONTINUE(stateloop);
    3264             :             }
    3265             :             case 'p':
    3266             :             case 'P': {
    3267           1 :               index = 0;
    3268           1 :               state = P::transition(
    3269             :                 mViewSource, nsHtml5Tokenizer::DOCTYPE_UBLIC, reconsume, pos);
    3270           1 :               NS_HTML5_BREAK(afterdoctypenameloop);
    3271             :             }
    3272             :             case 's':
    3273             :             case 'S': {
    3274           0 :               index = 0;
    3275           0 :               state = P::transition(
    3276             :                 mViewSource, nsHtml5Tokenizer::DOCTYPE_YSTEM, reconsume, pos);
    3277           0 :               NS_HTML5_CONTINUE(stateloop);
    3278             :             }
    3279             :             default: {
    3280           0 :               bogusDoctype();
    3281           0 :               state = P::transition(
    3282             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3283           0 :               NS_HTML5_CONTINUE(stateloop);
    3284             :             }
    3285             :           }
    3286             :         }
    3287             :         afterdoctypenameloop_end: ;
    3288             :       }
    3289             :       case DOCTYPE_UBLIC: {
    3290           5 :         for (; ; ) {
    3291           6 :           if (++pos == endPos) {
    3292           0 :             NS_HTML5_BREAK(stateloop);
    3293             :           }
    3294           6 :           c = checkChar(buf, pos);
    3295           6 :           if (index < 5) {
    3296           5 :             char16_t folded = c;
    3297           5 :             if (c >= 'A' && c <= 'Z') {
    3298           5 :               folded += 0x20;
    3299             :             }
    3300           5 :             if (folded != nsHtml5Tokenizer::UBLIC[index]) {
    3301           0 :               bogusDoctype();
    3302           0 :               reconsume = true;
    3303           0 :               state = P::transition(
    3304             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3305           0 :               NS_HTML5_CONTINUE(stateloop);
    3306             :             }
    3307           5 :             index++;
    3308           5 :             continue;
    3309             :           } else {
    3310           1 :             reconsume = true;
    3311           1 :             state =
    3312           1 :               P::transition(mViewSource,
    3313             :                             nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_KEYWORD,
    3314             :                             reconsume,
    3315             :                             pos);
    3316           1 :             NS_HTML5_BREAK(doctypeublicloop);
    3317             :           }
    3318             :         }
    3319             :         doctypeublicloop_end: ;
    3320             :       }
    3321             :       case AFTER_DOCTYPE_PUBLIC_KEYWORD: {
    3322             :         for (; ; ) {
    3323           1 :           if (reconsume) {
    3324           1 :             reconsume = false;
    3325             :           } else {
    3326           0 :             if (++pos == endPos) {
    3327           0 :               NS_HTML5_BREAK(stateloop);
    3328             :             }
    3329           0 :             c = checkChar(buf, pos);
    3330             :           }
    3331           1 :           switch(c) {
    3332             :             case '\r': {
    3333           0 :               silentCarriageReturn();
    3334           0 :               state = P::transition(
    3335             :                 mViewSource,
    3336             :                 nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER,
    3337             :                 reconsume,
    3338             :                 pos);
    3339           0 :               NS_HTML5_BREAK(stateloop);
    3340             :             }
    3341             :             case '\n': {
    3342           0 :               silentLineFeed();
    3343             :             }
    3344             :             case ' ':
    3345             :             case '\t':
    3346             :             case '\f': {
    3347           1 :               state = P::transition(
    3348             :                 mViewSource,
    3349             :                 nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER,
    3350             :                 reconsume,
    3351             :                 pos);
    3352           1 :               NS_HTML5_BREAK(afterdoctypepublickeywordloop);
    3353             :             }
    3354             :             case '\"': {
    3355             :               if (P::reportErrors) {
    3356           0 :                 errNoSpaceBetweenDoctypePublicKeywordAndQuote();
    3357             :               }
    3358           0 :               clearStrBufBeforeUse();
    3359           0 :               state = P::transition(
    3360             :                 mViewSource,
    3361             :                 nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED,
    3362             :                 reconsume,
    3363             :                 pos);
    3364           0 :               NS_HTML5_CONTINUE(stateloop);
    3365             :             }
    3366             :             case '\'': {
    3367             :               if (P::reportErrors) {
    3368           0 :                 errNoSpaceBetweenDoctypePublicKeywordAndQuote();
    3369             :               }
    3370           0 :               clearStrBufBeforeUse();
    3371           0 :               state = P::transition(
    3372             :                 mViewSource,
    3373             :                 nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED,
    3374             :                 reconsume,
    3375             :                 pos);
    3376           0 :               NS_HTML5_CONTINUE(stateloop);
    3377             :             }
    3378             :             case '>': {
    3379             :               if (P::reportErrors) {
    3380           0 :                 errExpectedPublicId();
    3381             :               }
    3382           0 :               forceQuirks = true;
    3383           0 :               emitDoctypeToken(pos);
    3384           0 :               state = P::transition(
    3385             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3386           0 :               NS_HTML5_CONTINUE(stateloop);
    3387             :             }
    3388             :             default: {
    3389           0 :               bogusDoctype();
    3390           0 :               state = P::transition(
    3391             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3392           0 :               NS_HTML5_CONTINUE(stateloop);
    3393             :             }
    3394             :           }
    3395             :         }
    3396             :         afterdoctypepublickeywordloop_end: ;
    3397             :       }
    3398             :       case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
    3399             :         for (; ; ) {
    3400           1 :           if (++pos == endPos) {
    3401           0 :             NS_HTML5_BREAK(stateloop);
    3402             :           }
    3403           1 :           c = checkChar(buf, pos);
    3404           1 :           switch(c) {
    3405             :             case '\r': {
    3406           0 :               silentCarriageReturn();
    3407           0 :               NS_HTML5_BREAK(stateloop);
    3408             :             }
    3409             :             case '\n': {
    3410           0 :               silentLineFeed();
    3411             :             }
    3412             :             case ' ':
    3413             :             case '\t':
    3414             :             case '\f': {
    3415           0 :               continue;
    3416             :             }
    3417             :             case '\"': {
    3418           1 :               clearStrBufBeforeUse();
    3419           1 :               state = P::transition(
    3420             :                 mViewSource,
    3421             :                 nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED,
    3422             :                 reconsume,
    3423             :                 pos);
    3424           1 :               NS_HTML5_BREAK(beforedoctypepublicidentifierloop);
    3425             :             }
    3426             :             case '\'': {
    3427           0 :               clearStrBufBeforeUse();
    3428           0 :               state = P::transition(
    3429             :                 mViewSource,
    3430             :                 nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED,
    3431             :                 reconsume,
    3432             :                 pos);
    3433           0 :               NS_HTML5_CONTINUE(stateloop);
    3434             :             }
    3435             :             case '>': {
    3436             :               if (P::reportErrors) {
    3437           0 :                 errExpectedPublicId();
    3438             :               }
    3439           0 :               forceQuirks = true;
    3440           0 :               emitDoctypeToken(pos);
    3441           0 :               state = P::transition(
    3442             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3443           0 :               NS_HTML5_CONTINUE(stateloop);
    3444             :             }
    3445             :             default: {
    3446           0 :               bogusDoctype();
    3447           0 :               state = P::transition(
    3448             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3449           0 :               NS_HTML5_CONTINUE(stateloop);
    3450             :             }
    3451             :           }
    3452             :         }
    3453             :         beforedoctypepublicidentifierloop_end: ;
    3454             :       }
    3455             :       case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED: {
    3456             :         for (; ; ) {
    3457          77 :           if (++pos == endPos) {
    3458           0 :             NS_HTML5_BREAK(stateloop);
    3459             :           }
    3460          39 :           c = checkChar(buf, pos);
    3461          39 :           switch(c) {
    3462             :             case '\"': {
    3463           1 :               publicIdentifier = strBufToString();
    3464           1 :               state =
    3465           1 :                 P::transition(mViewSource,
    3466             :                               nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER,
    3467             :                               reconsume,
    3468             :                               pos);
    3469           1 :               NS_HTML5_BREAK(doctypepublicidentifierdoublequotedloop);
    3470             :             }
    3471             :             case '>': {
    3472             :               if (P::reportErrors) {
    3473           0 :                 errGtInPublicId();
    3474             :               }
    3475           0 :               forceQuirks = true;
    3476           0 :               publicIdentifier = strBufToString();
    3477           0 :               emitDoctypeToken(pos);
    3478           0 :               state = P::transition(
    3479             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3480           0 :               NS_HTML5_CONTINUE(stateloop);
    3481             :             }
    3482             :             case '\r': {
    3483           0 :               appendStrBufCarriageReturn();
    3484           0 :               NS_HTML5_BREAK(stateloop);
    3485             :             }
    3486             :             case '\n': {
    3487           0 :               appendStrBufLineFeed();
    3488           0 :               continue;
    3489             :             }
    3490             :             case '\0': {
    3491           0 :               c = 0xfffd;
    3492             :             }
    3493             :             default: {
    3494          38 :               appendStrBuf(c);
    3495          38 :               continue;
    3496             :             }
    3497             :           }
    3498             :         }
    3499             :         doctypepublicidentifierdoublequotedloop_end: ;
    3500             :       }
    3501             :       case AFTER_DOCTYPE_PUBLIC_IDENTIFIER: {
    3502             :         for (; ; ) {
    3503           1 :           if (++pos == endPos) {
    3504           0 :             NS_HTML5_BREAK(stateloop);
    3505             :           }
    3506           1 :           c = checkChar(buf, pos);
    3507           1 :           switch(c) {
    3508             :             case '\r': {
    3509           0 :               silentCarriageReturn();
    3510           0 :               state = P::transition(
    3511             :                 mViewSource,
    3512             :                 nsHtml5Tokenizer::BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS,
    3513             :                 reconsume,
    3514             :                 pos);
    3515           0 :               NS_HTML5_BREAK(stateloop);
    3516             :             }
    3517             :             case '\n': {
    3518           0 :               silentLineFeed();
    3519             :             }
    3520             :             case ' ':
    3521             :             case '\t':
    3522             :             case '\f': {
    3523           0 :               state = P::transition(
    3524             :                 mViewSource,
    3525             :                 nsHtml5Tokenizer::BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS,
    3526             :                 reconsume,
    3527             :                 pos);
    3528           0 :               NS_HTML5_BREAK(afterdoctypepublicidentifierloop);
    3529             :             }
    3530             :             case '>': {
    3531           1 :               emitDoctypeToken(pos);
    3532           1 :               state = P::transition(
    3533             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3534           1 :               NS_HTML5_CONTINUE(stateloop);
    3535             :             }
    3536             :             case '\"': {
    3537             :               if (P::reportErrors) {
    3538           0 :                 errNoSpaceBetweenPublicAndSystemIds();
    3539             :               }
    3540           0 :               clearStrBufBeforeUse();
    3541           0 :               state = P::transition(
    3542             :                 mViewSource,
    3543             :                 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
    3544             :                 reconsume,
    3545             :                 pos);
    3546           0 :               NS_HTML5_CONTINUE(stateloop);
    3547             :             }
    3548             :             case '\'': {
    3549             :               if (P::reportErrors) {
    3550           0 :                 errNoSpaceBetweenPublicAndSystemIds();
    3551             :               }
    3552           0 :               clearStrBufBeforeUse();
    3553           0 :               state = P::transition(
    3554             :                 mViewSource,
    3555             :                 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
    3556             :                 reconsume,
    3557             :                 pos);
    3558           0 :               NS_HTML5_CONTINUE(stateloop);
    3559             :             }
    3560             :             default: {
    3561           0 :               bogusDoctype();
    3562           0 :               state = P::transition(
    3563             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3564           0 :               NS_HTML5_CONTINUE(stateloop);
    3565             :             }
    3566             :           }
    3567             :         }
    3568             :         afterdoctypepublicidentifierloop_end: ;
    3569             :       }
    3570             :       case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
    3571             :         for (; ; ) {
    3572           0 :           if (++pos == endPos) {
    3573           0 :             NS_HTML5_BREAK(stateloop);
    3574             :           }
    3575           0 :           c = checkChar(buf, pos);
    3576           0 :           switch(c) {
    3577             :             case '\r': {
    3578           0 :               silentCarriageReturn();
    3579           0 :               NS_HTML5_BREAK(stateloop);
    3580             :             }
    3581             :             case '\n': {
    3582           0 :               silentLineFeed();
    3583             :             }
    3584             :             case ' ':
    3585             :             case '\t':
    3586             :             case '\f': {
    3587           0 :               continue;
    3588             :             }
    3589             :             case '>': {
    3590           0 :               emitDoctypeToken(pos);
    3591           0 :               state = P::transition(
    3592             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3593           0 :               NS_HTML5_CONTINUE(stateloop);
    3594             :             }
    3595             :             case '\"': {
    3596           0 :               clearStrBufBeforeUse();
    3597           0 :               state = P::transition(
    3598             :                 mViewSource,
    3599             :                 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
    3600             :                 reconsume,
    3601             :                 pos);
    3602           0 :               NS_HTML5_BREAK(betweendoctypepublicandsystemidentifiersloop);
    3603             :             }
    3604             :             case '\'': {
    3605           0 :               clearStrBufBeforeUse();
    3606           0 :               state = P::transition(
    3607             :                 mViewSource,
    3608             :                 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
    3609             :                 reconsume,
    3610             :                 pos);
    3611           0 :               NS_HTML5_CONTINUE(stateloop);
    3612             :             }
    3613             :             default: {
    3614           0 :               bogusDoctype();
    3615           0 :               state = P::transition(
    3616             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3617           0 :               NS_HTML5_CONTINUE(stateloop);
    3618             :             }
    3619             :           }
    3620             :         }
    3621             :         betweendoctypepublicandsystemidentifiersloop_end: ;
    3622             :       }
    3623             :       case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED: {
    3624             :         for (; ; ) {
    3625           0 :           if (++pos == endPos) {
    3626           0 :             NS_HTML5_BREAK(stateloop);
    3627             :           }
    3628           0 :           c = checkChar(buf, pos);
    3629           0 :           switch(c) {
    3630             :             case '\"': {
    3631           0 :               systemIdentifier = strBufToString();
    3632           0 :               state =
    3633           0 :                 P::transition(mViewSource,
    3634             :                               nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER,
    3635             :                               reconsume,
    3636             :                               pos);
    3637           0 :               NS_HTML5_CONTINUE(stateloop);
    3638             :             }
    3639             :             case '>': {
    3640             :               if (P::reportErrors) {
    3641           0 :                 errGtInSystemId();
    3642             :               }
    3643           0 :               forceQuirks = true;
    3644           0 :               systemIdentifier = strBufToString();
    3645           0 :               emitDoctypeToken(pos);
    3646           0 :               state = P::transition(
    3647             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3648           0 :               NS_HTML5_CONTINUE(stateloop);
    3649             :             }
    3650             :             case '\r': {
    3651           0 :               appendStrBufCarriageReturn();
    3652           0 :               NS_HTML5_BREAK(stateloop);
    3653             :             }
    3654             :             case '\n': {
    3655           0 :               appendStrBufLineFeed();
    3656           0 :               continue;
    3657             :             }
    3658             :             case '\0': {
    3659           0 :               c = 0xfffd;
    3660             :             }
    3661             :             default: {
    3662           0 :               appendStrBuf(c);
    3663           0 :               continue;
    3664             :             }
    3665             :           }
    3666             :         }
    3667             : 
    3668             :       }
    3669             :       case AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
    3670             :         for (; ; ) {
    3671           0 :           if (++pos == endPos) {
    3672           0 :             NS_HTML5_BREAK(stateloop);
    3673             :           }
    3674           0 :           c = checkChar(buf, pos);
    3675           0 :           switch(c) {
    3676             :             case '\r': {
    3677           0 :               silentCarriageReturn();
    3678           0 :               NS_HTML5_BREAK(stateloop);
    3679             :             }
    3680             :             case '\n': {
    3681           0 :               silentLineFeed();
    3682             :             }
    3683             :             case ' ':
    3684             :             case '\t':
    3685             :             case '\f': {
    3686           0 :               continue;
    3687             :             }
    3688             :             case '>': {
    3689           0 :               emitDoctypeToken(pos);
    3690           0 :               state = P::transition(
    3691             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3692           0 :               NS_HTML5_CONTINUE(stateloop);
    3693             :             }
    3694             :             default: {
    3695           0 :               bogusDoctypeWithoutQuirks();
    3696           0 :               state = P::transition(
    3697             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3698           0 :               NS_HTML5_BREAK(afterdoctypesystemidentifierloop);
    3699             :             }
    3700             :           }
    3701             :         }
    3702             :         afterdoctypesystemidentifierloop_end: ;
    3703             :       }
    3704             :       case BOGUS_DOCTYPE: {
    3705             :         for (; ; ) {
    3706           0 :           if (reconsume) {
    3707           0 :             reconsume = false;
    3708             :           } else {
    3709           0 :             if (++pos == endPos) {
    3710           0 :               NS_HTML5_BREAK(stateloop);
    3711             :             }
    3712           0 :             c = checkChar(buf, pos);
    3713             :           }
    3714           0 :           switch(c) {
    3715             :             case '>': {
    3716           0 :               emitDoctypeToken(pos);
    3717           0 :               state = P::transition(
    3718             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3719           0 :               NS_HTML5_CONTINUE(stateloop);
    3720             :             }
    3721             :             case '\r': {
    3722           0 :               silentCarriageReturn();
    3723           0 :               NS_HTML5_BREAK(stateloop);
    3724             :             }
    3725             :             case '\n': {
    3726           0 :               silentLineFeed();
    3727             :             }
    3728             :             default: {
    3729           0 :               continue;
    3730             :             }
    3731             :           }
    3732             :         }
    3733             :       }
    3734             :       case DOCTYPE_YSTEM: {
    3735             :         for (; ; ) {
    3736           0 :           if (++pos == endPos) {
    3737           0 :             NS_HTML5_BREAK(stateloop);
    3738             :           }
    3739           0 :           c = checkChar(buf, pos);
    3740           0 :           if (index < 5) {
    3741           0 :             char16_t folded = c;
    3742           0 :             if (c >= 'A' && c <= 'Z') {
    3743           0 :               folded += 0x20;
    3744             :             }
    3745           0 :             if (folded != nsHtml5Tokenizer::YSTEM[index]) {
    3746           0 :               bogusDoctype();
    3747           0 :               reconsume = true;
    3748           0 :               state = P::transition(
    3749             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3750           0 :               NS_HTML5_CONTINUE(stateloop);
    3751             :             }
    3752           0 :             index++;
    3753           0 :             NS_HTML5_CONTINUE(stateloop);
    3754             :           } else {
    3755           0 :             reconsume = true;
    3756           0 :             state =
    3757           0 :               P::transition(mViewSource,
    3758             :                             nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_KEYWORD,
    3759             :                             reconsume,
    3760             :                             pos);
    3761           0 :             NS_HTML5_BREAK(doctypeystemloop);
    3762             :           }
    3763             :         }
    3764             :         doctypeystemloop_end: ;
    3765             :       }
    3766             :       case AFTER_DOCTYPE_SYSTEM_KEYWORD: {
    3767             :         for (; ; ) {
    3768           0 :           if (reconsume) {
    3769           0 :             reconsume = false;
    3770             :           } else {
    3771           0 :             if (++pos == endPos) {
    3772           0 :               NS_HTML5_BREAK(stateloop);
    3773             :             }
    3774           0 :             c = checkChar(buf, pos);
    3775             :           }
    3776           0 :           switch(c) {
    3777             :             case '\r': {
    3778           0 :               silentCarriageReturn();
    3779           0 :               state = P::transition(
    3780             :                 mViewSource,
    3781             :                 nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER,
    3782             :                 reconsume,
    3783             :                 pos);
    3784           0 :               NS_HTML5_BREAK(stateloop);
    3785             :             }
    3786             :             case '\n': {
    3787           0 :               silentLineFeed();
    3788             :             }
    3789             :             case ' ':
    3790             :             case '\t':
    3791             :             case '\f': {
    3792           0 :               state = P::transition(
    3793             :                 mViewSource,
    3794             :                 nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER,
    3795             :                 reconsume,
    3796             :                 pos);
    3797           0 :               NS_HTML5_BREAK(afterdoctypesystemkeywordloop);
    3798             :             }
    3799             :             case '\"': {
    3800             :               if (P::reportErrors) {
    3801           0 :                 errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
    3802             :               }
    3803           0 :               clearStrBufBeforeUse();
    3804           0 :               state = P::transition(
    3805             :                 mViewSource,
    3806             :                 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
    3807             :                 reconsume,
    3808             :                 pos);
    3809           0 :               NS_HTML5_CONTINUE(stateloop);
    3810             :             }
    3811             :             case '\'': {
    3812             :               if (P::reportErrors) {
    3813           0 :                 errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
    3814             :               }
    3815           0 :               clearStrBufBeforeUse();
    3816           0 :               state = P::transition(
    3817             :                 mViewSource,
    3818             :                 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
    3819             :                 reconsume,
    3820             :                 pos);
    3821           0 :               NS_HTML5_CONTINUE(stateloop);
    3822             :             }
    3823             :             case '>': {
    3824             :               if (P::reportErrors) {
    3825           0 :                 errExpectedPublicId();
    3826             :               }
    3827           0 :               forceQuirks = true;
    3828           0 :               emitDoctypeToken(pos);
    3829           0 :               state = P::transition(
    3830             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3831           0 :               NS_HTML5_CONTINUE(stateloop);
    3832             :             }
    3833             :             default: {
    3834           0 :               bogusDoctype();
    3835           0 :               state = P::transition(
    3836             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3837           0 :               NS_HTML5_CONTINUE(stateloop);
    3838             :             }
    3839             :           }
    3840             :         }
    3841             :         afterdoctypesystemkeywordloop_end: ;
    3842             :       }
    3843             :       case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER: {
    3844             :         for (; ; ) {
    3845           0 :           if (++pos == endPos) {
    3846           0 :             NS_HTML5_BREAK(stateloop);
    3847             :           }
    3848           0 :           c = checkChar(buf, pos);
    3849           0 :           switch(c) {
    3850             :             case '\r': {
    3851           0 :               silentCarriageReturn();
    3852           0 :               NS_HTML5_BREAK(stateloop);
    3853             :             }
    3854             :             case '\n': {
    3855           0 :               silentLineFeed();
    3856             :             }
    3857             :             case ' ':
    3858             :             case '\t':
    3859             :             case '\f': {
    3860           0 :               continue;
    3861             :             }
    3862             :             case '\"': {
    3863           0 :               clearStrBufBeforeUse();
    3864           0 :               state = P::transition(
    3865             :                 mViewSource,
    3866             :                 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
    3867             :                 reconsume,
    3868             :                 pos);
    3869           0 :               NS_HTML5_CONTINUE(stateloop);
    3870             :             }
    3871             :             case '\'': {
    3872           0 :               clearStrBufBeforeUse();
    3873           0 :               state = P::transition(
    3874             :                 mViewSource,
    3875             :                 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
    3876             :                 reconsume,
    3877             :                 pos);
    3878           0 :               NS_HTML5_BREAK(beforedoctypesystemidentifierloop);
    3879             :             }
    3880             :             case '>': {
    3881             :               if (P::reportErrors) {
    3882           0 :                 errExpectedSystemId();
    3883             :               }
    3884           0 :               forceQuirks = true;
    3885           0 :               emitDoctypeToken(pos);
    3886           0 :               state = P::transition(
    3887             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3888           0 :               NS_HTML5_CONTINUE(stateloop);
    3889             :             }
    3890             :             default: {
    3891           0 :               bogusDoctype();
    3892           0 :               state = P::transition(
    3893             :                 mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
    3894           0 :               NS_HTML5_CONTINUE(stateloop);
    3895             :             }
    3896             :           }
    3897             :         }
    3898             :         beforedoctypesystemidentifierloop_end: ;
    3899             :       }
    3900             :       case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
    3901             :         for (; ; ) {
    3902           0 :           if (++pos == endPos) {
    3903           0 :             NS_HTML5_BREAK(stateloop);
    3904             :           }
    3905           0 :           c = checkChar(buf, pos);
    3906           0 :           switch(c) {
    3907             :             case '\'': {
    3908           0 :               systemIdentifier = strBufToString();
    3909           0 :               state =
    3910           0 :                 P::transition(mViewSource,
    3911             :                               nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER,
    3912             :                               reconsume,
    3913             :                               pos);
    3914           0 :               NS_HTML5_CONTINUE(stateloop);
    3915             :             }
    3916             :             case '>': {
    3917             :               if (P::reportErrors) {
    3918           0 :                 errGtInSystemId();
    3919             :               }
    3920           0 :               forceQuirks = true;
    3921           0 :               systemIdentifier = strBufToString();
    3922           0 :               emitDoctypeToken(pos);
    3923           0 :               state = P::transition(
    3924             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3925           0 :               NS_HTML5_CONTINUE(stateloop);
    3926             :             }
    3927             :             case '\r': {
    3928           0 :               appendStrBufCarriageReturn();
    3929           0 :               NS_HTML5_BREAK(stateloop);
    3930             :             }
    3931             :             case '\n': {
    3932           0 :               appendStrBufLineFeed();
    3933           0 :               continue;
    3934             :             }
    3935             :             case '\0': {
    3936           0 :               c = 0xfffd;
    3937             :             }
    3938             :             default: {
    3939           0 :               appendStrBuf(c);
    3940           0 :               continue;
    3941             :             }
    3942             :           }
    3943             :         }
    3944             :       }
    3945             :       case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
    3946             :         for (; ; ) {
    3947           0 :           if (++pos == endPos) {
    3948           0 :             NS_HTML5_BREAK(stateloop);
    3949             :           }
    3950           0 :           c = checkChar(buf, pos);
    3951           0 :           switch(c) {
    3952             :             case '\'': {
    3953           0 :               publicIdentifier = strBufToString();
    3954           0 :               state =
    3955           0 :                 P::transition(mViewSource,
    3956             :                               nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER,
    3957             :                               reconsume,
    3958             :                               pos);
    3959           0 :               NS_HTML5_CONTINUE(stateloop);
    3960             :             }
    3961             :             case '>': {
    3962             :               if (P::reportErrors) {
    3963           0 :                 errGtInPublicId();
    3964             :               }
    3965           0 :               forceQuirks = true;
    3966           0 :               publicIdentifier = strBufToString();
    3967           0 :               emitDoctypeToken(pos);
    3968           0 :               state = P::transition(
    3969             :                 mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    3970           0 :               NS_HTML5_CONTINUE(stateloop);
    3971             :             }
    3972             :             case '\r': {
    3973           0 :               appendStrBufCarriageReturn();
    3974           0 :               NS_HTML5_BREAK(stateloop);
    3975             :             }
    3976             :             case '\n': {
    3977           0 :               appendStrBufLineFeed();
    3978           0 :               continue;
    3979             :             }
    3980             :             case '\0': {
    3981           0 :               c = 0xfffd;
    3982             :             }
    3983             :             default: {
    3984           0 :               appendStrBuf(c);
    3985           0 :               continue;
    3986             :             }
    3987             :           }
    3988             :         }
    3989             :       }
    3990             :       case PROCESSING_INSTRUCTION: {
    3991             :         for (; ; ) {
    3992           0 :           if (++pos == endPos) {
    3993           0 :             NS_HTML5_BREAK(stateloop);
    3994             :           }
    3995           0 :           c = checkChar(buf, pos);
    3996           0 :           switch(c) {
    3997             :             case '\?': {
    3998           0 :               state = P::transition(
    3999             :                 mViewSource,
    4000             :                 nsHtml5Tokenizer::PROCESSING_INSTRUCTION_QUESTION_MARK,
    4001             :                 reconsume,
    4002             :                 pos);
    4003           0 :               NS_HTML5_BREAK(processinginstructionloop);
    4004             :             }
    4005             :             default: {
    4006           0 :               continue;
    4007             :             }
    4008             :           }
    4009             :         }
    4010             :         processinginstructionloop_end: ;
    4011             :       }
    4012             :       case PROCESSING_INSTRUCTION_QUESTION_MARK: {
    4013           0 :         if (++pos == endPos) {
    4014           0 :           NS_HTML5_BREAK(stateloop);
    4015             :         }
    4016           0 :         c = checkChar(buf, pos);
    4017           0 :         switch(c) {
    4018             :           case '>': {
    4019           0 :             state = P::transition(
    4020             :               mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
    4021           0 :             NS_HTML5_CONTINUE(stateloop);
    4022             :           }
    4023             :           default: {
    4024           0 :             state = P::transition(mViewSource,
    4025             :                                   nsHtml5Tokenizer::PROCESSING_INSTRUCTION,
    4026             :                                   reconsume,
    4027             :                                   pos);
    4028           0 :             NS_HTML5_CONTINUE(stateloop);
    4029             :           }
    4030             :         }
    4031             :       }
    4032             :     }
    4033             :   }
    4034             :   stateloop_end: ;
    4035           9 :   flushChars(buf, pos);
    4036           9 :   stateSave = state;
    4037           9 :   returnStateSave = returnState;
    4038           9 :   return pos;
    4039             : }
    4040             : 
    4041             : void 
    4042          10 : nsHtml5Tokenizer::initDoctypeFields()
    4043             : {
    4044          10 :   clearStrBufAfterUse();
    4045          10 :   doctypeName = nsGkAtoms::_empty;
    4046          10 :   if (systemIdentifier) {
    4047           0 :     systemIdentifier.Release();
    4048           0 :     systemIdentifier = nullptr;
    4049             :   }
    4050          10 :   if (publicIdentifier) {
    4051           0 :     publicIdentifier.Release();
    4052           0 :     publicIdentifier = nullptr;
    4053             :   }
    4054          10 :   forceQuirks = false;
    4055          10 : }
    4056             : 
    4057             : void 
    4058           0 : nsHtml5Tokenizer::emitCarriageReturn(char16_t* buf, int32_t pos)
    4059             : {
    4060           0 :   silentCarriageReturn();
    4061           0 :   flushChars(buf, pos);
    4062           0 :   tokenHandler->characters(nsHtml5Tokenizer::LF, 0, 1);
    4063           0 :   cstart = INT32_MAX;
    4064           0 : }
    4065             : 
    4066             : void 
    4067           0 : nsHtml5Tokenizer::emitReplacementCharacter(char16_t* buf, int32_t pos)
    4068             : {
    4069           0 :   flushChars(buf, pos);
    4070           0 :   tokenHandler->zeroOriginatingReplacementCharacter();
    4071           0 :   cstart = pos + 1;
    4072           0 : }
    4073             : 
    4074             : void 
    4075           0 : nsHtml5Tokenizer::emitPlaintextReplacementCharacter(char16_t* buf, int32_t pos)
    4076             : {
    4077           0 :   flushChars(buf, pos);
    4078           0 :   tokenHandler->characters(REPLACEMENT_CHARACTER, 0, 1);
    4079           0 :   cstart = pos + 1;
    4080           0 : }
    4081             : 
    4082             : void 
    4083           0 : nsHtml5Tokenizer::setAdditionalAndRememberAmpersandLocation(char16_t add)
    4084             : {
    4085           0 :   additional = add;
    4086           0 : }
    4087             : 
    4088             : void 
    4089           0 : nsHtml5Tokenizer::bogusDoctype()
    4090             : {
    4091           0 :   errBogusDoctype();
    4092           0 :   forceQuirks = true;
    4093           0 : }
    4094             : 
    4095             : void 
    4096           0 : nsHtml5Tokenizer::bogusDoctypeWithoutQuirks()
    4097             : {
    4098           0 :   errBogusDoctype();
    4099           0 :   forceQuirks = false;
    4100           0 : }
    4101             : 
    4102             : void 
    4103           0 : nsHtml5Tokenizer::handleNcrValue(int32_t returnState)
    4104             : {
    4105           0 :   if (value <= 0xFFFF) {
    4106           0 :     if (value >= 0x80 && value <= 0x9f) {
    4107           0 :       errNcrInC1Range();
    4108           0 :       char16_t* val = nsHtml5NamedCharacters::WINDOWS_1252[value - 0x80];
    4109           0 :       emitOrAppendOne(val, returnState);
    4110           0 :     } else if (value == 0x0) {
    4111           0 :       errNcrZero();
    4112           0 :       emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
    4113           0 :     } else if ((value & 0xF800) == 0xD800) {
    4114           0 :       errNcrSurrogate();
    4115           0 :       emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
    4116             :     } else {
    4117           0 :       char16_t ch = (char16_t) value;
    4118           0 :       bmpChar[0] = ch;
    4119           0 :       emitOrAppendOne(bmpChar, returnState);
    4120             :     }
    4121           0 :   } else if (value <= 0x10FFFF) {
    4122           0 :     astralChar[0] = (char16_t)(nsHtml5Tokenizer::LEAD_OFFSET + (value >> 10));
    4123           0 :     astralChar[1] = (char16_t) (0xDC00 + (value & 0x3FF));
    4124           0 :     emitOrAppendTwo(astralChar, returnState);
    4125             :   } else {
    4126           0 :     errNcrOutOfRange();
    4127           0 :     emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
    4128             :   }
    4129           0 : }
    4130             : 
    4131             : void 
    4132           2 : nsHtml5Tokenizer::eof()
    4133             : {
    4134           2 :   int32_t state = stateSave;
    4135           2 :   int32_t returnState = returnStateSave;
    4136             :   eofloop: for (; ; ) {
    4137           2 :     switch(state) {
    4138             :       case SCRIPT_DATA_LESS_THAN_SIGN:
    4139             :       case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
    4140           0 :         tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
    4141           0 :         NS_HTML5_BREAK(eofloop);
    4142             :       }
    4143             :       case TAG_OPEN: {
    4144           0 :         errEofAfterLt();
    4145           0 :         tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
    4146           0 :         NS_HTML5_BREAK(eofloop);
    4147             :       }
    4148             :       case RAWTEXT_RCDATA_LESS_THAN_SIGN: {
    4149           0 :         tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
    4150           0 :         NS_HTML5_BREAK(eofloop);
    4151             :       }
    4152             :       case NON_DATA_END_TAG_NAME: {
    4153           0 :         tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
    4154           0 :         emitStrBuf();
    4155           0 :         NS_HTML5_BREAK(eofloop);
    4156             :       }
    4157             :       case CLOSE_TAG_OPEN: {
    4158           0 :         errEofAfterLt();
    4159           0 :         tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
    4160           0 :         NS_HTML5_BREAK(eofloop);
    4161             :       }
    4162             :       case TAG_NAME: {
    4163           0 :         errEofInTagName();
    4164           0 :         NS_HTML5_BREAK(eofloop);
    4165             :       }
    4166             :       case BEFORE_ATTRIBUTE_NAME:
    4167             :       case AFTER_ATTRIBUTE_VALUE_QUOTED:
    4168             :       case SELF_CLOSING_START_TAG: {
    4169           0 :         errEofWithoutGt();
    4170           0 :         NS_HTML5_BREAK(eofloop);
    4171             :       }
    4172             :       case ATTRIBUTE_NAME: {
    4173           0 :         errEofInAttributeName();
    4174           0 :         NS_HTML5_BREAK(eofloop);
    4175             :       }
    4176             :       case AFTER_ATTRIBUTE_NAME:
    4177             :       case BEFORE_ATTRIBUTE_VALUE: {
    4178           0 :         errEofWithoutGt();
    4179           0 :         NS_HTML5_BREAK(eofloop);
    4180             :       }
    4181             :       case ATTRIBUTE_VALUE_DOUBLE_QUOTED:
    4182             :       case ATTRIBUTE_VALUE_SINGLE_QUOTED:
    4183             :       case ATTRIBUTE_VALUE_UNQUOTED: {
    4184           0 :         errEofInAttributeValue();
    4185           0 :         NS_HTML5_BREAK(eofloop);
    4186             :       }
    4187             :       case BOGUS_COMMENT: {
    4188           0 :         emitComment(0, 0);
    4189           0 :         NS_HTML5_BREAK(eofloop);
    4190             :       }
    4191             :       case BOGUS_COMMENT_HYPHEN: {
    4192           0 :         emitComment(0, 0);
    4193           0 :         NS_HTML5_BREAK(eofloop);
    4194             :       }
    4195             :       case MARKUP_DECLARATION_OPEN: {
    4196           0 :         errBogusComment();
    4197           0 :         emitComment(0, 0);
    4198           0 :         NS_HTML5_BREAK(eofloop);
    4199             :       }
    4200             :       case MARKUP_DECLARATION_HYPHEN: {
    4201           0 :         errBogusComment();
    4202           0 :         emitComment(0, 0);
    4203           0 :         NS_HTML5_BREAK(eofloop);
    4204             :       }
    4205             :       case MARKUP_DECLARATION_OCTYPE: {
    4206           0 :         if (index < 6) {
    4207           0 :           errBogusComment();
    4208           0 :           emitComment(0, 0);
    4209             :         } else {
    4210           0 :           errEofInDoctype();
    4211           0 :           doctypeName = nsGkAtoms::_empty;
    4212           0 :           if (systemIdentifier) {
    4213           0 :             systemIdentifier.Release();
    4214           0 :             systemIdentifier = nullptr;
    4215             :           }
    4216           0 :           if (publicIdentifier) {
    4217           0 :             publicIdentifier.Release();
    4218           0 :             publicIdentifier = nullptr;
    4219             :           }
    4220           0 :           forceQuirks = true;
    4221           0 :           emitDoctypeToken(0);
    4222           0 :           NS_HTML5_BREAK(eofloop);
    4223             :         }
    4224           0 :         NS_HTML5_BREAK(eofloop);
    4225             :       }
    4226             :       case COMMENT_START:
    4227             :       case COMMENT: {
    4228           0 :         errEofInComment();
    4229           0 :         emitComment(0, 0);
    4230           0 :         NS_HTML5_BREAK(eofloop);
    4231             :       }
    4232             :       case COMMENT_END: {
    4233           0 :         errEofInComment();
    4234           0 :         emitComment(2, 0);
    4235           0 :         NS_HTML5_BREAK(eofloop);
    4236             :       }
    4237             :       case COMMENT_END_DASH:
    4238             :       case COMMENT_START_DASH: {
    4239           0 :         errEofInComment();
    4240           0 :         emitComment(1, 0);
    4241           0 :         NS_HTML5_BREAK(eofloop);
    4242             :       }
    4243             :       case COMMENT_END_BANG: {
    4244           0 :         errEofInComment();
    4245           0 :         emitComment(3, 0);
    4246           0 :         NS_HTML5_BREAK(eofloop);
    4247             :       }
    4248             :       case DOCTYPE:
    4249             :       case BEFORE_DOCTYPE_NAME: {
    4250           0 :         errEofInDoctype();
    4251           0 :         forceQuirks = true;
    4252           0 :         emitDoctypeToken(0);
    4253           0 :         NS_HTML5_BREAK(eofloop);
    4254             :       }
    4255             :       case DOCTYPE_NAME: {
    4256           0 :         errEofInDoctype();
    4257           0 :         strBufToDoctypeName();
    4258           0 :         forceQuirks = true;
    4259           0 :         emitDoctypeToken(0);
    4260           0 :         NS_HTML5_BREAK(eofloop);
    4261             :       }
    4262             :       case DOCTYPE_UBLIC:
    4263             :       case DOCTYPE_YSTEM:
    4264             :       case AFTER_DOCTYPE_NAME:
    4265             :       case AFTER_DOCTYPE_PUBLIC_KEYWORD:
    4266             :       case AFTER_DOCTYPE_SYSTEM_KEYWORD:
    4267             :       case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
    4268           0 :         errEofInDoctype();
    4269           0 :         forceQuirks = true;
    4270           0 :         emitDoctypeToken(0);
    4271           0 :         NS_HTML5_BREAK(eofloop);
    4272             :       }
    4273             :       case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:
    4274             :       case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
    4275           0 :         errEofInPublicId();
    4276           0 :         forceQuirks = true;
    4277           0 :         publicIdentifier = strBufToString();
    4278           0 :         emitDoctypeToken(0);
    4279           0 :         NS_HTML5_BREAK(eofloop);
    4280             :       }
    4281             :       case AFTER_DOCTYPE_PUBLIC_IDENTIFIER:
    4282             :       case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:
    4283             :       case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
    4284           0 :         errEofInDoctype();
    4285           0 :         forceQuirks = true;
    4286           0 :         emitDoctypeToken(0);
    4287           0 :         NS_HTML5_BREAK(eofloop);
    4288             :       }
    4289             :       case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:
    4290             :       case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
    4291           0 :         errEofInSystemId();
    4292           0 :         forceQuirks = true;
    4293           0 :         systemIdentifier = strBufToString();
    4294           0 :         emitDoctypeToken(0);
    4295           0 :         NS_HTML5_BREAK(eofloop);
    4296             :       }
    4297             :       case AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
    4298           0 :         errEofInDoctype();
    4299           0 :         forceQuirks = true;
    4300           0 :         emitDoctypeToken(0);
    4301           0 :         NS_HTML5_BREAK(eofloop);
    4302             :       }
    4303             :       case BOGUS_DOCTYPE: {
    4304           0 :         emitDoctypeToken(0);
    4305           0 :         NS_HTML5_BREAK(eofloop);
    4306             :       }
    4307             :       case CONSUME_CHARACTER_REFERENCE: {
    4308           0 :         emitOrAppendCharRefBuf(returnState);
    4309           0 :         state = returnState;
    4310           0 :         continue;
    4311             :       }
    4312             :       case CHARACTER_REFERENCE_HILO_LOOKUP: {
    4313           0 :         errNoNamedCharacterMatch();
    4314           0 :         emitOrAppendCharRefBuf(returnState);
    4315           0 :         state = returnState;
    4316           0 :         continue;
    4317             :       }
    4318             :       case CHARACTER_REFERENCE_TAIL: {
    4319             :         for (; ; ) {
    4320           0 :           char16_t c = '\0';
    4321           0 :           entCol++;
    4322             :           for (; ; ) {
    4323           0 :             if (hi == -1) {
    4324           0 :               NS_HTML5_BREAK(hiloop);
    4325             :             }
    4326           0 :             if (entCol == nsHtml5NamedCharacters::NAMES[hi].length()) {
    4327           0 :               NS_HTML5_BREAK(hiloop);
    4328             :             }
    4329           0 :             if (entCol > nsHtml5NamedCharacters::NAMES[hi].length()) {
    4330           0 :               NS_HTML5_BREAK(outer);
    4331           0 :             } else if (c < nsHtml5NamedCharacters::NAMES[hi].charAt(entCol)) {
    4332           0 :               hi--;
    4333             :             } else {
    4334           0 :               NS_HTML5_BREAK(hiloop);
    4335             :             }
    4336             :           }
    4337             :           hiloop_end: ;
    4338             :           for (; ; ) {
    4339           0 :             if (hi < lo) {
    4340           0 :               NS_HTML5_BREAK(outer);
    4341             :             }
    4342           0 :             if (entCol == nsHtml5NamedCharacters::NAMES[lo].length()) {
    4343           0 :               candidate = lo;
    4344           0 :               charRefBufMark = charRefBufLen;
    4345           0 :               lo++;
    4346           0 :             } else if (entCol > nsHtml5NamedCharacters::NAMES[lo].length()) {
    4347           0 :               NS_HTML5_BREAK(outer);
    4348           0 :             } else if (c > nsHtml5NamedCharacters::NAMES[lo].charAt(entCol)) {
    4349           0 :               lo++;
    4350             :             } else {
    4351           0 :               NS_HTML5_BREAK(loloop);
    4352             :             }
    4353             :           }
    4354             :           loloop_end: ;
    4355           0 :           if (hi < lo) {
    4356           0 :             NS_HTML5_BREAK(outer);
    4357             :           }
    4358           0 :           continue;
    4359           0 :         }
    4360             :         outer_end: ;
    4361           0 :         if (candidate == -1) {
    4362           0 :           errNoNamedCharacterMatch();
    4363           0 :           emitOrAppendCharRefBuf(returnState);
    4364           0 :           state = returnState;
    4365           0 :           NS_HTML5_CONTINUE(eofloop);
    4366             :         } else {
    4367           0 :           const nsHtml5CharacterName& candidateName = nsHtml5NamedCharacters::NAMES[candidate];
    4368           0 :           if (!candidateName.length() || candidateName.charAt(candidateName.length() - 1) != ';') {
    4369           0 :             if ((returnState & DATA_AND_RCDATA_MASK)) {
    4370             :               char16_t ch;
    4371           0 :               if (charRefBufMark == charRefBufLen) {
    4372           0 :                 ch = '\0';
    4373             :               } else {
    4374           0 :                 ch = charRefBuf[charRefBufMark];
    4375             :               }
    4376           0 :               if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
    4377           0 :                 errNoNamedCharacterMatch();
    4378           0 :                 appendCharRefBufToStrBuf();
    4379           0 :                 state = returnState;
    4380           0 :                 NS_HTML5_CONTINUE(eofloop);
    4381             :               }
    4382             :             }
    4383           0 :             if ((returnState & DATA_AND_RCDATA_MASK)) {
    4384           0 :               errUnescapedAmpersandInterpretedAsCharacterReference();
    4385             :             } else {
    4386           0 :               errNotSemicolonTerminated();
    4387             :             }
    4388             :           }
    4389           0 :           const char16_t* val = nsHtml5NamedCharacters::VALUES[candidate];
    4390           0 :           if (!val[1]) {
    4391           0 :             emitOrAppendOne(val, returnState);
    4392             :           } else {
    4393           0 :             emitOrAppendTwo(val, returnState);
    4394             :           }
    4395           0 :           if (charRefBufMark < charRefBufLen) {
    4396           0 :             if ((returnState & DATA_AND_RCDATA_MASK)) {
    4397           0 :               appendStrBuf(charRefBuf, charRefBufMark, charRefBufLen - charRefBufMark);
    4398             :             } else {
    4399           0 :               tokenHandler->characters(charRefBuf, charRefBufMark, charRefBufLen - charRefBufMark);
    4400             :             }
    4401             :           }
    4402           0 :           charRefBufLen = 0;
    4403           0 :           state = returnState;
    4404           0 :           NS_HTML5_CONTINUE(eofloop);
    4405             :         }
    4406             :       }
    4407             :       case CONSUME_NCR:
    4408             :       case DECIMAL_NRC_LOOP:
    4409             :       case HEX_NCR_LOOP: {
    4410           0 :         if (!seenDigits) {
    4411           0 :           errNoDigitsInNCR();
    4412           0 :           emitOrAppendCharRefBuf(returnState);
    4413           0 :           state = returnState;
    4414           0 :           continue;
    4415             :         } else {
    4416           0 :           errCharRefLacksSemicolon();
    4417             :         }
    4418           0 :         handleNcrValue(returnState);
    4419           0 :         state = returnState;
    4420           0 :         continue;
    4421             :       }
    4422             :       case CDATA_RSQB: {
    4423           0 :         tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
    4424           0 :         NS_HTML5_BREAK(eofloop);
    4425             :       }
    4426             :       case CDATA_RSQB_RSQB: {
    4427           0 :         tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
    4428           0 :         NS_HTML5_BREAK(eofloop);
    4429             :       }
    4430             :       case DATA:
    4431             :       default: {
    4432           2 :         NS_HTML5_BREAK(eofloop);
    4433             :       }
    4434             :     }
    4435           0 :   }
    4436             :   eofloop_end: ;
    4437           2 :   tokenHandler->eof();
    4438           2 :   return;
    4439             : }
    4440             : 
    4441             : void 
    4442           1 : nsHtml5Tokenizer::emitDoctypeToken(int32_t pos)
    4443             : {
    4444           1 :   cstart = pos + 1;
    4445           1 :   tokenHandler->doctype(doctypeName, publicIdentifier, systemIdentifier, forceQuirks);
    4446           1 :   doctypeName = nullptr;
    4447           1 :   publicIdentifier.Release();
    4448           1 :   publicIdentifier = nullptr;
    4449           1 :   systemIdentifier.Release();
    4450           1 :   systemIdentifier = nullptr;
    4451           1 : }
    4452             : 
    4453             : bool
    4454           2 : nsHtml5Tokenizer::internalEncodingDeclaration(nsHtml5String internalCharset)
    4455             : {
    4456           2 :   if (encodingDeclarationHandler) {
    4457           2 :     return encodingDeclarationHandler->internalEncodingDeclaration(internalCharset);
    4458             :   }
    4459           0 :   return false;
    4460             : }
    4461             : 
    4462             : void 
    4463           0 : nsHtml5Tokenizer::emitOrAppendTwo(const char16_t* val, int32_t returnState)
    4464             : {
    4465           0 :   if ((returnState & DATA_AND_RCDATA_MASK)) {
    4466           0 :     appendStrBuf(val[0]);
    4467           0 :     appendStrBuf(val[1]);
    4468             :   } else {
    4469           0 :     tokenHandler->characters(val, 0, 2);
    4470             :   }
    4471           0 : }
    4472             : 
    4473             : void 
    4474           0 : nsHtml5Tokenizer::emitOrAppendOne(const char16_t* val, int32_t returnState)
    4475             : {
    4476           0 :   if ((returnState & DATA_AND_RCDATA_MASK)) {
    4477           0 :     appendStrBuf(val[0]);
    4478             :   } else {
    4479           0 :     tokenHandler->characters(val, 0, 1);
    4480             :   }
    4481           0 : }
    4482             : 
    4483             : void 
    4484           1 : nsHtml5Tokenizer::end()
    4485             : {
    4486           1 :   strBuf = nullptr;
    4487           1 :   doctypeName = nullptr;
    4488           1 :   if (systemIdentifier) {
    4489           0 :     systemIdentifier.Release();
    4490           0 :     systemIdentifier = nullptr;
    4491             :   }
    4492           1 :   if (publicIdentifier) {
    4493           0 :     publicIdentifier.Release();
    4494           0 :     publicIdentifier = nullptr;
    4495             :   }
    4496           1 :   tagName = nullptr;
    4497           1 :   nonInternedTagName->setNameForNonInterned(nullptr);
    4498           1 :   attributeName = nullptr;
    4499           1 :   nonInternedAttributeName->setNameForNonInterned(nullptr);
    4500           1 :   tokenHandler->endTokenization();
    4501           1 :   if (attributes) {
    4502           0 :     attributes->clear(0);
    4503             :   }
    4504           1 : }
    4505             : 
    4506             : void 
    4507           5 : nsHtml5Tokenizer::requestSuspension()
    4508             : {
    4509           5 :   shouldSuspend = true;
    4510           5 : }
    4511             : 
    4512             : bool 
    4513           5 : nsHtml5Tokenizer::isInDataState()
    4514             : {
    4515           5 :   return (stateSave == DATA);
    4516             : }
    4517             : 
    4518             : void 
    4519           9 : nsHtml5Tokenizer::resetToDataState()
    4520             : {
    4521           9 :   clearStrBufAfterUse();
    4522           9 :   charRefBufLen = 0;
    4523           9 :   stateSave = nsHtml5Tokenizer::DATA;
    4524           9 :   lastCR = false;
    4525           9 :   index = 0;
    4526           9 :   forceQuirks = false;
    4527           9 :   additional = '\0';
    4528           9 :   entCol = -1;
    4529           9 :   firstCharKey = -1;
    4530           9 :   lo = 0;
    4531           9 :   hi = 0;
    4532           9 :   candidate = -1;
    4533           9 :   charRefBufMark = 0;
    4534           9 :   value = 0;
    4535           9 :   seenDigits = false;
    4536           9 :   endTag = false;
    4537           9 :   shouldSuspend = false;
    4538           9 :   initDoctypeFields();
    4539           9 :   containsHyphen = false;
    4540           9 :   tagName = nullptr;
    4541           9 :   attributeName = nullptr;
    4542           9 :   if (newAttributesEachTime) {
    4543           9 :     if (attributes) {
    4544           0 :       delete attributes;
    4545           0 :       attributes = nullptr;
    4546             :     }
    4547             :   }
    4548           9 : }
    4549             : 
    4550             : void 
    4551           0 : nsHtml5Tokenizer::loadState(nsHtml5Tokenizer* other)
    4552             : {
    4553           0 :   strBufLen = other->strBufLen;
    4554           0 :   if (strBufLen > strBuf.length) {
    4555           0 :     strBuf = jArray<char16_t,int32_t>::newJArray(strBufLen);
    4556             :   }
    4557           0 :   nsHtml5ArrayCopy::arraycopy(other->strBuf, strBuf, strBufLen);
    4558           0 :   charRefBufLen = other->charRefBufLen;
    4559           0 :   nsHtml5ArrayCopy::arraycopy(other->charRefBuf, charRefBuf, charRefBufLen);
    4560           0 :   stateSave = other->stateSave;
    4561           0 :   returnStateSave = other->returnStateSave;
    4562           0 :   endTagExpectation = other->endTagExpectation;
    4563           0 :   endTagExpectationAsArray = other->endTagExpectationAsArray;
    4564           0 :   lastCR = other->lastCR;
    4565           0 :   index = other->index;
    4566           0 :   forceQuirks = other->forceQuirks;
    4567           0 :   additional = other->additional;
    4568           0 :   entCol = other->entCol;
    4569           0 :   firstCharKey = other->firstCharKey;
    4570           0 :   lo = other->lo;
    4571           0 :   hi = other->hi;
    4572           0 :   candidate = other->candidate;
    4573           0 :   charRefBufMark = other->charRefBufMark;
    4574           0 :   value = other->value;
    4575           0 :   seenDigits = other->seenDigits;
    4576           0 :   endTag = other->endTag;
    4577           0 :   shouldSuspend = false;
    4578           0 :   if (!other->doctypeName) {
    4579           0 :     doctypeName = nullptr;
    4580             :   } else {
    4581           0 :     doctypeName = nsHtml5Portability::newLocalFromLocal(other->doctypeName, interner);
    4582             :   }
    4583           0 :   systemIdentifier.Release();
    4584           0 :   if (!other->systemIdentifier) {
    4585           0 :     systemIdentifier = nullptr;
    4586             :   } else {
    4587           0 :     systemIdentifier = nsHtml5Portability::newStringFromString(other->systemIdentifier);
    4588             :   }
    4589           0 :   publicIdentifier.Release();
    4590           0 :   if (!other->publicIdentifier) {
    4591           0 :     publicIdentifier = nullptr;
    4592             :   } else {
    4593           0 :     publicIdentifier = nsHtml5Portability::newStringFromString(other->publicIdentifier);
    4594             :   }
    4595           0 :   containsHyphen = other->containsHyphen;
    4596           0 :   if (!other->tagName) {
    4597           0 :     tagName = nullptr;
    4598           0 :   } else if (other->tagName->isInterned()) {
    4599           0 :     tagName = other->tagName;
    4600             :   } else {
    4601           0 :     nonInternedTagName->setNameForNonInterned(
    4602           0 :       nsHtml5Portability::newLocalFromLocal(other->tagName->getName(),
    4603           0 :                                             interner));
    4604           0 :     tagName = nonInternedTagName;
    4605             :   }
    4606           0 :   if (!other->attributeName) {
    4607           0 :     attributeName = nullptr;
    4608           0 :   } else if (other->attributeName->isInterned()) {
    4609           0 :     attributeName = other->attributeName;
    4610             :   } else {
    4611           0 :     nonInternedAttributeName->setNameForNonInterned(
    4612             :       nsHtml5Portability::newLocalFromLocal(
    4613           0 :         other->attributeName->getLocal(nsHtml5AttributeName::HTML), interner));
    4614           0 :     attributeName = nonInternedAttributeName;
    4615             :   }
    4616           0 :   delete attributes;
    4617           0 :   if (!other->attributes) {
    4618           0 :     attributes = nullptr;
    4619             :   } else {
    4620           0 :     attributes = other->attributes->cloneAttributes(interner);
    4621             :   }
    4622           0 : }
    4623             : 
    4624             : void 
    4625           4 : nsHtml5Tokenizer::initializeWithoutStarting()
    4626             : {
    4627           4 :   confident = false;
    4628           4 :   strBuf = nullptr;
    4629           4 :   line = 1;
    4630           4 :   attributeLine = 1;
    4631           4 :   resetToDataState();
    4632           4 : }
    4633             : 
    4634             : void 
    4635           2 : nsHtml5Tokenizer::setEncodingDeclarationHandler(nsHtml5StreamParser* encodingDeclarationHandler)
    4636             : {
    4637           2 :   this->encodingDeclarationHandler = encodingDeclarationHandler;
    4638           2 : }
    4639             : 
    4640             : 
    4641           2 : nsHtml5Tokenizer::~nsHtml5Tokenizer()
    4642             : {
    4643           1 :   MOZ_COUNT_DTOR(nsHtml5Tokenizer);
    4644           1 :   delete nonInternedTagName;
    4645           1 :   delete nonInternedAttributeName;
    4646           1 :   nonInternedTagName = nullptr;
    4647           1 :   delete attributes;
    4648           1 :   attributes = nullptr;
    4649           1 : }
    4650             : 
    4651             : void
    4652           3 : nsHtml5Tokenizer::initializeStatics()
    4653             : {
    4654           3 : }
    4655             : 
    4656             : void
    4657           0 : nsHtml5Tokenizer::releaseStatics()
    4658             : {
    4659           0 : }
    4660             : 
    4661             : 
    4662             : #include "nsHtml5TokenizerCppSupplement.h"
    4663             : 

Generated by: LCOV version 1.13