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