/*
* Copyright (c) 2005-2007 Henri Sivonen
* Copyright (c) 2007-2017 Mozilla Foundation
* Portions of comments Copyright 2004-2010 Apple Computer, Inc., Mozilla
* Foundation, and Opera Software ASA.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
/*
* THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
* Please edit Tokenizer.java instead and regenerate.
*/
#define nsHtml5Tokenizer_cpp__
#include "nsHtml5AttributeName.h"
#include "nsHtml5ElementName.h"
#include "nsHtml5TreeBuilder.h"
#include "nsHtml5StackNode.h"
#include "nsHtml5UTF16Buffer.h"
#include "nsHtml5StateSnapshot.h"
#include "nsHtml5Portability.h"
#include "nsHtml5Tokenizer.h"
#include "nsHtml5TokenizerLoopPolicies.h"
char16_t nsHtml5Tokenizer::LT_GT[] = {'<' , '>' };
char16_t nsHtml5Tokenizer::LT_SOLIDUS[] = {'<' , '/' };
char16_t nsHtml5Tokenizer::RSQB_RSQB[] = {']' , ']' };
char16_t nsHtml5Tokenizer::REPLACEMENT_CHARACTER[] = {0xfffd};
char16_t nsHtml5Tokenizer::LF[] = {'\n' };
char16_t nsHtml5Tokenizer::CDATA_LSQB[] = {'C' , 'D' , 'A' , 'T' , 'A' , '[' };
char16_t nsHtml5Tokenizer::OCTYPE[] = {'o' , 'c' , 't' , 'y' , 'p' , 'e' };
char16_t nsHtml5Tokenizer::UBLIC[] = {'u' , 'b' , 'l' , 'i' , 'c' };
char16_t nsHtml5Tokenizer::YSTEM[] = {'y' , 's' , 't' , 'e' , 'm' };
static char16_t const TITLE_ARR_DATA[] = {'t' , 'i' , 't' , 'l' , 'e' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::TITLE_ARR = {
TITLE_ARR_DATA, std::size(TITLE_ARR_DATA)};
static char16_t const SCRIPT_ARR_DATA[] = {'s' , 'c' , 'r' , 'i' , 'p' , 't' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::SCRIPT_ARR = {
SCRIPT_ARR_DATA, std::size(SCRIPT_ARR_DATA)};
static char16_t const STYLE_ARR_DATA[] = {'s' , 't' , 'y' , 'l' , 'e' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::STYLE_ARR = {
STYLE_ARR_DATA, std::size(STYLE_ARR_DATA)};
static char16_t const PLAINTEXT_ARR_DATA[] = {'p' , 'l' , 'a' , 'i' , 'n' ,
't' , 'e' , 'x' , 't' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::PLAINTEXT_ARR = {
PLAINTEXT_ARR_DATA, std::size(PLAINTEXT_ARR_DATA)};
static char16_t const XMP_ARR_DATA[] = {'x' , 'm' , 'p' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::XMP_ARR = {
XMP_ARR_DATA, std::size(XMP_ARR_DATA)};
static char16_t const TEXTAREA_ARR_DATA[] = {'t' , 'e' , 'x' , 't' ,
'a' , 'r' , 'e' , 'a' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::TEXTAREA_ARR = {
TEXTAREA_ARR_DATA, std::size(TEXTAREA_ARR_DATA)};
static char16_t const IFRAME_ARR_DATA[] = {'i' , 'f' , 'r' , 'a' , 'm' , 'e' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::IFRAME_ARR = {
IFRAME_ARR_DATA, std::size(IFRAME_ARR_DATA)};
static char16_t const NOEMBED_ARR_DATA[] = {'n' , 'o' , 'e' , 'm' , 'b' , 'e' , 'd' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::NOEMBED_ARR = {
NOEMBED_ARR_DATA, std::size(NOEMBED_ARR_DATA)};
static char16_t const NOSCRIPT_ARR_DATA[] = {'n' , 'o' , 's' , 'c' ,
'r' , 'i' , 'p' , 't' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::NOSCRIPT_ARR = {
NOSCRIPT_ARR_DATA, std::size(NOSCRIPT_ARR_DATA)};
static char16_t const NOFRAMES_ARR_DATA[] = {'n' , 'o' , 'f' , 'r' ,
'a' , 'm' , 'e' , 's' };
staticJArray<char16_t, int32_t> nsHtml5Tokenizer::NOFRAMES_ARR = {
NOFRAMES_ARR_DATA, std::size(NOFRAMES_ARR_DATA)};
nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder* tokenHandler,
bool viewingXmlSource)
: tokenHandler(tokenHandler),
encodingDeclarationHandler(nullptr),
lastCR(false ),
stateSave(0),
returnStateSave(0),
index(0),
forceQuirks(false ),
additional('\0' ),
entCol(0),
firstCharKey(0),
lo(0),
hi(0),
candidate(0),
charRefBufMark(0),
value(0),
seenDigits(false ),
suspendAfterCurrentNonTextToken(false ),
cstart(0),
strBufLen(0),
charRefBuf(jArray<char16_t, int32_t>::newJArray(32)),
charRefBufLen(0),
bmpChar(jArray<char16_t, int32_t>::newJArray(1)),
astralChar(jArray<char16_t, int32_t>::newJArray(2)),
endTagExpectation(nullptr),
endTagExpectationAsArray(nullptr),
endTag(false ),
containsHyphen(false ),
tagName(nullptr),
nonInternedTagName(new nsHtml5ElementName()),
attributeName(nullptr),
nonInternedAttributeName(new nsHtml5AttributeName()),
doctypeName(nullptr),
publicIdentifier(nullptr),
systemIdentifier(nullptr),
attributes(tokenHandler->HasBuilder() ? new nsHtml5HtmlAttributes(0)
: nullptr),
newAttributesEachTime(!tokenHandler->HasBuilder()),
shouldSuspend(false ),
keepBuffer(false ),
confident(false ),
line(0),
attributeLine(0),
interner(nullptr),
viewingXmlSource(viewingXmlSource) {
MOZ_COUNT_CTOR(nsHtml5Tokenizer);
}
void nsHtml5Tokenizer::setInterner(nsHtml5AtomTable* interner) {
this->interner = interner;
}
void nsHtml5Tokenizer::initLocation(nsHtml5String newPublicId,
nsHtml5String newSystemId) {
this->systemId = newSystemId;
this->publicId = newPublicId;
}
bool nsHtml5Tokenizer::isViewingXmlSource() { return viewingXmlSource; }
void nsHtml5Tokenizer::setKeepBuffer(bool keepBuffer) {
this->keepBuffer = keepBuffer;
}
bool nsHtml5Tokenizer::dropBufferIfLongerThan(int32_t length) {
if (strBuf.length > length) {
strBuf = nullptr;
return true ;
}
return false ;
}
void nsHtml5Tokenizer::setState(int32_t specialTokenizerState) {
this->stateSave = specialTokenizerState;
this->endTagExpectation = nullptr;
this->endTagExpectationAsArray = nullptr;
}
void nsHtml5Tokenizer::setStateAndEndTagExpectation(
int32_t specialTokenizerState, nsHtml5ElementName* endTagExpectation) {
this->stateSave = specialTokenizerState;
this->endTagExpectation = endTagExpectation;
endTagExpectationToArray();
}
void nsHtml5Tokenizer::endTagExpectationToArray() {
switch (endTagExpectation->getGroup()) {
case nsHtml5TreeBuilder::TITLE: {
endTagExpectationAsArray = TITLE_ARR;
return ;
}
case nsHtml5TreeBuilder::SCRIPT: {
endTagExpectationAsArray = SCRIPT_ARR;
return ;
}
case nsHtml5TreeBuilder::STYLE: {
endTagExpectationAsArray = STYLE_ARR;
return ;
}
case nsHtml5TreeBuilder::PLAINTEXT: {
endTagExpectationAsArray = PLAINTEXT_ARR;
return ;
}
case nsHtml5TreeBuilder::XMP: {
endTagExpectationAsArray = XMP_ARR;
return ;
}
case nsHtml5TreeBuilder::TEXTAREA: {
endTagExpectationAsArray = TEXTAREA_ARR;
return ;
}
case nsHtml5TreeBuilder::IFRAME: {
endTagExpectationAsArray = IFRAME_ARR;
return ;
}
case nsHtml5TreeBuilder::NOEMBED: {
endTagExpectationAsArray = NOEMBED_ARR;
return ;
}
case nsHtml5TreeBuilder::NOSCRIPT: {
endTagExpectationAsArray = NOSCRIPT_ARR;
return ;
}
case nsHtml5TreeBuilder::NOFRAMES: {
endTagExpectationAsArray = NOFRAMES_ARR;
return ;
}
default : {
MOZ_ASSERT(false , "Bad end tag expectation." );
return ;
}
}
}
void nsHtml5Tokenizer::setLineNumber(int32_t line) {
this->attributeLine = line;
this->line = line;
}
nsHtml5HtmlAttributes* nsHtml5Tokenizer::emptyAttributes() {
return nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES;
}
void nsHtml5Tokenizer::emitOrAppendCharRefBuf(int32_t returnState) {
if ((returnState & DATA_AND_RCDATA_MASK)) {
appendCharRefBufToStrBuf();
} else {
if (charRefBufLen > 0) {
tokenHandler->characters(charRefBuf, 0, charRefBufLen);
charRefBufLen = 0;
}
}
}
nsHtml5String nsHtml5Tokenizer::strBufToString() {
nsHtml5String str = nsHtml5Portability::newStringFromBuffer(
strBuf, 0, strBufLen, tokenHandler,
!newAttributesEachTime &&
attributeName == nsHtml5AttributeName::ATTR_CLASS);
clearStrBufAfterUse();
return str;
}
void nsHtml5Tokenizer::strBufToDoctypeName() {
doctypeName =
nsHtml5Portability::newLocalNameFromBuffer(strBuf, strBufLen, interner);
clearStrBufAfterUse();
}
void nsHtml5Tokenizer::emitStrBuf() {
if (strBufLen > 0) {
tokenHandler->characters(strBuf, 0, strBufLen);
clearStrBufAfterUse();
}
}
void nsHtml5Tokenizer::appendStrBuf(char16_t* buffer, int32_t offset,
int32_t length) {
int32_t newLen = nsHtml5Portability::checkedAdd(strBufLen, length);
MOZ_ASSERT(newLen <= strBuf.length, "Previous buffer length insufficient." );
if (MOZ_UNLIKELY(strBuf.length < newLen)) {
if (MOZ_UNLIKELY(!EnsureBufferSpace(length))) {
MOZ_CRASH("Unable to recover from buffer reallocation failure" );
}
}
nsHtml5ArrayCopy::arraycopy(buffer, offset, strBuf, strBufLen, length);
strBufLen = newLen;
}
void nsHtml5Tokenizer::emitComment(int32_t provisionalHyphens, int32_t pos) {
RememberGt(pos);
tokenHandler->comment(strBuf, 0, strBufLen - provisionalHyphens);
clearStrBufAfterUse();
cstart = pos + 1;
suspendIfRequestedAfterCurrentNonTextToken();
}
void nsHtml5Tokenizer::flushChars(char16_t* buf, int32_t pos) {
if (pos > cstart) {
tokenHandler->characters(buf, cstart, pos - cstart);
}
cstart = INT32_MAX;
}
void nsHtml5Tokenizer::strBufToElementNameString() {
if (containsHyphen) {
nsAtom* annotationName = nsHtml5ElementName::ELT_ANNOTATION_XML->getName();
if (nsHtml5Portability::localEqualsBuffer(annotationName, strBuf,
strBufLen)) {
tagName = nsHtml5ElementName::ELT_ANNOTATION_XML;
} else {
nonInternedTagName->setNameForNonInterned(
nsHtml5Portability::newLocalNameFromBuffer(strBuf, strBufLen,
interner),
true );
tagName = nonInternedTagName;
}
} else {
tagName = nsHtml5ElementName::elementNameByBuffer(strBuf, strBufLen);
if (!tagName) {
nonInternedTagName->setNameForNonInterned(
nsHtml5Portability::newLocalNameFromBuffer(strBuf, strBufLen,
interner),
false );
tagName = nonInternedTagName;
}
}
containsHyphen = false ;
clearStrBufAfterUse();
}
int32_t nsHtml5Tokenizer::emitCurrentTagToken(bool selfClosing, int32_t pos) {
RememberGt(pos);
cstart = pos + 1;
maybeErrSlashInEndTag(selfClosing);
stateSave = nsHtml5Tokenizer::DATA;
nsHtml5HtmlAttributes* attrs =
(!attributes ? nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES : attributes);
if (endTag) {
maybeErrAttributesOnEndTag(attrs);
if (!viewingXmlSource) {
tokenHandler->endTag(tagName);
}
if (newAttributesEachTime) {
delete attributes;
attributes = nullptr;
}
} else {
if (viewingXmlSource) {
MOZ_ASSERT(newAttributesEachTime);
delete attributes;
attributes = nullptr;
} else {
tokenHandler->startTag(tagName, attrs, selfClosing);
}
}
tagName = nullptr;
if (newAttributesEachTime) {
attributes = nullptr;
} else {
attributes->clear(0);
}
suspendIfRequestedAfterCurrentNonTextToken();
return stateSave;
}
void nsHtml5Tokenizer::attributeNameComplete() {
attributeName =
nsHtml5AttributeName::nameByBuffer(strBuf, strBufLen, interner);
if (!attributeName) {
nonInternedAttributeName->setNameForNonInterned(
nsHtml5Portability::newLocalNameFromBuffer(strBuf, strBufLen,
interner));
attributeName = nonInternedAttributeName;
}
clearStrBufAfterUse();
if (!attributes) {
attributes = new nsHtml5HtmlAttributes(0);
}
if (attributes->contains(attributeName)) {
errDuplicateAttribute();
attributeName = nullptr;
}
}
void nsHtml5Tokenizer::addAttributeWithoutValue() {
if (attributeName) {
attributes->addAttribute(
attributeName, nsHtml5Portability::newEmptyString(), attributeLine);
attributeName = nullptr;
} else {
clearStrBufAfterUse();
}
}
void nsHtml5Tokenizer::addAttributeWithValue() {
if (attributeName) {
nsHtml5String val = strBufToString();
if (mViewSource) {
mViewSource->MaybeLinkifyAttributeValue(attributeName, val);
}
attributes->addAttribute(attributeName, val, attributeLine);
attributeName = nullptr;
} else {
clearStrBufAfterUse();
}
}
void nsHtml5Tokenizer::start() {
initializeWithoutStarting();
tokenHandler->startTokenization(this );
if (mViewSource) {
line = 1;
col = -1;
nextCharOnNewLine = false ;
} else if (tokenHandler->WantsLineAndColumn()) {
line = 0;
col = 1;
nextCharOnNewLine = true ;
} else {
line = -1;
col = -1;
nextCharOnNewLine = false ;
}
}
bool nsHtml5Tokenizer::tokenizeBuffer(nsHtml5UTF16Buffer* buffer) {
int32_t state = stateSave;
int32_t returnState = returnStateSave;
char16_t c = '\0' ;
shouldSuspend = false ;
lastCR = false ;
int32_t start = buffer->getStart();
int32_t end = buffer->getEnd();
int32_t pos = start - 1;
switch (state) {
case DATA:
case RCDATA:
case SCRIPT_DATA:
case PLAINTEXT:
case RAWTEXT:
case CDATA_SECTION:
case SCRIPT_DATA_ESCAPED:
case SCRIPT_DATA_ESCAPE_START:
case SCRIPT_DATA_ESCAPE_START_DASH:
case SCRIPT_DATA_ESCAPED_DASH:
case SCRIPT_DATA_ESCAPED_DASH_DASH:
case SCRIPT_DATA_DOUBLE_ESCAPE_START:
case SCRIPT_DATA_DOUBLE_ESCAPED:
case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:
case SCRIPT_DATA_DOUBLE_ESCAPED_DASH:
case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:
case SCRIPT_DATA_DOUBLE_ESCAPE_END: {
cstart = start;
break ;
}
default : {
cstart = INT32_MAX;
break ;
}
}
if (mViewSource) {
mViewSource->SetBuffer(buffer);
pos = stateLoop<nsHtml5ViewSourcePolicy>(state, c, pos, buffer->getBuffer(),
false , returnState,
buffer->getEnd());
mViewSource->DropBuffer((pos == buffer->getEnd()) ? pos : pos + 1);
} else if (tokenHandler->WantsLineAndColumn()) {
pos = stateLoop<nsHtml5LineColPolicy>(state, c, pos, buffer->getBuffer(),
false , returnState, buffer->getEnd());
} else {
pos = stateLoop<nsHtml5FastestPolicy>(state, c, pos, buffer->getBuffer(),
false , returnState, buffer->getEnd());
}
if (pos == end) {
buffer->setStart(pos);
} else {
buffer->setStart(pos + 1);
}
return lastCR;
}
template <class P>
int32_t nsHtml5Tokenizer::stateLoop(int32_t state, char16_t c, int32_t pos,
char16_t* buf, bool reconsume,
int32_t returnState, int32_t endPos) {
bool reportedConsecutiveHyphens = false ;
stateloop:
for (;;) {
switch (state) {
case DATA: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '&' : {
flushChars(buf, pos);
MOZ_ASSERT(!charRefBufLen,
"charRefBufLen not reset after previous use!" );
appendCharRefBuf(c);
setAdditionalAndRememberAmpersandLocation('\0' );
returnState = state;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '<' : {
flushChars(buf, pos);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::TAG_OPEN, reconsume, pos);
NS_HTML5_BREAK(dataloop);
}
case '\0' : {
maybeEmitReplacementCharacter(buf, pos);
continue ;
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
dataloop_end:;
[[fallthrough]];
}
case TAG_OPEN: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
if (c >= 'A' && c <= 'Z' ) {
endTag = false ;
clearStrBufBeforeUse();
appendStrBuf((char16_t)(c + 0x20));
containsHyphen = false ;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::TAG_NAME,
reconsume, pos);
NS_HTML5_BREAK(tagopenloop);
} else if (c >= 'a' && c <= 'z' ) {
endTag = false ;
clearStrBufBeforeUse();
appendStrBuf(c);
containsHyphen = false ;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::TAG_NAME,
reconsume, pos);
NS_HTML5_BREAK(tagopenloop);
}
switch (c) {
case '!' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::MARKUP_DECLARATION_OPEN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '/' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::CLOSE_TAG_OPEN, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\?' : {
if (viewingXmlSource) {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::PROCESSING_INSTRUCTION,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
if (P::reportErrors) {
errProcessingInstruction();
}
clearStrBufBeforeUse();
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errLtGt();
}
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 2);
cstart = pos + 1;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
default : {
if (P::reportErrors) {
errBadCharAfterLt(c);
}
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
cstart = pos;
reconsume = true ;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
tagopenloop_end:;
[[fallthrough]];
}
case TAG_NAME: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
strBufToElementNameString();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
strBufToElementNameString();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_BREAK(tagnameloop);
}
case '/' : {
strBufToElementNameString();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
strBufToElementNameString();
state = P::transition(mViewSource.get(),
emitCurrentTagToken(false , pos), reconsume,
pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
if (c >= 'A' && c <= 'Z' ) {
c += 0x20;
} else if (c == '-' ) {
containsHyphen = true ;
}
appendStrBuf(c);
continue ;
}
}
}
tagnameloop_end:;
[[fallthrough]];
}
case BEFORE_ATTRIBUTE_NAME: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '/' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
state = P::transition(mViewSource.get(),
emitCurrentTagToken(false , pos), reconsume,
pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
case '\"' :
case '\' ':
case '<' :
case '=' : {
if (P::reportErrors) {
errBadCharBeforeAttributeNameOrNull(c);
}
[[fallthrough]];
}
default : {
if (c >= 'A' && c <= 'Z' ) {
c += 0x20;
}
attributeLine = line;
clearStrBufBeforeUse();
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume,
pos);
NS_HTML5_BREAK(beforeattributenameloop);
}
}
}
beforeattributenameloop_end:;
[[fallthrough]];
}
case ATTRIBUTE_NAME: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
attributeNameComplete();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
attributeNameComplete();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '/' : {
attributeNameComplete();
addAttributeWithoutValue();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '=' : {
attributeNameComplete();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE,
reconsume, pos);
NS_HTML5_BREAK(attributenameloop);
}
case '>' : {
attributeNameComplete();
addAttributeWithoutValue();
state = P::transition(mViewSource.get(),
emitCurrentTagToken(false , pos), reconsume,
pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
case '\"' :
case '\' ':
case '<' : {
if (P::reportErrors) {
errQuoteOrLtInAttributeNameOrNull(c);
}
[[fallthrough]];
}
default : {
if (c >= 'A' && c <= 'Z' ) {
c += 0x20;
}
appendStrBuf(c);
continue ;
}
}
}
attributenameloop_end:;
[[fallthrough]];
}
case BEFORE_ATTRIBUTE_VALUE: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '\"' : {
attributeLine = line;
clearStrBufBeforeUse();
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::ATTRIBUTE_VALUE_DOUBLE_QUOTED,
reconsume, pos);
NS_HTML5_BREAK(beforeattributevalueloop);
}
case '&' : {
attributeLine = line;
clearStrBufBeforeUse();
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\' ': {
attributeLine = line;
clearStrBufBeforeUse();
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::ATTRIBUTE_VALUE_SINGLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errAttributeValueMissing();
}
addAttributeWithoutValue();
state = P::transition(mViewSource.get(),
emitCurrentTagToken(false , pos), reconsume,
pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
case '<' :
case '=' :
case '`' : {
if (P::reportErrors) {
errLtOrEqualsOrGraveInUnquotedAttributeOrNull(c);
}
[[fallthrough]];
}
default : {
attributeLine = line;
clearStrBufBeforeUse();
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
beforeattributevalueloop_end:;
[[fallthrough]];
}
case ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '\"' : {
addAttributeWithValue();
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED,
reconsume, pos);
NS_HTML5_BREAK(attributevaluedoublequotedloop);
}
case '&' : {
MOZ_ASSERT(!charRefBufLen,
"charRefBufLen not reset after previous use!" );
appendCharRefBuf(c);
setAdditionalAndRememberAmpersandLocation('\"' );
returnState = state;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
continue ;
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
attributevaluedoublequotedloop_end:;
[[fallthrough]];
}
case AFTER_ATTRIBUTE_VALUE_QUOTED: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '/' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
reconsume, pos);
NS_HTML5_BREAK(afterattributevaluequotedloop);
}
case '>' : {
state = P::transition(mViewSource.get(),
emitCurrentTagToken(false , pos), reconsume,
pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
if (P::reportErrors) {
errNoSpaceBetweenAttributes();
}
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
afterattributevaluequotedloop_end:;
[[fallthrough]];
}
case SELF_CLOSING_START_TAG: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '>' : {
state =
P::transition(mViewSource.get(), emitCurrentTagToken(true , pos),
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
if (P::reportErrors) {
errSlashNotFollowedByGt();
}
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
case ATTRIBUTE_VALUE_UNQUOTED: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
addAttributeWithValue();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
addAttributeWithValue();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '&' : {
MOZ_ASSERT(!charRefBufLen,
"charRefBufLen not reset after previous use!" );
appendCharRefBuf(c);
setAdditionalAndRememberAmpersandLocation('>' );
returnState = state;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
addAttributeWithValue();
state = P::transition(mViewSource.get(),
emitCurrentTagToken(false , pos), reconsume,
pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
case '<' :
case '\"' :
case '\' ':
case '=' :
case '`' : {
if (P::reportErrors) {
errUnquotedAttributeValOrNull(c);
}
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
}
case AFTER_ATTRIBUTE_NAME: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '/' : {
addAttributeWithoutValue();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '=' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
addAttributeWithoutValue();
state = P::transition(mViewSource.get(),
emitCurrentTagToken(false , pos), reconsume,
pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
case '\"' :
case '\' ':
case '<' : {
if (P::reportErrors) {
errQuoteOrLtInAttributeNameOrNull(c);
}
[[fallthrough]];
}
default : {
addAttributeWithoutValue();
if (c >= 'A' && c <= 'Z' ) {
c += 0x20;
}
clearStrBufBeforeUse();
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
case MARKUP_DECLARATION_OPEN: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
clearStrBufBeforeUse();
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::MARKUP_DECLARATION_HYPHEN,
reconsume, pos);
NS_HTML5_BREAK(markupdeclarationopenloop);
}
case 'd' :
case 'D' : {
clearStrBufBeforeUse();
appendStrBuf(c);
index = 0;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::MARKUP_DECLARATION_OCTYPE,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '[' : {
if (tokenHandler->cdataSectionAllowed()) {
clearStrBufBeforeUse();
appendStrBuf(c);
index = 0;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::CDATA_START, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
[[fallthrough]];
}
default : {
if (P::reportErrors) {
errBogusComment();
}
clearStrBufBeforeUse();
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
markupdeclarationopenloop_end:;
[[fallthrough]];
}
case MARKUP_DECLARATION_HYPHEN: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
clearStrBufAfterOneHyphen();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_START, reconsume,
pos);
NS_HTML5_BREAK(markupdeclarationhyphenloop);
}
default : {
if (P::reportErrors) {
errBogusComment();
}
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
markupdeclarationhyphenloop_end:;
[[fallthrough]];
}
case COMMENT_START: {
reportedConsecutiveHyphens = false ;
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_START_DASH,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errPrematureEndOfComment();
}
emitComment(0, pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '<' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_BREAK(commentstartloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_BREAK(commentstartloop);
}
}
}
commentstartloop_end:;
[[fallthrough]];
}
case COMMENT: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_END_DASH,
reconsume, pos);
NS_HTML5_BREAK(commentloop);
}
case '<' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
continue ;
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
commentloop_end:;
[[fallthrough]];
}
case COMMENT_END_DASH: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
appendStrBuf(c);
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
NS_HTML5_BREAK(commentenddashloop);
}
case '<' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
commentenddashloop_end:;
[[fallthrough]];
}
case COMMENT_END: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '>' : {
emitComment(2, pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '-' : {
adjustDoubleHyphenAndAppendToStrBufAndErr(
c, reportedConsecutiveHyphens);
reportedConsecutiveHyphens = true ;
continue ;
}
case '<' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
adjustDoubleHyphenAndAppendToStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
adjustDoubleHyphenAndAppendToStrBufLineFeed<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '!' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_END_BANG,
reconsume, pos);
NS_HTML5_BREAK(commentendloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
adjustDoubleHyphenAndAppendToStrBufAndErr(
c, reportedConsecutiveHyphens);
reportedConsecutiveHyphens = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
commentendloop_end:;
[[fallthrough]];
}
case COMMENT_END_BANG: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '>' : {
emitComment(3, pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '-' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_END_DASH,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
case COMMENT_LESSTHAN: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '!' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN_BANG,
reconsume, pos);
NS_HTML5_BREAK(commentlessthanloop);
}
case '<' : {
appendStrBuf(c);
continue ;
}
case '-' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_END_DASH,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
commentlessthanloop_end:;
[[fallthrough]];
}
case COMMENT_LESSTHAN_BANG: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
appendStrBuf(c);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN_BANG_DASH, reconsume, pos);
NS_HTML5_BREAK(commentlessthanbangloop);
}
case '<' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
commentlessthanbangloop_end:;
[[fallthrough]];
}
case COMMENT_LESSTHAN_BANG_DASH: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
appendStrBuf(c);
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN_BANG_DASH_DASH,
reconsume, pos);
break ;
}
case '<' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
[[fallthrough]];
}
case COMMENT_LESSTHAN_BANG_DASH_DASH: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '>' : {
appendStrBuf(c);
emitComment(3, pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '-' : {
if (P::reportErrors) {
errNestedComment();
}
adjustDoubleHyphenAndAppendToStrBufAndErr(
c, reportedConsecutiveHyphens);
reportedConsecutiveHyphens = true ;
state =
P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT_END,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
c = '\n' ;
P::silentCarriageReturn(this );
if (P::reportErrors) {
errNestedComment();
}
adjustDoubleHyphenAndAppendToStrBufAndErr(
c, reportedConsecutiveHyphens);
reportedConsecutiveHyphens = true ;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
if (P::reportErrors) {
errNestedComment();
}
adjustDoubleHyphenAndAppendToStrBufAndErr(
c, reportedConsecutiveHyphens);
reportedConsecutiveHyphens = true ;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '!' : {
if (P::reportErrors) {
errNestedComment();
}
adjustDoubleHyphenAndAppendToStrBufAndErr(
c, reportedConsecutiveHyphens);
reportedConsecutiveHyphens = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_END_BANG, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
if (P::reportErrors) {
errNestedComment();
}
adjustDoubleHyphenAndAppendToStrBufAndErr(
c, reportedConsecutiveHyphens);
reportedConsecutiveHyphens = true ;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
case COMMENT_START_DASH: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
appendStrBuf(c);
state =
P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT_END,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errPrematureEndOfComment();
}
emitComment(1, pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '<' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::COMMENT_LESSTHAN, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::COMMENT,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
case CDATA_START: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
if (index < 6) {
if (c == nsHtml5Tokenizer::CDATA_LSQB[index]) {
appendStrBuf(c);
} else {
if (P::reportErrors) {
errBogusComment();
}
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
index++;
continue ;
} else {
clearStrBufAfterUse();
cstart = pos;
reconsume = true ;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
break ;
}
}
[[fallthrough]];
}
case CDATA_SECTION: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case ']' : {
flushChars(buf, pos);
state =
P::transition(mViewSource.get(), nsHtml5Tokenizer::CDATA_RSQB,
reconsume, pos);
NS_HTML5_BREAK(cdatasectionloop);
}
case '\0' : {
maybeEmitReplacementCharacter(buf, pos);
continue ;
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
cdatasectionloop_end:;
[[fallthrough]];
}
case CDATA_RSQB: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case ']' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::CDATA_RSQB_RSQB, reconsume,
pos);
break ;
}
default : {
tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
cstart = pos;
reconsume = true ;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
[[fallthrough]];
}
case CDATA_RSQB_RSQB: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case ']' : {
tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
continue ;
}
case '>' : {
cstart = pos + 1;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
suspendIfRequestedAfterCurrentNonTextToken();
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
cstart = pos;
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::CDATA_SECTION, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
case ATTRIBUTE_VALUE_SINGLE_QUOTED: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '\' ': {
addAttributeWithValue();
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '&' : {
MOZ_ASSERT(!charRefBufLen,
"charRefBufLen not reset after previous use!" );
appendCharRefBuf(c);
setAdditionalAndRememberAmpersandLocation('\' ');
returnState = state;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
reconsume, pos);
NS_HTML5_BREAK(attributevaluesinglequotedloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
continue ;
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
attributevaluesinglequotedloop_end:;
[[fallthrough]];
}
case CONSUME_CHARACTER_REFERENCE: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case ' ' :
case '\t' :
case '\n' :
case '\r' :
case '\f' :
case '<' :
case '&' :
case '\0' :
case ';' : {
emitOrAppendCharRefBuf(returnState);
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos;
}
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '#' : {
appendCharRefBuf('#' );
state =
P::transition(mViewSource.get(), nsHtml5Tokenizer::CONSUME_NCR,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
default : {
if (c == additional) {
emitOrAppendCharRefBuf(returnState);
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
if (c >= 'a' && c <= 'z' ) {
firstCharKey = c - 'a' + 26;
} else if (c >= 'A' && c <= 'Z' ) {
firstCharKey = c - 'A' ;
} else {
if (c == ';' ) {
if (P::reportErrors) {
errNoNamedCharacterMatch();
}
}
emitOrAppendCharRefBuf(returnState);
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos;
}
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
appendCharRefBuf(c);
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::CHARACTER_REFERENCE_HILO_LOOKUP,
reconsume, pos);
break ;
}
}
[[fallthrough]];
}
case CHARACTER_REFERENCE_HILO_LOOKUP: {
{
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
int32_t hilo = 0;
if (c <= 'z' ) {
const int32_t* row = nsHtml5NamedCharactersAccel::HILO_ACCEL[c];
if (row) {
hilo = row[firstCharKey];
}
}
if (!hilo) {
if (c == ';' ) {
if (P::reportErrors) {
errNoNamedCharacterMatch();
}
}
emitOrAppendCharRefBuf(returnState);
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos;
}
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
appendCharRefBuf(c);
lo = hilo & 0xFFFF;
hi = hilo >> 16;
entCol = -1;
candidate = -1;
charRefBufMark = 0;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::CHARACTER_REFERENCE_TAIL,
reconsume, pos);
}
[[fallthrough]];
}
case CHARACTER_REFERENCE_TAIL: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
entCol++;
for (;;) {
if (hi < lo) {
NS_HTML5_BREAK(outer);
}
if (entCol == nsHtml5NamedCharacters::NAMES[lo].length()) {
candidate = lo;
charRefBufMark = charRefBufLen;
lo++;
} else if (entCol > nsHtml5NamedCharacters::NAMES[lo].length()) {
NS_HTML5_BREAK(outer);
} else if (c > nsHtml5NamedCharacters::NAMES[lo].charAt(entCol)) {
lo++;
} else {
NS_HTML5_BREAK(loloop);
}
}
loloop_end:;
for (;;) {
if (hi < lo) {
NS_HTML5_BREAK(outer);
}
if (entCol == nsHtml5NamedCharacters::NAMES[hi].length()) {
NS_HTML5_BREAK(hiloop);
}
if (entCol > nsHtml5NamedCharacters::NAMES[hi].length()) {
NS_HTML5_BREAK(outer);
} else if (c < nsHtml5NamedCharacters::NAMES[hi].charAt(entCol)) {
hi--;
} else {
NS_HTML5_BREAK(hiloop);
}
}
hiloop_end:;
if (c == ';' ) {
if (entCol + 1 == nsHtml5NamedCharacters::NAMES[lo].length()) {
candidate = lo;
charRefBufMark = charRefBufLen;
}
NS_HTML5_BREAK(outer);
}
if (hi < lo) {
NS_HTML5_BREAK(outer);
}
appendCharRefBuf(c);
continue ;
}
outer_end:;
if (candidate == -1) {
if (c == ';' ) {
if (P::reportErrors) {
errNoNamedCharacterMatch();
}
}
emitOrAppendCharRefBuf(returnState);
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos;
}
reconsume = true ;
state = P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
} else {
const nsHtml5CharacterName& candidateName =
nsHtml5NamedCharacters::NAMES[candidate];
if (!candidateName.length() ||
candidateName.charAt(candidateName.length() - 1) != ';' ) {
if ((returnState & DATA_AND_RCDATA_MASK)) {
char16_t ch;
if (charRefBufMark == charRefBufLen) {
ch = c;
} else {
ch = charRefBuf[charRefBufMark];
}
if (ch == '=' || (ch >= '0' && ch <= '9' ) ||
(ch >= 'A' && ch <= 'Z' ) || (ch >= 'a' && ch <= 'z' )) {
if (c == ';' ) {
if (P::reportErrors) {
errNoNamedCharacterMatch();
}
}
appendCharRefBufToStrBuf();
reconsume = true ;
state = P::transition(mViewSource.get(), returnState, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
if ((returnState & DATA_AND_RCDATA_MASK)) {
if (P::reportErrors) {
errUnescapedAmpersandInterpretedAsCharacterReference();
}
} else {
if (P::reportErrors) {
errNotSemicolonTerminated();
}
}
}
P::completedNamedCharacterReference(mViewSource.get());
const char16_t* val = nsHtml5NamedCharacters::VALUES[candidate];
if (!val[1]) {
emitOrAppendOne(val, returnState);
} else {
emitOrAppendTwo(val, returnState);
}
if (charRefBufMark < charRefBufLen) {
if ((returnState & DATA_AND_RCDATA_MASK)) {
appendStrBuf(charRefBuf, charRefBufMark,
charRefBufLen - charRefBufMark);
} else {
tokenHandler->characters(charRefBuf, charRefBufMark,
charRefBufLen - charRefBufMark);
}
}
bool earlyBreak = (c == ';' && charRefBufMark == charRefBufLen);
charRefBufLen = 0;
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = earlyBreak ? pos + 1 : pos;
}
reconsume = !earlyBreak;
state = P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
case CONSUME_NCR: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
value = 0;
seenDigits = false ;
switch (c) {
case 'x' :
case 'X' : {
appendCharRefBuf(c);
state =
P::transition(mViewSource.get(), nsHtml5Tokenizer::HEX_NCR_LOOP,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
default : {
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::DECIMAL_NRC_LOOP, reconsume,
pos);
break ;
}
}
[[fallthrough]];
}
case DECIMAL_NRC_LOOP: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
MOZ_ASSERT(value >= 0, "value must not become negative." );
if (c >= '0' && c <= '9' ) {
seenDigits = true ;
if (value <= 0x10FFFF) {
value *= 10;
value += c - '0' ;
}
continue ;
} else if (c == ';' ) {
if (seenDigits) {
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos + 1;
}
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::HANDLE_NCR_VALUE,
reconsume, pos);
NS_HTML5_BREAK(decimalloop);
} else {
if (P::reportErrors) {
errNoDigitsInNCR();
}
appendCharRefBuf(';' );
emitOrAppendCharRefBuf(returnState);
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos + 1;
}
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
} else {
if (!seenDigits) {
if (P::reportErrors) {
errNoDigitsInNCR();
}
emitOrAppendCharRefBuf(returnState);
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos;
}
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
} else {
if (P::reportErrors) {
errCharRefLacksSemicolon();
}
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos;
}
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::HANDLE_NCR_VALUE,
reconsume, pos);
NS_HTML5_BREAK(decimalloop);
}
}
}
decimalloop_end:;
[[fallthrough]];
}
case HANDLE_NCR_VALUE: {
charRefBufLen = 0;
handleNcrValue(returnState);
state = P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case HEX_NCR_LOOP: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
MOZ_ASSERT(value >= 0, "value must not become negative." );
if (c >= '0' && c <= '9' ) {
seenDigits = true ;
if (value <= 0x10FFFF) {
value *= 16;
value += c - '0' ;
}
continue ;
} else if (c >= 'A' && c <= 'F' ) {
seenDigits = true ;
if (value <= 0x10FFFF) {
value *= 16;
value += c - 'A' + 10;
}
continue ;
} else if (c >= 'a' && c <= 'f' ) {
seenDigits = true ;
if (value <= 0x10FFFF) {
value *= 16;
value += c - 'a' + 10;
}
continue ;
} else if (c == ';' ) {
if (seenDigits) {
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos + 1;
}
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::HANDLE_NCR_VALUE,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
} else {
if (P::reportErrors) {
errNoDigitsInNCR();
}
appendCharRefBuf(';' );
emitOrAppendCharRefBuf(returnState);
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos + 1;
}
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
} else {
if (!seenDigits) {
if (P::reportErrors) {
errNoDigitsInNCR();
}
emitOrAppendCharRefBuf(returnState);
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos;
}
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
} else {
if (P::reportErrors) {
errCharRefLacksSemicolon();
}
if (!(returnState & DATA_AND_RCDATA_MASK)) {
cstart = pos;
}
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::HANDLE_NCR_VALUE,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
case PLAINTEXT: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '\0' : {
emitPlaintextReplacementCharacter(buf, pos);
continue ;
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
}
case CLOSE_TAG_OPEN: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '>' : {
if (P::reportErrors) {
errLtSlashGt();
}
cstart = pos + 1;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
P::silentCarriageReturn(this );
if (P::reportErrors) {
errGarbageAfterLtSlash();
}
clearStrBufBeforeUse();
appendStrBuf('\n' );
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
if (P::reportErrors) {
errGarbageAfterLtSlash();
}
clearStrBufBeforeUse();
appendStrBuf(c);
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
if (c >= 'A' && c <= 'Z' ) {
c += 0x20;
}
if (c >= 'a' && c <= 'z' ) {
endTag = true ;
clearStrBufBeforeUse();
appendStrBuf(c);
containsHyphen = false ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
} else {
if (P::reportErrors) {
errGarbageAfterLtSlash();
}
clearStrBufBeforeUse();
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
case RCDATA: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '&' : {
flushChars(buf, pos);
MOZ_ASSERT(!charRefBufLen,
"charRefBufLen not reset after previous use!" );
appendCharRefBuf(c);
setAdditionalAndRememberAmpersandLocation('\0' );
returnState = state;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '<' : {
flushChars(buf, pos);
returnState = state;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
continue ;
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
}
case RAWTEXT: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '<' : {
flushChars(buf, pos);
returnState = state;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN,
reconsume, pos);
NS_HTML5_BREAK(rawtextloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
continue ;
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
rawtextloop_end:;
[[fallthrough]];
}
case RAWTEXT_RCDATA_LESS_THAN_SIGN: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '/' : {
index = 0;
clearStrBufBeforeUse();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
reconsume, pos);
NS_HTML5_BREAK(rawtextrcdatalessthansignloop);
}
default : {
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
cstart = pos;
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
rawtextrcdatalessthansignloop_end:;
[[fallthrough]];
}
case NON_DATA_END_TAG_NAME: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
if (!endTagExpectationAsArray) {
tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
cstart = pos;
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
} else if (index < endTagExpectationAsArray.length) {
char16_t e = endTagExpectationAsArray[index];
char16_t folded = c;
if (c >= 'A' && c <= 'Z' ) {
folded += 0x20;
}
if (folded != e) {
tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
emitStrBuf();
cstart = pos;
reconsume = true ;
state =
P::transition(mViewSource.get(), returnState, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
appendStrBuf(c);
index++;
continue ;
} else {
endTag = true ;
tagName = endTagExpectation;
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
clearStrBufAfterUse();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
clearStrBufAfterUse();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '/' : {
clearStrBufAfterUse();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
clearStrBufAfterUse();
state = P::transition(mViewSource.get(),
emitCurrentTagToken(false , pos),
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
emitStrBuf();
cstart = pos;
reconsume = true ;
state = P::transition(mViewSource.get(), returnState, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
}
case BOGUS_COMMENT: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '>' : {
emitComment(0, pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '-' : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT_HYPHEN,
reconsume, pos);
NS_HTML5_BREAK(boguscommentloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
continue ;
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
boguscommentloop_end:;
[[fallthrough]];
}
case BOGUS_COMMENT_HYPHEN: {
boguscommenthyphenloop:
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '>' : {
emitComment(0, pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '-' : {
appendSecondHyphenToBogusComment();
NS_HTML5_CONTINUE(boguscommenthyphenloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
case SCRIPT_DATA: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '<' : {
flushChars(buf, pos);
returnState = state;
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_LESS_THAN_SIGN, reconsume, pos);
NS_HTML5_BREAK(scriptdataloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
continue ;
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
scriptdataloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_LESS_THAN_SIGN: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '/' : {
index = 0;
clearStrBufBeforeUse();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '!' : {
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
cstart = pos;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START,
reconsume, pos);
NS_HTML5_BREAK(scriptdatalessthansignloop);
}
default : {
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
cstart = pos;
reconsume = true ;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdatalessthansignloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_ESCAPE_START: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START_DASH,
reconsume, pos);
NS_HTML5_BREAK(scriptdataescapestartloop);
}
default : {
reconsume = true ;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdataescapestartloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_ESCAPE_START_DASH: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH,
reconsume, pos);
NS_HTML5_BREAK(scriptdataescapestartdashloop);
}
default : {
reconsume = true ;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdataescapestartdashloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_ESCAPED_DASH_DASH: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
continue ;
}
case '<' : {
flushChars(buf, pos);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_BREAK(scriptdataescapeddashdashloop);
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_BREAK(scriptdataescapeddashdashloop);
}
}
}
scriptdataescapeddashdashloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_ESCAPED: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '-' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH,
reconsume, pos);
NS_HTML5_BREAK(scriptdataescapedloop);
}
case '<' : {
flushChars(buf, pos);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
continue ;
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
scriptdataescapedloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_ESCAPED_DASH: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '<' : {
flushChars(buf, pos);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
reconsume, pos);
NS_HTML5_BREAK(scriptdataescapeddashloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdataescapeddashloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '/' : {
index = 0;
clearStrBufBeforeUse();
returnState = nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case 'S' :
case 's' : {
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
cstart = pos;
index = 1;
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_START, reconsume,
pos);
NS_HTML5_BREAK(scriptdataescapedlessthanloop);
}
default : {
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
cstart = pos;
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdataescapedlessthanloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_DOUBLE_ESCAPE_START: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
MOZ_ASSERT(index > 0);
if (index < 6) {
char16_t folded = c;
if (c >= 'A' && c <= 'Z' ) {
folded += 0x20;
}
if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
index++;
continue ;
}
switch (c) {
case '\r' : {
emitCarriageReturn<P>(buf, pos);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' :
case '/' :
case '>' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_BREAK(scriptdatadoubleescapestartloop);
}
default : {
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdatadoubleescapestartloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_DOUBLE_ESCAPED: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '-' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH, reconsume,
pos);
NS_HTML5_BREAK(scriptdatadoubleescapedloop);
}
case '<' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
continue ;
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
scriptdatadoubleescapedloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_DOUBLE_ESCAPED_DASH: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH,
reconsume, pos);
NS_HTML5_BREAK(scriptdatadoubleescapeddashloop);
}
case '<' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdatadoubleescapeddashloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '-' : {
continue ;
}
case '<' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
reconsume, pos);
NS_HTML5_BREAK(scriptdatadoubleescapeddashdashloop);
}
case '>' : {
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
emitReplacementCharacter(buf, pos);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
emitCarriageReturn<P>(buf, pos);
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdatadoubleescapeddashdashloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '/' : {
index = 0;
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_END,
reconsume, pos);
NS_HTML5_BREAK(scriptdatadoubleescapedlessthanloop);
}
default : {
reconsume = true ;
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
scriptdatadoubleescapedlessthanloop_end:;
[[fallthrough]];
}
case SCRIPT_DATA_DOUBLE_ESCAPE_END: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
if (index < 6) {
char16_t folded = c;
if (c >= 'A' && c <= 'Z' ) {
folded += 0x20;
}
if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
reconsume = true ;
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
index++;
continue ;
}
switch (c) {
case '\r' : {
emitCarriageReturn<P>(buf, pos);
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' :
case '/' :
case '>' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
default : {
reconsume = true ;
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
case MARKUP_DECLARATION_OCTYPE: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
if (index < 6) {
char16_t folded = c;
if (c >= 'A' && c <= 'Z' ) {
folded += 0x20;
}
if (folded == nsHtml5Tokenizer::OCTYPE[index]) {
appendStrBuf(c);
} else {
if (P::reportErrors) {
errBogusComment();
}
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_COMMENT, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
index++;
continue ;
} else {
reconsume = true ;
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DOCTYPE,
reconsume, pos);
NS_HTML5_BREAK(markupdeclarationdoctypeloop);
}
}
markupdeclarationdoctypeloop_end:;
[[fallthrough]];
}
case DOCTYPE: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
initDoctypeFields();
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
reconsume, pos);
NS_HTML5_BREAK(doctypeloop);
}
default : {
if (P::reportErrors) {
errMissingSpaceBeforeDoctypeName();
}
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
reconsume, pos);
NS_HTML5_BREAK(doctypeloop);
}
}
}
doctypeloop_end:;
[[fallthrough]];
}
case BEFORE_DOCTYPE_NAME: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '>' : {
if (P::reportErrors) {
errNamelessDoctype();
}
forceQuirks = true ;
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
if (c >= 'A' && c <= 'Z' ) {
c += 0x20;
}
clearStrBufBeforeUse();
appendStrBuf(c);
state =
P::transition(mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_NAME, reconsume, pos);
NS_HTML5_BREAK(beforedoctypenameloop);
}
}
}
beforedoctypenameloop_end:;
[[fallthrough]];
}
case DOCTYPE_NAME: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
strBufToDoctypeName();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::AFTER_DOCTYPE_NAME,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
strBufToDoctypeName();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::AFTER_DOCTYPE_NAME,
reconsume, pos);
NS_HTML5_BREAK(doctypenameloop);
}
case '>' : {
strBufToDoctypeName();
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
if (c >= 'A' && c <= 'Z' ) {
c += 0x0020;
}
appendStrBuf(c);
continue ;
}
}
}
doctypenameloop_end:;
[[fallthrough]];
}
case AFTER_DOCTYPE_NAME: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '>' : {
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case 'p' :
case 'P' : {
index = 0;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_UBLIC, reconsume,
pos);
NS_HTML5_BREAK(afterdoctypenameloop);
}
case 's' :
case 'S' : {
index = 0;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_YSTEM, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
default : {
bogusDoctype();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
afterdoctypenameloop_end:;
[[fallthrough]];
}
case DOCTYPE_UBLIC: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
if (index < 5) {
char16_t folded = c;
if (c >= 'A' && c <= 'Z' ) {
folded += 0x20;
}
if (folded != nsHtml5Tokenizer::UBLIC[index]) {
bogusDoctype();
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
index++;
continue ;
} else {
reconsume = true ;
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_KEYWORD, reconsume, pos);
NS_HTML5_BREAK(doctypeublicloop);
}
}
doctypeublicloop_end:;
[[fallthrough]];
}
case AFTER_DOCTYPE_PUBLIC_KEYWORD: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER, reconsume,
pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER, reconsume,
pos);
NS_HTML5_BREAK(afterdoctypepublickeywordloop);
}
case '\"' : {
if (P::reportErrors) {
errNoSpaceBetweenDoctypePublicKeywordAndQuote();
}
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\' ': {
if (P::reportErrors) {
errNoSpaceBetweenDoctypePublicKeywordAndQuote();
}
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errExpectedPublicId();
}
forceQuirks = true ;
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
bogusDoctype();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
afterdoctypepublickeywordloop_end:;
[[fallthrough]];
}
case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '\"' : {
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED,
reconsume, pos);
NS_HTML5_BREAK(beforedoctypepublicidentifierloop);
}
case '\' ': {
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errExpectedPublicId();
}
forceQuirks = true ;
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
bogusDoctype();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
beforedoctypepublicidentifierloop_end:;
[[fallthrough]];
}
case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\"' : {
publicIdentifier = strBufToString();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER, reconsume,
pos);
NS_HTML5_BREAK(doctypepublicidentifierdoublequotedloop);
}
case '>' : {
if (P::reportErrors) {
errGtInPublicId();
}
forceQuirks = true ;
publicIdentifier = strBufToString();
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
continue ;
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
doctypepublicidentifierdoublequotedloop_end:;
[[fallthrough]];
}
case AFTER_DOCTYPE_PUBLIC_IDENTIFIER: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::
BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS,
reconsume, pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::
BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS,
reconsume, pos);
NS_HTML5_BREAK(afterdoctypepublicidentifierloop);
}
case '>' : {
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\"' : {
if (P::reportErrors) {
errNoSpaceBetweenPublicAndSystemIds();
}
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\' ': {
if (P::reportErrors) {
errNoSpaceBetweenPublicAndSystemIds();
}
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
default : {
bogusDoctype();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
afterdoctypepublicidentifierloop_end:;
[[fallthrough]];
}
case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '>' : {
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\"' : {
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
reconsume, pos);
NS_HTML5_BREAK(betweendoctypepublicandsystemidentifiersloop);
}
case '\' ': {
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
default : {
bogusDoctype();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
betweendoctypepublicandsystemidentifiersloop_end:;
[[fallthrough]];
}
case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\"' : {
systemIdentifier = strBufToString();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER, reconsume,
pos);
NS_HTML5_BREAK(doctypesystemidentifierdoublequotedloop);
}
case '>' : {
if (P::reportErrors) {
errGtInSystemId();
}
forceQuirks = true ;
systemIdentifier = strBufToString();
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
continue ;
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
doctypesystemidentifierdoublequotedloop_end:;
[[fallthrough]];
}
case AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '>' : {
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
bogusDoctypeWithoutQuirks();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_BREAK(afterdoctypesystemidentifierloop);
}
}
}
afterdoctypesystemidentifierloop_end:;
[[fallthrough]];
}
case BOGUS_DOCTYPE: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '>' : {
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
default : {
continue ;
}
}
}
}
case DOCTYPE_YSTEM: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
if (index < 5) {
char16_t folded = c;
if (c >= 'A' && c <= 'Z' ) {
folded += 0x20;
}
if (folded != nsHtml5Tokenizer::YSTEM[index]) {
bogusDoctype();
reconsume = true ;
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
index++;
NS_HTML5_CONTINUE(stateloop);
} else {
reconsume = true ;
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_KEYWORD, reconsume, pos);
NS_HTML5_BREAK(doctypeystemloop);
}
}
doctypeystemloop_end:;
[[fallthrough]];
}
case AFTER_DOCTYPE_SYSTEM_KEYWORD: {
for (;;) {
if (reconsume) {
reconsume = false ;
} else {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
}
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER, reconsume,
pos);
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER, reconsume,
pos);
NS_HTML5_BREAK(afterdoctypesystemkeywordloop);
}
case '\"' : {
if (P::reportErrors) {
errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
}
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\' ': {
if (P::reportErrors) {
errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
}
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errExpectedPublicId();
}
forceQuirks = true ;
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
bogusDoctype();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
afterdoctypesystemkeywordloop_end:;
[[fallthrough]];
}
case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\r' : {
P::silentCarriageReturn(this );
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
P::silentLineFeed(this );
[[fallthrough]];
}
case ' ' :
case '\t' :
case '\f' : {
continue ;
}
case '\"' : {
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
case '\' ': {
clearStrBufBeforeUse();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
reconsume, pos);
NS_HTML5_BREAK(beforedoctypesystemidentifierloop);
}
case '>' : {
if (P::reportErrors) {
errExpectedSystemId();
}
forceQuirks = true ;
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
bogusDoctype();
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
beforedoctypesystemidentifierloop_end:;
[[fallthrough]];
}
case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\' ': {
systemIdentifier = strBufToString();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errGtInSystemId();
}
forceQuirks = true ;
systemIdentifier = strBufToString();
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
continue ;
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
}
case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\' ': {
publicIdentifier = strBufToString();
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER, reconsume,
pos);
NS_HTML5_CONTINUE(stateloop);
}
case '>' : {
if (P::reportErrors) {
errGtInPublicId();
}
forceQuirks = true ;
publicIdentifier = strBufToString();
emitDoctypeToken(pos);
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
case '\r' : {
appendStrBufCarriageReturn<P>();
NS_HTML5_BREAK(stateloop);
}
case '\n' : {
appendStrBufLineFeed<P>();
continue ;
}
case '\0' : {
c = 0xfffd;
[[fallthrough]];
}
default : {
appendStrBuf(c);
continue ;
}
}
}
}
case PROCESSING_INSTRUCTION: {
for (;;) {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '\?' : {
state = P::transition(
mViewSource.get(),
nsHtml5Tokenizer::PROCESSING_INSTRUCTION_QUESTION_MARK,
reconsume, pos);
NS_HTML5_BREAK(processinginstructionloop);
}
default : {
continue ;
}
}
}
processinginstructionloop_end:;
[[fallthrough]];
}
case PROCESSING_INSTRUCTION_QUESTION_MARK: {
if (++pos == endPos) {
NS_HTML5_BREAK(stateloop);
}
c = P::checkChar(this , buf, pos);
switch (c) {
case '>' : {
state = P::transition(mViewSource.get(), nsHtml5Tokenizer::DATA,
reconsume, pos);
suspendIfRequestedAfterCurrentNonTextToken();
if (shouldSuspend) {
NS_HTML5_BREAK(stateloop);
}
NS_HTML5_CONTINUE(stateloop);
}
default : {
state = P::transition(mViewSource.get(),
nsHtml5Tokenizer::PROCESSING_INSTRUCTION,
reconsume, pos);
NS_HTML5_CONTINUE(stateloop);
}
}
}
}
}
stateloop_end:;
flushChars(buf, pos);
stateSave = state;
returnStateSave = returnState;
return pos;
}
void nsHtml5Tokenizer::initDoctypeFields() {
clearStrBufAfterUse();
doctypeName = nullptr;
if (systemIdentifier) {
systemIdentifier.Release();
systemIdentifier = nullptr;
}
if (publicIdentifier) {
publicIdentifier.Release();
publicIdentifier = nullptr;
}
forceQuirks = false ;
}
template <class P>
void nsHtml5Tokenizer::adjustDoubleHyphenAndAppendToStrBufCarriageReturn() {
P::silentCarriageReturn(this );
adjustDoubleHyphenAndAppendToStrBufAndErr('\n' , false );
}
template <class P>
void nsHtml5Tokenizer::adjustDoubleHyphenAndAppendToStrBufLineFeed() {
P::silentLineFeed(this );
adjustDoubleHyphenAndAppendToStrBufAndErr('\n' , false );
}
template <class P>
void nsHtml5Tokenizer::appendStrBufLineFeed() {
P::silentLineFeed(this );
appendStrBuf('\n' );
}
template <class P>
void nsHtml5Tokenizer::appendStrBufCarriageReturn() {
P::silentCarriageReturn(this );
appendStrBuf('\n' );
}
template <class P>
void nsHtml5Tokenizer::emitCarriageReturn(char16_t* buf, int32_t pos) {
P::silentCarriageReturn(this );
flushChars(buf, pos);
tokenHandler->characters(nsHtml5Tokenizer::LF, 0, 1);
cstart = INT32_MAX;
}
void nsHtml5Tokenizer::emitReplacementCharacter(char16_t* buf, int32_t pos) {
flushChars(buf, pos);
tokenHandler->zeroOriginatingReplacementCharacter();
cstart = pos + 1;
}
void nsHtml5Tokenizer::maybeEmitReplacementCharacter(char16_t* buf,
int32_t pos) {
flushChars(buf, pos);
tokenHandler->zeroOrReplacementCharacter();
cstart = pos + 1;
}
void nsHtml5Tokenizer::emitPlaintextReplacementCharacter(char16_t* buf,
int32_t pos) {
flushChars(buf, pos);
tokenHandler->characters(REPLACEMENT_CHARACTER, 0, 1);
cstart = pos + 1;
}
void nsHtml5Tokenizer::setAdditionalAndRememberAmpersandLocation(char16_t add) {
additional = add;
}
void nsHtml5Tokenizer::bogusDoctype() {
errBogusDoctype();
forceQuirks = true ;
}
void nsHtml5Tokenizer::bogusDoctypeWithoutQuirks() {
errBogusDoctype();
forceQuirks = false ;
}
void nsHtml5Tokenizer::handleNcrValue(int32_t returnState) {
if (value <= 0xFFFF) {
if (value >= 0x80 && value <= 0x9f) {
errNcrInC1Range();
char16_t* val = nsHtml5NamedCharacters::WINDOWS_1252[value - 0x80];
emitOrAppendOne(val, returnState);
} else if (value == 0x0) {
errNcrZero();
emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
} else if ((value & 0xF800) == 0xD800) {
errNcrSurrogate();
emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
} else {
char16_t ch = (char16_t)value;
bmpChar[0] = ch;
emitOrAppendOne(bmpChar, returnState);
}
} else if (value <= 0x10FFFF) {
astralChar[0] = (char16_t)(nsHtml5Tokenizer::LEAD_OFFSET + (value >> 10));
astralChar[1] = (char16_t)(0xDC00 + (value & 0x3FF));
emitOrAppendTwo(astralChar, returnState);
} else {
errNcrOutOfRange();
emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
}
}
void nsHtml5Tokenizer::eof() {
int32_t state = stateSave;
int32_t returnState = returnStateSave;
eofloop:
for (;;) {
switch (state) {
case SCRIPT_DATA_LESS_THAN_SIGN:
case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
NS_HTML5_BREAK(eofloop);
}
case TAG_OPEN: {
errEofAfterLt();
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
NS_HTML5_BREAK(eofloop);
}
case RAWTEXT_RCDATA_LESS_THAN_SIGN: {
tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
NS_HTML5_BREAK(eofloop);
}
case NON_DATA_END_TAG_NAME: {
tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
emitStrBuf();
NS_HTML5_BREAK(eofloop);
}
case CLOSE_TAG_OPEN: {
errEofAfterLt();
tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
NS_HTML5_BREAK(eofloop);
}
case TAG_NAME: {
errEofInTagName();
NS_HTML5_BREAK(eofloop);
}
case BEFORE_ATTRIBUTE_NAME:
case AFTER_ATTRIBUTE_VALUE_QUOTED:
case SELF_CLOSING_START_TAG: {
errEofWithoutGt();
NS_HTML5_BREAK(eofloop);
}
case ATTRIBUTE_NAME: {
errEofInAttributeName();
NS_HTML5_BREAK(eofloop);
}
case AFTER_ATTRIBUTE_NAME:
case BEFORE_ATTRIBUTE_VALUE: {
errEofWithoutGt();
NS_HTML5_BREAK(eofloop);
}
case ATTRIBUTE_VALUE_DOUBLE_QUOTED:
case ATTRIBUTE_VALUE_SINGLE_QUOTED:
case ATTRIBUTE_VALUE_UNQUOTED: {
errEofInAttributeValue();
NS_HTML5_BREAK(eofloop);
}
case BOGUS_COMMENT: {
emitComment(0, 0);
NS_HTML5_BREAK(eofloop);
}
case BOGUS_COMMENT_HYPHEN: {
emitComment(0, 0);
NS_HTML5_BREAK(eofloop);
}
case MARKUP_DECLARATION_OPEN: {
errBogusComment();
emitComment(0, 0);
NS_HTML5_BREAK(eofloop);
}
case MARKUP_DECLARATION_HYPHEN: {
errBogusComment();
emitComment(0, 0);
NS_HTML5_BREAK(eofloop);
}
case MARKUP_DECLARATION_OCTYPE: {
if (index < 6) {
errBogusComment();
emitComment(0, 0);
} else {
errEofInDoctype();
doctypeName = nullptr;
if (systemIdentifier) {
systemIdentifier.Release();
systemIdentifier = nullptr;
}
if (publicIdentifier) {
publicIdentifier.Release();
publicIdentifier = nullptr;
}
forceQuirks = true ;
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
NS_HTML5_BREAK(eofloop);
}
case COMMENT_START:
case COMMENT:
case COMMENT_LESSTHAN:
case COMMENT_LESSTHAN_BANG: {
errEofInComment();
emitComment(0, 0);
NS_HTML5_BREAK(eofloop);
}
case COMMENT_END:
case COMMENT_LESSTHAN_BANG_DASH_DASH: {
errEofInComment();
emitComment(2, 0);
NS_HTML5_BREAK(eofloop);
}
case COMMENT_END_DASH:
case COMMENT_START_DASH:
case COMMENT_LESSTHAN_BANG_DASH: {
errEofInComment();
emitComment(1, 0);
NS_HTML5_BREAK(eofloop);
}
case COMMENT_END_BANG: {
errEofInComment();
emitComment(3, 0);
NS_HTML5_BREAK(eofloop);
}
case DOCTYPE:
case BEFORE_DOCTYPE_NAME: {
errEofInDoctype();
forceQuirks = true ;
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
case DOCTYPE_NAME: {
errEofInDoctype();
strBufToDoctypeName();
forceQuirks = true ;
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
case DOCTYPE_UBLIC:
case DOCTYPE_YSTEM:
case AFTER_DOCTYPE_NAME:
case AFTER_DOCTYPE_PUBLIC_KEYWORD:
case AFTER_DOCTYPE_SYSTEM_KEYWORD:
case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
errEofInDoctype();
forceQuirks = true ;
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:
case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: {
errEofInPublicId();
forceQuirks = true ;
publicIdentifier = strBufToString();
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
case AFTER_DOCTYPE_PUBLIC_IDENTIFIER:
case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:
case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
errEofInDoctype();
forceQuirks = true ;
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:
case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
errEofInSystemId();
forceQuirks = true ;
systemIdentifier = strBufToString();
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
case AFTER_DOCTYPE_SYSTEM_IDENTIFIER: {
errEofInDoctype();
forceQuirks = true ;
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
case BOGUS_DOCTYPE: {
emitDoctypeToken(0);
NS_HTML5_BREAK(eofloop);
}
case CONSUME_CHARACTER_REFERENCE: {
emitOrAppendCharRefBuf(returnState);
state = returnState;
continue ;
}
case CHARACTER_REFERENCE_HILO_LOOKUP: {
emitOrAppendCharRefBuf(returnState);
state = returnState;
continue ;
}
case CHARACTER_REFERENCE_TAIL: {
for (;;) {
char16_t c = '\0' ;
entCol++;
for (;;) {
if (hi == -1) {
NS_HTML5_BREAK(hiloop);
}
if (entCol == nsHtml5NamedCharacters::NAMES[hi].length()) {
NS_HTML5_BREAK(hiloop);
}
if (entCol > nsHtml5NamedCharacters::NAMES[hi].length()) {
NS_HTML5_BREAK(outer);
} else if (c < nsHtml5NamedCharacters::NAMES[hi].charAt(entCol)) {
hi--;
} else {
NS_HTML5_BREAK(hiloop);
}
}
hiloop_end:;
for (;;) {
if (hi < lo) {
NS_HTML5_BREAK(outer);
}
if (entCol == nsHtml5NamedCharacters::NAMES[lo].length()) {
candidate = lo;
charRefBufMark = charRefBufLen;
lo++;
} else if (entCol > nsHtml5NamedCharacters::NAMES[lo].length()) {
NS_HTML5_BREAK(outer);
} else if (c > nsHtml5NamedCharacters::NAMES[lo].charAt(entCol)) {
lo++;
} else {
NS_HTML5_BREAK(loloop);
}
}
loloop_end:;
if (hi < lo) {
NS_HTML5_BREAK(outer);
}
continue ;
}
outer_end:;
if (candidate == -1) {
emitOrAppendCharRefBuf(returnState);
state = returnState;
NS_HTML5_CONTINUE(eofloop);
} else {
const nsHtml5CharacterName& candidateName =
nsHtml5NamedCharacters::NAMES[candidate];
if (!candidateName.length() ||
candidateName.charAt(candidateName.length() - 1) != ';' ) {
if ((returnState & DATA_AND_RCDATA_MASK)) {
char16_t ch;
if (charRefBufMark == charRefBufLen) {
ch = '\0' ;
} else {
ch = charRefBuf[charRefBufMark];
}
if ((ch >= '0' && ch <= '9' ) || (ch >= 'A' && ch <= 'Z' ) ||
(ch >= 'a' && ch <= 'z' )) {
appendCharRefBufToStrBuf();
state = returnState;
NS_HTML5_CONTINUE(eofloop);
}
}
if ((returnState & DATA_AND_RCDATA_MASK)) {
errUnescapedAmpersandInterpretedAsCharacterReference();
} else {
errNotSemicolonTerminated();
}
}
const char16_t* val = nsHtml5NamedCharacters::VALUES[candidate];
if (!val[1]) {
emitOrAppendOne(val, returnState);
} else {
emitOrAppendTwo(val, returnState);
}
if (charRefBufMark < charRefBufLen) {
if ((returnState & DATA_AND_RCDATA_MASK)) {
appendStrBuf(charRefBuf, charRefBufMark,
charRefBufLen - charRefBufMark);
} else {
tokenHandler->characters(charRefBuf, charRefBufMark,
charRefBufLen - charRefBufMark);
}
}
charRefBufLen = 0;
state = returnState;
NS_HTML5_CONTINUE(eofloop);
}
}
case CONSUME_NCR:
case DECIMAL_NRC_LOOP:
case HEX_NCR_LOOP: {
if (!seenDigits) {
errNoDigitsInNCR();
emitOrAppendCharRefBuf(returnState);
state = returnState;
continue ;
} else {
errCharRefLacksSemicolon();
}
handleNcrValue(returnState);
state = returnState;
continue ;
}
case CDATA_RSQB: {
tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
NS_HTML5_BREAK(eofloop);
}
case CDATA_RSQB_RSQB: {
tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
NS_HTML5_BREAK(eofloop);
}
case DATA:
default : {
NS_HTML5_BREAK(eofloop);
}
}
}
eofloop_end:;
tokenHandler->eof();
return ;
}
void nsHtml5Tokenizer::emitDoctypeToken(int32_t pos) {
RememberGt(pos);
cstart = pos + 1;
tokenHandler->doctype(doctypeName, publicIdentifier, systemIdentifier,
forceQuirks);
doctypeName = nullptr;
publicIdentifier.Release();
publicIdentifier = nullptr;
systemIdentifier.Release();
systemIdentifier = nullptr;
suspendIfRequestedAfterCurrentNonTextToken();
}
void nsHtml5Tokenizer::suspendIfRequestedAfterCurrentNonTextToken() {
if (suspendAfterCurrentNonTextToken) {
suspendAfterCurrentNonTextToken = false ;
shouldSuspend = true ;
}
}
void nsHtml5Tokenizer::suspendAfterCurrentTokenIfNotInText() {
switch (stateSave) {
case DATA:
case RCDATA:
case SCRIPT_DATA:
case RAWTEXT:
case SCRIPT_DATA_ESCAPED:
case PLAINTEXT:
case NON_DATA_END_TAG_NAME:
case SCRIPT_DATA_LESS_THAN_SIGN:
case SCRIPT_DATA_ESCAPE_START:
case SCRIPT_DATA_ESCAPE_START_DASH:
case SCRIPT_DATA_ESCAPED_DASH:
case SCRIPT_DATA_ESCAPED_DASH_DASH:
case RAWTEXT_RCDATA_LESS_THAN_SIGN:
case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN:
case SCRIPT_DATA_DOUBLE_ESCAPE_START:
case SCRIPT_DATA_DOUBLE_ESCAPED:
case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:
case SCRIPT_DATA_DOUBLE_ESCAPED_DASH:
case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:
case SCRIPT_DATA_DOUBLE_ESCAPE_END: {
return ;
}
case TAG_NAME:
case BEFORE_ATTRIBUTE_NAME:
case ATTRIBUTE_NAME:
case AFTER_ATTRIBUTE_NAME:
case BEFORE_ATTRIBUTE_VALUE:
case AFTER_ATTRIBUTE_VALUE_QUOTED:
case BOGUS_COMMENT:
case MARKUP_DECLARATION_OPEN:
case DOCTYPE:
case BEFORE_DOCTYPE_NAME:
case DOCTYPE_NAME:
case AFTER_DOCTYPE_NAME:
case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER:
case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:
case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED:
case AFTER_DOCTYPE_PUBLIC_IDENTIFIER:
case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:
case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:
case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED:
case AFTER_DOCTYPE_SYSTEM_IDENTIFIER:
case BOGUS_DOCTYPE:
case COMMENT_START:
case COMMENT_START_DASH:
case COMMENT:
case COMMENT_END_DASH:
case COMMENT_END:
case COMMENT_END_BANG:
case TAG_OPEN:
case CLOSE_TAG_OPEN:
case MARKUP_DECLARATION_HYPHEN:
case MARKUP_DECLARATION_OCTYPE:
case DOCTYPE_UBLIC:
case DOCTYPE_YSTEM:
case AFTER_DOCTYPE_PUBLIC_KEYWORD:
case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS:
case AFTER_DOCTYPE_SYSTEM_KEYWORD:
case SELF_CLOSING_START_TAG:
case ATTRIBUTE_VALUE_DOUBLE_QUOTED:
case ATTRIBUTE_VALUE_SINGLE_QUOTED:
case ATTRIBUTE_VALUE_UNQUOTED:
case BOGUS_COMMENT_HYPHEN:
case COMMENT_LESSTHAN:
case COMMENT_LESSTHAN_BANG:
case COMMENT_LESSTHAN_BANG_DASH:
case COMMENT_LESSTHAN_BANG_DASH_DASH:
case CDATA_START:
case CDATA_SECTION:
case CDATA_RSQB:
case CDATA_RSQB_RSQB:
case PROCESSING_INSTRUCTION:
case PROCESSING_INSTRUCTION_QUESTION_MARK: {
break ;
}
case CONSUME_CHARACTER_REFERENCE:
case CONSUME_NCR:
case CHARACTER_REFERENCE_TAIL:
case HEX_NCR_LOOP:
case DECIMAL_NRC_LOOP:
case HANDLE_NCR_VALUE:
case HANDLE_NCR_VALUE_RECONSUME:
case CHARACTER_REFERENCE_HILO_LOOKUP: {
if (returnStateSave == DATA || returnStateSave == RCDATA) {
return ;
}
break ;
}
default : {
MOZ_ASSERT(false , "Incomplete switch" );
return ;
}
}
suspendAfterCurrentNonTextToken = true ;
}
bool nsHtml5Tokenizer::suspensionAfterCurrentNonTextTokenPending() {
return suspendAfterCurrentNonTextToken;
}
bool nsHtml5Tokenizer::internalEncodingDeclaration(
nsHtml5String internalCharset) {
if (encodingDeclarationHandler) {
return encodingDeclarationHandler->internalEncodingDeclaration(
internalCharset);
}
return false ;
}
void nsHtml5Tokenizer::emitOrAppendTwo(const char16_t* val,
int32_t returnState) {
if ((returnState & DATA_AND_RCDATA_MASK)) {
appendStrBuf(val[0]);
appendStrBuf(val[1]);
} else {
tokenHandler->characters(val, 0, 2);
}
}
void nsHtml5Tokenizer::emitOrAppendOne(const char16_t* val,
int32_t returnState) {
if ((returnState & DATA_AND_RCDATA_MASK)) {
appendStrBuf(val[0]);
} else {
tokenHandler->characters(val, 0, 1);
}
}
void nsHtml5Tokenizer::end() {
if (!keepBuffer) {
strBuf = nullptr;
}
doctypeName = nullptr;
if (systemIdentifier) {
systemIdentifier.Release();
systemIdentifier = nullptr;
}
if (publicIdentifier) {
publicIdentifier.Release();
publicIdentifier = nullptr;
}
tagName = nullptr;
nonInternedTagName->setNameForNonInterned(nullptr, false );
attributeName = nullptr;
nonInternedAttributeName->setNameForNonInterned(nullptr);
tokenHandler->endTokenization();
if (attributes) {
attributes->clear(0);
}
}
void nsHtml5Tokenizer::requestSuspension() { shouldSuspend = true ; }
bool nsHtml5Tokenizer::isInDataState() { return (stateSave == DATA); }
void nsHtml5Tokenizer::resetToDataState() {
clearStrBufAfterUse();
charRefBufLen = 0;
stateSave = nsHtml5Tokenizer::DATA;
lastCR = false ;
index = 0;
forceQuirks = false ;
additional = '\0' ;
entCol = -1;
firstCharKey = -1;
lo = 0;
hi = 0;
candidate = -1;
charRefBufMark = 0;
value = 0;
seenDigits = false ;
suspendAfterCurrentNonTextToken = false ;
endTag = false ;
shouldSuspend = false ;
initDoctypeFields();
containsHyphen = false ;
tagName = nullptr;
attributeName = nullptr;
if (newAttributesEachTime) {
if (attributes) {
delete attributes;
attributes = nullptr;
}
}
}
void nsHtml5Tokenizer::loadState(nsHtml5Tokenizer* other) {
strBufLen = other->strBufLen;
if (strBufLen > strBuf.length) {
strBuf = jArray<char16_t, int32_t>::newJArray(strBufLen);
}
nsHtml5ArrayCopy::arraycopy(other->strBuf, strBuf, strBufLen);
charRefBufLen = other->charRefBufLen;
nsHtml5ArrayCopy::arraycopy(other->charRefBuf, charRefBuf, charRefBufLen);
stateSave = other->stateSave;
returnStateSave = other->returnStateSave;
endTagExpectation = other->endTagExpectation;
endTagExpectationAsArray = other->endTagExpectationAsArray;
lastCR = other->lastCR;
index = other->index;
forceQuirks = other->forceQuirks;
additional = other->additional;
entCol = other->entCol;
firstCharKey = other->firstCharKey;
lo = other->lo;
hi = other->hi;
candidate = other->candidate;
charRefBufMark = other->charRefBufMark;
value = other->value;
seenDigits = other->seenDigits;
endTag = other->endTag;
shouldSuspend = false ;
suspendAfterCurrentNonTextToken = false ;
doctypeName = other->doctypeName;
systemIdentifier.Release();
if (!other->systemIdentifier) {
systemIdentifier = nullptr;
} else {
systemIdentifier =
nsHtml5Portability::newStringFromString(other->systemIdentifier);
}
publicIdentifier.Release();
if (!other->publicIdentifier) {
publicIdentifier = nullptr;
} else {
publicIdentifier =
nsHtml5Portability::newStringFromString(other->publicIdentifier);
}
containsHyphen = other->containsHyphen;
if (!other->tagName) {
tagName = nullptr;
} else if (other->tagName->isInterned()) {
tagName = other->tagName;
} else {
nonInternedTagName->setNameForNonInterned(other->tagName->getName(),
other->tagName->isCustom());
tagName = nonInternedTagName;
}
if (!other->attributeName) {
attributeName = nullptr;
} else if (other->attributeName->isInterned()) {
attributeName = other->attributeName;
} else {
nonInternedAttributeName->setNameForNonInterned(
other->attributeName->getLocal(nsHtml5AttributeName::HTML));
attributeName = nonInternedAttributeName;
}
delete attributes;
if (!other->attributes) {
attributes = nullptr;
} else {
attributes = other->attributes->cloneAttributes();
}
}
void nsHtml5Tokenizer::initializeWithoutStarting() {
confident = false ;
if (!keepBuffer) {
strBuf = nullptr;
}
line = 1;
attributeLine = 1;
resetToDataState();
}
void nsHtml5Tokenizer::setEncodingDeclarationHandler(
nsHtml5StreamParser* encodingDeclarationHandler) {
this->encodingDeclarationHandler = encodingDeclarationHandler;
}
nsHtml5Tokenizer::~nsHtml5Tokenizer() {
MOZ_COUNT_DTOR(nsHtml5Tokenizer);
delete nonInternedTagName;
nonInternedTagName = nullptr;
delete nonInternedAttributeName;
nonInternedAttributeName = nullptr;
delete attributes;
attributes = nullptr;
}
void nsHtml5Tokenizer::initializeStatics() {}
void nsHtml5Tokenizer::releaseStatics() {}
#include "nsHtml5TokenizerCppSupplement.h"
Messung V0.5 in Prozent C=100 H=92 G=95
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.116Bemerkung:
(vorverarbeitet am 2026-04-26)
¤
*© Formatika GbR, Deutschland