fix logic
[personal-kdelibs.git] / khtml / html / dtd.cpp
blob47f5664e0fe0b0cc17f8cdbc023e1ebd8b4cb1ba
1 /**
2 * This file is part of the DOM implementation for KDE.
4 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5 * (C) 2006-2007 Allan Sandfeld Jensen (kde@carewolf.com)
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public License
18 * along with this library; see the file COPYING.LIB. If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
24 #include "html/dtd.h"
26 using namespace DOM;
28 #include <kdebug.h>
29 #include <kglobal.h>
31 // priority of tags. Closing tags of higher priority close tags of lower
32 // priority.
33 // Update this list, whenever you change htmltags.*
35 // 0 elements with forbidden close tag and text. They don't get pushed
36 // to the stack.
37 // 1 formatting elements
38 // 3 form nobr noscript
39 // 5 phrasing elements
40 // 6 TD TH SELECT
41 // 7 TR
42 // 8 tbody thead tfoot
43 // 9 table
44 // 10 body frameset head noembed noframes
45 // 11 html
47 const unsigned short KDE_NO_EXPORT DOM::tagPriorityArray[] = {
48 0, // 0
49 1, // ID_A == 1
50 1, // ID_ABBR
51 1, // ID_ACRONYM
52 5, // ID_ADDRESS
53 1, // ID_APPLET
54 0, // ID_AREA
55 1, // ID_AUDIO
56 1, // ID_B
57 0, // ID_BASE
58 0, // ID_BASEFONT
59 1, // ID_BDO
60 1, // ID_BIG
61 5, // ID_BLOCKQUOTE
62 10, // ID_BODY
63 0, // ID_BR
64 1, // ID_BUTTON
65 1, // ID_CANVAS
66 5, // ID_CAPTION
67 5, // ID_CENTER
68 1, // ID_CITE
69 1, // ID_CODE
70 0, // ID_COL
71 1, // ID_COLGROUP
72 5, // ID_DD
73 1, // ID_DEL
74 1, // ID_DFN
75 5, // ID_DIR
76 5, // ID_DIV
77 5, // ID_DL
78 5, // ID_DT
79 1, // ID_EM
80 0, // ID_EMBED
81 5, // ID_FIELDSET
82 1, // ID_FONT
83 3, // ID_FORM
84 0, // ID_FRAME
85 10,// ID_FRAMESET
86 5, // ID_H1
87 5, // ID_H2
88 5, // ID_H3
89 5, // ID_H4
90 5, // ID_H5
91 5, // ID_H6
92 10,// ID_HEAD
93 0, // ID_HR
94 11,// ID_HTML
95 1, // ID_I
96 1, // ID_IFRAME
97 1, // ID_ILAYER
98 0, // ID_IMAGE
99 0, // ID_IMG
100 0, // ID_INPUT
101 1, // ID_INS
102 0, // ID_ISINDEX
103 1, // ID_KBD
104 0, // ID_KEYGEN
105 1, // ID_LABEL
106 1, // ID_LAYER
107 1, // ID_LEGEND
108 5, // ID_LI
109 0, // ID_LINK
110 5, // ID_LISTING
111 1, // ID_MAP
112 5, // ID_MARQUEE
113 5, // ID_MENU
114 0, // ID_META
115 5, // ID_NOBR
116 10,// ID_NOEMBED
117 10,// ID_NOFRAMES
118 3, // ID_NOSCRIPT
119 1, // ID_NOLAYER
120 5, // ID_OBJECT
121 5, // ID_OL
122 1, // ID_OPTGROUP
123 2, // ID_OPTION
124 5, // ID_P
125 0, // ID_PARAM
126 5, // ID_PLAINTEXT
127 5, // ID_PRE
128 1, // ID_Q
129 1, // ID_S
130 1, // ID_SAMP
131 1, // ID_SCRIPT
132 6, // ID_SELECT
133 1, // ID_SMALL
134 1, // ID_SOURCE
135 1, // ID_SPAN
136 1, // ID_STRIKE
137 1, // ID_STRONG
138 1, // ID_STYLE
139 1, // ID_SUB
140 1, // ID_SUP
141 9, // ID_TABLE
142 8, // ID_TBODY
143 6, // ID_TD
144 1, // ID_TEXTAREA
145 8, // ID_TFOOT
146 6, // ID_TH
147 8, // ID_THEAD
148 1, // ID_TITLE
149 7, // ID_TR
150 1, // ID_TT
151 1, // ID_U
152 5, // ID_UL
153 1, // ID_VAR
154 1, // ID_VIDEO
155 0, // ID_WBR
156 5, // ID_XMP
157 0, // ID_TEXT
160 const tagStatus DOM::endTagArray[] = {
161 REQUIRED, // 0
162 REQUIRED, // ID_A == 1
163 REQUIRED, // ID_ABBR
164 REQUIRED, // ID_ACRONYM
165 REQUIRED, // ID_ADDRESS
166 REQUIRED, // ID_APPLET
167 FORBIDDEN, // ID_AREA
168 REQUIRED, // ID_AUDIO
169 REQUIRED, // ID_B
170 FORBIDDEN, // ID_BASE
171 FORBIDDEN, // ID_BASEFONT
172 REQUIRED, // ID_BDO
173 REQUIRED, // ID_BIG
174 REQUIRED, // ID_BLOCKQUOTE
175 REQUIRED, // ID_BODY
176 FORBIDDEN, // ID_BR
177 REQUIRED, // ID_BUTTON
178 REQUIRED, // ID_CANVAS
179 REQUIRED, // ID_CAPTION
180 REQUIRED, // ID_CENTER
181 REQUIRED, // ID_CITE
182 REQUIRED, // ID_CODE
183 FORBIDDEN, // ID_COL
184 OPTIONAL, // ID_COLGROUP
185 OPTIONAL, // ID_DD
186 REQUIRED, // ID_DEL
187 REQUIRED, // ID_DFN
188 REQUIRED, // ID_DIR
189 REQUIRED, // ID_DIV
190 REQUIRED, // ID_DL
191 OPTIONAL, // ID_DT
192 REQUIRED, // ID_EM
193 REQUIRED, // ID_EMBED
194 REQUIRED, // ID_FIELDSET
195 REQUIRED, // ID_FONT
196 REQUIRED, // ID_FORM
197 FORBIDDEN, // ID_FRAME
198 REQUIRED, // ID_FRAMESET
199 REQUIRED, // ID_H1
200 REQUIRED, // ID_H2
201 REQUIRED, // ID_H3
202 REQUIRED, // ID_H4
203 REQUIRED, // ID_H5
204 REQUIRED, // ID_H6
205 OPTIONAL, // ID_HEAD
206 FORBIDDEN, // ID_HR
207 REQUIRED, // ID_HTML
208 REQUIRED, // ID_I
209 REQUIRED, // ID_IFRAME
210 REQUIRED, // ID_ILAYER
211 FORBIDDEN, // ID_IMAGE
212 FORBIDDEN, // ID_IMG
213 FORBIDDEN, // ID_INPUT
214 REQUIRED, // ID_INS
215 FORBIDDEN, // ID_ISINDEX
216 REQUIRED, // ID_KBD
217 REQUIRED, // ID_KEYGEN
218 REQUIRED, // ID_LABEL
219 REQUIRED, // ID_LAYER
220 REQUIRED, // ID_LEGEND
221 OPTIONAL, // ID_LI
222 FORBIDDEN, // ID_LINK
223 REQUIRED, // ID_LISTING
224 REQUIRED, // ID_MAP
225 REQUIRED, // ID_MARQUEE
226 REQUIRED, // ID_MENU
227 FORBIDDEN, // ID_META
228 REQUIRED, // ID_NOBR
229 REQUIRED, // ID_NOEMBED
230 REQUIRED, // ID_NOFRAMES
231 REQUIRED, // ID_NOSCRIPT
232 REQUIRED, // ID_NOLAYER
233 REQUIRED, // ID_OBJECT
234 REQUIRED, // ID_OL
235 REQUIRED, // ID_OPTGROUP
236 OPTIONAL, // ID_OPTION
237 OPTIONAL, // ID_P
238 FORBIDDEN, // ID_PARAM
239 REQUIRED, // ID_PLAINTEXT
240 REQUIRED, // ID_PRE
241 REQUIRED, // ID_Q
242 REQUIRED, // ID_S
243 REQUIRED, // ID_SAMP
244 REQUIRED, // ID_SCRIPT
245 REQUIRED, // ID_SELECT
246 REQUIRED, // ID_SMALL
247 FORBIDDEN, // ID_SOURCE
248 REQUIRED, // ID_SPAN
249 REQUIRED, // ID_STRIKE
250 REQUIRED, // ID_STRONG
251 REQUIRED, // ID_STYLE
252 REQUIRED, // ID_SUB
253 REQUIRED, // ID_SUP
254 REQUIRED, // ID_TABLE
255 OPTIONAL, // ID_TBODY
256 OPTIONAL, // ID_TD
257 REQUIRED, // ID_TEXTAREA
258 OPTIONAL, // ID_TFOOT
259 OPTIONAL, // ID_TH
260 OPTIONAL, // ID_THEAD
261 REQUIRED, // ID_TITLE
262 OPTIONAL, // ID_TR
263 REQUIRED, // ID_TT
264 REQUIRED, // ID_U
265 REQUIRED, // ID_UL
266 REQUIRED, // ID_VAR
267 REQUIRED, // ID_VIDEO
268 FORBIDDEN, // ID_WBR
269 REQUIRED, // ID_XMP
270 REQUIRED // ID_TEXT
273 // This a combination of HTML4.dtd XHTML11.dtd and various extensions
274 // and deprecated elements
275 static const ushort tag_list_inline[] = {
276 ID_TEXT,
277 // %fontstyle
278 ID_TT,
279 ID_I,
280 ID_B,
281 ID_BIG,
282 ID_SMALL,
283 ID_U, // legacy
284 ID_S, // legacy
285 ID_STRIKE, // legacy
286 ID_FONT, // legacy
287 ID_BASEFONT, // legacy
288 // %phrase
289 ID_EM,
290 ID_STRONG,
291 ID_DFN,
292 ID_CODE,
293 ID_Q,
294 ID_SAMP,
295 ID_KBD,
296 ID_VAR,
297 ID_CITE,
298 ID_ABBR,
299 ID_ACRONYM,
300 ID_SUB,
301 ID_SUP,
302 // %inline.forms
303 ID_INPUT,
304 ID_SELECT,
305 ID_TEXTAREA,
306 ID_LABEL,
307 ID_BUTTON,
308 // %special
309 ID_A,
310 ID_OBJECT,
311 ID_IMAGE,
312 ID_IMG,
313 ID_APPLET,
314 ID_IFRAME,
315 ID_EMBED, // ?
316 // %special.pre
317 ID_BR,
318 ID_SPAN,
319 ID_BDO,
320 ID_MAP,
321 // %misc.inline
322 ID_SCRIPT,
323 ID_INS,
324 ID_DEL,
325 // non-standard:
326 ID_ILAYER, // deprecated
327 ID_NOBR, // ?
328 ID_WBR, // ?
329 ID_CANVAS,
330 ID_AUDIO,
331 ID_VIDEO,
335 static const ushort tag_list_quirk_inline[] = {
336 ID_NOSCRIPT, // block, but parsed as inline in Mozilla and MSIE
340 static const ushort tag_list_block[] = {
341 ID_TEXT, // white-space is allowed
342 ID_P,
343 // %headings
344 ID_H1,
345 ID_H2,
346 ID_H3,
347 ID_H4,
348 ID_H5,
349 ID_H6,
350 // %lists
351 ID_UL,
352 ID_OL,
353 ID_DL,
354 ID_DIR, // legacy
355 ID_MENU, // legacy
356 // %blocktext
357 ID_LISTING,
358 ID_PRE,
359 ID_HR,
360 ID_BLOCKQUOTE,
361 ID_ADDRESS,
362 ID_PLAINTEXT, // ?
363 ID_XMP, // ?
364 ID_CENTER, // legacy
365 // other
366 ID_DIV,
367 ID_FIELDSET,
368 ID_TABLE,
369 ID_NOSCRIPT,
370 ID_NOFRAMES,
371 ID_FORM,
372 ID_ISINDEX, // legacy
373 // non-standard:
374 ID_LAYER, // deprecated
375 ID_MARQUEE, // extension
379 // block elements allowed for quirky error recovery
380 static const ushort tag_list_quirk_block[] = {
381 ID_LI,
382 ID_DD,
387 static const ushort tag_list_select[] = {
388 ID_TEXT,
389 ID_OPTGROUP,
390 ID_OPTION,
391 ID_COMMENT,
392 ID_SCRIPT,
396 static const ushort tag_list_frame[] = {
397 ID_FRAMESET,
398 ID_FRAME,
399 ID_NOFRAMES,
400 ID_COMMENT,
404 static const ushort tag_list_head[] = {
405 ID_SCRIPT,
406 ID_STYLE,
407 ID_META,
408 ID_LINK,
409 ID_TITLE,
410 ID_ISINDEX,
411 ID_BASE,
412 ID_COMMENT,
416 static bool check_array(ushort child, const ushort *tagList)
418 int i = 0;
419 while(tagList[i] != 0)
421 if(tagList[i] == child) return true;
422 i++;
424 return false;
428 static bool check_block(ushort childID, bool strict)
430 return check_array(childID, tag_list_block) ||
431 (!strict && check_array(childID, tag_list_quirk_block));
434 static bool check_inline(ushort childID, bool strict)
436 return check_array(childID, tag_list_inline) ||
437 (!strict && check_array(childID, tag_list_quirk_inline));
440 static bool check_flow(ushort childID, bool strict)
442 return check_block(childID, strict) || check_inline(childID, strict);
445 bool DOM::checkChild(ushort tagID, ushort childID, bool strict)
447 //kDebug( 6030 ) << "checkChild: " << tagID << "/" << childID;
449 if (childID == ID_COMMENT) return true;
451 // Treat custom elements the same as <span>.
452 if (tagID > ID_LAST_TAG)
453 tagID = ID_SPAN;
454 if (childID > ID_LAST_TAG)
455 childID = ID_SPAN;
457 switch(tagID)
459 case ID_TT:
460 case ID_I:
461 case ID_B:
462 case ID_U:
463 case ID_S:
464 case ID_STRIKE:
465 case ID_BIG:
466 case ID_SMALL:
467 case ID_EM:
468 case ID_STRONG:
469 case ID_DFN:
470 case ID_CODE:
471 case ID_SAMP:
472 case ID_KBD:
473 case ID_VAR:
474 case ID_CITE:
475 case ID_ABBR:
476 case ID_ACRONYM:
477 case ID_SUB:
478 case ID_SUP:
479 case ID_BDO:
480 case ID_FONT:
481 case ID_LEGEND:
482 case ID_Q:
483 case ID_A:
484 case ID_NOBR:
485 case ID_WBR:
486 // %inline *
487 return check_inline(childID, strict) || check_block(childID, strict);
488 case ID_P:
489 // P: %inline *
490 return check_inline(childID, strict) ||
491 (!strict && childID == ID_TABLE );
492 case ID_H1:
493 case ID_H2:
494 case ID_H3:
495 case ID_H4:
496 case ID_H5:
497 case ID_H6:
498 // %inline *
499 return check_inline(childID, strict) ||
500 (!strict && check_block(childID, true) && (childID < ID_H1 || childID > ID_H6));
501 case ID_BASEFONT:
502 case ID_BR:
503 case ID_AREA:
504 case ID_LINK:
505 case ID_IMAGE:
506 case ID_IMG:
507 case ID_PARAM:
508 case ID_HR:
509 case ID_INPUT:
510 case ID_COL:
511 case ID_FRAME:
512 case ID_ISINDEX:
513 case ID_BASE:
514 case ID_META:
515 case ID_COMMENT:
516 // BASEFONT: EMPTY
517 return false;
518 case ID_BODY:
519 // BODY: %block | SCRIPT (but even strict sites expect %flow)
520 return check_flow(childID, strict);
521 case ID_ADDRESS:
522 // ADDRESS: %inline *
523 return check_inline(childID, strict) ||
524 (!strict && childID == ID_P);
525 case ID_DT:
526 // DT: %inline *
527 return check_inline(childID, strict) ||
528 (!strict && check_block(childID, true) && childID != ID_DL);
529 case ID_LI:
530 case ID_DIV:
531 case ID_SPAN:
532 case ID_ILAYER:
533 case ID_LAYER:
534 case ID_CENTER:
535 case ID_BLOCKQUOTE:
536 case ID_INS:
537 case ID_DEL:
538 case ID_DD:
539 case ID_TH:
540 case ID_TD:
541 case ID_IFRAME:
542 case ID_NOFRAMES:
543 case ID_NOSCRIPT:
544 case ID_CAPTION:
545 case ID_MARQUEE:
546 case ID_CANVAS:
547 // DIV: %flow *
548 return check_flow(childID, strict);
549 case ID_MAP:
550 // MAP: ( %block | AREA ) (but "prose" in HTML5)
551 return check_flow(childID, true) || childID == ID_AREA ||
552 (!strict && childID == ID_SCRIPT);
553 case ID_OBJECT:
554 case ID_EMBED:
555 case ID_APPLET:
556 // OBJECT: %flow | PARAM *
557 return check_flow(childID, true) || childID == ID_PARAM;
558 case ID_AUDIO:
559 case ID_VIDEO:
560 return check_flow(childID, true) || childID == ID_SOURCE;
561 case ID_PRE:
562 case ID_XMP:
563 case ID_PLAINTEXT:
564 case ID_LISTING:
565 // PRE: %flow * - _5
566 return check_flow(childID, true);
567 case ID_DL:
568 // DL: DT | DD +
569 return (childID == ID_DT || childID == ID_DD || check_flow(childID, strict));
570 case ID_OL:
571 case ID_UL:
572 case ID_DIR:
573 case ID_MENU:
574 // OL: LI +
575 // For DIR and MENU, the DTD says - %block, but it contradicts spec language..
576 return (childID == ID_LI || check_flow(childID, strict));
577 case ID_FORM:
578 // FORM: %flow * - FORM
579 return check_flow(childID, strict);
580 case ID_LABEL:
581 // LABEL: %inline * - LABEL
582 return check_inline(childID, strict) ||
583 (!strict && check_block(childID, true));
584 case ID_KEYGEN:
585 // KEYGEN does not really allow any children
586 // from outside, just need this to be able
587 // to add the keylengths ourself
588 // Yes, consider it a hack (Dirk)
589 case ID_SELECT:
590 // SELECT: _7 +
591 return check_array(childID, tag_list_select);
592 case ID_OPTGROUP:
593 // OPTGROUP: OPTION +
594 if(childID == ID_OPTION) return true;
595 return false;
596 case ID_OPTION:
597 case ID_TEXTAREA:
598 case ID_TITLE:
599 case ID_STYLE:
600 case ID_SCRIPT:
601 // OPTION: TEXT
602 if(childID == ID_TEXT) return true;
603 return false;
604 case ID_FIELDSET:
605 // FIELDSET: ( TEXT , LEGEND , %flow * )
606 if(childID == ID_TEXT) return true;
607 if(childID == ID_LEGEND) return true;
608 return check_flow(childID, strict);
609 case ID_BUTTON:
610 // BUTTON: %flow * - _8
611 return check_flow(childID, strict);
612 case ID_TABLE:
613 // TABLE: ( CAPTION ? , ( COL * | COLGROUP * ) , THEAD ? , TFOOT ? , TBODY + )
614 switch(childID)
616 case ID_CAPTION:
617 case ID_COL:
618 case ID_COLGROUP:
619 case ID_THEAD:
620 case ID_TFOOT:
621 case ID_TBODY:
622 case ID_FORM:
623 case ID_SCRIPT:
624 return true;
625 default:
626 return false;
628 case ID_THEAD:
629 case ID_TFOOT:
630 case ID_TBODY:
631 // THEAD: TR +
632 if(childID == ID_TR || childID == ID_SCRIPT) return true;
633 return false;
634 case ID_COLGROUP:
635 // COLGROUP: COL *
636 if(childID == ID_COL) return true;
637 return false;
638 case ID_TR:
639 // TR: (TD, TH)
640 return (childID == ID_TH || childID == ID_TD || childID == ID_SCRIPT);
641 case ID_FRAMESET:
642 // FRAMESET: _10
643 return check_array(childID, tag_list_frame);
644 case ID_HEAD:
645 // HEAD: _11
646 return check_array(childID, tag_list_head);
647 case ID_HTML:
648 // HTML: ( HEAD , COMMENT, ( BODY | ( FRAMESET & NOFRAMES ? ) ) )
649 switch(childID)
651 case ID_HEAD:
652 case ID_BODY:
653 case ID_FRAMESET:
654 case ID_NOFRAMES:
655 case ID_SCRIPT:
656 return true;
657 default:
658 return false;
660 default:
661 kDebug( 6030 ) << "unhandled tag in dtd.cpp:checkChild(): tagID=" << tagID << "!";
662 return false;
666 void DOM::addForbidden(int tagId, ushort *forbiddenTags)
668 switch(tagId)
670 case ID_A:
671 // we allow nested anchors. The innermost one wil be taken...
672 //forbiddenTags[ID_A]++;
673 break;
674 case ID_NOBR:
675 forbiddenTags[ID_PRE]++;
676 forbiddenTags[ID_LISTING]++;
677 // fall through
678 case ID_PRE:
679 case ID_LISTING:
680 case ID_PLAINTEXT:
681 case ID_XMP:
682 //forbiddenTags[ID_IMAGE]++;
683 //forbiddenTags[ID_IMG]++;
684 forbiddenTags[ID_OBJECT]++;
685 forbiddenTags[ID_EMBED]++;
686 forbiddenTags[ID_APPLET]++;
687 // why forbid them. We can deal with them in PRE
688 //forbiddenTags[ID_BIG]++;
689 //forbiddenTags[ID_SMALL]++;
690 //forbiddenTags[ID_SUB]++;
691 //forbiddenTags[ID_SUP]++;
692 forbiddenTags[ID_BASEFONT]++;
693 break;
694 case ID_LABEL:
695 forbiddenTags[ID_LABEL]++;
696 break;
697 case ID_BUTTON:
698 forbiddenTags[ID_A]++;
699 forbiddenTags[ID_INPUT]++;
700 forbiddenTags[ID_SELECT]++;
701 forbiddenTags[ID_TEXTAREA]++;
702 forbiddenTags[ID_LABEL]++;
703 forbiddenTags[ID_BUTTON]++;
704 forbiddenTags[ID_FORM]++;
705 forbiddenTags[ID_ISINDEX]++;
706 forbiddenTags[ID_FIELDSET]++;
707 forbiddenTags[ID_IFRAME]++;
708 break;
709 default:
710 break;
714 void DOM::removeForbidden(int tagId, ushort *forbiddenTags)
716 switch(tagId)
718 case ID_A:
719 //forbiddenTags[ID_A]--;
720 break;
721 case ID_NOBR:
722 forbiddenTags[ID_PRE]--;
723 forbiddenTags[ID_LISTING]--;
724 // fall through
725 case ID_PRE:
726 case ID_LISTING:
727 case ID_XMP:
728 case ID_PLAINTEXT:
729 //forbiddenTags[ID_IMAGE]--;
730 //forbiddenTags[ID_IMG]--;
731 forbiddenTags[ID_OBJECT]--;
732 forbiddenTags[ID_EMBED]--;
733 forbiddenTags[ID_APPLET]--;
734 //forbiddenTags[ID_BIG]--;
735 //forbiddenTags[ID_SMALL]--;
736 //forbiddenTags[ID_SUB]--;
737 //forbiddenTags[ID_SUP]--;
738 forbiddenTags[ID_BASEFONT]--;
739 break;
740 case ID_LABEL:
741 forbiddenTags[ID_LABEL]--;
742 break;
743 case ID_BUTTON:
744 forbiddenTags[ID_A]--;
745 forbiddenTags[ID_INPUT]--;
746 forbiddenTags[ID_SELECT]--;
747 forbiddenTags[ID_TEXTAREA]--;
748 forbiddenTags[ID_LABEL]--;
749 forbiddenTags[ID_BUTTON]--;
750 forbiddenTags[ID_FORM]--;
751 forbiddenTags[ID_ISINDEX]--;
752 forbiddenTags[ID_FIELDSET]--;
753 forbiddenTags[ID_IFRAME]--;
754 break;
755 default:
756 break;