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