2 * Copyright (c) 2005-2007 Henri Sivonen
3 * Copyright (c) 2007-2017 Mozilla Foundation
4 * Portions of comments Copyright 2004-2010 Apple Computer, Inc., Mozilla
5 * Foundation, and Opera Software ASA.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
27 * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
28 * Please edit Tokenizer.java instead and regenerate.
31 #define nsHtml5Tokenizer_cpp__
34 #include "nsAHtml5TreeBuilderState.h"
36 #include "nsGkAtoms.h"
37 #include "nsHtml5ArrayCopy.h"
38 #include "nsHtml5AtomTable.h"
39 #include "nsHtml5DocumentMode.h"
40 #include "nsHtml5Highlighter.h"
41 #include "nsHtml5Macros.h"
42 #include "nsHtml5NamedCharacters.h"
43 #include "nsHtml5NamedCharactersAccel.h"
44 #include "nsHtml5String.h"
45 #include "nsHtml5TokenizerLoopPolicies.h"
46 #include "nsIContent.h"
47 #include "nsTraceRefcnt.h"
49 #include "nsHtml5AttributeName.h"
50 #include "nsHtml5ElementName.h"
51 #include "nsHtml5TreeBuilder.h"
52 #include "nsHtml5StackNode.h"
53 #include "nsHtml5UTF16Buffer.h"
54 #include "nsHtml5StateSnapshot.h"
55 #include "nsHtml5Portability.h"
57 #include "nsHtml5Tokenizer.h"
59 char16_t
nsHtml5Tokenizer::LT_GT
[] = {'<', '>'};
60 char16_t
nsHtml5Tokenizer::LT_SOLIDUS
[] = {'<', '/'};
61 char16_t
nsHtml5Tokenizer::RSQB_RSQB
[] = {']', ']'};
62 char16_t
nsHtml5Tokenizer::REPLACEMENT_CHARACTER
[] = {0xfffd};
63 char16_t
nsHtml5Tokenizer::LF
[] = {'\n'};
64 char16_t
nsHtml5Tokenizer::CDATA_LSQB
[] = {'C', 'D', 'A', 'T', 'A', '['};
65 char16_t
nsHtml5Tokenizer::OCTYPE
[] = {'o', 'c', 't', 'y', 'p', 'e'};
66 char16_t
nsHtml5Tokenizer::UBLIC
[] = {'u', 'b', 'l', 'i', 'c'};
67 char16_t
nsHtml5Tokenizer::YSTEM
[] = {'y', 's', 't', 'e', 'm'};
68 static char16_t
const TITLE_ARR_DATA
[] = {'t', 'i', 't', 'l', 'e'};
69 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::TITLE_ARR
= {
70 TITLE_ARR_DATA
, MOZ_ARRAY_LENGTH(TITLE_ARR_DATA
)};
71 static char16_t
const SCRIPT_ARR_DATA
[] = {'s', 'c', 'r', 'i', 'p', 't'};
72 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::SCRIPT_ARR
= {
73 SCRIPT_ARR_DATA
, MOZ_ARRAY_LENGTH(SCRIPT_ARR_DATA
)};
74 static char16_t
const STYLE_ARR_DATA
[] = {'s', 't', 'y', 'l', 'e'};
75 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::STYLE_ARR
= {
76 STYLE_ARR_DATA
, MOZ_ARRAY_LENGTH(STYLE_ARR_DATA
)};
77 static char16_t
const PLAINTEXT_ARR_DATA
[] = {'p', 'l', 'a', 'i', 'n',
79 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::PLAINTEXT_ARR
= {
80 PLAINTEXT_ARR_DATA
, MOZ_ARRAY_LENGTH(PLAINTEXT_ARR_DATA
)};
81 static char16_t
const XMP_ARR_DATA
[] = {'x', 'm', 'p'};
82 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::XMP_ARR
= {
83 XMP_ARR_DATA
, MOZ_ARRAY_LENGTH(XMP_ARR_DATA
)};
84 static char16_t
const TEXTAREA_ARR_DATA
[] = {'t', 'e', 'x', 't',
86 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::TEXTAREA_ARR
= {
87 TEXTAREA_ARR_DATA
, MOZ_ARRAY_LENGTH(TEXTAREA_ARR_DATA
)};
88 static char16_t
const IFRAME_ARR_DATA
[] = {'i', 'f', 'r', 'a', 'm', 'e'};
89 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::IFRAME_ARR
= {
90 IFRAME_ARR_DATA
, MOZ_ARRAY_LENGTH(IFRAME_ARR_DATA
)};
91 static char16_t
const NOEMBED_ARR_DATA
[] = {'n', 'o', 'e', 'm', 'b', 'e', 'd'};
92 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::NOEMBED_ARR
= {
93 NOEMBED_ARR_DATA
, MOZ_ARRAY_LENGTH(NOEMBED_ARR_DATA
)};
94 static char16_t
const NOSCRIPT_ARR_DATA
[] = {'n', 'o', 's', 'c',
96 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::NOSCRIPT_ARR
= {
97 NOSCRIPT_ARR_DATA
, MOZ_ARRAY_LENGTH(NOSCRIPT_ARR_DATA
)};
98 static char16_t
const NOFRAMES_ARR_DATA
[] = {'n', 'o', 'f', 'r',
100 staticJArray
<char16_t
, int32_t> nsHtml5Tokenizer::NOFRAMES_ARR
= {
101 NOFRAMES_ARR_DATA
, MOZ_ARRAY_LENGTH(NOFRAMES_ARR_DATA
)};
103 nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder
* tokenHandler
,
104 bool viewingXmlSource
)
105 : tokenHandler(tokenHandler
),
106 encodingDeclarationHandler(nullptr),
121 suspendAfterCurrentNonTextToken(false),
124 charRefBuf(jArray
<char16_t
, int32_t>::newJArray(32)),
126 bmpChar(jArray
<char16_t
, int32_t>::newJArray(1)),
127 astralChar(jArray
<char16_t
, int32_t>::newJArray(2)),
128 endTagExpectation(nullptr),
129 endTagExpectationAsArray(nullptr),
131 containsHyphen(false),
133 nonInternedTagName(new nsHtml5ElementName()),
134 attributeName(nullptr),
135 nonInternedAttributeName(new nsHtml5AttributeName()),
136 doctypeName(nullptr),
137 publicIdentifier(nullptr),
138 systemIdentifier(nullptr),
139 attributes(tokenHandler
->HasBuilder() ? new nsHtml5HtmlAttributes(0)
141 newAttributesEachTime(!tokenHandler
->HasBuilder()),
142 shouldSuspend(false),
147 viewingXmlSource(viewingXmlSource
) {
148 MOZ_COUNT_CTOR(nsHtml5Tokenizer
);
151 void nsHtml5Tokenizer::setInterner(nsHtml5AtomTable
* interner
) {
152 this->interner
= interner
;
155 void nsHtml5Tokenizer::initLocation(nsHtml5String newPublicId
,
156 nsHtml5String newSystemId
) {
157 this->systemId
= newSystemId
;
158 this->publicId
= newPublicId
;
161 bool nsHtml5Tokenizer::isViewingXmlSource() { return viewingXmlSource
; }
163 void nsHtml5Tokenizer::setState(int32_t specialTokenizerState
) {
164 this->stateSave
= specialTokenizerState
;
165 this->endTagExpectation
= nullptr;
166 this->endTagExpectationAsArray
= nullptr;
169 void nsHtml5Tokenizer::setStateAndEndTagExpectation(
170 int32_t specialTokenizerState
, nsHtml5ElementName
* endTagExpectation
) {
171 this->stateSave
= specialTokenizerState
;
172 this->endTagExpectation
= endTagExpectation
;
173 endTagExpectationToArray();
176 void nsHtml5Tokenizer::endTagExpectationToArray() {
177 switch (endTagExpectation
->getGroup()) {
178 case nsHtml5TreeBuilder::TITLE
: {
179 endTagExpectationAsArray
= TITLE_ARR
;
182 case nsHtml5TreeBuilder::SCRIPT
: {
183 endTagExpectationAsArray
= SCRIPT_ARR
;
186 case nsHtml5TreeBuilder::STYLE
: {
187 endTagExpectationAsArray
= STYLE_ARR
;
190 case nsHtml5TreeBuilder::PLAINTEXT
: {
191 endTagExpectationAsArray
= PLAINTEXT_ARR
;
194 case nsHtml5TreeBuilder::XMP
: {
195 endTagExpectationAsArray
= XMP_ARR
;
198 case nsHtml5TreeBuilder::TEXTAREA
: {
199 endTagExpectationAsArray
= TEXTAREA_ARR
;
202 case nsHtml5TreeBuilder::IFRAME
: {
203 endTagExpectationAsArray
= IFRAME_ARR
;
206 case nsHtml5TreeBuilder::NOEMBED
: {
207 endTagExpectationAsArray
= NOEMBED_ARR
;
210 case nsHtml5TreeBuilder::NOSCRIPT
: {
211 endTagExpectationAsArray
= NOSCRIPT_ARR
;
214 case nsHtml5TreeBuilder::NOFRAMES
: {
215 endTagExpectationAsArray
= NOFRAMES_ARR
;
219 MOZ_ASSERT(false, "Bad end tag expectation.");
225 void nsHtml5Tokenizer::setLineNumber(int32_t line
) {
226 this->attributeLine
= line
;
230 nsHtml5HtmlAttributes
* nsHtml5Tokenizer::emptyAttributes() {
231 return nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES
;
234 void nsHtml5Tokenizer::emitOrAppendCharRefBuf(int32_t returnState
) {
235 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
236 appendCharRefBufToStrBuf();
238 if (charRefBufLen
> 0) {
239 tokenHandler
->characters(charRefBuf
, 0, charRefBufLen
);
245 nsHtml5String
nsHtml5Tokenizer::strBufToString() {
246 nsHtml5String str
= nsHtml5Portability::newStringFromBuffer(
247 strBuf
, 0, strBufLen
, tokenHandler
,
248 !newAttributesEachTime
&&
249 attributeName
== nsHtml5AttributeName::ATTR_CLASS
);
250 clearStrBufAfterUse();
254 void nsHtml5Tokenizer::strBufToDoctypeName() {
256 nsHtml5Portability::newLocalNameFromBuffer(strBuf
, strBufLen
, interner
);
257 clearStrBufAfterUse();
260 void nsHtml5Tokenizer::emitStrBuf() {
262 tokenHandler
->characters(strBuf
, 0, strBufLen
);
263 clearStrBufAfterUse();
267 void nsHtml5Tokenizer::appendStrBuf(char16_t
* buffer
, int32_t offset
,
269 int32_t newLen
= nsHtml5Portability::checkedAdd(strBufLen
, length
);
270 MOZ_ASSERT(newLen
<= strBuf
.length
, "Previous buffer length insufficient.");
271 if (MOZ_UNLIKELY(strBuf
.length
< newLen
)) {
272 if (MOZ_UNLIKELY(!EnsureBufferSpace(length
))) {
273 MOZ_CRASH("Unable to recover from buffer reallocation failure");
276 nsHtml5ArrayCopy::arraycopy(buffer
, offset
, strBuf
, strBufLen
, length
);
280 void nsHtml5Tokenizer::emitComment(int32_t provisionalHyphens
, int32_t pos
) {
282 tokenHandler
->comment(strBuf
, 0, strBufLen
- provisionalHyphens
);
283 clearStrBufAfterUse();
285 suspendIfRequestedAfterCurrentNonTextToken();
288 void nsHtml5Tokenizer::flushChars(char16_t
* buf
, int32_t pos
) {
290 tokenHandler
->characters(buf
, cstart
, pos
- cstart
);
295 void nsHtml5Tokenizer::strBufToElementNameString() {
296 if (containsHyphen
) {
297 nsAtom
* annotationName
= nsHtml5ElementName::ELT_ANNOTATION_XML
->getName();
298 if (nsHtml5Portability::localEqualsBuffer(annotationName
, strBuf
,
300 tagName
= nsHtml5ElementName::ELT_ANNOTATION_XML
;
302 nonInternedTagName
->setNameForNonInterned(
303 nsHtml5Portability::newLocalNameFromBuffer(strBuf
, strBufLen
,
306 tagName
= nonInternedTagName
;
310 nsHtml5ElementName::elementNameByBuffer(strBuf
, strBufLen
, interner
);
312 nonInternedTagName
->setNameForNonInterned(
313 nsHtml5Portability::newLocalNameFromBuffer(strBuf
, strBufLen
,
316 tagName
= nonInternedTagName
;
319 containsHyphen
= false;
320 clearStrBufAfterUse();
323 int32_t nsHtml5Tokenizer::emitCurrentTagToken(bool selfClosing
, int32_t pos
) {
326 maybeErrSlashInEndTag(selfClosing
);
327 stateSave
= nsHtml5Tokenizer::DATA
;
328 nsHtml5HtmlAttributes
* attrs
=
329 (!attributes
? nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES
: attributes
);
331 maybeErrAttributesOnEndTag(attrs
);
332 if (!viewingXmlSource
) {
333 tokenHandler
->endTag(tagName
);
335 if (newAttributesEachTime
) {
337 attributes
= nullptr;
340 if (viewingXmlSource
) {
341 MOZ_ASSERT(newAttributesEachTime
);
343 attributes
= nullptr;
345 tokenHandler
->startTag(tagName
, attrs
, selfClosing
);
349 if (newAttributesEachTime
) {
350 attributes
= nullptr;
352 attributes
->clear(0);
354 suspendIfRequestedAfterCurrentNonTextToken();
358 void nsHtml5Tokenizer::attributeNameComplete() {
360 nsHtml5AttributeName::nameByBuffer(strBuf
, strBufLen
, interner
);
361 if (!attributeName
) {
362 nonInternedAttributeName
->setNameForNonInterned(
363 nsHtml5Portability::newLocalNameFromBuffer(strBuf
, strBufLen
,
365 attributeName
= nonInternedAttributeName
;
367 clearStrBufAfterUse();
369 attributes
= new nsHtml5HtmlAttributes(0);
371 if (attributes
->contains(attributeName
)) {
372 errDuplicateAttribute();
373 attributeName
= nullptr;
377 void nsHtml5Tokenizer::addAttributeWithoutValue() {
379 attributes
->addAttribute(
380 attributeName
, nsHtml5Portability::newEmptyString(), attributeLine
);
381 attributeName
= nullptr;
383 clearStrBufAfterUse();
387 void nsHtml5Tokenizer::addAttributeWithValue() {
389 nsHtml5String val
= strBufToString();
391 mViewSource
->MaybeLinkifyAttributeValue(attributeName
, val
);
393 attributes
->addAttribute(attributeName
, val
, attributeLine
);
394 attributeName
= nullptr;
396 clearStrBufAfterUse();
400 void nsHtml5Tokenizer::start() {
401 initializeWithoutStarting();
402 tokenHandler
->startTokenization(this);
405 nextCharOnNewLine
= true;
408 bool nsHtml5Tokenizer::tokenizeBuffer(nsHtml5UTF16Buffer
* buffer
) {
409 int32_t state
= stateSave
;
410 int32_t returnState
= returnStateSave
;
412 shouldSuspend
= false;
414 int32_t start
= buffer
->getStart();
415 int32_t end
= buffer
->getEnd();
416 int32_t pos
= start
- 1;
424 case SCRIPT_DATA_ESCAPED
:
425 case SCRIPT_DATA_ESCAPE_START
:
426 case SCRIPT_DATA_ESCAPE_START_DASH
:
427 case SCRIPT_DATA_ESCAPED_DASH
:
428 case SCRIPT_DATA_ESCAPED_DASH_DASH
:
429 case SCRIPT_DATA_DOUBLE_ESCAPE_START
:
430 case SCRIPT_DATA_DOUBLE_ESCAPED
:
431 case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN
:
432 case SCRIPT_DATA_DOUBLE_ESCAPED_DASH
:
433 case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH
:
434 case SCRIPT_DATA_DOUBLE_ESCAPE_END
: {
444 mViewSource
->SetBuffer(buffer
);
445 pos
= stateLoop
<nsHtml5ViewSourcePolicy
>(state
, c
, pos
, buffer
->getBuffer(),
448 mViewSource
->DropBuffer((pos
== buffer
->getEnd()) ? pos
: pos
+ 1);
450 pos
= stateLoop
<nsHtml5SilentPolicy
>(state
, c
, pos
, buffer
->getBuffer(),
451 false, returnState
, buffer
->getEnd());
454 buffer
->setStart(pos
);
456 buffer
->setStart(pos
+ 1);
462 int32_t nsHtml5Tokenizer::stateLoop(int32_t state
, char16_t c
, int32_t pos
,
463 char16_t
* buf
, bool reconsume
,
464 int32_t returnState
, int32_t endPos
) {
465 bool reportedConsecutiveHyphens
= false;
474 if (++pos
== endPos
) {
475 NS_HTML5_BREAK(stateloop
);
477 c
= checkChar(buf
, pos
);
481 flushChars(buf
, pos
);
482 MOZ_ASSERT(!charRefBufLen
,
483 "charRefBufLen not reset after previous use!");
485 setAdditionalAndRememberAmpersandLocation('\0');
488 P::transition(mViewSource
.get(),
489 nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE
,
491 NS_HTML5_CONTINUE(stateloop
);
494 flushChars(buf
, pos
);
495 state
= P::transition(mViewSource
.get(),
496 nsHtml5Tokenizer::TAG_OPEN
, reconsume
, pos
);
497 NS_HTML5_BREAK(dataloop
);
500 maybeEmitReplacementCharacter(buf
, pos
);
504 emitCarriageReturn(buf
, pos
);
505 NS_HTML5_BREAK(stateloop
);
521 if (++pos
== endPos
) {
522 NS_HTML5_BREAK(stateloop
);
524 c
= checkChar(buf
, pos
);
525 if (c
>= 'A' && c
<= 'Z') {
527 clearStrBufBeforeUse();
528 appendStrBuf((char16_t
)(c
+ 0x20));
529 containsHyphen
= false;
530 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::TAG_NAME
,
532 NS_HTML5_BREAK(tagopenloop
);
533 } else if (c
>= 'a' && c
<= 'z') {
535 clearStrBufBeforeUse();
537 containsHyphen
= false;
538 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::TAG_NAME
,
540 NS_HTML5_BREAK(tagopenloop
);
544 state
= P::transition(mViewSource
.get(),
545 nsHtml5Tokenizer::MARKUP_DECLARATION_OPEN
,
547 NS_HTML5_CONTINUE(stateloop
);
550 state
= P::transition(mViewSource
.get(),
551 nsHtml5Tokenizer::CLOSE_TAG_OPEN
, reconsume
,
553 NS_HTML5_CONTINUE(stateloop
);
556 if (viewingXmlSource
) {
557 state
= P::transition(mViewSource
.get(),
558 nsHtml5Tokenizer::PROCESSING_INSTRUCTION
,
560 NS_HTML5_CONTINUE(stateloop
);
562 if (P::reportErrors
) {
563 errProcessingInstruction();
565 clearStrBufBeforeUse();
567 state
= P::transition(mViewSource
.get(),
568 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
570 NS_HTML5_CONTINUE(stateloop
);
573 if (P::reportErrors
) {
576 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 2);
578 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
580 NS_HTML5_CONTINUE(stateloop
);
583 if (P::reportErrors
) {
584 errBadCharAfterLt(c
);
586 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
589 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
591 NS_HTML5_CONTINUE(stateloop
);
600 if (++pos
== endPos
) {
601 NS_HTML5_BREAK(stateloop
);
603 c
= checkChar(buf
, pos
);
606 silentCarriageReturn();
607 strBufToElementNameString();
608 state
= P::transition(mViewSource
.get(),
609 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
611 NS_HTML5_BREAK(stateloop
);
620 strBufToElementNameString();
621 state
= P::transition(mViewSource
.get(),
622 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
624 NS_HTML5_BREAK(tagnameloop
);
627 strBufToElementNameString();
628 state
= P::transition(mViewSource
.get(),
629 nsHtml5Tokenizer::SELF_CLOSING_START_TAG
,
631 NS_HTML5_CONTINUE(stateloop
);
634 strBufToElementNameString();
635 state
= P::transition(mViewSource
.get(),
636 emitCurrentTagToken(false, pos
), reconsume
,
639 NS_HTML5_BREAK(stateloop
);
641 NS_HTML5_CONTINUE(stateloop
);
648 if (c
>= 'A' && c
<= 'Z') {
650 } else if (c
== '-') {
651 containsHyphen
= true;
661 case BEFORE_ATTRIBUTE_NAME
: {
666 if (++pos
== endPos
) {
667 NS_HTML5_BREAK(stateloop
);
669 c
= checkChar(buf
, pos
);
673 silentCarriageReturn();
674 NS_HTML5_BREAK(stateloop
);
686 state
= P::transition(mViewSource
.get(),
687 nsHtml5Tokenizer::SELF_CLOSING_START_TAG
,
689 NS_HTML5_CONTINUE(stateloop
);
692 state
= P::transition(mViewSource
.get(),
693 emitCurrentTagToken(false, pos
), reconsume
,
696 NS_HTML5_BREAK(stateloop
);
698 NS_HTML5_CONTINUE(stateloop
);
708 if (P::reportErrors
) {
709 errBadCharBeforeAttributeNameOrNull(c
);
714 if (c
>= 'A' && c
<= 'Z') {
717 attributeLine
= line
;
718 clearStrBufBeforeUse();
720 state
= P::transition(mViewSource
.get(),
721 nsHtml5Tokenizer::ATTRIBUTE_NAME
, reconsume
,
723 NS_HTML5_BREAK(beforeattributenameloop
);
727 beforeattributenameloop_end
:;
730 case ATTRIBUTE_NAME
: {
732 if (++pos
== endPos
) {
733 NS_HTML5_BREAK(stateloop
);
735 c
= checkChar(buf
, pos
);
738 silentCarriageReturn();
739 attributeNameComplete();
740 state
= P::transition(mViewSource
.get(),
741 nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME
,
743 NS_HTML5_BREAK(stateloop
);
752 attributeNameComplete();
753 state
= P::transition(mViewSource
.get(),
754 nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME
,
756 NS_HTML5_CONTINUE(stateloop
);
759 attributeNameComplete();
760 addAttributeWithoutValue();
761 state
= P::transition(mViewSource
.get(),
762 nsHtml5Tokenizer::SELF_CLOSING_START_TAG
,
764 NS_HTML5_CONTINUE(stateloop
);
767 attributeNameComplete();
768 state
= P::transition(mViewSource
.get(),
769 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE
,
771 NS_HTML5_BREAK(attributenameloop
);
774 attributeNameComplete();
775 addAttributeWithoutValue();
776 state
= P::transition(mViewSource
.get(),
777 emitCurrentTagToken(false, pos
), reconsume
,
780 NS_HTML5_BREAK(stateloop
);
782 NS_HTML5_CONTINUE(stateloop
);
791 if (P::reportErrors
) {
792 errQuoteOrLtInAttributeNameOrNull(c
);
797 if (c
>= 'A' && c
<= 'Z') {
805 attributenameloop_end
:;
808 case BEFORE_ATTRIBUTE_VALUE
: {
810 if (++pos
== endPos
) {
811 NS_HTML5_BREAK(stateloop
);
813 c
= checkChar(buf
, pos
);
816 silentCarriageReturn();
817 NS_HTML5_BREAK(stateloop
);
829 attributeLine
= line
;
830 clearStrBufBeforeUse();
832 P::transition(mViewSource
.get(),
833 nsHtml5Tokenizer::ATTRIBUTE_VALUE_DOUBLE_QUOTED
,
835 NS_HTML5_BREAK(beforeattributevalueloop
);
838 attributeLine
= line
;
839 clearStrBufBeforeUse();
841 state
= P::transition(mViewSource
.get(),
842 nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED
,
845 NS_HTML5_CONTINUE(stateloop
);
848 attributeLine
= line
;
849 clearStrBufBeforeUse();
851 P::transition(mViewSource
.get(),
852 nsHtml5Tokenizer::ATTRIBUTE_VALUE_SINGLE_QUOTED
,
854 NS_HTML5_CONTINUE(stateloop
);
857 if (P::reportErrors
) {
858 errAttributeValueMissing();
860 addAttributeWithoutValue();
861 state
= P::transition(mViewSource
.get(),
862 emitCurrentTagToken(false, pos
), reconsume
,
865 NS_HTML5_BREAK(stateloop
);
867 NS_HTML5_CONTINUE(stateloop
);
876 if (P::reportErrors
) {
877 errLtOrEqualsOrGraveInUnquotedAttributeOrNull(c
);
882 attributeLine
= line
;
883 clearStrBufBeforeUse();
885 state
= P::transition(mViewSource
.get(),
886 nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED
,
889 NS_HTML5_CONTINUE(stateloop
);
893 beforeattributevalueloop_end
:;
896 case ATTRIBUTE_VALUE_DOUBLE_QUOTED
: {
901 if (++pos
== endPos
) {
902 NS_HTML5_BREAK(stateloop
);
904 c
= checkChar(buf
, pos
);
908 addAttributeWithValue();
910 P::transition(mViewSource
.get(),
911 nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED
,
913 NS_HTML5_BREAK(attributevaluedoublequotedloop
);
916 MOZ_ASSERT(!charRefBufLen
,
917 "charRefBufLen not reset after previous use!");
919 setAdditionalAndRememberAmpersandLocation('\"');
922 P::transition(mViewSource
.get(),
923 nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE
,
925 NS_HTML5_CONTINUE(stateloop
);
928 appendStrBufCarriageReturn();
929 NS_HTML5_BREAK(stateloop
);
932 appendStrBufLineFeed();
945 attributevaluedoublequotedloop_end
:;
948 case AFTER_ATTRIBUTE_VALUE_QUOTED
: {
950 if (++pos
== endPos
) {
951 NS_HTML5_BREAK(stateloop
);
953 c
= checkChar(buf
, pos
);
956 silentCarriageReturn();
957 state
= P::transition(mViewSource
.get(),
958 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
960 NS_HTML5_BREAK(stateloop
);
969 state
= P::transition(mViewSource
.get(),
970 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
972 NS_HTML5_CONTINUE(stateloop
);
975 state
= P::transition(mViewSource
.get(),
976 nsHtml5Tokenizer::SELF_CLOSING_START_TAG
,
978 NS_HTML5_BREAK(afterattributevaluequotedloop
);
981 state
= P::transition(mViewSource
.get(),
982 emitCurrentTagToken(false, pos
), reconsume
,
985 NS_HTML5_BREAK(stateloop
);
987 NS_HTML5_CONTINUE(stateloop
);
990 if (P::reportErrors
) {
991 errNoSpaceBetweenAttributes();
994 state
= P::transition(mViewSource
.get(),
995 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
997 NS_HTML5_CONTINUE(stateloop
);
1001 afterattributevaluequotedloop_end
:;
1004 case SELF_CLOSING_START_TAG
: {
1005 if (++pos
== endPos
) {
1006 NS_HTML5_BREAK(stateloop
);
1008 c
= checkChar(buf
, pos
);
1012 P::transition(mViewSource
.get(), emitCurrentTagToken(true, pos
),
1014 if (shouldSuspend
) {
1015 NS_HTML5_BREAK(stateloop
);
1017 NS_HTML5_CONTINUE(stateloop
);
1020 if (P::reportErrors
) {
1021 errSlashNotFollowedByGt();
1024 state
= P::transition(mViewSource
.get(),
1025 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
1027 NS_HTML5_CONTINUE(stateloop
);
1031 case ATTRIBUTE_VALUE_UNQUOTED
: {
1036 if (++pos
== endPos
) {
1037 NS_HTML5_BREAK(stateloop
);
1039 c
= checkChar(buf
, pos
);
1043 silentCarriageReturn();
1044 addAttributeWithValue();
1045 state
= P::transition(mViewSource
.get(),
1046 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
1048 NS_HTML5_BREAK(stateloop
);
1057 addAttributeWithValue();
1058 state
= P::transition(mViewSource
.get(),
1059 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
1061 NS_HTML5_CONTINUE(stateloop
);
1064 MOZ_ASSERT(!charRefBufLen
,
1065 "charRefBufLen not reset after previous use!");
1066 appendCharRefBuf(c
);
1067 setAdditionalAndRememberAmpersandLocation('>');
1068 returnState
= state
;
1070 P::transition(mViewSource
.get(),
1071 nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE
,
1073 NS_HTML5_CONTINUE(stateloop
);
1076 addAttributeWithValue();
1077 state
= P::transition(mViewSource
.get(),
1078 emitCurrentTagToken(false, pos
), reconsume
,
1080 if (shouldSuspend
) {
1081 NS_HTML5_BREAK(stateloop
);
1083 NS_HTML5_CONTINUE(stateloop
);
1094 if (P::reportErrors
) {
1095 errUnquotedAttributeValOrNull(c
);
1106 case AFTER_ATTRIBUTE_NAME
: {
1108 if (++pos
== endPos
) {
1109 NS_HTML5_BREAK(stateloop
);
1111 c
= checkChar(buf
, pos
);
1114 silentCarriageReturn();
1115 NS_HTML5_BREAK(stateloop
);
1127 addAttributeWithoutValue();
1128 state
= P::transition(mViewSource
.get(),
1129 nsHtml5Tokenizer::SELF_CLOSING_START_TAG
,
1131 NS_HTML5_CONTINUE(stateloop
);
1134 state
= P::transition(mViewSource
.get(),
1135 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE
,
1137 NS_HTML5_CONTINUE(stateloop
);
1140 addAttributeWithoutValue();
1141 state
= P::transition(mViewSource
.get(),
1142 emitCurrentTagToken(false, pos
), reconsume
,
1144 if (shouldSuspend
) {
1145 NS_HTML5_BREAK(stateloop
);
1147 NS_HTML5_CONTINUE(stateloop
);
1156 if (P::reportErrors
) {
1157 errQuoteOrLtInAttributeNameOrNull(c
);
1162 addAttributeWithoutValue();
1163 if (c
>= 'A' && c
<= 'Z') {
1166 clearStrBufBeforeUse();
1168 state
= P::transition(mViewSource
.get(),
1169 nsHtml5Tokenizer::ATTRIBUTE_NAME
, reconsume
,
1171 NS_HTML5_CONTINUE(stateloop
);
1176 case MARKUP_DECLARATION_OPEN
: {
1178 if (++pos
== endPos
) {
1179 NS_HTML5_BREAK(stateloop
);
1181 c
= checkChar(buf
, pos
);
1184 clearStrBufBeforeUse();
1186 state
= P::transition(mViewSource
.get(),
1187 nsHtml5Tokenizer::MARKUP_DECLARATION_HYPHEN
,
1189 NS_HTML5_BREAK(markupdeclarationopenloop
);
1193 clearStrBufBeforeUse();
1196 state
= P::transition(mViewSource
.get(),
1197 nsHtml5Tokenizer::MARKUP_DECLARATION_OCTYPE
,
1199 NS_HTML5_CONTINUE(stateloop
);
1202 if (tokenHandler
->cdataSectionAllowed()) {
1203 clearStrBufBeforeUse();
1206 state
= P::transition(mViewSource
.get(),
1207 nsHtml5Tokenizer::CDATA_START
, reconsume
,
1209 NS_HTML5_CONTINUE(stateloop
);
1214 if (P::reportErrors
) {
1217 clearStrBufBeforeUse();
1219 state
= P::transition(mViewSource
.get(),
1220 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
1222 NS_HTML5_CONTINUE(stateloop
);
1226 markupdeclarationopenloop_end
:;
1229 case MARKUP_DECLARATION_HYPHEN
: {
1231 if (++pos
== endPos
) {
1232 NS_HTML5_BREAK(stateloop
);
1234 c
= checkChar(buf
, pos
);
1237 clearStrBufAfterOneHyphen();
1238 state
= P::transition(mViewSource
.get(),
1239 nsHtml5Tokenizer::COMMENT_START
, reconsume
,
1241 NS_HTML5_BREAK(markupdeclarationhyphenloop
);
1244 if (P::reportErrors
) {
1248 state
= P::transition(mViewSource
.get(),
1249 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
1251 NS_HTML5_CONTINUE(stateloop
);
1255 markupdeclarationhyphenloop_end
:;
1258 case COMMENT_START
: {
1259 reportedConsecutiveHyphens
= false;
1261 if (++pos
== endPos
) {
1262 NS_HTML5_BREAK(stateloop
);
1264 c
= checkChar(buf
, pos
);
1268 state
= P::transition(mViewSource
.get(),
1269 nsHtml5Tokenizer::COMMENT_START_DASH
,
1271 NS_HTML5_CONTINUE(stateloop
);
1274 if (P::reportErrors
) {
1275 errPrematureEndOfComment();
1277 emitComment(0, pos
);
1278 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
1280 if (shouldSuspend
) {
1281 NS_HTML5_BREAK(stateloop
);
1283 NS_HTML5_CONTINUE(stateloop
);
1287 state
= P::transition(mViewSource
.get(),
1288 nsHtml5Tokenizer::COMMENT_LESSTHAN
,
1290 NS_HTML5_CONTINUE(stateloop
);
1293 appendStrBufCarriageReturn();
1294 state
= P::transition(mViewSource
.get(),
1295 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1296 NS_HTML5_BREAK(stateloop
);
1299 appendStrBufLineFeed();
1300 state
= P::transition(mViewSource
.get(),
1301 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1302 NS_HTML5_BREAK(commentstartloop
);
1310 state
= P::transition(mViewSource
.get(),
1311 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1312 NS_HTML5_BREAK(commentstartloop
);
1316 commentstartloop_end
:;
1321 if (++pos
== endPos
) {
1322 NS_HTML5_BREAK(stateloop
);
1324 c
= checkChar(buf
, pos
);
1328 state
= P::transition(mViewSource
.get(),
1329 nsHtml5Tokenizer::COMMENT_END_DASH
,
1331 NS_HTML5_BREAK(commentloop
);
1335 state
= P::transition(mViewSource
.get(),
1336 nsHtml5Tokenizer::COMMENT_LESSTHAN
,
1338 NS_HTML5_CONTINUE(stateloop
);
1341 appendStrBufCarriageReturn();
1342 NS_HTML5_BREAK(stateloop
);
1345 appendStrBufLineFeed();
1361 case COMMENT_END_DASH
: {
1363 if (++pos
== endPos
) {
1364 NS_HTML5_BREAK(stateloop
);
1366 c
= checkChar(buf
, pos
);
1371 P::transition(mViewSource
.get(),
1372 nsHtml5Tokenizer::COMMENT_END
, reconsume
, pos
);
1373 NS_HTML5_BREAK(commentenddashloop
);
1377 state
= P::transition(mViewSource
.get(),
1378 nsHtml5Tokenizer::COMMENT_LESSTHAN
,
1380 NS_HTML5_CONTINUE(stateloop
);
1383 appendStrBufCarriageReturn();
1384 state
= P::transition(mViewSource
.get(),
1385 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1386 NS_HTML5_BREAK(stateloop
);
1389 appendStrBufLineFeed();
1390 state
= P::transition(mViewSource
.get(),
1391 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1392 NS_HTML5_CONTINUE(stateloop
);
1400 state
= P::transition(mViewSource
.get(),
1401 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1402 NS_HTML5_CONTINUE(stateloop
);
1406 commentenddashloop_end
:;
1411 if (++pos
== endPos
) {
1412 NS_HTML5_BREAK(stateloop
);
1414 c
= checkChar(buf
, pos
);
1417 emitComment(2, pos
);
1418 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
1420 if (shouldSuspend
) {
1421 NS_HTML5_BREAK(stateloop
);
1423 NS_HTML5_CONTINUE(stateloop
);
1426 adjustDoubleHyphenAndAppendToStrBufAndErr(
1427 c
, reportedConsecutiveHyphens
);
1428 reportedConsecutiveHyphens
= true;
1433 state
= P::transition(mViewSource
.get(),
1434 nsHtml5Tokenizer::COMMENT_LESSTHAN
,
1436 NS_HTML5_CONTINUE(stateloop
);
1439 adjustDoubleHyphenAndAppendToStrBufCarriageReturn();
1440 state
= P::transition(mViewSource
.get(),
1441 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1442 NS_HTML5_BREAK(stateloop
);
1445 adjustDoubleHyphenAndAppendToStrBufLineFeed();
1446 state
= P::transition(mViewSource
.get(),
1447 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1448 NS_HTML5_CONTINUE(stateloop
);
1452 state
= P::transition(mViewSource
.get(),
1453 nsHtml5Tokenizer::COMMENT_END_BANG
,
1455 NS_HTML5_BREAK(commentendloop
);
1462 adjustDoubleHyphenAndAppendToStrBufAndErr(
1463 c
, reportedConsecutiveHyphens
);
1464 reportedConsecutiveHyphens
= true;
1465 state
= P::transition(mViewSource
.get(),
1466 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1467 NS_HTML5_CONTINUE(stateloop
);
1471 commentendloop_end
:;
1474 case COMMENT_END_BANG
: {
1476 if (++pos
== endPos
) {
1477 NS_HTML5_BREAK(stateloop
);
1479 c
= checkChar(buf
, pos
);
1482 emitComment(3, pos
);
1483 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
1485 if (shouldSuspend
) {
1486 NS_HTML5_BREAK(stateloop
);
1488 NS_HTML5_CONTINUE(stateloop
);
1492 state
= P::transition(mViewSource
.get(),
1493 nsHtml5Tokenizer::COMMENT_END_DASH
,
1495 NS_HTML5_CONTINUE(stateloop
);
1498 appendStrBufCarriageReturn();
1499 state
= P::transition(mViewSource
.get(),
1500 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1501 NS_HTML5_BREAK(stateloop
);
1504 appendStrBufLineFeed();
1505 state
= P::transition(mViewSource
.get(),
1506 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1507 NS_HTML5_CONTINUE(stateloop
);
1515 state
= P::transition(mViewSource
.get(),
1516 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1517 NS_HTML5_CONTINUE(stateloop
);
1522 case COMMENT_LESSTHAN
: {
1524 if (++pos
== endPos
) {
1525 NS_HTML5_BREAK(stateloop
);
1527 c
= checkChar(buf
, pos
);
1531 state
= P::transition(mViewSource
.get(),
1532 nsHtml5Tokenizer::COMMENT_LESSTHAN_BANG
,
1534 NS_HTML5_BREAK(commentlessthanloop
);
1542 state
= P::transition(mViewSource
.get(),
1543 nsHtml5Tokenizer::COMMENT_END_DASH
,
1545 NS_HTML5_CONTINUE(stateloop
);
1548 appendStrBufCarriageReturn();
1549 state
= P::transition(mViewSource
.get(),
1550 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1551 NS_HTML5_BREAK(stateloop
);
1554 appendStrBufLineFeed();
1555 state
= P::transition(mViewSource
.get(),
1556 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1557 NS_HTML5_CONTINUE(stateloop
);
1565 state
= P::transition(mViewSource
.get(),
1566 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1567 NS_HTML5_CONTINUE(stateloop
);
1571 commentlessthanloop_end
:;
1574 case COMMENT_LESSTHAN_BANG
: {
1576 if (++pos
== endPos
) {
1577 NS_HTML5_BREAK(stateloop
);
1579 c
= checkChar(buf
, pos
);
1583 state
= P::transition(
1585 nsHtml5Tokenizer::COMMENT_LESSTHAN_BANG_DASH
, reconsume
, pos
);
1586 NS_HTML5_BREAK(commentlessthanbangloop
);
1590 state
= P::transition(mViewSource
.get(),
1591 nsHtml5Tokenizer::COMMENT_LESSTHAN
,
1593 NS_HTML5_CONTINUE(stateloop
);
1596 appendStrBufCarriageReturn();
1597 state
= P::transition(mViewSource
.get(),
1598 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1599 NS_HTML5_BREAK(stateloop
);
1602 appendStrBufLineFeed();
1603 state
= P::transition(mViewSource
.get(),
1604 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1605 NS_HTML5_CONTINUE(stateloop
);
1613 state
= P::transition(mViewSource
.get(),
1614 nsHtml5Tokenizer::COMMENT
, reconsume
, pos
);
1615 NS_HTML5_CONTINUE(stateloop
);
1619 commentlessthanbangloop_end
:;
1622 case COMMENT_LESSTHAN_BANG_DASH
: {
1623 if (++pos
== endPos
) {
1624 NS_HTML5_BREAK(stateloop
);
1626 c
= checkChar(buf
, pos
);
1631 P::transition(mViewSource
.get(),
1632 nsHtml5Tokenizer::COMMENT_LESSTHAN_BANG_DASH_DASH
,
1638 state
= P::transition(mViewSource
.get(),
1639 nsHtml5Tokenizer::COMMENT_LESSTHAN
, reconsume
,
1641 NS_HTML5_CONTINUE(stateloop
);
1644 appendStrBufCarriageReturn();
1645 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1647 NS_HTML5_BREAK(stateloop
);
1650 appendStrBufLineFeed();
1651 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1653 NS_HTML5_CONTINUE(stateloop
);
1661 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1663 NS_HTML5_CONTINUE(stateloop
);
1668 case COMMENT_LESSTHAN_BANG_DASH_DASH
: {
1669 if (++pos
== endPos
) {
1670 NS_HTML5_BREAK(stateloop
);
1672 c
= checkChar(buf
, pos
);
1676 emitComment(3, pos
);
1677 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
1679 if (shouldSuspend
) {
1680 NS_HTML5_BREAK(stateloop
);
1682 NS_HTML5_CONTINUE(stateloop
);
1685 if (P::reportErrors
) {
1688 adjustDoubleHyphenAndAppendToStrBufAndErr(
1689 c
, reportedConsecutiveHyphens
);
1690 reportedConsecutiveHyphens
= true;
1692 P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT_END
,
1694 NS_HTML5_CONTINUE(stateloop
);
1698 silentCarriageReturn();
1699 if (P::reportErrors
) {
1702 adjustDoubleHyphenAndAppendToStrBufAndErr(
1703 c
, reportedConsecutiveHyphens
);
1704 reportedConsecutiveHyphens
= true;
1705 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1707 NS_HTML5_BREAK(stateloop
);
1711 if (P::reportErrors
) {
1714 adjustDoubleHyphenAndAppendToStrBufAndErr(
1715 c
, reportedConsecutiveHyphens
);
1716 reportedConsecutiveHyphens
= true;
1717 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1719 NS_HTML5_CONTINUE(stateloop
);
1722 if (P::reportErrors
) {
1725 adjustDoubleHyphenAndAppendToStrBufAndErr(
1726 c
, reportedConsecutiveHyphens
);
1727 reportedConsecutiveHyphens
= true;
1728 state
= P::transition(mViewSource
.get(),
1729 nsHtml5Tokenizer::COMMENT_END_BANG
, reconsume
,
1731 NS_HTML5_CONTINUE(stateloop
);
1738 if (P::reportErrors
) {
1741 adjustDoubleHyphenAndAppendToStrBufAndErr(
1742 c
, reportedConsecutiveHyphens
);
1743 reportedConsecutiveHyphens
= true;
1744 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1746 NS_HTML5_CONTINUE(stateloop
);
1750 case COMMENT_START_DASH
: {
1751 if (++pos
== endPos
) {
1752 NS_HTML5_BREAK(stateloop
);
1754 c
= checkChar(buf
, pos
);
1759 P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT_END
,
1761 NS_HTML5_CONTINUE(stateloop
);
1764 if (P::reportErrors
) {
1765 errPrematureEndOfComment();
1767 emitComment(1, pos
);
1768 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
1770 if (shouldSuspend
) {
1771 NS_HTML5_BREAK(stateloop
);
1773 NS_HTML5_CONTINUE(stateloop
);
1777 state
= P::transition(mViewSource
.get(),
1778 nsHtml5Tokenizer::COMMENT_LESSTHAN
, reconsume
,
1780 NS_HTML5_CONTINUE(stateloop
);
1783 appendStrBufCarriageReturn();
1784 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1786 NS_HTML5_BREAK(stateloop
);
1789 appendStrBufLineFeed();
1790 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1792 NS_HTML5_CONTINUE(stateloop
);
1800 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::COMMENT
,
1802 NS_HTML5_CONTINUE(stateloop
);
1808 if (++pos
== endPos
) {
1809 NS_HTML5_BREAK(stateloop
);
1811 c
= checkChar(buf
, pos
);
1813 if (c
== nsHtml5Tokenizer::CDATA_LSQB
[index
]) {
1816 if (P::reportErrors
) {
1820 state
= P::transition(mViewSource
.get(),
1821 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
1823 NS_HTML5_CONTINUE(stateloop
);
1828 clearStrBufAfterUse();
1832 P::transition(mViewSource
.get(),
1833 nsHtml5Tokenizer::CDATA_SECTION
, reconsume
, pos
);
1839 case CDATA_SECTION
: {
1844 if (++pos
== endPos
) {
1845 NS_HTML5_BREAK(stateloop
);
1847 c
= checkChar(buf
, pos
);
1851 flushChars(buf
, pos
);
1853 P::transition(mViewSource
.get(), nsHtml5Tokenizer::CDATA_RSQB
,
1855 NS_HTML5_BREAK(cdatasectionloop
);
1858 maybeEmitReplacementCharacter(buf
, pos
);
1862 emitCarriageReturn(buf
, pos
);
1863 NS_HTML5_BREAK(stateloop
);
1874 cdatasectionloop_end
:;
1878 if (++pos
== endPos
) {
1879 NS_HTML5_BREAK(stateloop
);
1881 c
= checkChar(buf
, pos
);
1884 state
= P::transition(mViewSource
.get(),
1885 nsHtml5Tokenizer::CDATA_RSQB_RSQB
, reconsume
,
1890 tokenHandler
->characters(nsHtml5Tokenizer::RSQB_RSQB
, 0, 1);
1894 P::transition(mViewSource
.get(),
1895 nsHtml5Tokenizer::CDATA_SECTION
, reconsume
, pos
);
1896 NS_HTML5_CONTINUE(stateloop
);
1901 case CDATA_RSQB_RSQB
: {
1903 if (++pos
== endPos
) {
1904 NS_HTML5_BREAK(stateloop
);
1906 c
= checkChar(buf
, pos
);
1909 tokenHandler
->characters(nsHtml5Tokenizer::RSQB_RSQB
, 0, 1);
1914 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
1916 suspendIfRequestedAfterCurrentNonTextToken();
1917 if (shouldSuspend
) {
1918 NS_HTML5_BREAK(stateloop
);
1920 NS_HTML5_CONTINUE(stateloop
);
1923 tokenHandler
->characters(nsHtml5Tokenizer::RSQB_RSQB
, 0, 2);
1926 state
= P::transition(mViewSource
.get(),
1927 nsHtml5Tokenizer::CDATA_SECTION
, reconsume
,
1929 NS_HTML5_CONTINUE(stateloop
);
1934 case ATTRIBUTE_VALUE_SINGLE_QUOTED
: {
1939 if (++pos
== endPos
) {
1940 NS_HTML5_BREAK(stateloop
);
1942 c
= checkChar(buf
, pos
);
1946 addAttributeWithValue();
1948 P::transition(mViewSource
.get(),
1949 nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED
,
1951 NS_HTML5_CONTINUE(stateloop
);
1954 MOZ_ASSERT(!charRefBufLen
,
1955 "charRefBufLen not reset after previous use!");
1956 appendCharRefBuf(c
);
1957 setAdditionalAndRememberAmpersandLocation('\'');
1958 returnState
= state
;
1960 P::transition(mViewSource
.get(),
1961 nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE
,
1963 NS_HTML5_BREAK(attributevaluesinglequotedloop
);
1966 appendStrBufCarriageReturn();
1967 NS_HTML5_BREAK(stateloop
);
1970 appendStrBufLineFeed();
1983 attributevaluesinglequotedloop_end
:;
1986 case CONSUME_CHARACTER_REFERENCE
: {
1987 if (++pos
== endPos
) {
1988 NS_HTML5_BREAK(stateloop
);
1990 c
= checkChar(buf
, pos
);
2001 emitOrAppendCharRefBuf(returnState
);
2002 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2007 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2008 NS_HTML5_CONTINUE(stateloop
);
2011 appendCharRefBuf('#');
2013 P::transition(mViewSource
.get(), nsHtml5Tokenizer::CONSUME_NCR
,
2015 NS_HTML5_CONTINUE(stateloop
);
2018 if (c
== additional
) {
2019 emitOrAppendCharRefBuf(returnState
);
2022 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2023 NS_HTML5_CONTINUE(stateloop
);
2025 if (c
>= 'a' && c
<= 'z') {
2026 firstCharKey
= c
- 'a' + 26;
2027 } else if (c
>= 'A' && c
<= 'Z') {
2028 firstCharKey
= c
- 'A';
2031 if (P::reportErrors
) {
2032 errNoNamedCharacterMatch();
2035 emitOrAppendCharRefBuf(returnState
);
2036 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2041 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2042 NS_HTML5_CONTINUE(stateloop
);
2044 appendCharRefBuf(c
);
2046 P::transition(mViewSource
.get(),
2047 nsHtml5Tokenizer::CHARACTER_REFERENCE_HILO_LOOKUP
,
2054 case CHARACTER_REFERENCE_HILO_LOOKUP
: {
2056 if (++pos
== endPos
) {
2057 NS_HTML5_BREAK(stateloop
);
2059 c
= checkChar(buf
, pos
);
2062 const int32_t* row
= nsHtml5NamedCharactersAccel::HILO_ACCEL
[c
];
2064 hilo
= row
[firstCharKey
];
2069 if (P::reportErrors
) {
2070 errNoNamedCharacterMatch();
2073 emitOrAppendCharRefBuf(returnState
);
2074 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2079 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2080 NS_HTML5_CONTINUE(stateloop
);
2082 appendCharRefBuf(c
);
2088 state
= P::transition(mViewSource
.get(),
2089 nsHtml5Tokenizer::CHARACTER_REFERENCE_TAIL
,
2094 case CHARACTER_REFERENCE_TAIL
: {
2096 if (++pos
== endPos
) {
2097 NS_HTML5_BREAK(stateloop
);
2099 c
= checkChar(buf
, pos
);
2103 NS_HTML5_BREAK(outer
);
2105 if (entCol
== nsHtml5NamedCharacters::NAMES
[lo
].length()) {
2107 charRefBufMark
= charRefBufLen
;
2109 } else if (entCol
> nsHtml5NamedCharacters::NAMES
[lo
].length()) {
2110 NS_HTML5_BREAK(outer
);
2111 } else if (c
> nsHtml5NamedCharacters::NAMES
[lo
].charAt(entCol
)) {
2114 NS_HTML5_BREAK(loloop
);
2120 NS_HTML5_BREAK(outer
);
2122 if (entCol
== nsHtml5NamedCharacters::NAMES
[hi
].length()) {
2123 NS_HTML5_BREAK(hiloop
);
2125 if (entCol
> nsHtml5NamedCharacters::NAMES
[hi
].length()) {
2126 NS_HTML5_BREAK(outer
);
2127 } else if (c
< nsHtml5NamedCharacters::NAMES
[hi
].charAt(entCol
)) {
2130 NS_HTML5_BREAK(hiloop
);
2135 if (entCol
+ 1 == nsHtml5NamedCharacters::NAMES
[lo
].length()) {
2137 charRefBufMark
= charRefBufLen
;
2139 NS_HTML5_BREAK(outer
);
2142 NS_HTML5_BREAK(outer
);
2144 appendCharRefBuf(c
);
2148 if (candidate
== -1) {
2150 if (P::reportErrors
) {
2151 errNoNamedCharacterMatch();
2154 emitOrAppendCharRefBuf(returnState
);
2155 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2159 state
= P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2160 NS_HTML5_CONTINUE(stateloop
);
2162 const nsHtml5CharacterName
& candidateName
=
2163 nsHtml5NamedCharacters::NAMES
[candidate
];
2164 if (!candidateName
.length() ||
2165 candidateName
.charAt(candidateName
.length() - 1) != ';') {
2166 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
2168 if (charRefBufMark
== charRefBufLen
) {
2171 ch
= charRefBuf
[charRefBufMark
];
2173 if (ch
== '=' || (ch
>= '0' && ch
<= '9') ||
2174 (ch
>= 'A' && ch
<= 'Z') || (ch
>= 'a' && ch
<= 'z')) {
2176 if (P::reportErrors
) {
2177 errNoNamedCharacterMatch();
2180 appendCharRefBufToStrBuf();
2182 state
= P::transition(mViewSource
.get(), returnState
, reconsume
,
2184 NS_HTML5_CONTINUE(stateloop
);
2187 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
2188 if (P::reportErrors
) {
2189 errUnescapedAmpersandInterpretedAsCharacterReference();
2192 if (P::reportErrors
) {
2193 errNotSemicolonTerminated();
2197 P::completedNamedCharacterReference(mViewSource
.get());
2198 const char16_t
* val
= nsHtml5NamedCharacters::VALUES
[candidate
];
2200 emitOrAppendOne(val
, returnState
);
2202 emitOrAppendTwo(val
, returnState
);
2204 if (charRefBufMark
< charRefBufLen
) {
2205 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
2206 appendStrBuf(charRefBuf
, charRefBufMark
,
2207 charRefBufLen
- charRefBufMark
);
2209 tokenHandler
->characters(charRefBuf
, charRefBufMark
,
2210 charRefBufLen
- charRefBufMark
);
2213 bool earlyBreak
= (c
== ';' && charRefBufMark
== charRefBufLen
);
2215 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2216 cstart
= earlyBreak
? pos
+ 1 : pos
;
2218 reconsume
= !earlyBreak
;
2219 state
= P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2220 NS_HTML5_CONTINUE(stateloop
);
2224 if (++pos
== endPos
) {
2225 NS_HTML5_BREAK(stateloop
);
2227 c
= checkChar(buf
, pos
);
2233 appendCharRefBuf(c
);
2235 P::transition(mViewSource
.get(), nsHtml5Tokenizer::HEX_NCR_LOOP
,
2237 NS_HTML5_CONTINUE(stateloop
);
2241 state
= P::transition(mViewSource
.get(),
2242 nsHtml5Tokenizer::DECIMAL_NRC_LOOP
, reconsume
,
2249 case DECIMAL_NRC_LOOP
: {
2254 if (++pos
== endPos
) {
2255 NS_HTML5_BREAK(stateloop
);
2257 c
= checkChar(buf
, pos
);
2259 MOZ_ASSERT(value
>= 0, "value must not become negative.");
2260 if (c
>= '0' && c
<= '9') {
2262 if (value
<= 0x10FFFF) {
2267 } else if (c
== ';') {
2269 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2272 state
= P::transition(mViewSource
.get(),
2273 nsHtml5Tokenizer::HANDLE_NCR_VALUE
,
2275 NS_HTML5_BREAK(decimalloop
);
2277 if (P::reportErrors
) {
2280 appendCharRefBuf(';');
2281 emitOrAppendCharRefBuf(returnState
);
2282 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2286 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2287 NS_HTML5_CONTINUE(stateloop
);
2291 if (P::reportErrors
) {
2294 emitOrAppendCharRefBuf(returnState
);
2295 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2300 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2301 NS_HTML5_CONTINUE(stateloop
);
2303 if (P::reportErrors
) {
2304 errCharRefLacksSemicolon();
2306 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2310 state
= P::transition(mViewSource
.get(),
2311 nsHtml5Tokenizer::HANDLE_NCR_VALUE
,
2313 NS_HTML5_BREAK(decimalloop
);
2320 case HANDLE_NCR_VALUE
: {
2322 handleNcrValue(returnState
);
2323 state
= P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2324 NS_HTML5_CONTINUE(stateloop
);
2326 case HEX_NCR_LOOP
: {
2328 if (++pos
== endPos
) {
2329 NS_HTML5_BREAK(stateloop
);
2331 c
= checkChar(buf
, pos
);
2332 MOZ_ASSERT(value
>= 0, "value must not become negative.");
2333 if (c
>= '0' && c
<= '9') {
2335 if (value
<= 0x10FFFF) {
2340 } else if (c
>= 'A' && c
<= 'F') {
2342 if (value
<= 0x10FFFF) {
2344 value
+= c
- 'A' + 10;
2347 } else if (c
>= 'a' && c
<= 'f') {
2349 if (value
<= 0x10FFFF) {
2351 value
+= c
- 'a' + 10;
2354 } else if (c
== ';') {
2356 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2359 state
= P::transition(mViewSource
.get(),
2360 nsHtml5Tokenizer::HANDLE_NCR_VALUE
,
2362 NS_HTML5_CONTINUE(stateloop
);
2364 if (P::reportErrors
) {
2367 appendCharRefBuf(';');
2368 emitOrAppendCharRefBuf(returnState
);
2369 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2373 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2374 NS_HTML5_CONTINUE(stateloop
);
2378 if (P::reportErrors
) {
2381 emitOrAppendCharRefBuf(returnState
);
2382 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2387 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2388 NS_HTML5_CONTINUE(stateloop
);
2390 if (P::reportErrors
) {
2391 errCharRefLacksSemicolon();
2393 if (!(returnState
& DATA_AND_RCDATA_MASK
)) {
2397 state
= P::transition(mViewSource
.get(),
2398 nsHtml5Tokenizer::HANDLE_NCR_VALUE
,
2400 NS_HTML5_CONTINUE(stateloop
);
2410 if (++pos
== endPos
) {
2411 NS_HTML5_BREAK(stateloop
);
2413 c
= checkChar(buf
, pos
);
2417 emitPlaintextReplacementCharacter(buf
, pos
);
2421 emitCarriageReturn(buf
, pos
);
2422 NS_HTML5_BREAK(stateloop
);
2434 case CLOSE_TAG_OPEN
: {
2435 if (++pos
== endPos
) {
2436 NS_HTML5_BREAK(stateloop
);
2438 c
= checkChar(buf
, pos
);
2441 if (P::reportErrors
) {
2445 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
2447 NS_HTML5_CONTINUE(stateloop
);
2450 silentCarriageReturn();
2451 if (P::reportErrors
) {
2452 errGarbageAfterLtSlash();
2454 clearStrBufBeforeUse();
2457 P::transition(mViewSource
.get(),
2458 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
, pos
);
2459 NS_HTML5_BREAK(stateloop
);
2463 if (P::reportErrors
) {
2464 errGarbageAfterLtSlash();
2466 clearStrBufBeforeUse();
2469 P::transition(mViewSource
.get(),
2470 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
, pos
);
2471 NS_HTML5_CONTINUE(stateloop
);
2478 if (c
>= 'A' && c
<= 'Z') {
2481 if (c
>= 'a' && c
<= 'z') {
2483 clearStrBufBeforeUse();
2485 containsHyphen
= false;
2486 state
= P::transition(mViewSource
.get(),
2487 nsHtml5Tokenizer::TAG_NAME
, reconsume
, pos
);
2488 NS_HTML5_CONTINUE(stateloop
);
2490 if (P::reportErrors
) {
2491 errGarbageAfterLtSlash();
2493 clearStrBufBeforeUse();
2495 state
= P::transition(mViewSource
.get(),
2496 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
2498 NS_HTML5_CONTINUE(stateloop
);
2508 if (++pos
== endPos
) {
2509 NS_HTML5_BREAK(stateloop
);
2511 c
= checkChar(buf
, pos
);
2515 flushChars(buf
, pos
);
2516 MOZ_ASSERT(!charRefBufLen
,
2517 "charRefBufLen not reset after previous use!");
2518 appendCharRefBuf(c
);
2519 setAdditionalAndRememberAmpersandLocation('\0');
2520 returnState
= state
;
2522 P::transition(mViewSource
.get(),
2523 nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE
,
2525 NS_HTML5_CONTINUE(stateloop
);
2528 flushChars(buf
, pos
);
2529 returnState
= state
;
2531 P::transition(mViewSource
.get(),
2532 nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN
,
2534 NS_HTML5_CONTINUE(stateloop
);
2537 emitReplacementCharacter(buf
, pos
);
2541 emitCarriageReturn(buf
, pos
);
2542 NS_HTML5_BREAK(stateloop
);
2559 if (++pos
== endPos
) {
2560 NS_HTML5_BREAK(stateloop
);
2562 c
= checkChar(buf
, pos
);
2566 flushChars(buf
, pos
);
2567 returnState
= state
;
2569 P::transition(mViewSource
.get(),
2570 nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN
,
2572 NS_HTML5_BREAK(rawtextloop
);
2575 emitReplacementCharacter(buf
, pos
);
2579 emitCarriageReturn(buf
, pos
);
2580 NS_HTML5_BREAK(stateloop
);
2594 case RAWTEXT_RCDATA_LESS_THAN_SIGN
: {
2596 if (++pos
== endPos
) {
2597 NS_HTML5_BREAK(stateloop
);
2599 c
= checkChar(buf
, pos
);
2603 clearStrBufBeforeUse();
2604 state
= P::transition(mViewSource
.get(),
2605 nsHtml5Tokenizer::NON_DATA_END_TAG_NAME
,
2607 NS_HTML5_BREAK(rawtextrcdatalessthansignloop
);
2610 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
2614 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2615 NS_HTML5_CONTINUE(stateloop
);
2619 rawtextrcdatalessthansignloop_end
:;
2622 case NON_DATA_END_TAG_NAME
: {
2624 if (++pos
== endPos
) {
2625 NS_HTML5_BREAK(stateloop
);
2627 c
= checkChar(buf
, pos
);
2628 if (!endTagExpectationAsArray
) {
2629 tokenHandler
->characters(nsHtml5Tokenizer::LT_SOLIDUS
, 0, 2);
2633 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2634 NS_HTML5_CONTINUE(stateloop
);
2635 } else if (index
< endTagExpectationAsArray
.length
) {
2636 char16_t e
= endTagExpectationAsArray
[index
];
2637 char16_t folded
= c
;
2638 if (c
>= 'A' && c
<= 'Z') {
2642 tokenHandler
->characters(nsHtml5Tokenizer::LT_SOLIDUS
, 0, 2);
2647 P::transition(mViewSource
.get(), returnState
, reconsume
, pos
);
2648 NS_HTML5_CONTINUE(stateloop
);
2655 tagName
= endTagExpectation
;
2658 silentCarriageReturn();
2659 clearStrBufAfterUse();
2660 state
= P::transition(mViewSource
.get(),
2661 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
2663 NS_HTML5_BREAK(stateloop
);
2672 clearStrBufAfterUse();
2673 state
= P::transition(mViewSource
.get(),
2674 nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME
,
2676 NS_HTML5_CONTINUE(stateloop
);
2679 clearStrBufAfterUse();
2680 state
= P::transition(mViewSource
.get(),
2681 nsHtml5Tokenizer::SELF_CLOSING_START_TAG
,
2683 NS_HTML5_CONTINUE(stateloop
);
2686 clearStrBufAfterUse();
2687 state
= P::transition(mViewSource
.get(),
2688 emitCurrentTagToken(false, pos
),
2690 if (shouldSuspend
) {
2691 NS_HTML5_BREAK(stateloop
);
2693 NS_HTML5_CONTINUE(stateloop
);
2696 tokenHandler
->characters(nsHtml5Tokenizer::LT_SOLIDUS
, 0, 2);
2700 state
= P::transition(mViewSource
.get(), returnState
, reconsume
,
2702 NS_HTML5_CONTINUE(stateloop
);
2708 case BOGUS_COMMENT
: {
2713 if (++pos
== endPos
) {
2714 NS_HTML5_BREAK(stateloop
);
2716 c
= checkChar(buf
, pos
);
2720 emitComment(0, pos
);
2721 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
2723 if (shouldSuspend
) {
2724 NS_HTML5_BREAK(stateloop
);
2726 NS_HTML5_CONTINUE(stateloop
);
2730 state
= P::transition(mViewSource
.get(),
2731 nsHtml5Tokenizer::BOGUS_COMMENT_HYPHEN
,
2733 NS_HTML5_BREAK(boguscommentloop
);
2736 appendStrBufCarriageReturn();
2737 NS_HTML5_BREAK(stateloop
);
2740 appendStrBufLineFeed();
2753 boguscommentloop_end
:;
2756 case BOGUS_COMMENT_HYPHEN
: {
2757 boguscommenthyphenloop
:
2759 if (++pos
== endPos
) {
2760 NS_HTML5_BREAK(stateloop
);
2762 c
= checkChar(buf
, pos
);
2765 emitComment(0, pos
);
2766 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
2768 if (shouldSuspend
) {
2769 NS_HTML5_BREAK(stateloop
);
2771 NS_HTML5_CONTINUE(stateloop
);
2774 appendSecondHyphenToBogusComment();
2775 NS_HTML5_CONTINUE(boguscommenthyphenloop
);
2778 appendStrBufCarriageReturn();
2779 state
= P::transition(mViewSource
.get(),
2780 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
2782 NS_HTML5_BREAK(stateloop
);
2785 appendStrBufLineFeed();
2786 state
= P::transition(mViewSource
.get(),
2787 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
2789 NS_HTML5_CONTINUE(stateloop
);
2797 state
= P::transition(mViewSource
.get(),
2798 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
2800 NS_HTML5_CONTINUE(stateloop
);
2810 if (++pos
== endPos
) {
2811 NS_HTML5_BREAK(stateloop
);
2813 c
= checkChar(buf
, pos
);
2817 flushChars(buf
, pos
);
2818 returnState
= state
;
2819 state
= P::transition(
2821 nsHtml5Tokenizer::SCRIPT_DATA_LESS_THAN_SIGN
, reconsume
, pos
);
2822 NS_HTML5_BREAK(scriptdataloop
);
2825 emitReplacementCharacter(buf
, pos
);
2829 emitCarriageReturn(buf
, pos
);
2830 NS_HTML5_BREAK(stateloop
);
2841 scriptdataloop_end
:;
2844 case SCRIPT_DATA_LESS_THAN_SIGN
: {
2846 if (++pos
== endPos
) {
2847 NS_HTML5_BREAK(stateloop
);
2849 c
= checkChar(buf
, pos
);
2853 clearStrBufBeforeUse();
2854 state
= P::transition(mViewSource
.get(),
2855 nsHtml5Tokenizer::NON_DATA_END_TAG_NAME
,
2857 NS_HTML5_CONTINUE(stateloop
);
2860 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
2862 state
= P::transition(mViewSource
.get(),
2863 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START
,
2865 NS_HTML5_BREAK(scriptdatalessthansignloop
);
2868 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
2872 P::transition(mViewSource
.get(),
2873 nsHtml5Tokenizer::SCRIPT_DATA
, reconsume
, pos
);
2874 NS_HTML5_CONTINUE(stateloop
);
2878 scriptdatalessthansignloop_end
:;
2881 case SCRIPT_DATA_ESCAPE_START
: {
2883 if (++pos
== endPos
) {
2884 NS_HTML5_BREAK(stateloop
);
2886 c
= checkChar(buf
, pos
);
2890 P::transition(mViewSource
.get(),
2891 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START_DASH
,
2893 NS_HTML5_BREAK(scriptdataescapestartloop
);
2898 P::transition(mViewSource
.get(),
2899 nsHtml5Tokenizer::SCRIPT_DATA
, reconsume
, pos
);
2900 NS_HTML5_CONTINUE(stateloop
);
2904 scriptdataescapestartloop_end
:;
2907 case SCRIPT_DATA_ESCAPE_START_DASH
: {
2909 if (++pos
== endPos
) {
2910 NS_HTML5_BREAK(stateloop
);
2912 c
= checkChar(buf
, pos
);
2916 P::transition(mViewSource
.get(),
2917 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH
,
2919 NS_HTML5_BREAK(scriptdataescapestartdashloop
);
2924 P::transition(mViewSource
.get(),
2925 nsHtml5Tokenizer::SCRIPT_DATA
, reconsume
, pos
);
2926 NS_HTML5_CONTINUE(stateloop
);
2930 scriptdataescapestartdashloop_end
:;
2933 case SCRIPT_DATA_ESCAPED_DASH_DASH
: {
2935 if (++pos
== endPos
) {
2936 NS_HTML5_BREAK(stateloop
);
2938 c
= checkChar(buf
, pos
);
2944 flushChars(buf
, pos
);
2945 state
= P::transition(
2947 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN
,
2949 NS_HTML5_CONTINUE(stateloop
);
2953 P::transition(mViewSource
.get(),
2954 nsHtml5Tokenizer::SCRIPT_DATA
, reconsume
, pos
);
2955 NS_HTML5_CONTINUE(stateloop
);
2958 emitReplacementCharacter(buf
, pos
);
2959 state
= P::transition(mViewSource
.get(),
2960 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
2962 NS_HTML5_BREAK(scriptdataescapeddashdashloop
);
2965 emitCarriageReturn(buf
, pos
);
2966 state
= P::transition(mViewSource
.get(),
2967 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
2969 NS_HTML5_BREAK(stateloop
);
2976 state
= P::transition(mViewSource
.get(),
2977 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
2979 NS_HTML5_BREAK(scriptdataescapeddashdashloop
);
2983 scriptdataescapeddashdashloop_end
:;
2986 case SCRIPT_DATA_ESCAPED
: {
2991 if (++pos
== endPos
) {
2992 NS_HTML5_BREAK(stateloop
);
2994 c
= checkChar(buf
, pos
);
2998 state
= P::transition(mViewSource
.get(),
2999 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH
,
3001 NS_HTML5_BREAK(scriptdataescapedloop
);
3004 flushChars(buf
, pos
);
3005 state
= P::transition(
3007 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN
,
3009 NS_HTML5_CONTINUE(stateloop
);
3012 emitReplacementCharacter(buf
, pos
);
3016 emitCarriageReturn(buf
, pos
);
3017 NS_HTML5_BREAK(stateloop
);
3028 scriptdataescapedloop_end
:;
3031 case SCRIPT_DATA_ESCAPED_DASH
: {
3033 if (++pos
== endPos
) {
3034 NS_HTML5_BREAK(stateloop
);
3036 c
= checkChar(buf
, pos
);
3040 P::transition(mViewSource
.get(),
3041 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH
,
3043 NS_HTML5_CONTINUE(stateloop
);
3046 flushChars(buf
, pos
);
3047 state
= P::transition(
3049 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN
,
3051 NS_HTML5_BREAK(scriptdataescapeddashloop
);
3054 emitReplacementCharacter(buf
, pos
);
3055 state
= P::transition(mViewSource
.get(),
3056 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
3058 NS_HTML5_CONTINUE(stateloop
);
3061 emitCarriageReturn(buf
, pos
);
3062 state
= P::transition(mViewSource
.get(),
3063 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
3065 NS_HTML5_BREAK(stateloop
);
3072 state
= P::transition(mViewSource
.get(),
3073 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
3075 NS_HTML5_CONTINUE(stateloop
);
3079 scriptdataescapeddashloop_end
:;
3082 case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN
: {
3084 if (++pos
== endPos
) {
3085 NS_HTML5_BREAK(stateloop
);
3087 c
= checkChar(buf
, pos
);
3091 clearStrBufBeforeUse();
3092 returnState
= nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
;
3093 state
= P::transition(mViewSource
.get(),
3094 nsHtml5Tokenizer::NON_DATA_END_TAG_NAME
,
3096 NS_HTML5_CONTINUE(stateloop
);
3100 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
3103 state
= P::transition(
3105 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_START
, reconsume
,
3107 NS_HTML5_BREAK(scriptdataescapedlessthanloop
);
3110 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
3113 state
= P::transition(mViewSource
.get(),
3114 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
3116 NS_HTML5_CONTINUE(stateloop
);
3120 scriptdataescapedlessthanloop_end
:;
3123 case SCRIPT_DATA_DOUBLE_ESCAPE_START
: {
3125 if (++pos
== endPos
) {
3126 NS_HTML5_BREAK(stateloop
);
3128 c
= checkChar(buf
, pos
);
3129 MOZ_ASSERT(index
> 0);
3131 char16_t folded
= c
;
3132 if (c
>= 'A' && c
<= 'Z') {
3135 if (folded
!= nsHtml5Tokenizer::SCRIPT_ARR
[index
]) {
3137 state
= P::transition(mViewSource
.get(),
3138 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
3140 NS_HTML5_CONTINUE(stateloop
);
3147 emitCarriageReturn(buf
, pos
);
3148 state
= P::transition(
3150 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3151 NS_HTML5_BREAK(stateloop
);
3162 state
= P::transition(
3164 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3165 NS_HTML5_BREAK(scriptdatadoubleescapestartloop
);
3169 state
= P::transition(mViewSource
.get(),
3170 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
3172 NS_HTML5_CONTINUE(stateloop
);
3176 scriptdatadoubleescapestartloop_end
:;
3179 case SCRIPT_DATA_DOUBLE_ESCAPED
: {
3184 if (++pos
== endPos
) {
3185 NS_HTML5_BREAK(stateloop
);
3187 c
= checkChar(buf
, pos
);
3191 state
= P::transition(
3193 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH
, reconsume
,
3195 NS_HTML5_BREAK(scriptdatadoubleescapedloop
);
3198 state
= P::transition(
3200 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN
,
3202 NS_HTML5_CONTINUE(stateloop
);
3205 emitReplacementCharacter(buf
, pos
);
3209 emitCarriageReturn(buf
, pos
);
3210 NS_HTML5_BREAK(stateloop
);
3221 scriptdatadoubleescapedloop_end
:;
3224 case SCRIPT_DATA_DOUBLE_ESCAPED_DASH
: {
3226 if (++pos
== endPos
) {
3227 NS_HTML5_BREAK(stateloop
);
3229 c
= checkChar(buf
, pos
);
3232 state
= P::transition(
3234 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH
,
3236 NS_HTML5_BREAK(scriptdatadoubleescapeddashloop
);
3239 state
= P::transition(
3241 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN
,
3243 NS_HTML5_CONTINUE(stateloop
);
3246 emitReplacementCharacter(buf
, pos
);
3247 state
= P::transition(
3249 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3250 NS_HTML5_CONTINUE(stateloop
);
3253 emitCarriageReturn(buf
, pos
);
3254 state
= P::transition(
3256 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3257 NS_HTML5_BREAK(stateloop
);
3264 state
= P::transition(
3266 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3267 NS_HTML5_CONTINUE(stateloop
);
3271 scriptdatadoubleescapeddashloop_end
:;
3274 case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH
: {
3276 if (++pos
== endPos
) {
3277 NS_HTML5_BREAK(stateloop
);
3279 c
= checkChar(buf
, pos
);
3285 state
= P::transition(
3287 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN
,
3289 NS_HTML5_BREAK(scriptdatadoubleescapeddashdashloop
);
3293 P::transition(mViewSource
.get(),
3294 nsHtml5Tokenizer::SCRIPT_DATA
, reconsume
, pos
);
3295 NS_HTML5_CONTINUE(stateloop
);
3298 emitReplacementCharacter(buf
, pos
);
3299 state
= P::transition(
3301 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3302 NS_HTML5_CONTINUE(stateloop
);
3305 emitCarriageReturn(buf
, pos
);
3306 state
= P::transition(
3308 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3309 NS_HTML5_BREAK(stateloop
);
3316 state
= P::transition(
3318 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3319 NS_HTML5_CONTINUE(stateloop
);
3323 scriptdatadoubleescapeddashdashloop_end
:;
3326 case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN
: {
3328 if (++pos
== endPos
) {
3329 NS_HTML5_BREAK(stateloop
);
3331 c
= checkChar(buf
, pos
);
3336 P::transition(mViewSource
.get(),
3337 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_END
,
3339 NS_HTML5_BREAK(scriptdatadoubleescapedlessthanloop
);
3343 state
= P::transition(
3345 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3346 NS_HTML5_CONTINUE(stateloop
);
3350 scriptdatadoubleescapedlessthanloop_end
:;
3353 case SCRIPT_DATA_DOUBLE_ESCAPE_END
: {
3355 if (++pos
== endPos
) {
3356 NS_HTML5_BREAK(stateloop
);
3358 c
= checkChar(buf
, pos
);
3360 char16_t folded
= c
;
3361 if (c
>= 'A' && c
<= 'Z') {
3364 if (folded
!= nsHtml5Tokenizer::SCRIPT_ARR
[index
]) {
3366 state
= P::transition(
3368 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3369 NS_HTML5_CONTINUE(stateloop
);
3376 emitCarriageReturn(buf
, pos
);
3377 state
= P::transition(mViewSource
.get(),
3378 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
3380 NS_HTML5_BREAK(stateloop
);
3391 state
= P::transition(mViewSource
.get(),
3392 nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED
,
3394 NS_HTML5_CONTINUE(stateloop
);
3398 state
= P::transition(
3400 nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED
, reconsume
, pos
);
3401 NS_HTML5_CONTINUE(stateloop
);
3406 case MARKUP_DECLARATION_OCTYPE
: {
3408 if (++pos
== endPos
) {
3409 NS_HTML5_BREAK(stateloop
);
3411 c
= checkChar(buf
, pos
);
3413 char16_t folded
= c
;
3414 if (c
>= 'A' && c
<= 'Z') {
3417 if (folded
== nsHtml5Tokenizer::OCTYPE
[index
]) {
3420 if (P::reportErrors
) {
3424 state
= P::transition(mViewSource
.get(),
3425 nsHtml5Tokenizer::BOGUS_COMMENT
, reconsume
,
3427 NS_HTML5_CONTINUE(stateloop
);
3433 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DOCTYPE
,
3435 NS_HTML5_BREAK(markupdeclarationdoctypeloop
);
3438 markupdeclarationdoctypeloop_end
:;
3446 if (++pos
== endPos
) {
3447 NS_HTML5_BREAK(stateloop
);
3449 c
= checkChar(buf
, pos
);
3451 initDoctypeFields();
3454 silentCarriageReturn();
3455 state
= P::transition(mViewSource
.get(),
3456 nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME
,
3458 NS_HTML5_BREAK(stateloop
);
3467 state
= P::transition(mViewSource
.get(),
3468 nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME
,
3470 NS_HTML5_BREAK(doctypeloop
);
3473 if (P::reportErrors
) {
3474 errMissingSpaceBeforeDoctypeName();
3477 state
= P::transition(mViewSource
.get(),
3478 nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME
,
3480 NS_HTML5_BREAK(doctypeloop
);
3487 case BEFORE_DOCTYPE_NAME
: {
3492 if (++pos
== endPos
) {
3493 NS_HTML5_BREAK(stateloop
);
3495 c
= checkChar(buf
, pos
);
3499 silentCarriageReturn();
3500 NS_HTML5_BREAK(stateloop
);
3512 if (P::reportErrors
) {
3513 errNamelessDoctype();
3516 emitDoctypeToken(pos
);
3517 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
3519 if (shouldSuspend
) {
3520 NS_HTML5_BREAK(stateloop
);
3522 NS_HTML5_CONTINUE(stateloop
);
3529 if (c
>= 'A' && c
<= 'Z') {
3532 clearStrBufBeforeUse();
3535 P::transition(mViewSource
.get(),
3536 nsHtml5Tokenizer::DOCTYPE_NAME
, reconsume
, pos
);
3537 NS_HTML5_BREAK(beforedoctypenameloop
);
3541 beforedoctypenameloop_end
:;
3544 case DOCTYPE_NAME
: {
3546 if (++pos
== endPos
) {
3547 NS_HTML5_BREAK(stateloop
);
3549 c
= checkChar(buf
, pos
);
3552 silentCarriageReturn();
3553 strBufToDoctypeName();
3554 state
= P::transition(mViewSource
.get(),
3555 nsHtml5Tokenizer::AFTER_DOCTYPE_NAME
,
3557 NS_HTML5_BREAK(stateloop
);
3566 strBufToDoctypeName();
3567 state
= P::transition(mViewSource
.get(),
3568 nsHtml5Tokenizer::AFTER_DOCTYPE_NAME
,
3570 NS_HTML5_BREAK(doctypenameloop
);
3573 strBufToDoctypeName();
3574 emitDoctypeToken(pos
);
3575 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
3577 if (shouldSuspend
) {
3578 NS_HTML5_BREAK(stateloop
);
3580 NS_HTML5_CONTINUE(stateloop
);
3587 if (c
>= 'A' && c
<= 'Z') {
3595 doctypenameloop_end
:;
3598 case AFTER_DOCTYPE_NAME
: {
3600 if (++pos
== endPos
) {
3601 NS_HTML5_BREAK(stateloop
);
3603 c
= checkChar(buf
, pos
);
3606 silentCarriageReturn();
3607 NS_HTML5_BREAK(stateloop
);
3619 emitDoctypeToken(pos
);
3620 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
3622 if (shouldSuspend
) {
3623 NS_HTML5_BREAK(stateloop
);
3625 NS_HTML5_CONTINUE(stateloop
);
3630 state
= P::transition(mViewSource
.get(),
3631 nsHtml5Tokenizer::DOCTYPE_UBLIC
, reconsume
,
3633 NS_HTML5_BREAK(afterdoctypenameloop
);
3638 state
= P::transition(mViewSource
.get(),
3639 nsHtml5Tokenizer::DOCTYPE_YSTEM
, reconsume
,
3641 NS_HTML5_CONTINUE(stateloop
);
3645 state
= P::transition(mViewSource
.get(),
3646 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
3648 NS_HTML5_CONTINUE(stateloop
);
3652 afterdoctypenameloop_end
:;
3655 case DOCTYPE_UBLIC
: {
3657 if (++pos
== endPos
) {
3658 NS_HTML5_BREAK(stateloop
);
3660 c
= checkChar(buf
, pos
);
3662 char16_t folded
= c
;
3663 if (c
>= 'A' && c
<= 'Z') {
3666 if (folded
!= nsHtml5Tokenizer::UBLIC
[index
]) {
3669 state
= P::transition(mViewSource
.get(),
3670 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
3672 NS_HTML5_CONTINUE(stateloop
);
3678 state
= P::transition(
3680 nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_KEYWORD
, reconsume
, pos
);
3681 NS_HTML5_BREAK(doctypeublicloop
);
3684 doctypeublicloop_end
:;
3687 case AFTER_DOCTYPE_PUBLIC_KEYWORD
: {
3692 if (++pos
== endPos
) {
3693 NS_HTML5_BREAK(stateloop
);
3695 c
= checkChar(buf
, pos
);
3699 silentCarriageReturn();
3700 state
= P::transition(
3702 nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER
, reconsume
,
3704 NS_HTML5_BREAK(stateloop
);
3713 state
= P::transition(
3715 nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER
, reconsume
,
3717 NS_HTML5_BREAK(afterdoctypepublickeywordloop
);
3720 if (P::reportErrors
) {
3721 errNoSpaceBetweenDoctypePublicKeywordAndQuote();
3723 clearStrBufBeforeUse();
3724 state
= P::transition(
3726 nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED
,
3728 NS_HTML5_CONTINUE(stateloop
);
3731 if (P::reportErrors
) {
3732 errNoSpaceBetweenDoctypePublicKeywordAndQuote();
3734 clearStrBufBeforeUse();
3735 state
= P::transition(
3737 nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED
,
3739 NS_HTML5_CONTINUE(stateloop
);
3742 if (P::reportErrors
) {
3743 errExpectedPublicId();
3746 emitDoctypeToken(pos
);
3747 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
3749 if (shouldSuspend
) {
3750 NS_HTML5_BREAK(stateloop
);
3752 NS_HTML5_CONTINUE(stateloop
);
3756 state
= P::transition(mViewSource
.get(),
3757 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
3759 NS_HTML5_CONTINUE(stateloop
);
3763 afterdoctypepublickeywordloop_end
:;
3766 case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER
: {
3768 if (++pos
== endPos
) {
3769 NS_HTML5_BREAK(stateloop
);
3771 c
= checkChar(buf
, pos
);
3774 silentCarriageReturn();
3775 NS_HTML5_BREAK(stateloop
);
3787 clearStrBufBeforeUse();
3788 state
= P::transition(
3790 nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED
,
3792 NS_HTML5_BREAK(beforedoctypepublicidentifierloop
);
3795 clearStrBufBeforeUse();
3796 state
= P::transition(
3798 nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED
,
3800 NS_HTML5_CONTINUE(stateloop
);
3803 if (P::reportErrors
) {
3804 errExpectedPublicId();
3807 emitDoctypeToken(pos
);
3808 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
3810 if (shouldSuspend
) {
3811 NS_HTML5_BREAK(stateloop
);
3813 NS_HTML5_CONTINUE(stateloop
);
3817 state
= P::transition(mViewSource
.get(),
3818 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
3820 NS_HTML5_CONTINUE(stateloop
);
3824 beforedoctypepublicidentifierloop_end
:;
3827 case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED
: {
3829 if (++pos
== endPos
) {
3830 NS_HTML5_BREAK(stateloop
);
3832 c
= checkChar(buf
, pos
);
3835 publicIdentifier
= strBufToString();
3836 state
= P::transition(
3838 nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER
, reconsume
,
3840 NS_HTML5_BREAK(doctypepublicidentifierdoublequotedloop
);
3843 if (P::reportErrors
) {
3847 publicIdentifier
= strBufToString();
3848 emitDoctypeToken(pos
);
3849 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
3851 if (shouldSuspend
) {
3852 NS_HTML5_BREAK(stateloop
);
3854 NS_HTML5_CONTINUE(stateloop
);
3857 appendStrBufCarriageReturn();
3858 NS_HTML5_BREAK(stateloop
);
3861 appendStrBufLineFeed();
3874 doctypepublicidentifierdoublequotedloop_end
:;
3877 case AFTER_DOCTYPE_PUBLIC_IDENTIFIER
: {
3879 if (++pos
== endPos
) {
3880 NS_HTML5_BREAK(stateloop
);
3882 c
= checkChar(buf
, pos
);
3885 silentCarriageReturn();
3886 state
= P::transition(
3889 BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS
,
3891 NS_HTML5_BREAK(stateloop
);
3900 state
= P::transition(
3903 BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS
,
3905 NS_HTML5_BREAK(afterdoctypepublicidentifierloop
);
3908 emitDoctypeToken(pos
);
3909 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
3911 if (shouldSuspend
) {
3912 NS_HTML5_BREAK(stateloop
);
3914 NS_HTML5_CONTINUE(stateloop
);
3917 if (P::reportErrors
) {
3918 errNoSpaceBetweenPublicAndSystemIds();
3920 clearStrBufBeforeUse();
3921 state
= P::transition(
3923 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED
,
3925 NS_HTML5_CONTINUE(stateloop
);
3928 if (P::reportErrors
) {
3929 errNoSpaceBetweenPublicAndSystemIds();
3931 clearStrBufBeforeUse();
3932 state
= P::transition(
3934 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED
,
3936 NS_HTML5_CONTINUE(stateloop
);
3940 state
= P::transition(mViewSource
.get(),
3941 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
3943 NS_HTML5_CONTINUE(stateloop
);
3947 afterdoctypepublicidentifierloop_end
:;
3950 case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS
: {
3952 if (++pos
== endPos
) {
3953 NS_HTML5_BREAK(stateloop
);
3955 c
= checkChar(buf
, pos
);
3958 silentCarriageReturn();
3959 NS_HTML5_BREAK(stateloop
);
3971 emitDoctypeToken(pos
);
3972 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
3974 if (shouldSuspend
) {
3975 NS_HTML5_BREAK(stateloop
);
3977 NS_HTML5_CONTINUE(stateloop
);
3980 clearStrBufBeforeUse();
3981 state
= P::transition(
3983 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED
,
3985 NS_HTML5_BREAK(betweendoctypepublicandsystemidentifiersloop
);
3988 clearStrBufBeforeUse();
3989 state
= P::transition(
3991 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED
,
3993 NS_HTML5_CONTINUE(stateloop
);
3997 state
= P::transition(mViewSource
.get(),
3998 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
4000 NS_HTML5_CONTINUE(stateloop
);
4004 betweendoctypepublicandsystemidentifiersloop_end
:;
4007 case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED
: {
4009 if (++pos
== endPos
) {
4010 NS_HTML5_BREAK(stateloop
);
4012 c
= checkChar(buf
, pos
);
4015 systemIdentifier
= strBufToString();
4016 state
= P::transition(
4018 nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER
, reconsume
,
4020 NS_HTML5_BREAK(doctypesystemidentifierdoublequotedloop
);
4023 if (P::reportErrors
) {
4027 systemIdentifier
= strBufToString();
4028 emitDoctypeToken(pos
);
4029 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
4031 if (shouldSuspend
) {
4032 NS_HTML5_BREAK(stateloop
);
4034 NS_HTML5_CONTINUE(stateloop
);
4037 appendStrBufCarriageReturn();
4038 NS_HTML5_BREAK(stateloop
);
4041 appendStrBufLineFeed();
4054 doctypesystemidentifierdoublequotedloop_end
:;
4057 case AFTER_DOCTYPE_SYSTEM_IDENTIFIER
: {
4059 if (++pos
== endPos
) {
4060 NS_HTML5_BREAK(stateloop
);
4062 c
= checkChar(buf
, pos
);
4065 silentCarriageReturn();
4066 NS_HTML5_BREAK(stateloop
);
4078 emitDoctypeToken(pos
);
4079 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
4081 if (shouldSuspend
) {
4082 NS_HTML5_BREAK(stateloop
);
4084 NS_HTML5_CONTINUE(stateloop
);
4087 bogusDoctypeWithoutQuirks();
4088 state
= P::transition(mViewSource
.get(),
4089 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
4091 NS_HTML5_BREAK(afterdoctypesystemidentifierloop
);
4095 afterdoctypesystemidentifierloop_end
:;
4098 case BOGUS_DOCTYPE
: {
4103 if (++pos
== endPos
) {
4104 NS_HTML5_BREAK(stateloop
);
4106 c
= checkChar(buf
, pos
);
4110 emitDoctypeToken(pos
);
4111 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
4113 if (shouldSuspend
) {
4114 NS_HTML5_BREAK(stateloop
);
4116 NS_HTML5_CONTINUE(stateloop
);
4119 silentCarriageReturn();
4120 NS_HTML5_BREAK(stateloop
);
4132 case DOCTYPE_YSTEM
: {
4134 if (++pos
== endPos
) {
4135 NS_HTML5_BREAK(stateloop
);
4137 c
= checkChar(buf
, pos
);
4139 char16_t folded
= c
;
4140 if (c
>= 'A' && c
<= 'Z') {
4143 if (folded
!= nsHtml5Tokenizer::YSTEM
[index
]) {
4146 state
= P::transition(mViewSource
.get(),
4147 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
4149 NS_HTML5_CONTINUE(stateloop
);
4152 NS_HTML5_CONTINUE(stateloop
);
4155 state
= P::transition(
4157 nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_KEYWORD
, reconsume
, pos
);
4158 NS_HTML5_BREAK(doctypeystemloop
);
4161 doctypeystemloop_end
:;
4164 case AFTER_DOCTYPE_SYSTEM_KEYWORD
: {
4169 if (++pos
== endPos
) {
4170 NS_HTML5_BREAK(stateloop
);
4172 c
= checkChar(buf
, pos
);
4176 silentCarriageReturn();
4177 state
= P::transition(
4179 nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER
, reconsume
,
4181 NS_HTML5_BREAK(stateloop
);
4190 state
= P::transition(
4192 nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER
, reconsume
,
4194 NS_HTML5_BREAK(afterdoctypesystemkeywordloop
);
4197 if (P::reportErrors
) {
4198 errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
4200 clearStrBufBeforeUse();
4201 state
= P::transition(
4203 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED
,
4205 NS_HTML5_CONTINUE(stateloop
);
4208 if (P::reportErrors
) {
4209 errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
4211 clearStrBufBeforeUse();
4212 state
= P::transition(
4214 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED
,
4216 NS_HTML5_CONTINUE(stateloop
);
4219 if (P::reportErrors
) {
4220 errExpectedPublicId();
4223 emitDoctypeToken(pos
);
4224 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
4226 if (shouldSuspend
) {
4227 NS_HTML5_BREAK(stateloop
);
4229 NS_HTML5_CONTINUE(stateloop
);
4233 state
= P::transition(mViewSource
.get(),
4234 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
4236 NS_HTML5_CONTINUE(stateloop
);
4240 afterdoctypesystemkeywordloop_end
:;
4243 case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER
: {
4245 if (++pos
== endPos
) {
4246 NS_HTML5_BREAK(stateloop
);
4248 c
= checkChar(buf
, pos
);
4251 silentCarriageReturn();
4252 NS_HTML5_BREAK(stateloop
);
4264 clearStrBufBeforeUse();
4265 state
= P::transition(
4267 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED
,
4269 NS_HTML5_CONTINUE(stateloop
);
4272 clearStrBufBeforeUse();
4273 state
= P::transition(
4275 nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED
,
4277 NS_HTML5_BREAK(beforedoctypesystemidentifierloop
);
4280 if (P::reportErrors
) {
4281 errExpectedSystemId();
4284 emitDoctypeToken(pos
);
4285 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
4287 if (shouldSuspend
) {
4288 NS_HTML5_BREAK(stateloop
);
4290 NS_HTML5_CONTINUE(stateloop
);
4294 state
= P::transition(mViewSource
.get(),
4295 nsHtml5Tokenizer::BOGUS_DOCTYPE
, reconsume
,
4297 NS_HTML5_CONTINUE(stateloop
);
4301 beforedoctypesystemidentifierloop_end
:;
4304 case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED
: {
4306 if (++pos
== endPos
) {
4307 NS_HTML5_BREAK(stateloop
);
4309 c
= checkChar(buf
, pos
);
4312 systemIdentifier
= strBufToString();
4313 state
= P::transition(
4315 nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER
, reconsume
,
4317 NS_HTML5_CONTINUE(stateloop
);
4320 if (P::reportErrors
) {
4324 systemIdentifier
= strBufToString();
4325 emitDoctypeToken(pos
);
4326 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
4328 if (shouldSuspend
) {
4329 NS_HTML5_BREAK(stateloop
);
4331 NS_HTML5_CONTINUE(stateloop
);
4334 appendStrBufCarriageReturn();
4335 NS_HTML5_BREAK(stateloop
);
4338 appendStrBufLineFeed();
4352 case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED
: {
4354 if (++pos
== endPos
) {
4355 NS_HTML5_BREAK(stateloop
);
4357 c
= checkChar(buf
, pos
);
4360 publicIdentifier
= strBufToString();
4361 state
= P::transition(
4363 nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER
, reconsume
,
4365 NS_HTML5_CONTINUE(stateloop
);
4368 if (P::reportErrors
) {
4372 publicIdentifier
= strBufToString();
4373 emitDoctypeToken(pos
);
4374 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
4376 if (shouldSuspend
) {
4377 NS_HTML5_BREAK(stateloop
);
4379 NS_HTML5_CONTINUE(stateloop
);
4382 appendStrBufCarriageReturn();
4383 NS_HTML5_BREAK(stateloop
);
4386 appendStrBufLineFeed();
4400 case PROCESSING_INSTRUCTION
: {
4402 if (++pos
== endPos
) {
4403 NS_HTML5_BREAK(stateloop
);
4405 c
= checkChar(buf
, pos
);
4408 state
= P::transition(
4410 nsHtml5Tokenizer::PROCESSING_INSTRUCTION_QUESTION_MARK
,
4412 NS_HTML5_BREAK(processinginstructionloop
);
4419 processinginstructionloop_end
:;
4422 case PROCESSING_INSTRUCTION_QUESTION_MARK
: {
4423 if (++pos
== endPos
) {
4424 NS_HTML5_BREAK(stateloop
);
4426 c
= checkChar(buf
, pos
);
4429 state
= P::transition(mViewSource
.get(), nsHtml5Tokenizer::DATA
,
4431 suspendIfRequestedAfterCurrentNonTextToken();
4432 if (shouldSuspend
) {
4433 NS_HTML5_BREAK(stateloop
);
4435 NS_HTML5_CONTINUE(stateloop
);
4438 state
= P::transition(mViewSource
.get(),
4439 nsHtml5Tokenizer::PROCESSING_INSTRUCTION
,
4441 NS_HTML5_CONTINUE(stateloop
);
4448 flushChars(buf
, pos
);
4450 returnStateSave
= returnState
;
4454 void nsHtml5Tokenizer::initDoctypeFields() {
4455 clearStrBufAfterUse();
4456 doctypeName
= nullptr;
4457 if (systemIdentifier
) {
4458 systemIdentifier
.Release();
4459 systemIdentifier
= nullptr;
4461 if (publicIdentifier
) {
4462 publicIdentifier
.Release();
4463 publicIdentifier
= nullptr;
4465 forceQuirks
= false;
4468 void nsHtml5Tokenizer::emitCarriageReturn(char16_t
* buf
, int32_t pos
) {
4469 silentCarriageReturn();
4470 flushChars(buf
, pos
);
4471 tokenHandler
->characters(nsHtml5Tokenizer::LF
, 0, 1);
4475 void nsHtml5Tokenizer::emitReplacementCharacter(char16_t
* buf
, int32_t pos
) {
4476 flushChars(buf
, pos
);
4477 tokenHandler
->zeroOriginatingReplacementCharacter();
4481 void nsHtml5Tokenizer::maybeEmitReplacementCharacter(char16_t
* buf
,
4483 flushChars(buf
, pos
);
4484 tokenHandler
->zeroOrReplacementCharacter();
4488 void nsHtml5Tokenizer::emitPlaintextReplacementCharacter(char16_t
* buf
,
4490 flushChars(buf
, pos
);
4491 tokenHandler
->characters(REPLACEMENT_CHARACTER
, 0, 1);
4495 void nsHtml5Tokenizer::setAdditionalAndRememberAmpersandLocation(char16_t add
) {
4499 void nsHtml5Tokenizer::bogusDoctype() {
4504 void nsHtml5Tokenizer::bogusDoctypeWithoutQuirks() {
4506 forceQuirks
= false;
4509 void nsHtml5Tokenizer::handleNcrValue(int32_t returnState
) {
4510 if (value
<= 0xFFFF) {
4511 if (value
>= 0x80 && value
<= 0x9f) {
4513 char16_t
* val
= nsHtml5NamedCharacters::WINDOWS_1252
[value
- 0x80];
4514 emitOrAppendOne(val
, returnState
);
4515 } else if (value
== 0x0) {
4517 emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER
, returnState
);
4518 } else if ((value
& 0xF800) == 0xD800) {
4520 emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER
, returnState
);
4522 char16_t ch
= (char16_t
)value
;
4524 emitOrAppendOne(bmpChar
, returnState
);
4526 } else if (value
<= 0x10FFFF) {
4527 astralChar
[0] = (char16_t
)(nsHtml5Tokenizer::LEAD_OFFSET
+ (value
>> 10));
4528 astralChar
[1] = (char16_t
)(0xDC00 + (value
& 0x3FF));
4529 emitOrAppendTwo(astralChar
, returnState
);
4532 emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER
, returnState
);
4536 void nsHtml5Tokenizer::eof() {
4537 int32_t state
= stateSave
;
4538 int32_t returnState
= returnStateSave
;
4542 case SCRIPT_DATA_LESS_THAN_SIGN
:
4543 case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN
: {
4544 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
4545 NS_HTML5_BREAK(eofloop
);
4549 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
4550 NS_HTML5_BREAK(eofloop
);
4552 case RAWTEXT_RCDATA_LESS_THAN_SIGN
: {
4553 tokenHandler
->characters(nsHtml5Tokenizer::LT_GT
, 0, 1);
4554 NS_HTML5_BREAK(eofloop
);
4556 case NON_DATA_END_TAG_NAME
: {
4557 tokenHandler
->characters(nsHtml5Tokenizer::LT_SOLIDUS
, 0, 2);
4559 NS_HTML5_BREAK(eofloop
);
4561 case CLOSE_TAG_OPEN
: {
4563 tokenHandler
->characters(nsHtml5Tokenizer::LT_SOLIDUS
, 0, 2);
4564 NS_HTML5_BREAK(eofloop
);
4568 NS_HTML5_BREAK(eofloop
);
4570 case BEFORE_ATTRIBUTE_NAME
:
4571 case AFTER_ATTRIBUTE_VALUE_QUOTED
:
4572 case SELF_CLOSING_START_TAG
: {
4574 NS_HTML5_BREAK(eofloop
);
4576 case ATTRIBUTE_NAME
: {
4577 errEofInAttributeName();
4578 NS_HTML5_BREAK(eofloop
);
4580 case AFTER_ATTRIBUTE_NAME
:
4581 case BEFORE_ATTRIBUTE_VALUE
: {
4583 NS_HTML5_BREAK(eofloop
);
4585 case ATTRIBUTE_VALUE_DOUBLE_QUOTED
:
4586 case ATTRIBUTE_VALUE_SINGLE_QUOTED
:
4587 case ATTRIBUTE_VALUE_UNQUOTED
: {
4588 errEofInAttributeValue();
4589 NS_HTML5_BREAK(eofloop
);
4591 case BOGUS_COMMENT
: {
4593 NS_HTML5_BREAK(eofloop
);
4595 case BOGUS_COMMENT_HYPHEN
: {
4597 NS_HTML5_BREAK(eofloop
);
4599 case MARKUP_DECLARATION_OPEN
: {
4602 NS_HTML5_BREAK(eofloop
);
4604 case MARKUP_DECLARATION_HYPHEN
: {
4607 NS_HTML5_BREAK(eofloop
);
4609 case MARKUP_DECLARATION_OCTYPE
: {
4615 doctypeName
= nullptr;
4616 if (systemIdentifier
) {
4617 systemIdentifier
.Release();
4618 systemIdentifier
= nullptr;
4620 if (publicIdentifier
) {
4621 publicIdentifier
.Release();
4622 publicIdentifier
= nullptr;
4625 emitDoctypeToken(0);
4626 NS_HTML5_BREAK(eofloop
);
4628 NS_HTML5_BREAK(eofloop
);
4632 case COMMENT_LESSTHAN
:
4633 case COMMENT_LESSTHAN_BANG
: {
4636 NS_HTML5_BREAK(eofloop
);
4639 case COMMENT_LESSTHAN_BANG_DASH_DASH
: {
4642 NS_HTML5_BREAK(eofloop
);
4644 case COMMENT_END_DASH
:
4645 case COMMENT_START_DASH
:
4646 case COMMENT_LESSTHAN_BANG_DASH
: {
4649 NS_HTML5_BREAK(eofloop
);
4651 case COMMENT_END_BANG
: {
4654 NS_HTML5_BREAK(eofloop
);
4657 case BEFORE_DOCTYPE_NAME
: {
4660 emitDoctypeToken(0);
4661 NS_HTML5_BREAK(eofloop
);
4663 case DOCTYPE_NAME
: {
4665 strBufToDoctypeName();
4667 emitDoctypeToken(0);
4668 NS_HTML5_BREAK(eofloop
);
4672 case AFTER_DOCTYPE_NAME
:
4673 case AFTER_DOCTYPE_PUBLIC_KEYWORD
:
4674 case AFTER_DOCTYPE_SYSTEM_KEYWORD
:
4675 case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER
: {
4678 emitDoctypeToken(0);
4679 NS_HTML5_BREAK(eofloop
);
4681 case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED
:
4682 case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED
: {
4685 publicIdentifier
= strBufToString();
4686 emitDoctypeToken(0);
4687 NS_HTML5_BREAK(eofloop
);
4689 case AFTER_DOCTYPE_PUBLIC_IDENTIFIER
:
4690 case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER
:
4691 case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS
: {
4694 emitDoctypeToken(0);
4695 NS_HTML5_BREAK(eofloop
);
4697 case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED
:
4698 case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED
: {
4701 systemIdentifier
= strBufToString();
4702 emitDoctypeToken(0);
4703 NS_HTML5_BREAK(eofloop
);
4705 case AFTER_DOCTYPE_SYSTEM_IDENTIFIER
: {
4708 emitDoctypeToken(0);
4709 NS_HTML5_BREAK(eofloop
);
4711 case BOGUS_DOCTYPE
: {
4712 emitDoctypeToken(0);
4713 NS_HTML5_BREAK(eofloop
);
4715 case CONSUME_CHARACTER_REFERENCE
: {
4716 emitOrAppendCharRefBuf(returnState
);
4717 state
= returnState
;
4720 case CHARACTER_REFERENCE_HILO_LOOKUP
: {
4721 emitOrAppendCharRefBuf(returnState
);
4722 state
= returnState
;
4725 case CHARACTER_REFERENCE_TAIL
: {
4731 NS_HTML5_BREAK(hiloop
);
4733 if (entCol
== nsHtml5NamedCharacters::NAMES
[hi
].length()) {
4734 NS_HTML5_BREAK(hiloop
);
4736 if (entCol
> nsHtml5NamedCharacters::NAMES
[hi
].length()) {
4737 NS_HTML5_BREAK(outer
);
4738 } else if (c
< nsHtml5NamedCharacters::NAMES
[hi
].charAt(entCol
)) {
4741 NS_HTML5_BREAK(hiloop
);
4747 NS_HTML5_BREAK(outer
);
4749 if (entCol
== nsHtml5NamedCharacters::NAMES
[lo
].length()) {
4751 charRefBufMark
= charRefBufLen
;
4753 } else if (entCol
> nsHtml5NamedCharacters::NAMES
[lo
].length()) {
4754 NS_HTML5_BREAK(outer
);
4755 } else if (c
> nsHtml5NamedCharacters::NAMES
[lo
].charAt(entCol
)) {
4758 NS_HTML5_BREAK(loloop
);
4763 NS_HTML5_BREAK(outer
);
4768 if (candidate
== -1) {
4769 emitOrAppendCharRefBuf(returnState
);
4770 state
= returnState
;
4771 NS_HTML5_CONTINUE(eofloop
);
4773 const nsHtml5CharacterName
& candidateName
=
4774 nsHtml5NamedCharacters::NAMES
[candidate
];
4775 if (!candidateName
.length() ||
4776 candidateName
.charAt(candidateName
.length() - 1) != ';') {
4777 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
4779 if (charRefBufMark
== charRefBufLen
) {
4782 ch
= charRefBuf
[charRefBufMark
];
4784 if ((ch
>= '0' && ch
<= '9') || (ch
>= 'A' && ch
<= 'Z') ||
4785 (ch
>= 'a' && ch
<= 'z')) {
4786 appendCharRefBufToStrBuf();
4787 state
= returnState
;
4788 NS_HTML5_CONTINUE(eofloop
);
4791 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
4792 errUnescapedAmpersandInterpretedAsCharacterReference();
4794 errNotSemicolonTerminated();
4797 const char16_t
* val
= nsHtml5NamedCharacters::VALUES
[candidate
];
4799 emitOrAppendOne(val
, returnState
);
4801 emitOrAppendTwo(val
, returnState
);
4803 if (charRefBufMark
< charRefBufLen
) {
4804 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
4805 appendStrBuf(charRefBuf
, charRefBufMark
,
4806 charRefBufLen
- charRefBufMark
);
4808 tokenHandler
->characters(charRefBuf
, charRefBufMark
,
4809 charRefBufLen
- charRefBufMark
);
4813 state
= returnState
;
4814 NS_HTML5_CONTINUE(eofloop
);
4818 case DECIMAL_NRC_LOOP
:
4819 case HEX_NCR_LOOP
: {
4822 emitOrAppendCharRefBuf(returnState
);
4823 state
= returnState
;
4826 errCharRefLacksSemicolon();
4828 handleNcrValue(returnState
);
4829 state
= returnState
;
4833 tokenHandler
->characters(nsHtml5Tokenizer::RSQB_RSQB
, 0, 1);
4834 NS_HTML5_BREAK(eofloop
);
4836 case CDATA_RSQB_RSQB
: {
4837 tokenHandler
->characters(nsHtml5Tokenizer::RSQB_RSQB
, 0, 2);
4838 NS_HTML5_BREAK(eofloop
);
4842 NS_HTML5_BREAK(eofloop
);
4847 tokenHandler
->eof();
4851 void nsHtml5Tokenizer::emitDoctypeToken(int32_t pos
) {
4854 tokenHandler
->doctype(doctypeName
, publicIdentifier
, systemIdentifier
,
4856 doctypeName
= nullptr;
4857 publicIdentifier
.Release();
4858 publicIdentifier
= nullptr;
4859 systemIdentifier
.Release();
4860 systemIdentifier
= nullptr;
4861 suspendIfRequestedAfterCurrentNonTextToken();
4864 void nsHtml5Tokenizer::suspendIfRequestedAfterCurrentNonTextToken() {
4865 if (suspendAfterCurrentNonTextToken
) {
4866 suspendAfterCurrentNonTextToken
= false;
4867 shouldSuspend
= true;
4871 void nsHtml5Tokenizer::suspendAfterCurrentTokenIfNotInText() {
4872 switch (stateSave
) {
4877 case SCRIPT_DATA_ESCAPED
:
4879 case NON_DATA_END_TAG_NAME
:
4880 case SCRIPT_DATA_LESS_THAN_SIGN
:
4881 case SCRIPT_DATA_ESCAPE_START
:
4882 case SCRIPT_DATA_ESCAPE_START_DASH
:
4883 case SCRIPT_DATA_ESCAPED_DASH
:
4884 case SCRIPT_DATA_ESCAPED_DASH_DASH
:
4885 case RAWTEXT_RCDATA_LESS_THAN_SIGN
:
4886 case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN
:
4887 case SCRIPT_DATA_DOUBLE_ESCAPE_START
:
4888 case SCRIPT_DATA_DOUBLE_ESCAPED
:
4889 case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN
:
4890 case SCRIPT_DATA_DOUBLE_ESCAPED_DASH
:
4891 case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH
:
4892 case SCRIPT_DATA_DOUBLE_ESCAPE_END
: {
4896 case BEFORE_ATTRIBUTE_NAME
:
4897 case ATTRIBUTE_NAME
:
4898 case AFTER_ATTRIBUTE_NAME
:
4899 case BEFORE_ATTRIBUTE_VALUE
:
4900 case AFTER_ATTRIBUTE_VALUE_QUOTED
:
4902 case MARKUP_DECLARATION_OPEN
:
4904 case BEFORE_DOCTYPE_NAME
:
4906 case AFTER_DOCTYPE_NAME
:
4907 case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER
:
4908 case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED
:
4909 case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED
:
4910 case AFTER_DOCTYPE_PUBLIC_IDENTIFIER
:
4911 case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER
:
4912 case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED
:
4913 case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED
:
4914 case AFTER_DOCTYPE_SYSTEM_IDENTIFIER
:
4917 case COMMENT_START_DASH
:
4919 case COMMENT_END_DASH
:
4921 case COMMENT_END_BANG
:
4923 case CLOSE_TAG_OPEN
:
4924 case MARKUP_DECLARATION_HYPHEN
:
4925 case MARKUP_DECLARATION_OCTYPE
:
4928 case AFTER_DOCTYPE_PUBLIC_KEYWORD
:
4929 case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS
:
4930 case AFTER_DOCTYPE_SYSTEM_KEYWORD
:
4931 case SELF_CLOSING_START_TAG
:
4932 case ATTRIBUTE_VALUE_DOUBLE_QUOTED
:
4933 case ATTRIBUTE_VALUE_SINGLE_QUOTED
:
4934 case ATTRIBUTE_VALUE_UNQUOTED
:
4935 case BOGUS_COMMENT_HYPHEN
:
4936 case COMMENT_LESSTHAN
:
4937 case COMMENT_LESSTHAN_BANG
:
4938 case COMMENT_LESSTHAN_BANG_DASH
:
4939 case COMMENT_LESSTHAN_BANG_DASH_DASH
:
4943 case CDATA_RSQB_RSQB
:
4944 case PROCESSING_INSTRUCTION
:
4945 case PROCESSING_INSTRUCTION_QUESTION_MARK
: {
4948 case CONSUME_CHARACTER_REFERENCE
:
4950 case CHARACTER_REFERENCE_TAIL
:
4952 case DECIMAL_NRC_LOOP
:
4953 case HANDLE_NCR_VALUE
:
4954 case HANDLE_NCR_VALUE_RECONSUME
:
4955 case CHARACTER_REFERENCE_HILO_LOOKUP
: {
4956 if (returnStateSave
== DATA
|| returnStateSave
== RCDATA
) {
4962 MOZ_ASSERT(false, "Incomplete switch");
4966 suspendAfterCurrentNonTextToken
= true;
4969 bool nsHtml5Tokenizer::suspensionAfterCurrentNonTextTokenPending() {
4970 return suspendAfterCurrentNonTextToken
;
4973 bool nsHtml5Tokenizer::internalEncodingDeclaration(
4974 nsHtml5String internalCharset
) {
4975 if (encodingDeclarationHandler
) {
4976 return encodingDeclarationHandler
->internalEncodingDeclaration(
4982 void nsHtml5Tokenizer::emitOrAppendTwo(const char16_t
* val
,
4983 int32_t returnState
) {
4984 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
4985 appendStrBuf(val
[0]);
4986 appendStrBuf(val
[1]);
4988 tokenHandler
->characters(val
, 0, 2);
4992 void nsHtml5Tokenizer::emitOrAppendOne(const char16_t
* val
,
4993 int32_t returnState
) {
4994 if ((returnState
& DATA_AND_RCDATA_MASK
)) {
4995 appendStrBuf(val
[0]);
4997 tokenHandler
->characters(val
, 0, 1);
5001 void nsHtml5Tokenizer::end() {
5003 doctypeName
= nullptr;
5004 if (systemIdentifier
) {
5005 systemIdentifier
.Release();
5006 systemIdentifier
= nullptr;
5008 if (publicIdentifier
) {
5009 publicIdentifier
.Release();
5010 publicIdentifier
= nullptr;
5013 nonInternedTagName
->setNameForNonInterned(nullptr, false);
5014 attributeName
= nullptr;
5015 nonInternedAttributeName
->setNameForNonInterned(nullptr);
5016 tokenHandler
->endTokenization();
5018 attributes
->clear(0);
5022 void nsHtml5Tokenizer::requestSuspension() { shouldSuspend
= true; }
5024 bool nsHtml5Tokenizer::isInDataState() { return (stateSave
== DATA
); }
5026 void nsHtml5Tokenizer::resetToDataState() {
5027 clearStrBufAfterUse();
5029 stateSave
= nsHtml5Tokenizer::DATA
;
5032 forceQuirks
= false;
5042 suspendAfterCurrentNonTextToken
= false;
5044 shouldSuspend
= false;
5045 initDoctypeFields();
5046 containsHyphen
= false;
5048 attributeName
= nullptr;
5049 if (newAttributesEachTime
) {
5052 attributes
= nullptr;
5057 void nsHtml5Tokenizer::loadState(nsHtml5Tokenizer
* other
) {
5058 strBufLen
= other
->strBufLen
;
5059 if (strBufLen
> strBuf
.length
) {
5060 strBuf
= jArray
<char16_t
, int32_t>::newJArray(strBufLen
);
5062 nsHtml5ArrayCopy::arraycopy(other
->strBuf
, strBuf
, strBufLen
);
5063 charRefBufLen
= other
->charRefBufLen
;
5064 nsHtml5ArrayCopy::arraycopy(other
->charRefBuf
, charRefBuf
, charRefBufLen
);
5065 stateSave
= other
->stateSave
;
5066 returnStateSave
= other
->returnStateSave
;
5067 endTagExpectation
= other
->endTagExpectation
;
5068 endTagExpectationAsArray
= other
->endTagExpectationAsArray
;
5069 lastCR
= other
->lastCR
;
5070 index
= other
->index
;
5071 forceQuirks
= other
->forceQuirks
;
5072 additional
= other
->additional
;
5073 entCol
= other
->entCol
;
5074 firstCharKey
= other
->firstCharKey
;
5077 candidate
= other
->candidate
;
5078 charRefBufMark
= other
->charRefBufMark
;
5079 value
= other
->value
;
5080 seenDigits
= other
->seenDigits
;
5081 endTag
= other
->endTag
;
5082 shouldSuspend
= false;
5083 suspendAfterCurrentNonTextToken
= false;
5084 doctypeName
= other
->doctypeName
;
5085 systemIdentifier
.Release();
5086 if (!other
->systemIdentifier
) {
5087 systemIdentifier
= nullptr;
5090 nsHtml5Portability::newStringFromString(other
->systemIdentifier
);
5092 publicIdentifier
.Release();
5093 if (!other
->publicIdentifier
) {
5094 publicIdentifier
= nullptr;
5097 nsHtml5Portability::newStringFromString(other
->publicIdentifier
);
5099 containsHyphen
= other
->containsHyphen
;
5100 if (!other
->tagName
) {
5102 } else if (other
->tagName
->isInterned()) {
5103 tagName
= other
->tagName
;
5105 nonInternedTagName
->setNameForNonInterned(other
->tagName
->getName(),
5106 other
->tagName
->isCustom());
5107 tagName
= nonInternedTagName
;
5109 if (!other
->attributeName
) {
5110 attributeName
= nullptr;
5111 } else if (other
->attributeName
->isInterned()) {
5112 attributeName
= other
->attributeName
;
5114 nonInternedAttributeName
->setNameForNonInterned(
5115 other
->attributeName
->getLocal(nsHtml5AttributeName::HTML
));
5116 attributeName
= nonInternedAttributeName
;
5119 if (!other
->attributes
) {
5120 attributes
= nullptr;
5122 attributes
= other
->attributes
->cloneAttributes();
5126 void nsHtml5Tokenizer::initializeWithoutStarting() {
5134 void nsHtml5Tokenizer::setEncodingDeclarationHandler(
5135 nsHtml5StreamParser
* encodingDeclarationHandler
) {
5136 this->encodingDeclarationHandler
= encodingDeclarationHandler
;
5139 nsHtml5Tokenizer::~nsHtml5Tokenizer() {
5140 MOZ_COUNT_DTOR(nsHtml5Tokenizer
);
5141 delete nonInternedTagName
;
5142 nonInternedTagName
= nullptr;
5143 delete nonInternedAttributeName
;
5144 nonInternedAttributeName
= nullptr;
5146 attributes
= nullptr;
5149 void nsHtml5Tokenizer::initializeStatics() {}
5151 void nsHtml5Tokenizer::releaseStatics() {}
5153 #include "nsHtml5TokenizerCppSupplement.h"