2 * Copyright (c) 2007 Henri Sivonen
3 * Copyright (c) 2008-2010 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"
34 #include "nsNameSpaceManager.h"
35 #include "nsIContent.h"
36 #include "nsTraceRefcnt.h"
38 #include "nsHtml5ArrayCopy.h"
39 #include "nsAHtml5TreeBuilderState.h"
40 #include "nsHtml5Atoms.h"
41 #include "nsHtml5ByteReadable.h"
42 #include "nsIUnicodeDecoder.h"
43 #include "nsHtml5Macros.h"
44 #include "nsIContentHandle.h"
46 #include "nsHtml5Tokenizer.h"
47 #include "nsHtml5TreeBuilder.h"
48 #include "nsHtml5AttributeName.h"
49 #include "nsHtml5ElementName.h"
50 #include "nsHtml5HtmlAttributes.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
= { CHARSET_DATA
, MOZ_ARRAY_LENGTH(CHARSET_DATA
) };
60 static char16_t
const CONTENT_DATA
[] = { 'o', 'n', 't', 'e', 'n', 't' };
61 staticJArray
<char16_t
,int32_t> nsHtml5MetaScanner::CONTENT
= { CONTENT_DATA
, MOZ_ARRAY_LENGTH(CONTENT_DATA
) };
62 static char16_t
const HTTP_EQUIV_DATA
[] = { 't', 't', 'p', '-', 'e', 'q', 'u', 'i', 'v' };
63 staticJArray
<char16_t
,int32_t> nsHtml5MetaScanner::HTTP_EQUIV
= { HTTP_EQUIV_DATA
, MOZ_ARRAY_LENGTH(HTTP_EQUIV_DATA
) };
64 static char16_t
const CONTENT_TYPE_DATA
[] = { 'c', 'o', 'n', 't', 'e', 'n', 't', '-', 't', 'y', 'p', 'e' };
65 staticJArray
<char16_t
,int32_t> nsHtml5MetaScanner::CONTENT_TYPE
= { CONTENT_TYPE_DATA
, MOZ_ARRAY_LENGTH(CONTENT_TYPE_DATA
) };
67 nsHtml5MetaScanner::nsHtml5MetaScanner()
69 metaState(NS_HTML5META_SCANNER_NO
),
70 contentIndex(INT32_MAX
),
71 charsetIndex(INT32_MAX
),
72 httpEquivIndex(INT32_MAX
),
73 contentTypeIndex(INT32_MAX
),
74 stateSave(NS_HTML5META_SCANNER_DATA
),
76 strBuf(jArray
<char16_t
,int32_t>::newJArray(36)),
79 httpEquivState(NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN
)
81 MOZ_COUNT_CTOR(nsHtml5MetaScanner
);
85 nsHtml5MetaScanner::~nsHtml5MetaScanner()
87 MOZ_COUNT_DTOR(nsHtml5MetaScanner
);
88 nsHtml5Portability::releaseString(content
);
89 nsHtml5Portability::releaseString(charset
);
93 nsHtml5MetaScanner::stateLoop(int32_t state
)
96 bool reconsume
= false;
97 stateloop
: for (; ; ) {
99 case NS_HTML5META_SCANNER_DATA
: {
108 NS_HTML5_BREAK(stateloop
);
111 state
= NS_HTML5META_SCANNER_TAG_OPEN
;
112 NS_HTML5_BREAK(dataloop
);
121 case NS_HTML5META_SCANNER_TAG_OPEN
: {
126 NS_HTML5_BREAK(stateloop
);
130 metaState
= NS_HTML5META_SCANNER_M
;
131 state
= NS_HTML5META_SCANNER_TAG_NAME
;
132 NS_HTML5_BREAK(tagopenloop
);
135 state
= NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN
;
136 NS_HTML5_CONTINUE(stateloop
);
140 state
= NS_HTML5META_SCANNER_SCAN_UNTIL_GT
;
141 NS_HTML5_CONTINUE(stateloop
);
144 state
= NS_HTML5META_SCANNER_DATA
;
145 NS_HTML5_CONTINUE(stateloop
);
148 if ((c
>= 'A' && c
<= 'Z') || (c
>= 'a' && c
<= 'z')) {
149 metaState
= NS_HTML5META_SCANNER_NO
;
150 state
= NS_HTML5META_SCANNER_TAG_NAME
;
151 NS_HTML5_BREAK(tagopenloop
);
153 state
= NS_HTML5META_SCANNER_DATA
;
155 NS_HTML5_CONTINUE(stateloop
);
161 case NS_HTML5META_SCANNER_TAG_NAME
: {
166 NS_HTML5_BREAK(stateloop
);
172 state
= NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME
;
173 NS_HTML5_BREAK(tagnameloop
);
176 state
= NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG
;
177 NS_HTML5_CONTINUE(stateloop
);
180 state
= NS_HTML5META_SCANNER_DATA
;
181 NS_HTML5_CONTINUE(stateloop
);
185 if (metaState
== NS_HTML5META_SCANNER_M
) {
186 metaState
= NS_HTML5META_SCANNER_E
;
188 metaState
= NS_HTML5META_SCANNER_NO
;
194 if (metaState
== NS_HTML5META_SCANNER_E
) {
195 metaState
= NS_HTML5META_SCANNER_T
;
197 metaState
= NS_HTML5META_SCANNER_NO
;
203 if (metaState
== NS_HTML5META_SCANNER_T
) {
204 metaState
= NS_HTML5META_SCANNER_A
;
206 metaState
= NS_HTML5META_SCANNER_NO
;
211 metaState
= NS_HTML5META_SCANNER_NO
;
218 case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME
: {
227 NS_HTML5_BREAK(stateloop
);
236 state
= NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG
;
237 NS_HTML5_CONTINUE(stateloop
);
241 NS_HTML5_BREAK(stateloop
);
243 state
= NS_HTML5META_SCANNER_DATA
;
244 NS_HTML5_CONTINUE(stateloop
);
250 httpEquivIndex
= INT32_MAX
;
251 contentTypeIndex
= INT32_MAX
;
252 state
= NS_HTML5META_SCANNER_ATTRIBUTE_NAME
;
253 NS_HTML5_BREAK(beforeattributenameloop
);
257 contentIndex
= INT32_MAX
;
258 charsetIndex
= INT32_MAX
;
260 contentTypeIndex
= INT32_MAX
;
261 state
= NS_HTML5META_SCANNER_ATTRIBUTE_NAME
;
262 NS_HTML5_BREAK(beforeattributenameloop
);
265 contentIndex
= INT32_MAX
;
266 charsetIndex
= INT32_MAX
;
267 httpEquivIndex
= INT32_MAX
;
268 contentTypeIndex
= INT32_MAX
;
269 state
= NS_HTML5META_SCANNER_ATTRIBUTE_NAME
;
270 NS_HTML5_BREAK(beforeattributenameloop
);
274 beforeattributenameloop_end
: ;
276 case NS_HTML5META_SCANNER_ATTRIBUTE_NAME
: {
281 NS_HTML5_BREAK(stateloop
);
287 state
= NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME
;
288 NS_HTML5_CONTINUE(stateloop
);
291 state
= NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG
;
292 NS_HTML5_CONTINUE(stateloop
);
296 contentTypeIndex
= 0;
297 state
= NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE
;
298 NS_HTML5_BREAK(attributenameloop
);
302 NS_HTML5_BREAK(stateloop
);
304 state
= NS_HTML5META_SCANNER_DATA
;
305 NS_HTML5_CONTINUE(stateloop
);
308 if (metaState
== NS_HTML5META_SCANNER_A
) {
309 if (c
>= 'A' && c
<= 'Z') {
312 if (contentIndex
< CONTENT
.length
&& c
== CONTENT
[contentIndex
]) {
315 contentIndex
= INT32_MAX
;
317 if (charsetIndex
< CHARSET
.length
&& c
== CHARSET
[charsetIndex
]) {
320 charsetIndex
= INT32_MAX
;
322 if (httpEquivIndex
< HTTP_EQUIV
.length
&& c
== HTTP_EQUIV
[httpEquivIndex
]) {
325 httpEquivIndex
= INT32_MAX
;
332 attributenameloop_end
: ;
334 case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE
: {
339 NS_HTML5_BREAK(stateloop
);
348 state
= NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED
;
349 NS_HTML5_BREAK(beforeattributevalueloop
);
352 state
= NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED
;
353 NS_HTML5_CONTINUE(stateloop
);
357 NS_HTML5_BREAK(stateloop
);
359 state
= NS_HTML5META_SCANNER_DATA
;
360 NS_HTML5_CONTINUE(stateloop
);
363 handleCharInAttributeValue(c
);
364 state
= NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED
;
365 NS_HTML5_CONTINUE(stateloop
);
369 beforeattributevalueloop_end
: ;
371 case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED
: {
380 NS_HTML5_BREAK(stateloop
);
383 handleAttributeValue();
384 state
= NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED
;
385 NS_HTML5_BREAK(attributevaluedoublequotedloop
);
388 handleCharInAttributeValue(c
);
393 attributevaluedoublequotedloop_end
: ;
395 case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED
: {
400 NS_HTML5_BREAK(stateloop
);
406 state
= NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME
;
407 NS_HTML5_CONTINUE(stateloop
);
410 state
= NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG
;
411 NS_HTML5_BREAK(afterattributevaluequotedloop
);
415 NS_HTML5_BREAK(stateloop
);
417 state
= NS_HTML5META_SCANNER_DATA
;
418 NS_HTML5_CONTINUE(stateloop
);
421 state
= NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME
;
423 NS_HTML5_CONTINUE(stateloop
);
427 afterattributevaluequotedloop_end
: ;
429 case NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG
: {
433 NS_HTML5_BREAK(stateloop
);
437 NS_HTML5_BREAK(stateloop
);
439 state
= NS_HTML5META_SCANNER_DATA
;
440 NS_HTML5_CONTINUE(stateloop
);
443 state
= NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME
;
445 NS_HTML5_CONTINUE(stateloop
);
449 case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED
: {
458 NS_HTML5_BREAK(stateloop
);
464 handleAttributeValue();
465 state
= NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME
;
466 NS_HTML5_CONTINUE(stateloop
);
469 handleAttributeValue();
471 NS_HTML5_BREAK(stateloop
);
473 state
= NS_HTML5META_SCANNER_DATA
;
474 NS_HTML5_CONTINUE(stateloop
);
477 handleCharInAttributeValue(c
);
483 case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME
: {
488 NS_HTML5_BREAK(stateloop
);
497 handleAttributeValue();
498 state
= NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG
;
499 NS_HTML5_CONTINUE(stateloop
);
503 contentTypeIndex
= 0;
504 state
= NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE
;
505 NS_HTML5_CONTINUE(stateloop
);
508 handleAttributeValue();
510 NS_HTML5_BREAK(stateloop
);
512 state
= NS_HTML5META_SCANNER_DATA
;
513 NS_HTML5_CONTINUE(stateloop
);
519 state
= NS_HTML5META_SCANNER_ATTRIBUTE_NAME
;
520 NS_HTML5_CONTINUE(stateloop
);
523 contentIndex
= INT32_MAX
;
524 charsetIndex
= INT32_MAX
;
525 state
= NS_HTML5META_SCANNER_ATTRIBUTE_NAME
;
526 NS_HTML5_CONTINUE(stateloop
);
531 case NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN
: {
536 NS_HTML5_BREAK(stateloop
);
539 state
= NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN
;
540 NS_HTML5_BREAK(markupdeclarationopenloop
);
543 state
= NS_HTML5META_SCANNER_SCAN_UNTIL_GT
;
545 NS_HTML5_CONTINUE(stateloop
);
549 markupdeclarationopenloop_end
: ;
551 case NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN
: {
556 NS_HTML5_BREAK(stateloop
);
559 state
= NS_HTML5META_SCANNER_COMMENT_START
;
560 NS_HTML5_BREAK(markupdeclarationhyphenloop
);
563 state
= NS_HTML5META_SCANNER_SCAN_UNTIL_GT
;
565 NS_HTML5_CONTINUE(stateloop
);
569 markupdeclarationhyphenloop_end
: ;
571 case NS_HTML5META_SCANNER_COMMENT_START
: {
576 NS_HTML5_BREAK(stateloop
);
579 state
= NS_HTML5META_SCANNER_COMMENT_START_DASH
;
580 NS_HTML5_CONTINUE(stateloop
);
583 state
= NS_HTML5META_SCANNER_DATA
;
584 NS_HTML5_CONTINUE(stateloop
);
587 state
= NS_HTML5META_SCANNER_COMMENT
;
588 NS_HTML5_BREAK(commentstartloop
);
592 commentstartloop_end
: ;
594 case NS_HTML5META_SCANNER_COMMENT
: {
599 NS_HTML5_BREAK(stateloop
);
602 state
= NS_HTML5META_SCANNER_COMMENT_END_DASH
;
603 NS_HTML5_BREAK(commentloop
);
612 case NS_HTML5META_SCANNER_COMMENT_END_DASH
: {
617 NS_HTML5_BREAK(stateloop
);
620 state
= NS_HTML5META_SCANNER_COMMENT_END
;
621 NS_HTML5_BREAK(commentenddashloop
);
624 state
= NS_HTML5META_SCANNER_COMMENT
;
625 NS_HTML5_CONTINUE(stateloop
);
629 commentenddashloop_end
: ;
631 case NS_HTML5META_SCANNER_COMMENT_END
: {
636 NS_HTML5_BREAK(stateloop
);
639 state
= NS_HTML5META_SCANNER_DATA
;
640 NS_HTML5_CONTINUE(stateloop
);
646 state
= NS_HTML5META_SCANNER_COMMENT
;
647 NS_HTML5_CONTINUE(stateloop
);
652 case NS_HTML5META_SCANNER_COMMENT_START_DASH
: {
656 NS_HTML5_BREAK(stateloop
);
659 state
= NS_HTML5META_SCANNER_COMMENT_END
;
660 NS_HTML5_CONTINUE(stateloop
);
663 state
= NS_HTML5META_SCANNER_DATA
;
664 NS_HTML5_CONTINUE(stateloop
);
667 state
= NS_HTML5META_SCANNER_COMMENT
;
668 NS_HTML5_CONTINUE(stateloop
);
672 case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED
: {
681 NS_HTML5_BREAK(stateloop
);
684 handleAttributeValue();
685 state
= NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED
;
686 NS_HTML5_CONTINUE(stateloop
);
689 handleCharInAttributeValue(c
);
695 case NS_HTML5META_SCANNER_SCAN_UNTIL_GT
: {
704 NS_HTML5_BREAK(stateloop
);
707 state
= NS_HTML5META_SCANNER_DATA
;
708 NS_HTML5_CONTINUE(stateloop
);
723 nsHtml5MetaScanner::handleCharInAttributeValue(int32_t c
)
725 if (metaState
== NS_HTML5META_SCANNER_A
) {
726 if (contentIndex
== CONTENT
.length
|| charsetIndex
== CHARSET
.length
) {
728 } else if (httpEquivIndex
== HTTP_EQUIV
.length
) {
729 if (contentTypeIndex
< CONTENT_TYPE
.length
&& toAsciiLowerCase(c
) == CONTENT_TYPE
[contentTypeIndex
]) {
732 contentTypeIndex
= INT32_MAX
;
739 nsHtml5MetaScanner::addToBuffer(int32_t c
)
741 if (strBufLen
== strBuf
.length
) {
742 jArray
<char16_t
,int32_t> newBuf
= jArray
<char16_t
,int32_t>::newJArray(strBuf
.length
+ (strBuf
.length
<< 1));
743 nsHtml5ArrayCopy::arraycopy(strBuf
, newBuf
, strBuf
.length
);
746 strBuf
[strBufLen
++] = (char16_t
) c
;
750 nsHtml5MetaScanner::handleAttributeValue()
752 if (metaState
!= NS_HTML5META_SCANNER_A
) {
755 if (contentIndex
== CONTENT
.length
&& !content
) {
756 content
= nsHtml5Portability::newStringFromBuffer(strBuf
, 0, strBufLen
);
759 if (charsetIndex
== CHARSET
.length
&& !charset
) {
760 charset
= nsHtml5Portability::newStringFromBuffer(strBuf
, 0, strBufLen
);
763 if (httpEquivIndex
== HTTP_EQUIV
.length
&& httpEquivState
== NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN
) {
764 httpEquivState
= (contentTypeIndex
== CONTENT_TYPE
.length
) ? NS_HTML5META_SCANNER_HTTP_EQUIV_CONTENT_TYPE
: NS_HTML5META_SCANNER_HTTP_EQUIV_OTHER
;
770 nsHtml5MetaScanner::handleTag()
772 bool stop
= handleTagInner();
773 nsHtml5Portability::releaseString(content
);
775 nsHtml5Portability::releaseString(charset
);
777 httpEquivState
= NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN
;
782 nsHtml5MetaScanner::handleTagInner()
784 if (!!charset
&& tryCharset(charset
)) {
787 if (!!content
&& httpEquivState
== NS_HTML5META_SCANNER_HTTP_EQUIV_CONTENT_TYPE
) {
788 nsString
* extract
= nsHtml5TreeBuilder::extractCharsetFromContent(content
);
792 bool success
= tryCharset(extract
);
793 nsHtml5Portability::releaseString(extract
);
800 nsHtml5MetaScanner::initializeStatics()
805 nsHtml5MetaScanner::releaseStatics()
810 #include "nsHtml5MetaScannerCppSupplement.h"