Fri, 16 Jan 2015 18:13:44 +0100
Integrate suggestion from review to improve consistency with existing code.
1 /*
2 * Copyright (c) 2007 Henri Sivonen
3 * Copyright (c) 2008-2010 Mozilla Foundation
4 *
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:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
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.
22 */
24 /*
25 * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
26 * Please edit MetaScanner.java instead and regenerate.
27 */
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)
80 {
81 MOZ_COUNT_CTOR(nsHtml5MetaScanner);
82 }
85 nsHtml5MetaScanner::~nsHtml5MetaScanner()
86 {
87 MOZ_COUNT_DTOR(nsHtml5MetaScanner);
88 nsHtml5Portability::releaseString(content);
89 nsHtml5Portability::releaseString(charset);
90 }
92 void
93 nsHtml5MetaScanner::stateLoop(int32_t state)
94 {
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();
105 }
106 switch(c) {
107 case -1: {
108 NS_HTML5_BREAK(stateloop);
109 }
110 case '<': {
111 state = NS_HTML5META_SCANNER_TAG_OPEN;
112 NS_HTML5_BREAK(dataloop);
113 }
114 default: {
115 continue;
116 }
117 }
118 }
119 dataloop_end: ;
120 }
121 case NS_HTML5META_SCANNER_TAG_OPEN: {
122 for (; ; ) {
123 c = read();
124 switch(c) {
125 case -1: {
126 NS_HTML5_BREAK(stateloop);
127 }
128 case 'm':
129 case 'M': {
130 metaState = NS_HTML5META_SCANNER_M;
131 state = NS_HTML5META_SCANNER_TAG_NAME;
132 NS_HTML5_BREAK(tagopenloop);
133 }
134 case '!': {
135 state = NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN;
136 NS_HTML5_CONTINUE(stateloop);
137 }
138 case '\?':
139 case '/': {
140 state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
141 NS_HTML5_CONTINUE(stateloop);
142 }
143 case '>': {
144 state = NS_HTML5META_SCANNER_DATA;
145 NS_HTML5_CONTINUE(stateloop);
146 }
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);
152 }
153 state = NS_HTML5META_SCANNER_DATA;
154 reconsume = true;
155 NS_HTML5_CONTINUE(stateloop);
156 }
157 }
158 }
159 tagopenloop_end: ;
160 }
161 case NS_HTML5META_SCANNER_TAG_NAME: {
162 for (; ; ) {
163 c = read();
164 switch(c) {
165 case -1: {
166 NS_HTML5_BREAK(stateloop);
167 }
168 case ' ':
169 case '\t':
170 case '\n':
171 case '\f': {
172 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
173 NS_HTML5_BREAK(tagnameloop);
174 }
175 case '/': {
176 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
177 NS_HTML5_CONTINUE(stateloop);
178 }
179 case '>': {
180 state = NS_HTML5META_SCANNER_DATA;
181 NS_HTML5_CONTINUE(stateloop);
182 }
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;
189 }
190 continue;
191 }
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;
198 }
199 continue;
200 }
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;
207 }
208 continue;
209 }
210 default: {
211 metaState = NS_HTML5META_SCANNER_NO;
212 continue;
213 }
214 }
215 }
216 tagnameloop_end: ;
217 }
218 case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME: {
219 for (; ; ) {
220 if (reconsume) {
221 reconsume = false;
222 } else {
223 c = read();
224 }
225 switch(c) {
226 case -1: {
227 NS_HTML5_BREAK(stateloop);
228 }
229 case ' ':
230 case '\t':
231 case '\n':
232 case '\f': {
233 continue;
234 }
235 case '/': {
236 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
237 NS_HTML5_CONTINUE(stateloop);
238 }
239 case '>': {
240 if (handleTag()) {
241 NS_HTML5_BREAK(stateloop);
242 }
243 state = NS_HTML5META_SCANNER_DATA;
244 NS_HTML5_CONTINUE(stateloop);
245 }
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);
254 }
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);
263 }
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);
271 }
272 }
273 }
274 beforeattributenameloop_end: ;
275 }
276 case NS_HTML5META_SCANNER_ATTRIBUTE_NAME: {
277 for (; ; ) {
278 c = read();
279 switch(c) {
280 case -1: {
281 NS_HTML5_BREAK(stateloop);
282 }
283 case ' ':
284 case '\t':
285 case '\n':
286 case '\f': {
287 state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME;
288 NS_HTML5_CONTINUE(stateloop);
289 }
290 case '/': {
291 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
292 NS_HTML5_CONTINUE(stateloop);
293 }
294 case '=': {
295 strBufLen = 0;
296 contentTypeIndex = 0;
297 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE;
298 NS_HTML5_BREAK(attributenameloop);
299 }
300 case '>': {
301 if (handleTag()) {
302 NS_HTML5_BREAK(stateloop);
303 }
304 state = NS_HTML5META_SCANNER_DATA;
305 NS_HTML5_CONTINUE(stateloop);
306 }
307 default: {
308 if (metaState == NS_HTML5META_SCANNER_A) {
309 if (c >= 'A' && c <= 'Z') {
310 c += 0x20;
311 }
312 if (contentIndex < CONTENT.length && c == CONTENT[contentIndex]) {
313 ++contentIndex;
314 } else {
315 contentIndex = INT32_MAX;
316 }
317 if (charsetIndex < CHARSET.length && c == CHARSET[charsetIndex]) {
318 ++charsetIndex;
319 } else {
320 charsetIndex = INT32_MAX;
321 }
322 if (httpEquivIndex < HTTP_EQUIV.length && c == HTTP_EQUIV[httpEquivIndex]) {
323 ++httpEquivIndex;
324 } else {
325 httpEquivIndex = INT32_MAX;
326 }
327 }
328 continue;
329 }
330 }
331 }
332 attributenameloop_end: ;
333 }
334 case NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE: {
335 for (; ; ) {
336 c = read();
337 switch(c) {
338 case -1: {
339 NS_HTML5_BREAK(stateloop);
340 }
341 case ' ':
342 case '\t':
343 case '\n':
344 case '\f': {
345 continue;
346 }
347 case '\"': {
348 state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED;
349 NS_HTML5_BREAK(beforeattributevalueloop);
350 }
351 case '\'': {
352 state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED;
353 NS_HTML5_CONTINUE(stateloop);
354 }
355 case '>': {
356 if (handleTag()) {
357 NS_HTML5_BREAK(stateloop);
358 }
359 state = NS_HTML5META_SCANNER_DATA;
360 NS_HTML5_CONTINUE(stateloop);
361 }
362 default: {
363 handleCharInAttributeValue(c);
364 state = NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED;
365 NS_HTML5_CONTINUE(stateloop);
366 }
367 }
368 }
369 beforeattributevalueloop_end: ;
370 }
371 case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
372 for (; ; ) {
373 if (reconsume) {
374 reconsume = false;
375 } else {
376 c = read();
377 }
378 switch(c) {
379 case -1: {
380 NS_HTML5_BREAK(stateloop);
381 }
382 case '\"': {
383 handleAttributeValue();
384 state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED;
385 NS_HTML5_BREAK(attributevaluedoublequotedloop);
386 }
387 default: {
388 handleCharInAttributeValue(c);
389 continue;
390 }
391 }
392 }
393 attributevaluedoublequotedloop_end: ;
394 }
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);
401 }
402 case ' ':
403 case '\t':
404 case '\n':
405 case '\f': {
406 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
407 NS_HTML5_CONTINUE(stateloop);
408 }
409 case '/': {
410 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
411 NS_HTML5_BREAK(afterattributevaluequotedloop);
412 }
413 case '>': {
414 if (handleTag()) {
415 NS_HTML5_BREAK(stateloop);
416 }
417 state = NS_HTML5META_SCANNER_DATA;
418 NS_HTML5_CONTINUE(stateloop);
419 }
420 default: {
421 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
422 reconsume = true;
423 NS_HTML5_CONTINUE(stateloop);
424 }
425 }
426 }
427 afterattributevaluequotedloop_end: ;
428 }
429 case NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG: {
430 c = read();
431 switch(c) {
432 case -1: {
433 NS_HTML5_BREAK(stateloop);
434 }
435 case '>': {
436 if (handleTag()) {
437 NS_HTML5_BREAK(stateloop);
438 }
439 state = NS_HTML5META_SCANNER_DATA;
440 NS_HTML5_CONTINUE(stateloop);
441 }
442 default: {
443 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_NAME;
444 reconsume = true;
445 NS_HTML5_CONTINUE(stateloop);
446 }
447 }
448 }
449 case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_UNQUOTED: {
450 for (; ; ) {
451 if (reconsume) {
452 reconsume = false;
453 } else {
454 c = read();
455 }
456 switch(c) {
457 case -1: {
458 NS_HTML5_BREAK(stateloop);
459 }
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);
467 }
468 case '>': {
469 handleAttributeValue();
470 if (handleTag()) {
471 NS_HTML5_BREAK(stateloop);
472 }
473 state = NS_HTML5META_SCANNER_DATA;
474 NS_HTML5_CONTINUE(stateloop);
475 }
476 default: {
477 handleCharInAttributeValue(c);
478 continue;
479 }
480 }
481 }
482 }
483 case NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_NAME: {
484 for (; ; ) {
485 c = read();
486 switch(c) {
487 case -1: {
488 NS_HTML5_BREAK(stateloop);
489 }
490 case ' ':
491 case '\t':
492 case '\n':
493 case '\f': {
494 continue;
495 }
496 case '/': {
497 handleAttributeValue();
498 state = NS_HTML5META_SCANNER_SELF_CLOSING_START_TAG;
499 NS_HTML5_CONTINUE(stateloop);
500 }
501 case '=': {
502 strBufLen = 0;
503 contentTypeIndex = 0;
504 state = NS_HTML5META_SCANNER_BEFORE_ATTRIBUTE_VALUE;
505 NS_HTML5_CONTINUE(stateloop);
506 }
507 case '>': {
508 handleAttributeValue();
509 if (handleTag()) {
510 NS_HTML5_BREAK(stateloop);
511 }
512 state = NS_HTML5META_SCANNER_DATA;
513 NS_HTML5_CONTINUE(stateloop);
514 }
515 case 'c':
516 case 'C': {
517 contentIndex = 0;
518 charsetIndex = 0;
519 state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
520 NS_HTML5_CONTINUE(stateloop);
521 }
522 default: {
523 contentIndex = INT32_MAX;
524 charsetIndex = INT32_MAX;
525 state = NS_HTML5META_SCANNER_ATTRIBUTE_NAME;
526 NS_HTML5_CONTINUE(stateloop);
527 }
528 }
529 }
530 }
531 case NS_HTML5META_SCANNER_MARKUP_DECLARATION_OPEN: {
532 for (; ; ) {
533 c = read();
534 switch(c) {
535 case -1: {
536 NS_HTML5_BREAK(stateloop);
537 }
538 case '-': {
539 state = NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN;
540 NS_HTML5_BREAK(markupdeclarationopenloop);
541 }
542 default: {
543 state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
544 reconsume = true;
545 NS_HTML5_CONTINUE(stateloop);
546 }
547 }
548 }
549 markupdeclarationopenloop_end: ;
550 }
551 case NS_HTML5META_SCANNER_MARKUP_DECLARATION_HYPHEN: {
552 for (; ; ) {
553 c = read();
554 switch(c) {
555 case -1: {
556 NS_HTML5_BREAK(stateloop);
557 }
558 case '-': {
559 state = NS_HTML5META_SCANNER_COMMENT_START;
560 NS_HTML5_BREAK(markupdeclarationhyphenloop);
561 }
562 default: {
563 state = NS_HTML5META_SCANNER_SCAN_UNTIL_GT;
564 reconsume = true;
565 NS_HTML5_CONTINUE(stateloop);
566 }
567 }
568 }
569 markupdeclarationhyphenloop_end: ;
570 }
571 case NS_HTML5META_SCANNER_COMMENT_START: {
572 for (; ; ) {
573 c = read();
574 switch(c) {
575 case -1: {
576 NS_HTML5_BREAK(stateloop);
577 }
578 case '-': {
579 state = NS_HTML5META_SCANNER_COMMENT_START_DASH;
580 NS_HTML5_CONTINUE(stateloop);
581 }
582 case '>': {
583 state = NS_HTML5META_SCANNER_DATA;
584 NS_HTML5_CONTINUE(stateloop);
585 }
586 default: {
587 state = NS_HTML5META_SCANNER_COMMENT;
588 NS_HTML5_BREAK(commentstartloop);
589 }
590 }
591 }
592 commentstartloop_end: ;
593 }
594 case NS_HTML5META_SCANNER_COMMENT: {
595 for (; ; ) {
596 c = read();
597 switch(c) {
598 case -1: {
599 NS_HTML5_BREAK(stateloop);
600 }
601 case '-': {
602 state = NS_HTML5META_SCANNER_COMMENT_END_DASH;
603 NS_HTML5_BREAK(commentloop);
604 }
605 default: {
606 continue;
607 }
608 }
609 }
610 commentloop_end: ;
611 }
612 case NS_HTML5META_SCANNER_COMMENT_END_DASH: {
613 for (; ; ) {
614 c = read();
615 switch(c) {
616 case -1: {
617 NS_HTML5_BREAK(stateloop);
618 }
619 case '-': {
620 state = NS_HTML5META_SCANNER_COMMENT_END;
621 NS_HTML5_BREAK(commentenddashloop);
622 }
623 default: {
624 state = NS_HTML5META_SCANNER_COMMENT;
625 NS_HTML5_CONTINUE(stateloop);
626 }
627 }
628 }
629 commentenddashloop_end: ;
630 }
631 case NS_HTML5META_SCANNER_COMMENT_END: {
632 for (; ; ) {
633 c = read();
634 switch(c) {
635 case -1: {
636 NS_HTML5_BREAK(stateloop);
637 }
638 case '>': {
639 state = NS_HTML5META_SCANNER_DATA;
640 NS_HTML5_CONTINUE(stateloop);
641 }
642 case '-': {
643 continue;
644 }
645 default: {
646 state = NS_HTML5META_SCANNER_COMMENT;
647 NS_HTML5_CONTINUE(stateloop);
648 }
649 }
650 }
651 }
652 case NS_HTML5META_SCANNER_COMMENT_START_DASH: {
653 c = read();
654 switch(c) {
655 case -1: {
656 NS_HTML5_BREAK(stateloop);
657 }
658 case '-': {
659 state = NS_HTML5META_SCANNER_COMMENT_END;
660 NS_HTML5_CONTINUE(stateloop);
661 }
662 case '>': {
663 state = NS_HTML5META_SCANNER_DATA;
664 NS_HTML5_CONTINUE(stateloop);
665 }
666 default: {
667 state = NS_HTML5META_SCANNER_COMMENT;
668 NS_HTML5_CONTINUE(stateloop);
669 }
670 }
671 }
672 case NS_HTML5META_SCANNER_ATTRIBUTE_VALUE_SINGLE_QUOTED: {
673 for (; ; ) {
674 if (reconsume) {
675 reconsume = false;
676 } else {
677 c = read();
678 }
679 switch(c) {
680 case -1: {
681 NS_HTML5_BREAK(stateloop);
682 }
683 case '\'': {
684 handleAttributeValue();
685 state = NS_HTML5META_SCANNER_AFTER_ATTRIBUTE_VALUE_QUOTED;
686 NS_HTML5_CONTINUE(stateloop);
687 }
688 default: {
689 handleCharInAttributeValue(c);
690 continue;
691 }
692 }
693 }
694 }
695 case NS_HTML5META_SCANNER_SCAN_UNTIL_GT: {
696 for (; ; ) {
697 if (reconsume) {
698 reconsume = false;
699 } else {
700 c = read();
701 }
702 switch(c) {
703 case -1: {
704 NS_HTML5_BREAK(stateloop);
705 }
706 case '>': {
707 state = NS_HTML5META_SCANNER_DATA;
708 NS_HTML5_CONTINUE(stateloop);
709 }
710 default: {
711 continue;
712 }
713 }
714 }
715 }
716 }
717 }
718 stateloop_end: ;
719 stateSave = state;
720 }
722 void
723 nsHtml5MetaScanner::handleCharInAttributeValue(int32_t c)
724 {
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;
733 }
734 }
735 }
736 }
738 void
739 nsHtml5MetaScanner::addToBuffer(int32_t c)
740 {
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;
745 }
746 strBuf[strBufLen++] = (char16_t) c;
747 }
749 void
750 nsHtml5MetaScanner::handleAttributeValue()
751 {
752 if (metaState != NS_HTML5META_SCANNER_A) {
753 return;
754 }
755 if (contentIndex == CONTENT.length && !content) {
756 content = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen);
757 return;
758 }
759 if (charsetIndex == CHARSET.length && !charset) {
760 charset = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen);
761 return;
762 }
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;
766 }
767 }
769 bool
770 nsHtml5MetaScanner::handleTag()
771 {
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;
779 }
781 bool
782 nsHtml5MetaScanner::handleTagInner()
783 {
784 if (!!charset && tryCharset(charset)) {
785 return true;
786 }
787 if (!!content && httpEquivState == NS_HTML5META_SCANNER_HTTP_EQUIV_CONTENT_TYPE) {
788 nsString* extract = nsHtml5TreeBuilder::extractCharsetFromContent(content);
789 if (!extract) {
790 return false;
791 }
792 bool success = tryCharset(extract);
793 nsHtml5Portability::releaseString(extract);
794 return success;
795 }
796 return false;
797 }
799 void
800 nsHtml5MetaScanner::initializeStatics()
801 {
802 }
804 void
805 nsHtml5MetaScanner::releaseStatics()
806 {
807 }
810 #include "nsHtml5MetaScannerCppSupplement.h"