Bumping gaia.json for 2 gaia revision(s) a=gaia-bump
[gecko.git] / parser / html / nsHtml5MetaScanner.cpp
blob050f07f15b0089cabcc69f0429bbc52cdb4ec27e
1 /*
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__
31 #include "nsIAtom.h"
32 #include "nsHtml5AtomTable.h"
33 #include "nsString.h"
34 #include "nsNameSpaceManager.h"
35 #include "nsIContent.h"
36 #include "nsTraceRefcnt.h"
37 #include "jArray.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()
68 : readable(nullptr),
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),
75 strBufLen(0),
76 strBuf(jArray<char16_t,int32_t>::newJArray(36)),
77 content(nullptr),
78 charset(nullptr),
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);
92 void
93 nsHtml5MetaScanner::stateLoop(int32_t state)
95 int32_t c = -1;
96 bool reconsume = false;
97 stateloop: for (; ; ) {
98 switch(state) {
99 case NS_HTML5META_SCANNER_DATA: {
100 for (; ; ) {
101 if (reconsume) {
102 reconsume = false;
103 } else {
104 c = read();
106 switch(c) {
107 case -1: {
108 NS_HTML5_BREAK(stateloop);
110 case '<': {
111 state = NS_HTML5META_SCANNER_TAG_OPEN;
112 NS_HTML5_BREAK(dataloop);
114 default: {
115 continue;
119 dataloop_end: ;
121 case NS_HTML5META_SCANNER_TAG_OPEN: {
122 for (; ; ) {
123 c = read();
124 switch(c) {
125 case -1: {
126 NS_HTML5_BREAK(stateloop);
128 case 'm':
129 case 'M': {
130 metaState = NS_HTML5META_SCANNER_M;
131 state = NS_HTML5META_SCANNER_TAG_NAME;
132 NS_HTML5_BREAK(tagopenloop);
134 case '!': {
135 state = NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN;
136 NS_HTML5_CONTINUE(stateloop);
138 case '\?':
139 case '/': {
140 state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
141 NS_HTML5_CONTINUE(stateloop);
143 case '>': {
144 state = NS_HTML5META_SCANNER_DATA;
145 NS_HTML5_CONTINUE(stateloop);
147 default: {
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;
154 reconsume = true;
155 NS_HTML5_CONTINUE(stateloop);
159 tagopenloop_end: ;
161 case NS_HTML5META_SCANNER_TAG_NAME: {
162 for (; ; ) {
163 c = read();
164 switch(c) {
165 case -1: {
166 NS_HTML5_BREAK(stateloop);
168 case ' ':
169 case '\t':
170 case '\n':
171 case '\f': {
172 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
173 NS_HTML5_BREAK(tagnameloop);
175 case '/': {
176 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
177 NS_HTML5_CONTINUE(stateloop);
179 case '>': {
180 state = NS_HTML5META_SCANNER_DATA;
181 NS_HTML5_CONTINUE(stateloop);
183 case 'e':
184 case 'E': {
185 if (metaState == NS_HTML5META_SCANNER_M) {
186 metaState = NS_HTML5META_SCANNER_E;
187 } else {
188 metaState = NS_HTML5META_SCANNER_NO;
190 continue;
192 case 't':
193 case 'T': {
194 if (metaState == NS_HTML5META_SCANNER_E) {
195 metaState = NS_HTML5META_SCANNER_T;
196 } else {
197 metaState = NS_HTML5META_SCANNER_NO;
199 continue;
201 case 'a':
202 case 'A': {
203 if (metaState == NS_HTML5META_SCANNER_T) {
204 metaState = NS_HTML5META_SCANNER_A;
205 } else {
206 metaState = NS_HTML5META_SCANNER_NO;
208 continue;
210 default: {
211 metaState = NS_HTML5META_SCANNER_NO;
212 continue;
216 tagnameloop_end: ;
218 case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME: {
219 for (; ; ) {
220 if (reconsume) {
221 reconsume = false;
222 } else {
223 c = read();
225 switch(c) {
226 case -1: {
227 NS_HTML5_BREAK(stateloop);
229 case ' ':
230 case '\t':
231 case '\n':
232 case '\f': {
233 continue;
235 case '/': {
236 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
237 NS_HTML5_CONTINUE(stateloop);
239 case '>': {
240 if (handleTag()) {
241 NS_HTML5_BREAK(stateloop);
243 state = NS_HTML5META_SCANNER_DATA;
244 NS_HTML5_CONTINUE(stateloop);
246 case 'c':
247 case 'C': {
248 contentIndex = 0;
249 charsetIndex = 0;
250 httpEquivIndex = INT32_MAX;
251 contentTypeIndex = INT32_MAX;
252 state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
253 NS_HTML5_BREAK(beforeattributenameloop);
255 case 'h':
256 case 'H': {
257 contentIndex = INT32_MAX;
258 charsetIndex = INT32_MAX;
259 httpEquivIndex = 0;
260 contentTypeIndex = INT32_MAX;
261 state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
262 NS_HTML5_BREAK(beforeattributenameloop);
264 default: {
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: {
277 for (; ; ) {
278 c = read();
279 switch(c) {
280 case -1: {
281 NS_HTML5_BREAK(stateloop);
283 case ' ':
284 case '\t':
285 case '\n':
286 case '\f': {
287 state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME;
288 NS_HTML5_CONTINUE(stateloop);
290 case '/': {
291 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
292 NS_HTML5_CONTINUE(stateloop);
294 case '=': {
295 strBufLen = 0;
296 contentTypeIndex = 0;
297 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE;
298 NS_HTML5_BREAK(attributenameloop);
300 case '>': {
301 if (handleTag()) {
302 NS_HTML5_BREAK(stateloop);
304 state = NS_HTML5META_SCANNER_DATA;
305 NS_HTML5_CONTINUE(stateloop);
307 default: {
308 if (metaState == NS_HTML5META_SCANNER_A) {
309 if (c >= 'A' && c <= 'Z') {
310 c += 0x20;
312 if (contentIndex < CONTENT.length && c == CONTENT[contentIndex]) {
313 ++contentIndex;
314 } else {
315 contentIndex = INT32_MAX;
317 if (charsetIndex < CHARSET.length && c == CHARSET[charsetIndex]) {
318 ++charsetIndex;
319 } else {
320 charsetIndex = INT32_MAX;
322 if (httpEquivIndex < HTTP_EQUIV.length && c == HTTP_EQUIV[httpEquivIndex]) {
323 ++httpEquivIndex;
324 } else {
325 httpEquivIndex = INT32_MAX;
328 continue;
332 attributenameloop_end: ;
334 case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE: {
335 for (; ; ) {
336 c = read();
337 switch(c) {
338 case -1: {
339 NS_HTML5_BREAK(stateloop);
341 case ' ':
342 case '\t':
343 case '\n':
344 case '\f': {
345 continue;
347 case '\"': {
348 state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED;
349 NS_HTML5_BREAK(beforeattributevalueloop);
351 case '\'': {
352 state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED;
353 NS_HTML5_CONTINUE(stateloop);
355 case '>': {
356 if (handleTag()) {
357 NS_HTML5_BREAK(stateloop);
359 state = NS_HTML5META_SCANNER_DATA;
360 NS_HTML5_CONTINUE(stateloop);
362 default: {
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: {
372 for (; ; ) {
373 if (reconsume) {
374 reconsume = false;
375 } else {
376 c = read();
378 switch(c) {
379 case -1: {
380 NS_HTML5_BREAK(stateloop);
382 case '\"': {
383 handleAttributeValue();
384 state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED;
385 NS_HTML5_BREAK(attributevaluedoublequotedloop);
387 default: {
388 handleCharInAttributeValue(c);
389 continue;
393 attributevaluedoublequotedloop_end: ;
395 case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED: {
396 for (; ; ) {
397 c = read();
398 switch(c) {
399 case -1: {
400 NS_HTML5_BREAK(stateloop);
402 case ' ':
403 case '\t':
404 case '\n':
405 case '\f': {
406 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
407 NS_HTML5_CONTINUE(stateloop);
409 case '/': {
410 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
411 NS_HTML5_BREAK(afterattributevaluequotedloop);
413 case '>': {
414 if (handleTag()) {
415 NS_HTML5_BREAK(stateloop);
417 state = NS_HTML5META_SCANNER_DATA;
418 NS_HTML5_CONTINUE(stateloop);
420 default: {
421 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
422 reconsume = true;
423 NS_HTML5_CONTINUE(stateloop);
427 afterattributevaluequotedloop_end: ;
429 case NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG: {
430 c = read();
431 switch(c) {
432 case -1: {
433 NS_HTML5_BREAK(stateloop);
435 case '>': {
436 if (handleTag()) {
437 NS_HTML5_BREAK(stateloop);
439 state = NS_HTML5META_SCANNER_DATA;
440 NS_HTML5_CONTINUE(stateloop);
442 default: {
443 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
444 reconsume = true;
445 NS_HTML5_CONTINUE(stateloop);
449 case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED: {
450 for (; ; ) {
451 if (reconsume) {
452 reconsume = false;
453 } else {
454 c = read();
456 switch(c) {
457 case -1: {
458 NS_HTML5_BREAK(stateloop);
460 case ' ':
461 case '\t':
462 case '\n':
463 case '\f': {
464 handleAttributeValue();
465 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
466 NS_HTML5_CONTINUE(stateloop);
468 case '>': {
469 handleAttributeValue();
470 if (handleTag()) {
471 NS_HTML5_BREAK(stateloop);
473 state = NS_HTML5META_SCANNER_DATA;
474 NS_HTML5_CONTINUE(stateloop);
476 default: {
477 handleCharInAttributeValue(c);
478 continue;
483 case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME: {
484 for (; ; ) {
485 c = read();
486 switch(c) {
487 case -1: {
488 NS_HTML5_BREAK(stateloop);
490 case ' ':
491 case '\t':
492 case '\n':
493 case '\f': {
494 continue;
496 case '/': {
497 handleAttributeValue();
498 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
499 NS_HTML5_CONTINUE(stateloop);
501 case '=': {
502 strBufLen = 0;
503 contentTypeIndex = 0;
504 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE;
505 NS_HTML5_CONTINUE(stateloop);
507 case '>': {
508 handleAttributeValue();
509 if (handleTag()) {
510 NS_HTML5_BREAK(stateloop);
512 state = NS_HTML5META_SCANNER_DATA;
513 NS_HTML5_CONTINUE(stateloop);
515 case 'c':
516 case 'C': {
517 contentIndex = 0;
518 charsetIndex = 0;
519 state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
520 NS_HTML5_CONTINUE(stateloop);
522 default: {
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: {
532 for (; ; ) {
533 c = read();
534 switch(c) {
535 case -1: {
536 NS_HTML5_BREAK(stateloop);
538 case '-': {
539 state = NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN;
540 NS_HTML5_BREAK(markupdeclarationopenloop);
542 default: {
543 state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
544 reconsume = true;
545 NS_HTML5_CONTINUE(stateloop);
549 markupdeclarationopenloop_end: ;
551 case NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN: {
552 for (; ; ) {
553 c = read();
554 switch(c) {
555 case -1: {
556 NS_HTML5_BREAK(stateloop);
558 case '-': {
559 state = NS_HTML5META_SCANNER_COMMENT_START;
560 NS_HTML5_BREAK(markupdeclarationhyphenloop);
562 default: {
563 state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
564 reconsume = true;
565 NS_HTML5_CONTINUE(stateloop);
569 markupdeclarationhyphenloop_end: ;
571 case NS_HTML5META_SCANNER_COMMENT_START: {
572 for (; ; ) {
573 c = read();
574 switch(c) {
575 case -1: {
576 NS_HTML5_BREAK(stateloop);
578 case '-': {
579 state = NS_HTML5META_SCANNER_COMMENT_START_DASH;
580 NS_HTML5_CONTINUE(stateloop);
582 case '>': {
583 state = NS_HTML5META_SCANNER_DATA;
584 NS_HTML5_CONTINUE(stateloop);
586 default: {
587 state = NS_HTML5META_SCANNER_COMMENT;
588 NS_HTML5_BREAK(commentstartloop);
592 commentstartloop_end: ;
594 case NS_HTML5META_SCANNER_COMMENT: {
595 for (; ; ) {
596 c = read();
597 switch(c) {
598 case -1: {
599 NS_HTML5_BREAK(stateloop);
601 case '-': {
602 state = NS_HTML5META_SCANNER_COMMENT_END_DASH;
603 NS_HTML5_BREAK(commentloop);
605 default: {
606 continue;
610 commentloop_end: ;
612 case NS_HTML5META_SCANNER_COMMENT_END_DASH: {
613 for (; ; ) {
614 c = read();
615 switch(c) {
616 case -1: {
617 NS_HTML5_BREAK(stateloop);
619 case '-': {
620 state = NS_HTML5META_SCANNER_COMMENT_END;
621 NS_HTML5_BREAK(commentenddashloop);
623 default: {
624 state = NS_HTML5META_SCANNER_COMMENT;
625 NS_HTML5_CONTINUE(stateloop);
629 commentenddashloop_end: ;
631 case NS_HTML5META_SCANNER_COMMENT_END: {
632 for (; ; ) {
633 c = read();
634 switch(c) {
635 case -1: {
636 NS_HTML5_BREAK(stateloop);
638 case '>': {
639 state = NS_HTML5META_SCANNER_DATA;
640 NS_HTML5_CONTINUE(stateloop);
642 case '-': {
643 continue;
645 default: {
646 state = NS_HTML5META_SCANNER_COMMENT;
647 NS_HTML5_CONTINUE(stateloop);
652 case NS_HTML5META_SCANNER_COMMENT_START_DASH: {
653 c = read();
654 switch(c) {
655 case -1: {
656 NS_HTML5_BREAK(stateloop);
658 case '-': {
659 state = NS_HTML5META_SCANNER_COMMENT_END;
660 NS_HTML5_CONTINUE(stateloop);
662 case '>': {
663 state = NS_HTML5META_SCANNER_DATA;
664 NS_HTML5_CONTINUE(stateloop);
666 default: {
667 state = NS_HTML5META_SCANNER_COMMENT;
668 NS_HTML5_CONTINUE(stateloop);
672 case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED: {
673 for (; ; ) {
674 if (reconsume) {
675 reconsume = false;
676 } else {
677 c = read();
679 switch(c) {
680 case -1: {
681 NS_HTML5_BREAK(stateloop);
683 case '\'': {
684 handleAttributeValue();
685 state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED;
686 NS_HTML5_CONTINUE(stateloop);
688 default: {
689 handleCharInAttributeValue(c);
690 continue;
695 case NS_HTML5META_SCANNER_SCAN_UNTIL_GT: {
696 for (; ; ) {
697 if (reconsume) {
698 reconsume = false;
699 } else {
700 c = read();
702 switch(c) {
703 case -1: {
704 NS_HTML5_BREAK(stateloop);
706 case '>': {
707 state = NS_HTML5META_SCANNER_DATA;
708 NS_HTML5_CONTINUE(stateloop);
710 default: {
711 continue;
718 stateloop_end: ;
719 stateSave = state;
722 void
723 nsHtml5MetaScanner::handleCharInAttributeValue(int32_t c)
725 if (metaState == NS_HTML5META_SCANNER_A) {
726 if (contentIndex == CONTENT.length || charsetIndex == CHARSET.length) {
727 addToBuffer(c);
728 } else if (httpEquivIndex == HTTP_EQUIV.length) {
729 if (contentTypeIndex < CONTENT_TYPE.length && toAsciiLowerCase(c) == CONTENT_TYPE[contentTypeIndex]) {
730 ++contentTypeIndex;
731 } else {
732 contentTypeIndex = INT32_MAX;
738 void
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);
744 strBuf = newBuf;
746 strBuf[strBufLen++] = (char16_t) c;
749 void
750 nsHtml5MetaScanner::handleAttributeValue()
752 if (metaState != NS_HTML5META_SCANNER_A) {
753 return;
755 if (contentIndex == CONTENT.length && !content) {
756 content = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen);
757 return;
759 if (charsetIndex == CHARSET.length && !charset) {
760 charset = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen);
761 return;
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;
765 return;
769 bool
770 nsHtml5MetaScanner::handleTag()
772 bool stop = handleTagInner();
773 nsHtml5Portability::releaseString(content);
774 content = nullptr;
775 nsHtml5Portability::releaseString(charset);
776 charset = nullptr;
777 httpEquivState = NS_HTML5META_SCANNER_HTTP_EQUIV_NOT_SEEN;
778 return stop;
781 bool
782 nsHtml5MetaScanner::handleTagInner()
784 if (!!charset && tryCharset(charset)) {
785 return true;
787 if (!!content && httpEquivState == NS_HTML5META_SCANNER_HTTP_EQUIV_CONTENT_TYPE) {
788 nsString* extract = nsHtml5TreeBuilder::extractCharsetFromContent(content);
789 if (!extract) {
790 return false;
792 bool success = tryCharset(extract);
793 nsHtml5Portability::releaseString(extract);
794 return success;
796 return false;
799 void
800 nsHtml5MetaScanner::initializeStatics()
804 void
805 nsHtml5MetaScanner::releaseStatics()
810 #include "nsHtml5MetaScannerCppSupplement.h"