2 * Copyright (c) 2007 Henri Sivonen
3 * Copyright (c) 2008-2015 Mozilla Foundation
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
25 * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
26 * Please edit MetaScanner.java instead and regenerate.
29 #define nsHtml5MetaScanner_cpp__
32 #include "nsHtml5AtomTable.h"
33 #include "nsHtml5String.h"
34 #include "nsNameSpaceManager.h"
35 #include "nsIContent.h"
36 #include "nsTraceRefcnt.h"
38 #include "nsHtml5ArrayCopy.h"
39 #include "nsAHtml5TreeBuilderState.h"
40 #include "nsGkAtoms.h"
41 #include "nsHtml5ByteReadable.h"
42 #include "nsHtml5Macros.h"
43 #include "nsIContentHandle.h"
44 #include "nsHtml5Portability.h"
45 #include "nsHtml5ContentCreatorFunction.h"
47 #include "nsHtml5AttributeName.h"
48 #include "nsHtml5ElementName.h"
49 #include "nsHtml5Tokenizer.h"
50 #include "nsHtml5TreeBuilder.h"
51 #include "nsHtml5StackNode.h"
52 #include "nsHtml5UTF16Buffer.h"
53 #include "nsHtml5StateSnapshot.h"
54 #include "nsHtml5Portability.h"
56 #include "nsHtml5MetaScanner.h"
58 static char16_t
const CHARSET_DATA
[] = {'h', 'a', 'r', 's', 'e', 't'};
59 staticJArray
<char16_t
, int32_t> nsHtml5MetaScanner::CHARSET
= {
60 CHARSET_DATA
, MOZ_ARRAY_LENGTH(CHARSET_DATA
)};
61 static char16_t
const CONTENT_DATA
[] = {'o', 'n', 't', 'e', 'n', 't'};
62 staticJArray
<char16_t
, int32_t> nsHtml5MetaScanner::CONTENT
= {
63 CONTENT_DATA
, MOZ_ARRAY_LENGTH(CONTENT_DATA
)};
64 static char16_t
const HTTP_EQUIV_DATA
[] = {'t', 't', 'p', '-', 'e',
66 staticJArray
<char16_t
, int32_t> nsHtml5MetaScanner::HTTP_EQUIV
= {
67 HTTP_EQUIV_DATA
, MOZ_ARRAY_LENGTH(HTTP_EQUIV_DATA
)};
68 static char16_t
const CONTENT_TYPE_DATA
[] = {'c', 'o', 'n', 't', 'e', 'n',
69 't', '-', 't', 'y', 'p', 'e'};
70 staticJArray
<char16_t
, int32_t> nsHtml5MetaScanner::CONTENT_TYPE
= {
71 CONTENT_TYPE_DATA
, MOZ_ARRAY_LENGTH(CONTENT_TYPE_DATA
)};
73 nsHtml5MetaScanner::nsHtml5MetaScanner(nsHtml5TreeBuilder
* tb
)
76 contentIndex(INT32_MAX
),
77 charsetIndex(INT32_MAX
),
78 httpEquivIndex(INT32_MAX
),
79 contentTypeIndex(INT32_MAX
),
82 strBuf(jArray
<char16_t
, int32_t>::newJArray(36)),
85 httpEquivState(HTTP_EQUIV_NOT_SEEN
),
88 MOZ_COUNT_CTOR(nsHtml5MetaScanner
);
91 nsHtml5MetaScanner::~nsHtml5MetaScanner() {
92 MOZ_COUNT_DTOR(nsHtml5MetaScanner
);
97 void nsHtml5MetaScanner::stateLoop(int32_t state
) {
99 bool reconsume
= false;
112 NS_HTML5_BREAK(stateloop
);
115 state
= nsHtml5MetaScanner::TAG_OPEN
;
116 NS_HTML5_BREAK(dataloop
);
131 NS_HTML5_BREAK(stateloop
);
136 state
= nsHtml5MetaScanner::TAG_NAME
;
137 NS_HTML5_BREAK(tagopenloop
);
140 state
= nsHtml5MetaScanner::MARKUP_DECLARATION_OPEN
;
141 NS_HTML5_CONTINUE(stateloop
);
145 state
= nsHtml5MetaScanner::SCAN_UNTIL_GT
;
146 NS_HTML5_CONTINUE(stateloop
);
149 state
= nsHtml5MetaScanner::DATA
;
150 NS_HTML5_CONTINUE(stateloop
);
153 if ((c
>= 'A' && c
<= 'Z') || (c
>= 'a' && c
<= 'z')) {
155 state
= nsHtml5MetaScanner::TAG_NAME
;
156 NS_HTML5_BREAK(tagopenloop
);
158 state
= nsHtml5MetaScanner::DATA
;
160 NS_HTML5_CONTINUE(stateloop
);
172 NS_HTML5_BREAK(stateloop
);
178 state
= nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME
;
179 NS_HTML5_BREAK(tagnameloop
);
182 state
= nsHtml5MetaScanner::SELF_CLOSING_START_TAG
;
183 NS_HTML5_CONTINUE(stateloop
);
186 state
= nsHtml5MetaScanner::DATA
;
187 NS_HTML5_CONTINUE(stateloop
);
191 if (metaState
== M
) {
200 if (metaState
== E
) {
209 if (metaState
== T
) {
225 case BEFORE_ATTRIBUTE_NAME
: {
234 NS_HTML5_BREAK(stateloop
);
243 state
= nsHtml5MetaScanner::SELF_CLOSING_START_TAG
;
244 NS_HTML5_CONTINUE(stateloop
);
248 NS_HTML5_BREAK(stateloop
);
251 NS_HTML5_CONTINUE(stateloop
);
257 httpEquivIndex
= INT32_MAX
;
258 contentTypeIndex
= INT32_MAX
;
259 state
= nsHtml5MetaScanner::ATTRIBUTE_NAME
;
260 NS_HTML5_BREAK(beforeattributenameloop
);
264 contentIndex
= INT32_MAX
;
265 charsetIndex
= INT32_MAX
;
267 contentTypeIndex
= INT32_MAX
;
268 state
= nsHtml5MetaScanner::ATTRIBUTE_NAME
;
269 NS_HTML5_BREAK(beforeattributenameloop
);
272 contentIndex
= INT32_MAX
;
273 charsetIndex
= INT32_MAX
;
274 httpEquivIndex
= INT32_MAX
;
275 contentTypeIndex
= INT32_MAX
;
276 state
= nsHtml5MetaScanner::ATTRIBUTE_NAME
;
277 NS_HTML5_BREAK(beforeattributenameloop
);
281 beforeattributenameloop_end
:;
284 case ATTRIBUTE_NAME
: {
289 NS_HTML5_BREAK(stateloop
);
295 state
= nsHtml5MetaScanner::AFTER_ATTRIBUTE_NAME
;
296 NS_HTML5_CONTINUE(stateloop
);
299 state
= nsHtml5MetaScanner::SELF_CLOSING_START_TAG
;
300 NS_HTML5_CONTINUE(stateloop
);
304 contentTypeIndex
= 0;
305 state
= nsHtml5MetaScanner::BEFORE_ATTRIBUTE_VALUE
;
306 NS_HTML5_BREAK(attributenameloop
);
310 NS_HTML5_BREAK(stateloop
);
312 state
= nsHtml5MetaScanner::DATA
;
313 NS_HTML5_CONTINUE(stateloop
);
316 if (metaState
== A
) {
317 if (c
>= 'A' && c
<= 'Z') {
320 if (contentIndex
< CONTENT
.length
&&
321 c
== CONTENT
[contentIndex
]) {
324 contentIndex
= INT32_MAX
;
326 if (charsetIndex
< CHARSET
.length
&&
327 c
== CHARSET
[charsetIndex
]) {
330 charsetIndex
= INT32_MAX
;
332 if (httpEquivIndex
< HTTP_EQUIV
.length
&&
333 c
== HTTP_EQUIV
[httpEquivIndex
]) {
336 httpEquivIndex
= INT32_MAX
;
343 attributenameloop_end
:;
346 case BEFORE_ATTRIBUTE_VALUE
: {
351 NS_HTML5_BREAK(stateloop
);
360 state
= nsHtml5MetaScanner::ATTRIBUTE_VALUE_DOUBLE_QUOTED
;
361 NS_HTML5_BREAK(beforeattributevalueloop
);
364 state
= nsHtml5MetaScanner::ATTRIBUTE_VALUE_SINGLE_QUOTED
;
365 NS_HTML5_CONTINUE(stateloop
);
369 NS_HTML5_BREAK(stateloop
);
371 state
= nsHtml5MetaScanner::DATA
;
372 NS_HTML5_CONTINUE(stateloop
);
375 handleCharInAttributeValue(c
);
376 state
= nsHtml5MetaScanner::ATTRIBUTE_VALUE_UNQUOTED
;
377 NS_HTML5_CONTINUE(stateloop
);
381 beforeattributevalueloop_end
:;
384 case ATTRIBUTE_VALUE_DOUBLE_QUOTED
: {
393 NS_HTML5_BREAK(stateloop
);
396 handleAttributeValue();
397 state
= nsHtml5MetaScanner::AFTER_ATTRIBUTE_VALUE_QUOTED
;
398 NS_HTML5_BREAK(attributevaluedoublequotedloop
);
401 handleCharInAttributeValue(c
);
406 attributevaluedoublequotedloop_end
:;
409 case AFTER_ATTRIBUTE_VALUE_QUOTED
: {
414 NS_HTML5_BREAK(stateloop
);
420 state
= nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME
;
421 NS_HTML5_CONTINUE(stateloop
);
424 state
= nsHtml5MetaScanner::SELF_CLOSING_START_TAG
;
425 NS_HTML5_BREAK(afterattributevaluequotedloop
);
429 NS_HTML5_BREAK(stateloop
);
431 state
= nsHtml5MetaScanner::DATA
;
432 NS_HTML5_CONTINUE(stateloop
);
435 state
= nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME
;
437 NS_HTML5_CONTINUE(stateloop
);
441 afterattributevaluequotedloop_end
:;
444 case SELF_CLOSING_START_TAG
: {
448 NS_HTML5_BREAK(stateloop
);
452 NS_HTML5_BREAK(stateloop
);
454 state
= nsHtml5MetaScanner::DATA
;
455 NS_HTML5_CONTINUE(stateloop
);
458 state
= nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME
;
460 NS_HTML5_CONTINUE(stateloop
);
464 case ATTRIBUTE_VALUE_UNQUOTED
: {
473 NS_HTML5_BREAK(stateloop
);
479 handleAttributeValue();
480 state
= nsHtml5MetaScanner::BEFORE_ATTRIBUTE_NAME
;
481 NS_HTML5_CONTINUE(stateloop
);
484 handleAttributeValue();
486 NS_HTML5_BREAK(stateloop
);
488 state
= nsHtml5MetaScanner::DATA
;
489 NS_HTML5_CONTINUE(stateloop
);
492 handleCharInAttributeValue(c
);
498 case AFTER_ATTRIBUTE_NAME
: {
503 NS_HTML5_BREAK(stateloop
);
512 handleAttributeValue();
513 state
= nsHtml5MetaScanner::SELF_CLOSING_START_TAG
;
514 NS_HTML5_CONTINUE(stateloop
);
518 contentTypeIndex
= 0;
519 state
= nsHtml5MetaScanner::BEFORE_ATTRIBUTE_VALUE
;
520 NS_HTML5_CONTINUE(stateloop
);
523 handleAttributeValue();
525 NS_HTML5_BREAK(stateloop
);
527 state
= nsHtml5MetaScanner::DATA
;
528 NS_HTML5_CONTINUE(stateloop
);
534 state
= nsHtml5MetaScanner::ATTRIBUTE_NAME
;
535 NS_HTML5_CONTINUE(stateloop
);
538 contentIndex
= INT32_MAX
;
539 charsetIndex
= INT32_MAX
;
540 state
= nsHtml5MetaScanner::ATTRIBUTE_NAME
;
541 NS_HTML5_CONTINUE(stateloop
);
546 case MARKUP_DECLARATION_OPEN
: {
551 NS_HTML5_BREAK(stateloop
);
554 state
= nsHtml5MetaScanner::MARKUP_DECLARATION_HYPHEN
;
555 NS_HTML5_BREAK(markupdeclarationopenloop
);
558 state
= nsHtml5MetaScanner::SCAN_UNTIL_GT
;
560 NS_HTML5_CONTINUE(stateloop
);
564 markupdeclarationopenloop_end
:;
567 case MARKUP_DECLARATION_HYPHEN
: {
572 NS_HTML5_BREAK(stateloop
);
575 state
= nsHtml5MetaScanner::COMMENT_START
;
576 NS_HTML5_BREAK(markupdeclarationhyphenloop
);
579 state
= nsHtml5MetaScanner::SCAN_UNTIL_GT
;
581 NS_HTML5_CONTINUE(stateloop
);
585 markupdeclarationhyphenloop_end
:;
588 case COMMENT_START
: {
593 NS_HTML5_BREAK(stateloop
);
596 state
= nsHtml5MetaScanner::COMMENT_START_DASH
;
597 NS_HTML5_CONTINUE(stateloop
);
600 state
= nsHtml5MetaScanner::DATA
;
601 NS_HTML5_CONTINUE(stateloop
);
604 state
= nsHtml5MetaScanner::COMMENT
;
605 NS_HTML5_BREAK(commentstartloop
);
609 commentstartloop_end
:;
617 NS_HTML5_BREAK(stateloop
);
620 state
= nsHtml5MetaScanner::COMMENT_END_DASH
;
621 NS_HTML5_BREAK(commentloop
);
631 case COMMENT_END_DASH
: {
636 NS_HTML5_BREAK(stateloop
);
639 state
= nsHtml5MetaScanner::COMMENT_END
;
640 NS_HTML5_BREAK(commentenddashloop
);
643 state
= nsHtml5MetaScanner::COMMENT
;
644 NS_HTML5_CONTINUE(stateloop
);
648 commentenddashloop_end
:;
656 NS_HTML5_BREAK(stateloop
);
659 state
= nsHtml5MetaScanner::DATA
;
660 NS_HTML5_CONTINUE(stateloop
);
666 state
= nsHtml5MetaScanner::COMMENT
;
667 NS_HTML5_CONTINUE(stateloop
);
672 case COMMENT_START_DASH
: {
676 NS_HTML5_BREAK(stateloop
);
679 state
= nsHtml5MetaScanner::COMMENT_END
;
680 NS_HTML5_CONTINUE(stateloop
);
683 state
= nsHtml5MetaScanner::DATA
;
684 NS_HTML5_CONTINUE(stateloop
);
687 state
= nsHtml5MetaScanner::COMMENT
;
688 NS_HTML5_CONTINUE(stateloop
);
692 case ATTRIBUTE_VALUE_SINGLE_QUOTED
: {
701 NS_HTML5_BREAK(stateloop
);
704 handleAttributeValue();
705 state
= nsHtml5MetaScanner::AFTER_ATTRIBUTE_VALUE_QUOTED
;
706 NS_HTML5_CONTINUE(stateloop
);
709 handleCharInAttributeValue(c
);
715 case SCAN_UNTIL_GT
: {
724 NS_HTML5_BREAK(stateloop
);
727 state
= nsHtml5MetaScanner::DATA
;
728 NS_HTML5_CONTINUE(stateloop
);
742 void nsHtml5MetaScanner::handleCharInAttributeValue(int32_t c
) {
743 if (metaState
== A
) {
744 if (contentIndex
== CONTENT
.length
|| charsetIndex
== CHARSET
.length
) {
746 } else if (httpEquivIndex
== HTTP_EQUIV
.length
) {
747 if (contentTypeIndex
< CONTENT_TYPE
.length
&&
748 toAsciiLowerCase(c
) == CONTENT_TYPE
[contentTypeIndex
]) {
751 contentTypeIndex
= INT32_MAX
;
757 void nsHtml5MetaScanner::addToBuffer(int32_t c
) {
758 if (strBufLen
== strBuf
.length
) {
759 jArray
<char16_t
, int32_t> newBuf
= jArray
<char16_t
, int32_t>::newJArray(
760 nsHtml5Portability::checkedAdd(strBuf
.length
, (strBuf
.length
<< 1)));
761 nsHtml5ArrayCopy::arraycopy(strBuf
, newBuf
, strBuf
.length
);
764 strBuf
[strBufLen
++] = (char16_t
)c
;
767 void nsHtml5MetaScanner::handleAttributeValue() {
768 if (metaState
!= A
) {
771 if (contentIndex
== CONTENT
.length
&& !content
) {
772 content
= nsHtml5Portability::newStringFromBuffer(strBuf
, 0, strBufLen
,
776 if (charsetIndex
== CHARSET
.length
&& !charset
) {
777 charset
= nsHtml5Portability::newStringFromBuffer(strBuf
, 0, strBufLen
,
781 if (httpEquivIndex
== HTTP_EQUIV
.length
&&
782 httpEquivState
== HTTP_EQUIV_NOT_SEEN
) {
783 httpEquivState
= (contentTypeIndex
== CONTENT_TYPE
.length
)
784 ? HTTP_EQUIV_CONTENT_TYPE
790 bool nsHtml5MetaScanner::handleTag() {
791 bool stop
= handleTagInner();
796 httpEquivState
= HTTP_EQUIV_NOT_SEEN
;
800 bool nsHtml5MetaScanner::handleTagInner() {
801 if (!!charset
&& tryCharset(charset
)) {
804 if (!!content
&& httpEquivState
== HTTP_EQUIV_CONTENT_TYPE
) {
805 nsHtml5String extract
=
806 nsHtml5TreeBuilder::extractCharsetFromContent(content
, treeBuilder
);
810 bool success
= tryCharset(extract
);
817 void nsHtml5MetaScanner::initializeStatics() {}
819 void nsHtml5MetaScanner::releaseStatics() {}
821 #include "nsHtml5MetaScannerCppSupplement.h"