LCOV - app.info - parser/html/nsHtml5TreeBuilder.cpp

LCOV - code coverage report
| Current view: | directory - parser/html - nsHtml5TreeBuilder.cpp (source / functions) |  | Found | Hit | Coverage |
| Test: | app.info | Lines: | 2220 | 313 | 14.1 %
| Date: | 2012-04-21 | Functions: | 102 | 34 | 33.3 %

           1                 : /*
           2                 :  * Copyright (c) 2007 Henri Sivonen
           3                 :  * Copyright (c) 2007-2011 Mozilla Foundation
           4                 :  * Portions of comments Copyright 2004-2008 Apple Computer, Inc., Mozilla
           5                 :  * Foundation, and Opera Software ASA.
           6                 :  *
           7                 :  * Permission is hereby granted, free of charge, to any person obtaining a
           8                 :  * copy of this software and associated documentation files (the "Software"),
           9                 :  * to deal in the Software without restriction, including without limitation
          10                 :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
          11                 :  * and/or sell copies of the Software, and to permit persons to whom the
          12                 :  * Software is furnished to do so, subject to the following conditions:
          13                 :  *
          14                 :  * The above copyright notice and this permission notice shall be included in
          15                 :  * all copies or substantial portions of the Software.
          16                 :  *
          17                 :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
          18                 :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
          19                 :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
          20                 :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
          21                 :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
          22                 :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
          23                 :  * DEALINGS IN THE SOFTWARE.
          24                 :  */
          25                 :
          26                 : /*
          27                 :  * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
          28                 :  * Please edit TreeBuilder.java instead and regenerate.
          29                 :  */
          30                 :
          31                 : #define nsHtml5TreeBuilder_cpp__
          32                 :
          33                 : #include "prtypes.h"
          34                 : #include "nsIAtom.h"
          35                 : #include "nsHtml5AtomTable.h"
          36                 : #include "nsITimer.h"
          37                 : #include "nsString.h"
          38                 : #include "nsINameSpaceManager.h"
          39                 : #include "nsIContent.h"
          40                 : #include "nsIDocument.h"
          41                 : #include "nsTraceRefcnt.h"
          42                 : #include "jArray.h"
          43                 : #include "nsHtml5DocumentMode.h"
          44                 : #include "nsHtml5ArrayCopy.h"
          45                 : #include "nsHtml5Parser.h"
          46                 : #include "nsHtml5Atoms.h"
          47                 : #include "nsHtml5TreeOperation.h"
          48                 : #include "nsHtml5PendingNotification.h"
          49                 : #include "nsHtml5StateSnapshot.h"
          50                 : #include "nsHtml5StackNode.h"
          51                 : #include "nsHtml5TreeOpExecutor.h"
          52                 : #include "nsHtml5StreamParser.h"
          53                 : #include "nsAHtml5TreeBuilderState.h"
          54                 : #include "nsHtml5Highlighter.h"
          55                 : #include "nsHtml5ViewSourceUtils.h"
          56                 :
          57                 : #include "nsHtml5Tokenizer.h"
          58                 : #include "nsHtml5MetaScanner.h"
          59                 : #include "nsHtml5AttributeName.h"
          60                 : #include "nsHtml5ElementName.h"
          61                 : #include "nsHtml5HtmlAttributes.h"
          62                 : #include "nsHtml5StackNode.h"
          63                 : #include "nsHtml5UTF16Buffer.h"
          64                 : #include "nsHtml5StateSnapshot.h"
          65                 : #include "nsHtml5Portability.h"
          66                 :
          67                 : #include "nsHtml5TreeBuilder.h"
          68                 :
          69                 : PRUnichar nsHtml5TreeBuilder::REPLACEMENT_CHARACTER[] = { 0xfffd };
          70                 : static const char* const QUIRKY_PUBLIC_IDS_DATA[] = { "+//silmaril//dtd html pro v0r11 19970101//", "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", "-//as//dtd html 3.0 aswedit + extensions//", "-//ietf//dtd html 2.0 level 1//", "-//ietf//dtd html 2.0 level 2//", "-//ietf//dtd html 2.0 strict level 1//", "-//ietf//dtd html 2.0 strict level 2//", "-//ietf//dtd html 2.0 strict//", "-//ietf//dtd html 2.0//", "-//ietf//dtd html 2.1e//", "-//ietf//dtd html 3.0//", "-//ietf//dtd html 3.2 final//", "-//ietf//dtd html 3.2//", "-//ietf//dtd html 3//", "-//ietf//dtd html level 0//", "-//ietf//dtd html level 1//", "-//ietf//dtd html level 2//", "-//ietf//dtd html level 3//", "-//ietf//dtd html strict level 0//", "-//ietf//dtd html strict level 1//", "-//ietf//dtd html strict level 2//", "-//ietf//dtd html strict level 3//", "-//ietf//dtd html strict//", "-//ietf//dtd html//", "-//metrius//dtd metrius presentational//", "-//microsoft//dtd internet explorer 2.0 html strict//", "-//microsoft//dtd internet explorer 2.0 html//", "-//microsoft//dtd internet explorer 2.0 tables//", "-//microsoft//dtd internet explorer 3.0 html strict//", "-//microsoft//dtd internet explorer 3.0 html//", "-//microsoft//dtd internet explorer 3.0 tables//", "-//netscape comm. corp.//dtd html//", "-//netscape comm. corp.//dtd strict html//", "-//o'reilly and associates//dtd html 2.0//", "-//o'reilly and associates//dtd html extended 1.0//", "-//o'reilly and associates//dtd html extended relaxed 1.0//", "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", "-//spyglass//dtd html 2.0 extended//", "-//sq//dtd html 2.0 hotmetal + extensions//", "-//sun microsystems corp.//dtd hotjava html//", "-//sun microsystems corp.//dtd hotjava strict html//", "-//w3c//dtd html 3 1995-03-24//", "-//w3c//dtd html 3.2 draft//", "-//w3c//dtd html 3.2 final//", "-//w3c//dtd html 3.2//", "-//w3c//dtd html 3.2s draft//", "-//w3c//dtd html 4.0 frameset//", "-//w3c//dtd html 4.0 transitional//", "-//w3c//dtd html experimental 19960712//", "-//w3c//dtd html experimental 970421//", "-//w3c//dtd w3 html//", "-//w3o//dtd w3 html 3.0//", "-//webtechs//dtd mozilla html 2.0//", "-//webtechs//dtd mozilla html//" };
          71                 : staticJArray<const char*,PRInt32> nsHtml5TreeBuilder::QUIRKY_PUBLIC_IDS = { QUIRKY_PUBLIC_IDS_DATA, NS_ARRAY_LENGTH(QUIRKY_PUBLIC_IDS_DATA) };
          72                 : void
          73             216 : nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self)
          74                 : {
          75             216 :   tokenizer = self;
          76             216 :   stack = jArray<nsHtml5StackNode*,PRInt32>::newJArray(64);
          77             216 :   listOfActiveFormattingElements = jArray<nsHtml5StackNode*,PRInt32>::newJArray(64);
          78             216 :   needToDropLF = false;
          79             216 :   originalMode = NS_HTML5TREE_BUILDER_INITIAL;
          80             216 :   currentPtr = -1;
          81             216 :   listPtr = -1;
          82             216 :   formPointer = nsnull;
          83             216 :   headPointer = nsnull;
          84             216 :   deepTreeSurrogateParent = nsnull;
          85             216 :   start(fragment);
          86             216 :   charBufferLen = 0;
          87             216 :   charBuffer = jArray<PRUnichar,PRInt32>::newJArray(1024);
          88             216 :   framesetOk = true;
          89             216 :   if (fragment) {
          90                 :     nsIContent** elt;
          91               0 :     if (contextNode) {
          92               0 :       elt = contextNode;
          93                 :     } else {
          94               0 :       elt = createHtmlElementSetAsRoot(tokenizer->emptyAttributes());
          95                 :     }
          96               0 :     nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_HTML, elt);
          97               0 :     currentPtr++;
          98               0 :     stack[currentPtr] = node;
          99               0 :     resetTheInsertionMode();
         100               0 :     if (nsHtml5Atoms::title == contextName || nsHtml5Atoms::textarea == contextName) {
         101               0 :       tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, contextName);
         102               0 :     } else if (nsHtml5Atoms::style == contextName || nsHtml5Atoms::xmp == contextName || nsHtml5Atoms::iframe == contextName || nsHtml5Atoms::noembed == contextName || nsHtml5Atoms::noframes == contextName || (scriptingEnabled && nsHtml5Atoms::noscript == contextName)) {
         103               0 :       tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, contextName);
         104               0 :     } else if (nsHtml5Atoms::plaintext == contextName) {
         105               0 :       tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_PLAINTEXT, contextName);
         106               0 :     } else if (nsHtml5Atoms::script == contextName) {
         107               0 :       tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, contextName);
         108                 :     } else {
         109               0 :       tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_DATA, contextName);
         110                 :     }
         111               0 :     contextName = nsnull;
         112               0 :     contextNode = nsnull;
         113                 :   } else {
         114             216 :     mode = NS_HTML5TREE_BUILDER_INITIAL;
         115             216 :     if (tokenizer->isViewingXmlSource()) {
         116               0 :       nsIContent** elt = createElement(kNameSpaceID_SVG, nsHtml5Atoms::svg, tokenizer->emptyAttributes());
         117               0 :       nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_SVG, nsHtml5Atoms::svg, elt);
         118               0 :       currentPtr++;
         119               0 :       stack[currentPtr] = node;
         120                 :     }
         121                 :   }
         122             216 : }
         123                 :
         124                 : void
         125               0 : nsHtml5TreeBuilder::doctype(nsIAtom* name, nsString* publicIdentifier, nsString* systemIdentifier, bool forceQuirks)
         126                 : {
         127               0 :   needToDropLF = false;
         128               0 :   if (!isInForeign()) {
         129               0 :     switch(mode) {
         130                 :       case NS_HTML5TREE_BUILDER_INITIAL: {
         131               0 :         nsString* emptyString = nsHtml5Portability::newEmptyString();
         132               0 :         appendDoctypeToDocument(!name ? nsHtml5Atoms::emptystring : name, !publicIdentifier ? emptyString : publicIdentifier, !systemIdentifier ? emptyString : systemIdentifier);
         133               0 :         nsHtml5Portability::releaseString(emptyString);
         134               0 :         if (isQuirky(name, publicIdentifier, systemIdentifier, forceQuirks)) {
         135               0 :           errQuirkyDoctype();
         136               0 :           documentModeInternal(QUIRKS_MODE, publicIdentifier, systemIdentifier, false);
         137               0 :         } else if (isAlmostStandards(publicIdentifier, systemIdentifier)) {
         138               0 :           errAlmostStandardsDoctype();
         139               0 :           documentModeInternal(ALMOST_STANDARDS_MODE, publicIdentifier, systemIdentifier, false);
         140                 :         } else {
         141               0 :           documentModeInternal(STANDARDS_MODE, publicIdentifier, systemIdentifier, false);
         142                 :         }
         143               0 :         mode = NS_HTML5TREE_BUILDER_BEFORE_HTML;
         144               0 :         return;
         145                 :       }
         146                 :       default: {
         147                 :         break;
         148                 :       }
         149                 :     }
         150                 :   }
         151               0 :   errStrayDoctype();
         152               0 :   return;
         153                 : }
         154                 :
         155                 : void
         156               0 : nsHtml5TreeBuilder::comment(PRUnichar* buf, PRInt32 start, PRInt32 length)
         157                 : {
         158               0 :   needToDropLF = false;
         159               0 :   if (!isInForeign()) {
         160               0 :     switch(mode) {
         161                 :       case NS_HTML5TREE_BUILDER_INITIAL:
         162                 :       case NS_HTML5TREE_BUILDER_BEFORE_HTML:
         163                 :       case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY:
         164                 :       case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: {
         165               0 :         appendCommentToDocument(buf, start, length);
         166               0 :         return;
         167                 :       }
         168                 :       case NS_HTML5TREE_BUILDER_AFTER_BODY: {
         169               0 :         flushCharacters();
         170               0 :         appendComment(stack[0]->node, buf, start, length);
         171               0 :         return;
         172                 :       }
         173                 :       default: {
         174                 :         break;
         175                 :       }
         176                 :     }
         177                 :   }
         178               0 :   flushCharacters();
         179               0 :   appendComment(stack[currentPtr]->node, buf, start, length);
         180               0 :   return;
         181                 : }
         182                 :
         183                 : void
         184             292 : nsHtml5TreeBuilder::characters(const PRUnichar* buf, PRInt32 start, PRInt32 length)
         185                 : {
         186             292 :   if (tokenizer->isViewingXmlSource()) {
         187               0 :     return;
         188                 :   }
         189             292 :   if (needToDropLF) {
         190               0 :     needToDropLF = false;
         191               0 :     if (buf[start] == '\n') {
         192               0 :       start++;
         193               0 :       length--;
         194               0 :       if (!length) {
         195               0 :         return;
         196                 :       }
         197                 :     }
         198                 :   }
         199             292 :   switch(mode) {
         200                 :     case NS_HTML5TREE_BUILDER_IN_BODY:
         201                 :     case NS_HTML5TREE_BUILDER_IN_CELL:
         202                 :     case NS_HTML5TREE_BUILDER_IN_CAPTION: {
         203              76 :       if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) {
         204              76 :         reconstructTheActiveFormattingElements();
         205                 :       }
         206                 :     }
         207                 :     case NS_HTML5TREE_BUILDER_TEXT: {
         208              76 :       accumulateCharacters(buf, start, length);
         209              76 :       return;
         210                 :     }
         211                 :     case NS_HTML5TREE_BUILDER_IN_TABLE:
         212                 :     case NS_HTML5TREE_BUILDER_IN_TABLE_BODY:
         213                 :     case NS_HTML5TREE_BUILDER_IN_ROW: {
         214               0 :       accumulateCharactersForced(buf, start, length);
         215               0 :       return;
         216                 :     }
         217                 :     default: {
         218             216 :       PRInt32 end = start + length;
         219            1422 :       for (PRInt32 i = start; i < end; i++) {
         220            1422 :         switch(buf[i]) {
         221                 :           case ' ':
         222                 :           case '\t':
         223                 :           case '\n':
         224                 :           case '\r':
         225                 :           case '\f': {
         226               0 :             switch(mode) {
         227                 :               case NS_HTML5TREE_BUILDER_INITIAL:
         228                 :               case NS_HTML5TREE_BUILDER_BEFORE_HTML:
         229                 :               case NS_HTML5TREE_BUILDER_BEFORE_HEAD: {
         230               0 :                 start = i + 1;
         231               0 :                 continue;
         232                 :               }
         233                 :               case NS_HTML5TREE_BUILDER_IN_HEAD:
         234                 :               case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT:
         235                 :               case NS_HTML5TREE_BUILDER_AFTER_HEAD:
         236                 :               case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP:
         237                 :               case NS_HTML5TREE_BUILDER_IN_FRAMESET:
         238                 :               case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: {
         239               0 :                 continue;
         240                 :               }
         241                 :               case NS_HTML5TREE_BUILDER_FRAMESET_OK:
         242                 :               case NS_HTML5TREE_BUILDER_IN_BODY:
         243                 :               case NS_HTML5TREE_BUILDER_IN_CELL:
         244                 :               case NS_HTML5TREE_BUILDER_IN_CAPTION: {
         245               0 :                 if (start < i) {
         246               0 :                   accumulateCharacters(buf, start, i - start);
         247               0 :                   start = i;
         248                 :                 }
         249               0 :                 if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) {
         250               0 :                   flushCharacters();
         251               0 :                   reconstructTheActiveFormattingElements();
         252                 :                 }
         253               0 :                 NS_HTML5_BREAK(charactersloop);
         254                 :               }
         255                 :               case NS_HTML5TREE_BUILDER_IN_SELECT:
         256                 :               case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: {
         257               0 :                 NS_HTML5_BREAK(charactersloop);
         258                 :               }
         259                 :               case NS_HTML5TREE_BUILDER_IN_TABLE:
         260                 :               case NS_HTML5TREE_BUILDER_IN_TABLE_BODY:
         261                 :               case NS_HTML5TREE_BUILDER_IN_ROW: {
         262               0 :                 accumulateCharactersForced(buf, i, 1);
         263               0 :                 start = i + 1;
         264               0 :                 continue;
         265                 :               }
         266                 :               case NS_HTML5TREE_BUILDER_AFTER_BODY:
         267                 :               case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY:
         268                 :               case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: {
         269               0 :                 if (start < i) {
         270               0 :                   accumulateCharacters(buf, start, i - start);
         271               0 :                   start = i;
         272                 :                 }
         273               0 :                 flushCharacters();
         274               0 :                 reconstructTheActiveFormattingElements();
         275               0 :                 continue;
         276                 :               }
         277                 :             }
         278                 :           }
         279                 :           default: {
         280            1422 :             switch(mode) {
         281                 :               case NS_HTML5TREE_BUILDER_INITIAL: {
         282             198 :                 documentModeInternal(QUIRKS_MODE, nsnull, nsnull, false);
         283             198 :                 mode = NS_HTML5TREE_BUILDER_BEFORE_HTML;
         284             198 :                 i--;
         285             198 :                 continue;
         286                 :               }
         287                 :               case NS_HTML5TREE_BUILDER_BEFORE_HTML: {
         288             198 :                 appendHtmlElementToDocumentAndPush();
         289             198 :                 mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD;
         290             198 :                 i--;
         291             198 :                 continue;
         292                 :               }
         293                 :               case NS_HTML5TREE_BUILDER_BEFORE_HEAD: {
         294             198 :                 if (start < i) {
         295               0 :                   accumulateCharacters(buf, start, i - start);
         296               0 :                   start = i;
         297                 :                 }
         298             198 :                 flushCharacters();
         299             198 :                 appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
         300             198 :                 mode = NS_HTML5TREE_BUILDER_IN_HEAD;
         301             198 :                 i--;
         302             198 :                 continue;
         303                 :               }
         304                 :               case NS_HTML5TREE_BUILDER_IN_HEAD: {
         305             198 :                 if (start < i) {
         306               0 :                   accumulateCharacters(buf, start, i - start);
         307               0 :                   start = i;
         308                 :                 }
         309             198 :                 flushCharacters();
         310             198 :                 pop();
         311             198 :                 mode = NS_HTML5TREE_BUILDER_AFTER_HEAD;
         312             198 :                 i--;
         313             198 :                 continue;
         314                 :               }
         315                 :               case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: {
         316               0 :                 if (start < i) {
         317               0 :                   accumulateCharacters(buf, start, i - start);
         318               0 :                   start = i;
         319                 :                 }
         320               0 :                 errNonSpaceInNoscriptInHead();
         321               0 :                 flushCharacters();
         322               0 :                 pop();
         323               0 :                 mode = NS_HTML5TREE_BUILDER_IN_HEAD;
         324               0 :                 i--;
         325               0 :                 continue;
         326                 :               }
         327                 :               case NS_HTML5TREE_BUILDER_AFTER_HEAD: {
         328             198 :                 if (start < i) {
         329               0 :                   accumulateCharacters(buf, start, i - start);
         330               0 :                   start = i;
         331                 :                 }
         332             198 :                 flushCharacters();
         333             198 :                 appendToCurrentNodeAndPushBodyElement();
         334             198 :                 mode = NS_HTML5TREE_BUILDER_FRAMESET_OK;
         335             198 :                 i--;
         336             198 :                 continue;
         337                 :               }
         338                 :               case NS_HTML5TREE_BUILDER_FRAMESET_OK: {
         339             216 :                 framesetOk = false;
         340             216 :                 mode = NS_HTML5TREE_BUILDER_IN_BODY;
         341             216 :                 i--;
         342             216 :                 continue;
         343                 :               }
         344                 :               case NS_HTML5TREE_BUILDER_IN_BODY:
         345                 :               case NS_HTML5TREE_BUILDER_IN_CELL:
         346                 :               case NS_HTML5TREE_BUILDER_IN_CAPTION: {
         347             216 :                 if (start < i) {
         348               0 :                   accumulateCharacters(buf, start, i - start);
         349               0 :                   start = i;
         350                 :                 }
         351             216 :                 if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) {
         352             216 :                   flushCharacters();
         353             216 :                   reconstructTheActiveFormattingElements();
         354                 :                 }
         355             216 :                 NS_HTML5_BREAK(charactersloop);
         356                 :               }
         357                 :               case NS_HTML5TREE_BUILDER_IN_TABLE:
         358                 :               case NS_HTML5TREE_BUILDER_IN_TABLE_BODY:
         359                 :               case NS_HTML5TREE_BUILDER_IN_ROW: {
         360               0 :                 accumulateCharactersForced(buf, i, 1);
         361               0 :                 start = i + 1;
         362               0 :                 continue;
         363                 :               }
         364                 :               case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: {
         365               0 :                 if (start < i) {
         366               0 :                   accumulateCharacters(buf, start, i - start);
         367               0 :                   start = i;
         368                 :                 }
         369               0 :                 if (!currentPtr) {
         370               0 :                   errNonSpaceInColgroupInFragment();
         371               0 :                   start = i + 1;
         372               0 :                   continue;
         373                 :                 }
         374               0 :                 flushCharacters();
         375               0 :                 pop();
         376               0 :                 mode = NS_HTML5TREE_BUILDER_IN_TABLE;
         377               0 :                 i--;
         378               0 :                 continue;
         379                 :               }
         380                 :               case NS_HTML5TREE_BUILDER_IN_SELECT:
         381                 :               case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: {
         382               0 :                 NS_HTML5_BREAK(charactersloop);
         383                 :               }
         384                 :               case NS_HTML5TREE_BUILDER_AFTER_BODY: {
         385               0 :                 errNonSpaceAfterBody();
         386                 :
         387               0 :                 mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
         388               0 :                 i--;
         389               0 :                 continue;
         390                 :               }
         391                 :               case NS_HTML5TREE_BUILDER_IN_FRAMESET: {
         392               0 :                 if (start < i) {
         393               0 :                   accumulateCharacters(buf, start, i - start);
         394               0 :                   start = i;
         395                 :                 }
         396               0 :                 errNonSpaceInFrameset();
         397               0 :                 start = i + 1;
         398               0 :                 continue;
         399                 :               }
         400                 :               case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: {
         401               0 :                 if (start < i) {
         402               0 :                   accumulateCharacters(buf, start, i - start);
         403               0 :                   start = i;
         404                 :                 }
         405               0 :                 errNonSpaceAfterFrameset();
         406               0 :                 start = i + 1;
         407               0 :                 continue;
         408                 :               }
         409                 :               case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: {
         410               0 :                 errNonSpaceInTrailer();
         411               0 :                 mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
         412               0 :                 i--;
         413               0 :                 continue;
         414                 :               }
         415                 :               case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: {
         416               0 :                 errNonSpaceInTrailer();
         417               0 :                 mode = NS_HTML5TREE_BUILDER_IN_FRAMESET;
         418               0 :                 i--;
         419               0 :                 continue;
         420                 :               }
         421                 :             }
         422                 :           }
         423                 :         }
         424                 :       }
         425                 :       charactersloop_end: ;
         426             216 :       if (start < end) {
         427             216 :         accumulateCharacters(buf, start, end - start);
         428                 :       }
         429                 :     }
         430                 :   }
         431                 : }
         432                 :
         433                 : void
         434               0 : nsHtml5TreeBuilder::zeroOriginatingReplacementCharacter()
         435                 : {
         436               0 :   if (mode == NS_HTML5TREE_BUILDER_TEXT) {
         437               0 :     accumulateCharacters(REPLACEMENT_CHARACTER, 0, 1);
         438               0 :     return;
         439                 :   }
         440               0 :   if (currentPtr >= 0) {
         441               0 :     if (isSpecialParentInForeign(stack[currentPtr])) {
         442               0 :       return;
         443                 :     }
         444               0 :     accumulateCharacters(REPLACEMENT_CHARACTER, 0, 1);
         445                 :   }
         446                 : }
         447                 :
         448                 : void
         449             216 : nsHtml5TreeBuilder::eof()
         450                 : {
         451             216 :   flushCharacters();
         452               0 :   for (; ; ) {
         453             216 :     if (isInForeign()) {
         454               0 :       NS_HTML5_BREAK(eofloop);
         455                 :     }
         456             216 :     switch(mode) {
         457                 :       case NS_HTML5TREE_BUILDER_INITIAL: {
         458               0 :         documentModeInternal(QUIRKS_MODE, nsnull, nsnull, false);
         459               0 :         mode = NS_HTML5TREE_BUILDER_BEFORE_HTML;
         460               0 :         continue;
         461                 :       }
         462                 :       case NS_HTML5TREE_BUILDER_BEFORE_HTML: {
         463               0 :         appendHtmlElementToDocumentAndPush();
         464               0 :         mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD;
         465               0 :         continue;
         466                 :       }
         467                 :       case NS_HTML5TREE_BUILDER_BEFORE_HEAD: {
         468               0 :         appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
         469               0 :         mode = NS_HTML5TREE_BUILDER_IN_HEAD;
         470               0 :         continue;
         471                 :       }
         472                 :       case NS_HTML5TREE_BUILDER_IN_HEAD: {
         473               0 :         while (currentPtr > 0) {
         474               0 :           popOnEof();
         475                 :         }
         476               0 :         mode = NS_HTML5TREE_BUILDER_AFTER_HEAD;
         477               0 :         continue;
         478                 :       }
         479                 :       case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: {
         480               0 :         while (currentPtr > 1) {
         481               0 :           popOnEof();
         482                 :         }
         483               0 :         mode = NS_HTML5TREE_BUILDER_IN_HEAD;
         484               0 :         continue;
         485                 :       }
         486                 :       case NS_HTML5TREE_BUILDER_AFTER_HEAD: {
         487               0 :         appendToCurrentNodeAndPushBodyElement();
         488               0 :         mode = NS_HTML5TREE_BUILDER_IN_BODY;
         489               0 :         continue;
         490                 :       }
         491                 :       case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: {
         492               0 :         if (!currentPtr) {
         493                 :
         494               0 :           NS_HTML5_BREAK(eofloop);
         495                 :         } else {
         496               0 :           popOnEof();
         497               0 :           mode = NS_HTML5TREE_BUILDER_IN_TABLE;
         498               0 :           continue;
         499                 :         }
         500                 :       }
         501                 :       case NS_HTML5TREE_BUILDER_FRAMESET_OK:
         502                 :       case NS_HTML5TREE_BUILDER_IN_CAPTION:
         503                 :       case NS_HTML5TREE_BUILDER_IN_CELL:
         504                 :       case NS_HTML5TREE_BUILDER_IN_BODY: {
         505             216 :         NS_HTML5_BREAK(eofloop);
         506                 :       }
         507                 :       case NS_HTML5TREE_BUILDER_TEXT: {
         508               0 :         if (originalMode == NS_HTML5TREE_BUILDER_AFTER_HEAD) {
         509               0 :           popOnEof();
         510                 :         }
         511               0 :         popOnEof();
         512               0 :         mode = originalMode;
         513               0 :         continue;
         514                 :       }
         515                 :       case NS_HTML5TREE_BUILDER_IN_TABLE_BODY:
         516                 :       case NS_HTML5TREE_BUILDER_IN_ROW:
         517                 :       case NS_HTML5TREE_BUILDER_IN_TABLE:
         518                 :       case NS_HTML5TREE_BUILDER_IN_SELECT:
         519                 :       case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE:
         520                 :       case NS_HTML5TREE_BUILDER_IN_FRAMESET: {
         521               0 :         NS_HTML5_BREAK(eofloop);
         522                 :       }
         523                 :       case NS_HTML5TREE_BUILDER_AFTER_BODY:
         524                 :       case NS_HTML5TREE_BUILDER_AFTER_FRAMESET:
         525                 :       case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY:
         526                 :       case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET:
         527                 :       default: {
         528               0 :         NS_HTML5_BREAK(eofloop);
         529                 :       }
         530                 :     }
         531                 :   }
         532                 :   eofloop_end: ;
         533             648 :   while (currentPtr > 0) {
         534             216 :     popOnEof();
         535                 :   }
         536             216 :   if (!fragment) {
         537             216 :     popOnEof();
         538                 :   }
         539             216 : }
         540                 :
         541                 : void
         542             216 : nsHtml5TreeBuilder::endTokenization()
         543                 : {
         544             216 :   formPointer = nsnull;
         545             216 :   headPointer = nsnull;
         546             216 :   deepTreeSurrogateParent = nsnull;
         547             216 :   if (stack) {
         548             432 :     while (currentPtr > -1) {
         549               0 :       stack[currentPtr]->release();
         550               0 :       currentPtr--;
         551                 :     }
         552             216 :     stack = nsnull;
         553                 :   }
         554             216 :   if (listOfActiveFormattingElements) {
         555             432 :     while (listPtr > -1) {
         556               0 :       if (listOfActiveFormattingElements[listPtr]) {
         557               0 :         listOfActiveFormattingElements[listPtr]->release();
         558                 :       }
         559               0 :       listPtr--;
         560                 :     }
         561             216 :     listOfActiveFormattingElements = nsnull;
         562                 :   }
         563             216 :   charBuffer = nsnull;
         564             216 :   end();
         565             216 : }
         566                 :
         567                 : void
         568              74 : nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, bool selfClosing)
         569                 : {
         570              74 :   flushCharacters();
         571                 :   PRInt32 eltPos;
         572              74 :   needToDropLF = false;
         573              72 :   starttagloop: for (; ; ) {
         574             164 :     PRInt32 group = elementName->getGroup();
         575             164 :     nsIAtom* name = elementName->name;
         576             164 :     if (isInForeign()) {
         577               0 :       nsHtml5StackNode* currentNode = stack[currentPtr];
         578               0 :       PRInt32 currNs = currentNode->ns;
         579               0 :       if (!(currentNode->isHtmlIntegrationPoint() || (currNs == kNameSpaceID_MathML && ((currentNode->getGroup() == NS_HTML5TREE_BUILDER_MI_MO_MN_MS_MTEXT && group != NS_HTML5TREE_BUILDER_MGLYPH_OR_MALIGNMARK) || (currentNode->getGroup() == NS_HTML5TREE_BUILDER_ANNOTATION_XML && group == NS_HTML5TREE_BUILDER_SVG))))) {
         580               0 :         switch(group) {
         581                 :           case NS_HTML5TREE_BUILDER_B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
         582                 :           case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
         583                 :           case NS_HTML5TREE_BUILDER_BODY:
         584                 :           case NS_HTML5TREE_BUILDER_BR:
         585                 :           case NS_HTML5TREE_BUILDER_RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR:
         586                 :           case NS_HTML5TREE_BUILDER_DD_OR_DT:
         587                 :           case NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL:
         588                 :           case NS_HTML5TREE_BUILDER_EMBED_OR_IMG:
         589                 :           case NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6:
         590                 :           case NS_HTML5TREE_BUILDER_HEAD:
         591                 :           case NS_HTML5TREE_BUILDER_HR:
         592                 :           case NS_HTML5TREE_BUILDER_LI:
         593                 :           case NS_HTML5TREE_BUILDER_META:
         594                 :           case NS_HTML5TREE_BUILDER_NOBR:
         595                 :           case NS_HTML5TREE_BUILDER_P:
         596                 :           case NS_HTML5TREE_BUILDER_PRE_OR_LISTING:
         597                 :           case NS_HTML5TREE_BUILDER_TABLE: {
         598               0 :             errHtmlStartTagInForeignContext(name);
         599               0 :             while (!isSpecialParentInForeign(stack[currentPtr])) {
         600               0 :               pop();
         601                 :             }
         602               0 :             NS_HTML5_CONTINUE(starttagloop);
         603                 :           }
         604                 :           case NS_HTML5TREE_BUILDER_FONT: {
         605               0 :             if (attributes->contains(nsHtml5AttributeName::ATTR_COLOR) || attributes->contains(nsHtml5AttributeName::ATTR_FACE) || attributes->contains(nsHtml5AttributeName::ATTR_SIZE)) {
         606               0 :               errHtmlStartTagInForeignContext(name);
         607               0 :               while (!isSpecialParentInForeign(stack[currentPtr])) {
         608               0 :                 pop();
         609                 :               }
         610               0 :               NS_HTML5_CONTINUE(starttagloop);
         611                 :             }
         612                 :           }
         613                 :           default: {
         614               0 :             if (kNameSpaceID_SVG == currNs) {
         615               0 :               attributes->adjustForSvg();
         616               0 :               if (selfClosing) {
         617               0 :                 appendVoidElementToCurrentMayFosterSVG(elementName, attributes);
         618               0 :                 selfClosing = false;
         619                 :               } else {
         620               0 :                 appendToCurrentNodeAndPushElementMayFosterSVG(elementName, attributes);
         621                 :               }
         622               0 :               attributes = nsnull;
         623               0 :               NS_HTML5_BREAK(starttagloop);
         624                 :             } else {
         625               0 :               attributes->adjustForMath();
         626               0 :               if (selfClosing) {
         627               0 :                 appendVoidElementToCurrentMayFosterMathML(elementName, attributes);
         628               0 :                 selfClosing = false;
         629                 :               } else {
         630               0 :                 appendToCurrentNodeAndPushElementMayFosterMathML(elementName, attributes);
         631                 :               }
         632               0 :               attributes = nsnull;
         633               0 :               NS_HTML5_BREAK(starttagloop);
         634                 :             }
         635                 :           }
         636                 :         }
         637                 :       }
         638                 :     }
         639             164 :     switch(mode) {
         640                 :       case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: {
         641               0 :         switch(group) {
         642                 :           case NS_HTML5TREE_BUILDER_TR: {
         643               0 :             clearStackBackTo(findLastInTableScopeOrRootTbodyTheadTfoot());
         644               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
         645               0 :             mode = NS_HTML5TREE_BUILDER_IN_ROW;
         646               0 :             attributes = nsnull;
         647               0 :             NS_HTML5_BREAK(starttagloop);
         648                 :           }
         649                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH: {
         650               0 :             errStartTagInTableBody(name);
         651               0 :             clearStackBackTo(findLastInTableScopeOrRootTbodyTheadTfoot());
         652               0 :             appendToCurrentNodeAndPushElement(nsHtml5ElementName::ELT_TR, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
         653               0 :             mode = NS_HTML5TREE_BUILDER_IN_ROW;
         654               0 :             continue;
         655                 :           }
         656                 :           case NS_HTML5TREE_BUILDER_CAPTION:
         657                 :           case NS_HTML5TREE_BUILDER_COL:
         658                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
         659                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: {
         660               0 :             eltPos = findLastInTableScopeOrRootTbodyTheadTfoot();
         661               0 :             if (!eltPos) {
         662               0 :               errStrayStartTag(name);
         663               0 :               NS_HTML5_BREAK(starttagloop);
         664                 :             } else {
         665               0 :               clearStackBackTo(eltPos);
         666               0 :               pop();
         667               0 :               mode = NS_HTML5TREE_BUILDER_IN_TABLE;
         668               0 :               continue;
         669                 :             }
         670                 :           }
         671                 :           default:
         672                 :             ; // fall through
         673                 :         }
         674                 :       }
         675                 :       case NS_HTML5TREE_BUILDER_IN_ROW: {
         676               0 :         switch(group) {
         677                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH: {
         678               0 :             clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TR));
         679               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
         680               0 :             mode = NS_HTML5TREE_BUILDER_IN_CELL;
         681               0 :             insertMarker();
         682               0 :             attributes = nsnull;
         683               0 :             NS_HTML5_BREAK(starttagloop);
         684                 :           }
         685                 :           case NS_HTML5TREE_BUILDER_CAPTION:
         686                 :           case NS_HTML5TREE_BUILDER_COL:
         687                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
         688                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
         689                 :           case NS_HTML5TREE_BUILDER_TR: {
         690               0 :             eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TR);
         691               0 :             if (!eltPos) {
         692                 :
         693               0 :               errNoTableRowToClose();
         694               0 :               NS_HTML5_BREAK(starttagloop);
         695                 :             }
         696               0 :             clearStackBackTo(eltPos);
         697               0 :             pop();
         698               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY;
         699               0 :             continue;
         700                 :           }
         701                 :           default:
         702                 :             ; // fall through
         703                 :         }
         704                 :       }
         705                 :       case NS_HTML5TREE_BUILDER_IN_TABLE: {
         706                 :         for (; ; ) {
         707               0 :           switch(group) {
         708                 :             case NS_HTML5TREE_BUILDER_CAPTION: {
         709               0 :               clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE));
         710               0 :               insertMarker();
         711               0 :               appendToCurrentNodeAndPushElement(elementName, attributes);
         712               0 :               mode = NS_HTML5TREE_BUILDER_IN_CAPTION;
         713               0 :               attributes = nsnull;
         714               0 :               NS_HTML5_BREAK(starttagloop);
         715                 :             }
         716                 :             case NS_HTML5TREE_BUILDER_COLGROUP: {
         717               0 :               clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE));
         718               0 :               appendToCurrentNodeAndPushElement(elementName, attributes);
         719               0 :               mode = NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP;
         720               0 :               attributes = nsnull;
         721               0 :               NS_HTML5_BREAK(starttagloop);
         722                 :             }
         723                 :             case NS_HTML5TREE_BUILDER_COL: {
         724               0 :               clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE));
         725               0 :               appendToCurrentNodeAndPushElement(nsHtml5ElementName::ELT_COLGROUP, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
         726               0 :               mode = NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP;
         727               0 :               NS_HTML5_CONTINUE(starttagloop);
         728                 :             }
         729                 :             case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: {
         730               0 :               clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE));
         731               0 :               appendToCurrentNodeAndPushElement(elementName, attributes);
         732               0 :               mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY;
         733               0 :               attributes = nsnull;
         734               0 :               NS_HTML5_BREAK(starttagloop);
         735                 :             }
         736                 :             case NS_HTML5TREE_BUILDER_TR:
         737                 :             case NS_HTML5TREE_BUILDER_TD_OR_TH: {
         738               0 :               clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE));
         739               0 :               appendToCurrentNodeAndPushElement(nsHtml5ElementName::ELT_TBODY, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
         740               0 :               mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY;
         741               0 :               NS_HTML5_CONTINUE(starttagloop);
         742                 :             }
         743                 :             case NS_HTML5TREE_BUILDER_TABLE: {
         744               0 :               errTableSeenWhileTableOpen();
         745               0 :               eltPos = findLastInTableScope(name);
         746               0 :               if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
         747                 :
         748               0 :                 NS_HTML5_BREAK(starttagloop);
         749                 :               }
         750               0 :               generateImpliedEndTags();
         751               0 :               if (!!NS_UNLIKELY(mViewSource) && !isCurrent(nsHtml5Atoms::table)) {
         752               0 :                 errNoCheckUnclosedElementsOnStack();
         753                 :               }
         754               0 :               while (currentPtr >= eltPos) {
         755               0 :                 pop();
         756                 :               }
         757               0 :               resetTheInsertionMode();
         758               0 :               NS_HTML5_CONTINUE(starttagloop);
         759                 :             }
         760                 :             case NS_HTML5TREE_BUILDER_SCRIPT: {
         761               0 :               appendToCurrentNodeAndPushElement(elementName, attributes);
         762               0 :               originalMode = mode;
         763               0 :               mode = NS_HTML5TREE_BUILDER_TEXT;
         764               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, elementName);
         765               0 :               attributes = nsnull;
         766               0 :               NS_HTML5_BREAK(starttagloop);
         767                 :             }
         768                 :             case NS_HTML5TREE_BUILDER_STYLE: {
         769               0 :               appendToCurrentNodeAndPushElement(elementName, attributes);
         770               0 :               originalMode = mode;
         771               0 :               mode = NS_HTML5TREE_BUILDER_TEXT;
         772               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName);
         773               0 :               attributes = nsnull;
         774               0 :               NS_HTML5_BREAK(starttagloop);
         775                 :             }
         776                 :             case NS_HTML5TREE_BUILDER_INPUT: {
         777               0 :               if (!nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("hidden", attributes->getValue(nsHtml5AttributeName::ATTR_TYPE))) {
         778               0 :                 NS_HTML5_BREAK(intableloop);
         779                 :               }
         780               0 :               appendVoidElementToCurrent(name, attributes, formPointer);
         781               0 :               selfClosing = false;
         782               0 :               attributes = nsnull;
         783               0 :               NS_HTML5_BREAK(starttagloop);
         784                 :             }
         785                 :             case NS_HTML5TREE_BUILDER_FORM: {
         786               0 :               if (formPointer) {
         787               0 :                 errFormWhenFormOpen();
         788               0 :                 NS_HTML5_BREAK(starttagloop);
         789                 :               } else {
         790               0 :                 errStartTagInTable(name);
         791               0 :                 appendVoidFormToCurrent(attributes);
         792               0 :                 attributes = nsnull;
         793               0 :                 NS_HTML5_BREAK(starttagloop);
         794                 :               }
         795                 :             }
         796                 :             default: {
         797               0 :               errStartTagInTable(name);
         798               0 :               NS_HTML5_BREAK(intableloop);
         799                 :             }
         800                 :           }
         801                 :         }
         802                 :         intableloop_end: ;
         803                 :       }
         804                 :       case NS_HTML5TREE_BUILDER_IN_CAPTION: {
         805               0 :         switch(group) {
         806                 :           case NS_HTML5TREE_BUILDER_CAPTION:
         807                 :           case NS_HTML5TREE_BUILDER_COL:
         808                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
         809                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
         810                 :           case NS_HTML5TREE_BUILDER_TR:
         811                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH: {
         812               0 :             errStrayStartTag(name);
         813               0 :             eltPos = findLastInTableScope(nsHtml5Atoms::caption);
         814               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
         815               0 :               NS_HTML5_BREAK(starttagloop);
         816                 :             }
         817               0 :             generateImpliedEndTags();
         818               0 :             if (!!NS_UNLIKELY(mViewSource) && currentPtr != eltPos) {
         819               0 :               errNoCheckUnclosedElementsOnStack();
         820                 :             }
         821               0 :             while (currentPtr >= eltPos) {
         822               0 :               pop();
         823                 :             }
         824               0 :             clearTheListOfActiveFormattingElementsUpToTheLastMarker();
         825               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE;
         826               0 :             continue;
         827                 :           }
         828                 :           default:
         829                 :             ; // fall through
         830                 :         }
         831                 :       }
         832                 :       case NS_HTML5TREE_BUILDER_IN_CELL: {
         833               0 :         switch(group) {
         834                 :           case NS_HTML5TREE_BUILDER_CAPTION:
         835                 :           case NS_HTML5TREE_BUILDER_COL:
         836                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
         837                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
         838                 :           case NS_HTML5TREE_BUILDER_TR:
         839                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH: {
         840               0 :             eltPos = findLastInTableScopeTdTh();
         841               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
         842               0 :               errNoCellToClose();
         843               0 :               NS_HTML5_BREAK(starttagloop);
         844                 :             } else {
         845               0 :               closeTheCell(eltPos);
         846               0 :               continue;
         847                 :             }
         848                 :           }
         849                 :           default:
         850                 :             ; // fall through
         851                 :         }
         852                 :       }
         853                 :       case NS_HTML5TREE_BUILDER_FRAMESET_OK: {
         854              18 :         switch(group) {
         855                 :           case NS_HTML5TREE_BUILDER_FRAMESET: {
         856               0 :             if (mode == NS_HTML5TREE_BUILDER_FRAMESET_OK) {
         857               0 :               if (!currentPtr || stack[1]->getGroup() != NS_HTML5TREE_BUILDER_BODY) {
         858                 :
         859               0 :                 errStrayStartTag(name);
         860               0 :                 NS_HTML5_BREAK(starttagloop);
         861                 :               } else {
         862               0 :                 errFramesetStart();
         863               0 :                 detachFromParent(stack[1]->node);
         864               0 :                 while (currentPtr > 0) {
         865               0 :                   pop();
         866                 :                 }
         867               0 :                 appendToCurrentNodeAndPushElement(elementName, attributes);
         868               0 :                 mode = NS_HTML5TREE_BUILDER_IN_FRAMESET;
         869               0 :                 attributes = nsnull;
         870               0 :                 NS_HTML5_BREAK(starttagloop);
         871                 :               }
         872                 :             } else {
         873               0 :               errStrayStartTag(name);
         874               0 :               NS_HTML5_BREAK(starttagloop);
         875                 :             }
         876                 :           }
         877                 :           case NS_HTML5TREE_BUILDER_PRE_OR_LISTING:
         878                 :           case NS_HTML5TREE_BUILDER_LI:
         879                 :           case NS_HTML5TREE_BUILDER_DD_OR_DT:
         880                 :           case NS_HTML5TREE_BUILDER_BUTTON:
         881                 :           case NS_HTML5TREE_BUILDER_MARQUEE_OR_APPLET:
         882                 :           case NS_HTML5TREE_BUILDER_OBJECT:
         883                 :           case NS_HTML5TREE_BUILDER_TABLE:
         884                 :           case NS_HTML5TREE_BUILDER_AREA_OR_WBR:
         885                 :           case NS_HTML5TREE_BUILDER_BR:
         886                 :           case NS_HTML5TREE_BUILDER_EMBED_OR_IMG:
         887                 :           case NS_HTML5TREE_BUILDER_INPUT:
         888                 :           case NS_HTML5TREE_BUILDER_KEYGEN:
         889                 :           case NS_HTML5TREE_BUILDER_HR:
         890                 :           case NS_HTML5TREE_BUILDER_TEXTAREA:
         891                 :           case NS_HTML5TREE_BUILDER_XMP:
         892                 :           case NS_HTML5TREE_BUILDER_IFRAME:
         893                 :           case NS_HTML5TREE_BUILDER_SELECT: {
         894               0 :             if (mode == NS_HTML5TREE_BUILDER_FRAMESET_OK && !(group == NS_HTML5TREE_BUILDER_INPUT && nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("hidden", attributes->getValue(nsHtml5AttributeName::ATTR_TYPE)))) {
         895               0 :               framesetOk = false;
         896               0 :               mode = NS_HTML5TREE_BUILDER_IN_BODY;
         897                 :             }
         898                 :           }
         899                 :           default:
         900                 :             ; // fall through
         901                 :         }
         902                 :       }
         903                 :       case NS_HTML5TREE_BUILDER_IN_BODY: {
         904                 :         for (; ; ) {
         905              74 :           switch(group) {
         906                 :             case NS_HTML5TREE_BUILDER_HTML: {
         907               0 :               errStrayStartTag(name);
         908               0 :               if (!fragment) {
         909               0 :                 addAttributesToHtml(attributes);
         910               0 :                 attributes = nsnull;
         911                 :               }
         912               0 :               NS_HTML5_BREAK(starttagloop);
         913                 :             }
         914                 :             case NS_HTML5TREE_BUILDER_BASE:
         915                 :             case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND:
         916                 :             case NS_HTML5TREE_BUILDER_META:
         917                 :             case NS_HTML5TREE_BUILDER_STYLE:
         918                 :             case NS_HTML5TREE_BUILDER_SCRIPT:
         919                 :             case NS_HTML5TREE_BUILDER_TITLE:
         920                 :             case NS_HTML5TREE_BUILDER_COMMAND: {
         921               0 :               NS_HTML5_BREAK(inbodyloop);
         922                 :             }
         923                 :             case NS_HTML5TREE_BUILDER_BODY: {
         924               0 :               if (!currentPtr || stack[1]->getGroup() != NS_HTML5TREE_BUILDER_BODY) {
         925                 :
         926               0 :                 errStrayStartTag(name);
         927               0 :                 NS_HTML5_BREAK(starttagloop);
         928                 :               }
         929               0 :               errFooSeenWhenFooOpen(name);
         930               0 :               framesetOk = false;
         931               0 :               if (mode == NS_HTML5TREE_BUILDER_FRAMESET_OK) {
         932               0 :                 mode = NS_HTML5TREE_BUILDER_IN_BODY;
         933                 :               }
         934               0 :               if (addAttributesToBody(attributes)) {
         935               0 :                 attributes = nsnull;
         936                 :               }
         937               0 :               NS_HTML5_BREAK(starttagloop);
         938                 :             }
         939                 :             case NS_HTML5TREE_BUILDER_P:
         940                 :             case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
         941                 :             case NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL:
         942                 :             case NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_NAV_OR_SECTION_OR_SUMMARY: {
         943              22 :               implicitlyCloseP();
         944              22 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
         945              22 :               attributes = nsnull;
         946              22 :               NS_HTML5_BREAK(starttagloop);
         947                 :             }
         948                 :             case NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6: {
         949               4 :               implicitlyCloseP();
         950               4 :               if (stack[currentPtr]->getGroup() == NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
         951               0 :                 errHeadingWhenHeadingOpen();
         952               0 :                 pop();
         953                 :               }
         954               4 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
         955               4 :               attributes = nsnull;
         956               4 :               NS_HTML5_BREAK(starttagloop);
         957                 :             }
         958                 :             case NS_HTML5TREE_BUILDER_FIELDSET: {
         959               0 :               implicitlyCloseP();
         960               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer);
         961               0 :               attributes = nsnull;
         962               0 :               NS_HTML5_BREAK(starttagloop);
         963                 :             }
         964                 :             case NS_HTML5TREE_BUILDER_PRE_OR_LISTING: {
         965               0 :               implicitlyCloseP();
         966               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
         967               0 :               needToDropLF = true;
         968               0 :               attributes = nsnull;
         969               0 :               NS_HTML5_BREAK(starttagloop);
         970                 :             }
         971                 :             case NS_HTML5TREE_BUILDER_FORM: {
         972               0 :               if (formPointer) {
         973               0 :                 errFormWhenFormOpen();
         974               0 :                 NS_HTML5_BREAK(starttagloop);
         975                 :               } else {
         976               0 :                 implicitlyCloseP();
         977               0 :                 appendToCurrentNodeAndPushFormElementMayFoster(attributes);
         978               0 :                 attributes = nsnull;
         979               0 :                 NS_HTML5_BREAK(starttagloop);
         980                 :               }
         981                 :             }
         982                 :             case NS_HTML5TREE_BUILDER_LI:
         983                 :             case NS_HTML5TREE_BUILDER_DD_OR_DT: {
         984               8 :               eltPos = currentPtr;
         985               0 :               for (; ; ) {
         986               8 :                 nsHtml5StackNode* node = stack[eltPos];
         987               8 :                 if (node->getGroup() == group) {
         988               4 :                   generateImpliedEndTagsExceptFor(node->name);
         989               4 :                   if (!!NS_UNLIKELY(mViewSource) && eltPos != currentPtr) {
         990               0 :                     errUnclosedElementsImplied(eltPos, name);
         991                 :                   }
         992              12 :                   while (currentPtr >= eltPos) {
         993               4 :                     pop();
         994                 :                   }
         995               4 :                   break;
         996               4 :                 } else if (node->isScoping() || (node->isSpecial() && node->name != nsHtml5Atoms::p && node->name != nsHtml5Atoms::address && node->name != nsHtml5Atoms::div)) {
         997               4 :                   break;
         998                 :                 }
         999               0 :                 eltPos--;
        1000                 :               }
        1001               8 :               implicitlyCloseP();
        1002               8 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1003               8 :               attributes = nsnull;
        1004               8 :               NS_HTML5_BREAK(starttagloop);
        1005                 :             }
        1006                 :             case NS_HTML5TREE_BUILDER_PLAINTEXT: {
        1007               0 :               implicitlyCloseP();
        1008               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1009               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_PLAINTEXT, elementName);
        1010               0 :               attributes = nsnull;
        1011               0 :               NS_HTML5_BREAK(starttagloop);
        1012                 :             }
        1013                 :             case NS_HTML5TREE_BUILDER_A: {
        1014               0 :               PRInt32 activeAPos = findInListOfActiveFormattingElementsContainsBetweenEndAndLastMarker(nsHtml5Atoms::a);
        1015               0 :               if (activeAPos != -1) {
        1016               0 :                 errFooSeenWhenFooOpen(name);
        1017               0 :                 nsHtml5StackNode* activeA = listOfActiveFormattingElements[activeAPos];
        1018               0 :                 activeA->retain();
        1019               0 :                 adoptionAgencyEndTag(nsHtml5Atoms::a);
        1020               0 :                 removeFromStack(activeA);
        1021               0 :                 activeAPos = findInListOfActiveFormattingElements(activeA);
        1022               0 :                 if (activeAPos != -1) {
        1023               0 :                   removeFromListOfActiveFormattingElements(activeAPos);
        1024                 :                 }
        1025               0 :                 activeA->release();
        1026                 :               }
        1027               0 :               reconstructTheActiveFormattingElements();
        1028               0 :               appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes);
        1029               0 :               attributes = nsnull;
        1030               0 :               NS_HTML5_BREAK(starttagloop);
        1031                 :             }
        1032                 :             case NS_HTML5TREE_BUILDER_B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
        1033                 :             case NS_HTML5TREE_BUILDER_FONT: {
        1034               0 :               reconstructTheActiveFormattingElements();
        1035               0 :               maybeForgetEarlierDuplicateFormattingElement(elementName->name, attributes);
        1036               0 :               appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes);
        1037               0 :               attributes = nsnull;
        1038               0 :               NS_HTML5_BREAK(starttagloop);
        1039                 :             }
        1040                 :             case NS_HTML5TREE_BUILDER_NOBR: {
        1041               0 :               reconstructTheActiveFormattingElements();
        1042               0 :               if (NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK != findLastInScope(nsHtml5Atoms::nobr)) {
        1043               0 :                 errFooSeenWhenFooOpen(name);
        1044               0 :                 adoptionAgencyEndTag(nsHtml5Atoms::nobr);
        1045               0 :                 reconstructTheActiveFormattingElements();
        1046                 :               }
        1047               0 :               appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes);
        1048               0 :               attributes = nsnull;
        1049               0 :               NS_HTML5_BREAK(starttagloop);
        1050                 :             }
        1051                 :             case NS_HTML5TREE_BUILDER_BUTTON: {
        1052               0 :               eltPos = findLastInScope(name);
        1053               0 :               if (eltPos != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        1054               0 :                 errFooSeenWhenFooOpen(name);
        1055               0 :                 generateImpliedEndTags();
        1056               0 :                 if (!!NS_UNLIKELY(mViewSource) && !isCurrent(name)) {
        1057               0 :                   errUnclosedElementsImplied(eltPos, name);
        1058                 :                 }
        1059               0 :                 while (currentPtr >= eltPos) {
        1060               0 :                   pop();
        1061                 :                 }
        1062               0 :                 NS_HTML5_CONTINUE(starttagloop);
        1063                 :               } else {
        1064               0 :                 reconstructTheActiveFormattingElements();
        1065               0 :                 appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer);
        1066               0 :                 attributes = nsnull;
        1067               0 :                 NS_HTML5_BREAK(starttagloop);
        1068                 :               }
        1069                 :             }
        1070                 :             case NS_HTML5TREE_BUILDER_OBJECT: {
        1071               0 :               reconstructTheActiveFormattingElements();
        1072               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer);
        1073               0 :               insertMarker();
        1074               0 :               attributes = nsnull;
        1075               0 :               NS_HTML5_BREAK(starttagloop);
        1076                 :             }
        1077                 :             case NS_HTML5TREE_BUILDER_MARQUEE_OR_APPLET: {
        1078               0 :               reconstructTheActiveFormattingElements();
        1079               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1080               0 :               insertMarker();
        1081               0 :               attributes = nsnull;
        1082               0 :               NS_HTML5_BREAK(starttagloop);
        1083                 :             }
        1084                 :             case NS_HTML5TREE_BUILDER_TABLE: {
        1085               0 :               if (!quirks) {
        1086               0 :                 implicitlyCloseP();
        1087                 :               }
        1088               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1089               0 :               mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        1090               0 :               attributes = nsnull;
        1091               0 :               NS_HTML5_BREAK(starttagloop);
        1092                 :             }
        1093                 :             case NS_HTML5TREE_BUILDER_BR:
        1094                 :             case NS_HTML5TREE_BUILDER_EMBED_OR_IMG:
        1095                 :             case NS_HTML5TREE_BUILDER_AREA_OR_WBR: {
        1096              40 :               reconstructTheActiveFormattingElements();
        1097                 :             }
        1098                 : #ifdef ENABLE_VOID_MENUITEM
        1099                 :             case NS_HTML5TREE_BUILDER_MENUITEM:
        1100                 : #endif
        1101                 :             case NS_HTML5TREE_BUILDER_PARAM_OR_SOURCE_OR_TRACK: {
        1102              40 :               appendVoidElementToCurrentMayFoster(elementName, attributes);
        1103              40 :               selfClosing = false;
        1104              40 :               attributes = nsnull;
        1105              40 :               NS_HTML5_BREAK(starttagloop);
        1106                 :             }
        1107                 :             case NS_HTML5TREE_BUILDER_HR: {
        1108               0 :               implicitlyCloseP();
        1109               0 :               appendVoidElementToCurrentMayFoster(elementName, attributes);
        1110               0 :               selfClosing = false;
        1111               0 :               attributes = nsnull;
        1112               0 :               NS_HTML5_BREAK(starttagloop);
        1113                 :             }
        1114                 :             case NS_HTML5TREE_BUILDER_IMAGE: {
        1115               0 :               errImage();
        1116               0 :               elementName = nsHtml5ElementName::ELT_IMG;
        1117               0 :               NS_HTML5_CONTINUE(starttagloop);
        1118                 :             }
        1119                 :             case NS_HTML5TREE_BUILDER_KEYGEN:
        1120                 :             case NS_HTML5TREE_BUILDER_INPUT: {
        1121               0 :               reconstructTheActiveFormattingElements();
        1122               0 :               appendVoidElementToCurrentMayFoster(name, attributes, formPointer);
        1123               0 :               selfClosing = false;
        1124               0 :               attributes = nsnull;
        1125               0 :               NS_HTML5_BREAK(starttagloop);
        1126                 :             }
        1127                 :             case NS_HTML5TREE_BUILDER_ISINDEX: {
        1128               0 :               errIsindex();
        1129               0 :               if (formPointer) {
        1130               0 :                 NS_HTML5_BREAK(starttagloop);
        1131                 :               }
        1132               0 :               implicitlyCloseP();
        1133               0 :               nsHtml5HtmlAttributes* formAttrs = new nsHtml5HtmlAttributes(0);
        1134               0 :               PRInt32 actionIndex = attributes->getIndex(nsHtml5AttributeName::ATTR_ACTION);
        1135               0 :               if (actionIndex > -1) {
        1136               0 :                 formAttrs->addAttribute(nsHtml5AttributeName::ATTR_ACTION, attributes->getValue(actionIndex));
        1137                 :               }
        1138               0 :               appendToCurrentNodeAndPushFormElementMayFoster(formAttrs);
        1139               0 :               appendVoidElementToCurrentMayFoster(nsHtml5ElementName::ELT_HR, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
        1140               0 :               appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName::ELT_LABEL, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
        1141               0 :               PRInt32 promptIndex = attributes->getIndex(nsHtml5AttributeName::ATTR_PROMPT);
        1142               0 :               if (promptIndex > -1) {
        1143               0 :                 autoJArray<PRUnichar,PRInt32> prompt = nsHtml5Portability::newCharArrayFromString(attributes->getValue(promptIndex));
        1144               0 :                 appendCharacters(stack[currentPtr]->node, prompt, 0, prompt.length);
        1145                 :               } else {
        1146               0 :                 appendIsindexPrompt(stack[currentPtr]->node);
        1147                 :               }
        1148               0 :               nsHtml5HtmlAttributes* inputAttributes = new nsHtml5HtmlAttributes(0);
        1149               0 :               inputAttributes->addAttribute(nsHtml5AttributeName::ATTR_NAME, nsHtml5Portability::newStringFromLiteral("isindex"));
        1150               0 :               for (PRInt32 i = 0; i < attributes->getLength(); i++) {
        1151               0 :                 nsHtml5AttributeName* attributeQName = attributes->getAttributeName(i);
        1152               0 :                 if (nsHtml5AttributeName::ATTR_NAME == attributeQName || nsHtml5AttributeName::ATTR_PROMPT == attributeQName) {
        1153               0 :                   attributes->releaseValue(i);
        1154               0 :                 } else if (nsHtml5AttributeName::ATTR_ACTION != attributeQName) {
        1155               0 :                   inputAttributes->addAttribute(attributeQName, attributes->getValue(i));
        1156                 :                 }
        1157                 :               }
        1158               0 :               attributes->clearWithoutReleasingContents();
        1159               0 :               appendVoidElementToCurrentMayFoster(nsHtml5Atoms::input, inputAttributes, formPointer);
        1160               0 :               pop();
        1161               0 :               appendVoidElementToCurrentMayFoster(nsHtml5ElementName::ELT_HR, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
        1162               0 :               pop();
        1163               0 :               selfClosing = false;
        1164               0 :               NS_HTML5_BREAK(starttagloop);
        1165                 :             }
        1166                 :             case NS_HTML5TREE_BUILDER_TEXTAREA: {
        1167               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer);
        1168               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, elementName);
        1169               0 :               originalMode = mode;
        1170               0 :               mode = NS_HTML5TREE_BUILDER_TEXT;
        1171               0 :               needToDropLF = true;
        1172               0 :               attributes = nsnull;
        1173               0 :               NS_HTML5_BREAK(starttagloop);
        1174                 :             }
        1175                 :             case NS_HTML5TREE_BUILDER_XMP: {
        1176               0 :               implicitlyCloseP();
        1177               0 :               reconstructTheActiveFormattingElements();
        1178               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1179               0 :               originalMode = mode;
        1180               0 :               mode = NS_HTML5TREE_BUILDER_TEXT;
        1181               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName);
        1182               0 :               attributes = nsnull;
        1183               0 :               NS_HTML5_BREAK(starttagloop);
        1184                 :             }
        1185                 :             case NS_HTML5TREE_BUILDER_NOSCRIPT: {
        1186               0 :               if (!scriptingEnabled) {
        1187               0 :                 reconstructTheActiveFormattingElements();
        1188               0 :                 appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1189               0 :                 attributes = nsnull;
        1190               0 :                 NS_HTML5_BREAK(starttagloop);
        1191                 :               } else {
        1192                 :               }
        1193                 :             }
        1194                 :             case NS_HTML5TREE_BUILDER_NOFRAMES:
        1195                 :             case NS_HTML5TREE_BUILDER_IFRAME:
        1196                 :             case NS_HTML5TREE_BUILDER_NOEMBED: {
        1197               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1198               0 :               originalMode = mode;
        1199               0 :               mode = NS_HTML5TREE_BUILDER_TEXT;
        1200               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName);
        1201               0 :               attributes = nsnull;
        1202               0 :               NS_HTML5_BREAK(starttagloop);
        1203                 :             }
        1204                 :             case NS_HTML5TREE_BUILDER_SELECT: {
        1205               0 :               reconstructTheActiveFormattingElements();
        1206               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer);
        1207               0 :               switch(mode) {
        1208                 :                 case NS_HTML5TREE_BUILDER_IN_TABLE:
        1209                 :                 case NS_HTML5TREE_BUILDER_IN_CAPTION:
        1210                 :                 case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP:
        1211                 :                 case NS_HTML5TREE_BUILDER_IN_TABLE_BODY:
        1212                 :                 case NS_HTML5TREE_BUILDER_IN_ROW:
        1213                 :                 case NS_HTML5TREE_BUILDER_IN_CELL: {
        1214               0 :                   mode = NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE;
        1215               0 :                   break;
        1216                 :                 }
        1217                 :                 default: {
        1218               0 :                   mode = NS_HTML5TREE_BUILDER_IN_SELECT;
        1219               0 :                   break;
        1220                 :                 }
        1221                 :               }
        1222               0 :               attributes = nsnull;
        1223               0 :               NS_HTML5_BREAK(starttagloop);
        1224                 :             }
        1225                 :             case NS_HTML5TREE_BUILDER_OPTGROUP:
        1226                 :             case NS_HTML5TREE_BUILDER_OPTION: {
        1227               0 :               if (isCurrent(nsHtml5Atoms::option)) {
        1228               0 :                 pop();
        1229                 :               }
        1230               0 :               reconstructTheActiveFormattingElements();
        1231               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1232               0 :               attributes = nsnull;
        1233               0 :               NS_HTML5_BREAK(starttagloop);
        1234                 :             }
        1235                 :             case NS_HTML5TREE_BUILDER_RT_OR_RP: {
        1236               0 :               eltPos = findLastInScope(nsHtml5Atoms::ruby);
        1237               0 :               if (eltPos != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        1238               0 :                 generateImpliedEndTags();
        1239                 :               }
        1240               0 :               if (eltPos != currentPtr) {
        1241               0 :                 if (eltPos != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        1242               0 :                   errStartTagSeenWithoutRuby(name);
        1243                 :                 } else {
        1244               0 :                   errUnclosedChildrenInRuby();
        1245                 :                 }
        1246                 :               }
        1247               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1248               0 :               attributes = nsnull;
        1249               0 :               NS_HTML5_BREAK(starttagloop);
        1250                 :             }
        1251                 :             case NS_HTML5TREE_BUILDER_MATH: {
        1252               0 :               reconstructTheActiveFormattingElements();
        1253               0 :               attributes->adjustForMath();
        1254               0 :               if (selfClosing) {
        1255               0 :                 appendVoidElementToCurrentMayFosterMathML(elementName, attributes);
        1256               0 :                 selfClosing = false;
        1257                 :               } else {
        1258               0 :                 appendToCurrentNodeAndPushElementMayFosterMathML(elementName, attributes);
        1259                 :               }
        1260               0 :               attributes = nsnull;
        1261               0 :               NS_HTML5_BREAK(starttagloop);
        1262                 :             }
        1263                 :             case NS_HTML5TREE_BUILDER_SVG: {
        1264               0 :               reconstructTheActiveFormattingElements();
        1265               0 :               attributes->adjustForSvg();
        1266               0 :               if (selfClosing) {
        1267               0 :                 appendVoidElementToCurrentMayFosterSVG(elementName, attributes);
        1268               0 :                 selfClosing = false;
        1269                 :               } else {
        1270               0 :                 appendToCurrentNodeAndPushElementMayFosterSVG(elementName, attributes);
        1271                 :               }
        1272               0 :               attributes = nsnull;
        1273               0 :               NS_HTML5_BREAK(starttagloop);
        1274                 :             }
        1275                 :             case NS_HTML5TREE_BUILDER_CAPTION:
        1276                 :             case NS_HTML5TREE_BUILDER_COL:
        1277                 :             case NS_HTML5TREE_BUILDER_COLGROUP:
        1278                 :             case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
        1279                 :             case NS_HTML5TREE_BUILDER_TR:
        1280                 :             case NS_HTML5TREE_BUILDER_TD_OR_TH:
        1281                 :             case NS_HTML5TREE_BUILDER_FRAME:
        1282                 :             case NS_HTML5TREE_BUILDER_FRAMESET:
        1283                 :             case NS_HTML5TREE_BUILDER_HEAD: {
        1284               0 :               errStrayStartTag(name);
        1285               0 :               NS_HTML5_BREAK(starttagloop);
        1286                 :             }
        1287                 :             case NS_HTML5TREE_BUILDER_OUTPUT_OR_LABEL: {
        1288               0 :               reconstructTheActiveFormattingElements();
        1289               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer);
        1290               0 :               attributes = nsnull;
        1291               0 :               NS_HTML5_BREAK(starttagloop);
        1292                 :             }
        1293                 :             default: {
        1294               0 :               reconstructTheActiveFormattingElements();
        1295               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1296               0 :               attributes = nsnull;
        1297               0 :               NS_HTML5_BREAK(starttagloop);
        1298                 :             }
        1299                 :           }
        1300                 :         }
        1301                 :         inbodyloop_end: ;
        1302                 :       }
        1303                 :       case NS_HTML5TREE_BUILDER_IN_HEAD: {
        1304                 :         for (; ; ) {
        1305              18 :           switch(group) {
        1306                 :             case NS_HTML5TREE_BUILDER_HTML: {
        1307               0 :               errStrayStartTag(name);
        1308               0 :               if (!fragment) {
        1309               0 :                 addAttributesToHtml(attributes);
        1310               0 :                 attributes = nsnull;
        1311                 :               }
        1312               0 :               NS_HTML5_BREAK(starttagloop);
        1313                 :             }
        1314                 :             case NS_HTML5TREE_BUILDER_BASE:
        1315                 :             case NS_HTML5TREE_BUILDER_COMMAND: {
        1316               0 :               appendVoidElementToCurrentMayFoster(elementName, attributes);
        1317               0 :               selfClosing = false;
        1318               0 :               attributes = nsnull;
        1319               0 :               NS_HTML5_BREAK(starttagloop);
        1320                 :             }
        1321                 :             case NS_HTML5TREE_BUILDER_META:
        1322                 :             case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: {
        1323               0 :               NS_HTML5_BREAK(inheadloop);
        1324                 :             }
        1325                 :             case NS_HTML5TREE_BUILDER_TITLE: {
        1326               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1327               0 :               originalMode = mode;
        1328               0 :               mode = NS_HTML5TREE_BUILDER_TEXT;
        1329               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, elementName);
        1330               0 :               attributes = nsnull;
        1331               0 :               NS_HTML5_BREAK(starttagloop);
        1332                 :             }
        1333                 :             case NS_HTML5TREE_BUILDER_NOSCRIPT: {
        1334               0 :               if (scriptingEnabled) {
        1335               0 :                 appendToCurrentNodeAndPushElement(elementName, attributes);
        1336               0 :                 originalMode = mode;
        1337               0 :                 mode = NS_HTML5TREE_BUILDER_TEXT;
        1338               0 :                 tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName);
        1339                 :               } else {
        1340               0 :                 appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1341               0 :                 mode = NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT;
        1342                 :               }
        1343               0 :               attributes = nsnull;
        1344               0 :               NS_HTML5_BREAK(starttagloop);
        1345                 :             }
        1346                 :             case NS_HTML5TREE_BUILDER_SCRIPT: {
        1347               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1348               0 :               originalMode = mode;
        1349               0 :               mode = NS_HTML5TREE_BUILDER_TEXT;
        1350               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, elementName);
        1351               0 :               attributes = nsnull;
        1352               0 :               NS_HTML5_BREAK(starttagloop);
        1353                 :             }
        1354                 :             case NS_HTML5TREE_BUILDER_STYLE:
        1355                 :             case NS_HTML5TREE_BUILDER_NOFRAMES: {
        1356               0 :               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1357               0 :               originalMode = mode;
        1358               0 :               mode = NS_HTML5TREE_BUILDER_TEXT;
        1359               0 :               tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName);
        1360               0 :               attributes = nsnull;
        1361               0 :               NS_HTML5_BREAK(starttagloop);
        1362                 :             }
        1363                 :             case NS_HTML5TREE_BUILDER_HEAD: {
        1364               0 :               errFooSeenWhenFooOpen(name);
        1365               0 :               NS_HTML5_BREAK(starttagloop);
        1366                 :             }
        1367                 :             default: {
        1368              18 :               pop();
        1369              18 :               mode = NS_HTML5TREE_BUILDER_AFTER_HEAD;
        1370              18 :               NS_HTML5_CONTINUE(starttagloop);
        1371                 :             }
        1372                 :           }
        1373                 :         }
        1374                 :         inheadloop_end: ;
        1375                 :       }
        1376                 :       case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: {
        1377               0 :         switch(group) {
        1378                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1379               0 :             errStrayStartTag(name);
        1380               0 :             if (!fragment) {
        1381               0 :               addAttributesToHtml(attributes);
        1382               0 :               attributes = nsnull;
        1383                 :             }
        1384               0 :             NS_HTML5_BREAK(starttagloop);
        1385                 :           }
        1386                 :           case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: {
        1387               0 :             appendVoidElementToCurrentMayFoster(elementName, attributes);
        1388               0 :             selfClosing = false;
        1389               0 :             attributes = nsnull;
        1390               0 :             NS_HTML5_BREAK(starttagloop);
        1391                 :           }
        1392                 :           case NS_HTML5TREE_BUILDER_META: {
        1393               0 :             checkMetaCharset(attributes);
        1394               0 :             appendVoidElementToCurrentMayFoster(elementName, attributes);
        1395               0 :             selfClosing = false;
        1396               0 :             attributes = nsnull;
        1397               0 :             NS_HTML5_BREAK(starttagloop);
        1398                 :           }
        1399                 :           case NS_HTML5TREE_BUILDER_STYLE:
        1400                 :           case NS_HTML5TREE_BUILDER_NOFRAMES: {
        1401               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1402               0 :             originalMode = mode;
        1403               0 :             mode = NS_HTML5TREE_BUILDER_TEXT;
        1404               0 :             tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName);
        1405               0 :             attributes = nsnull;
        1406               0 :             NS_HTML5_BREAK(starttagloop);
        1407                 :           }
        1408                 :           case NS_HTML5TREE_BUILDER_HEAD: {
        1409               0 :             errFooSeenWhenFooOpen(name);
        1410               0 :             NS_HTML5_BREAK(starttagloop);
        1411                 :           }
        1412                 :           case NS_HTML5TREE_BUILDER_NOSCRIPT: {
        1413               0 :             errFooSeenWhenFooOpen(name);
        1414               0 :             NS_HTML5_BREAK(starttagloop);
        1415                 :           }
        1416                 :           default: {
        1417               0 :             errBadStartTagInHead(name);
        1418               0 :             pop();
        1419               0 :             mode = NS_HTML5TREE_BUILDER_IN_HEAD;
        1420               0 :             continue;
        1421                 :           }
        1422                 :         }
        1423                 :       }
        1424                 :       case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: {
        1425               0 :         switch(group) {
        1426                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1427               0 :             errStrayStartTag(name);
        1428               0 :             if (!fragment) {
        1429               0 :               addAttributesToHtml(attributes);
        1430               0 :               attributes = nsnull;
        1431                 :             }
        1432               0 :             NS_HTML5_BREAK(starttagloop);
        1433                 :           }
        1434                 :           case NS_HTML5TREE_BUILDER_COL: {
        1435               0 :             appendVoidElementToCurrentMayFoster(elementName, attributes);
        1436               0 :             selfClosing = false;
        1437               0 :             attributes = nsnull;
        1438               0 :             NS_HTML5_BREAK(starttagloop);
        1439                 :           }
        1440                 :           default: {
        1441               0 :             if (!currentPtr) {
        1442                 :
        1443               0 :               errGarbageInColgroup();
        1444               0 :               NS_HTML5_BREAK(starttagloop);
        1445                 :             }
        1446               0 :             pop();
        1447               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        1448               0 :             continue;
        1449                 :           }
        1450                 :         }
        1451                 :       }
        1452                 :       case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: {
        1453               0 :         switch(group) {
        1454                 :           case NS_HTML5TREE_BUILDER_CAPTION:
        1455                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
        1456                 :           case NS_HTML5TREE_BUILDER_TR:
        1457                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH:
        1458                 :           case NS_HTML5TREE_BUILDER_TABLE: {
        1459               0 :             errStartTagWithSelectOpen(name);
        1460               0 :             eltPos = findLastInTableScope(nsHtml5Atoms::select);
        1461               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        1462                 :
        1463               0 :               NS_HTML5_BREAK(starttagloop);
        1464                 :             }
        1465               0 :             while (currentPtr >= eltPos) {
        1466               0 :               pop();
        1467                 :             }
        1468               0 :             resetTheInsertionMode();
        1469               0 :             continue;
        1470                 :           }
        1471                 :           default:
        1472                 :             ; // fall through
        1473                 :         }
        1474                 :       }
        1475                 :       case NS_HTML5TREE_BUILDER_IN_SELECT: {
        1476               0 :         switch(group) {
        1477                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1478               0 :             errStrayStartTag(name);
        1479               0 :             if (!fragment) {
        1480               0 :               addAttributesToHtml(attributes);
        1481               0 :               attributes = nsnull;
        1482                 :             }
        1483               0 :             NS_HTML5_BREAK(starttagloop);
        1484                 :           }
        1485                 :           case NS_HTML5TREE_BUILDER_OPTION: {
        1486               0 :             if (isCurrent(nsHtml5Atoms::option)) {
        1487               0 :               pop();
        1488                 :             }
        1489               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1490               0 :             attributes = nsnull;
        1491               0 :             NS_HTML5_BREAK(starttagloop);
        1492                 :           }
        1493                 :           case NS_HTML5TREE_BUILDER_OPTGROUP: {
        1494               0 :             if (isCurrent(nsHtml5Atoms::option)) {
        1495               0 :               pop();
        1496                 :             }
        1497               0 :             if (isCurrent(nsHtml5Atoms::optgroup)) {
        1498               0 :               pop();
        1499                 :             }
        1500               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1501               0 :             attributes = nsnull;
        1502               0 :             NS_HTML5_BREAK(starttagloop);
        1503                 :           }
        1504                 :           case NS_HTML5TREE_BUILDER_SELECT: {
        1505               0 :             errStartSelectWhereEndSelectExpected();
        1506               0 :             eltPos = findLastInTableScope(name);
        1507               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        1508                 :
        1509               0 :               errNoSelectInTableScope();
        1510               0 :               NS_HTML5_BREAK(starttagloop);
        1511                 :             } else {
        1512               0 :               while (currentPtr >= eltPos) {
        1513               0 :                 pop();
        1514                 :               }
        1515               0 :               resetTheInsertionMode();
        1516               0 :               NS_HTML5_BREAK(starttagloop);
        1517                 :             }
        1518                 :           }
        1519                 :           case NS_HTML5TREE_BUILDER_INPUT:
        1520                 :           case NS_HTML5TREE_BUILDER_TEXTAREA:
        1521                 :           case NS_HTML5TREE_BUILDER_KEYGEN: {
        1522               0 :             errStartTagWithSelectOpen(name);
        1523               0 :             eltPos = findLastInTableScope(nsHtml5Atoms::select);
        1524               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        1525                 :
        1526               0 :               NS_HTML5_BREAK(starttagloop);
        1527                 :             }
        1528               0 :             while (currentPtr >= eltPos) {
        1529               0 :               pop();
        1530                 :             }
        1531               0 :             resetTheInsertionMode();
        1532               0 :             continue;
        1533                 :           }
        1534                 :           case NS_HTML5TREE_BUILDER_SCRIPT: {
        1535               0 :             appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1536               0 :             originalMode = mode;
        1537               0 :             mode = NS_HTML5TREE_BUILDER_TEXT;
        1538               0 :             tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, elementName);
        1539               0 :             attributes = nsnull;
        1540               0 :             NS_HTML5_BREAK(starttagloop);
        1541                 :           }
        1542                 :           default: {
        1543               0 :             errStrayStartTag(name);
        1544               0 :             NS_HTML5_BREAK(starttagloop);
        1545                 :           }
        1546                 :         }
        1547                 :       }
        1548                 :       case NS_HTML5TREE_BUILDER_AFTER_BODY: {
        1549               0 :         switch(group) {
        1550                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1551               0 :             errStrayStartTag(name);
        1552               0 :             if (!fragment) {
        1553               0 :               addAttributesToHtml(attributes);
        1554               0 :               attributes = nsnull;
        1555                 :             }
        1556               0 :             NS_HTML5_BREAK(starttagloop);
        1557                 :           }
        1558                 :           default: {
        1559               0 :             errStrayStartTag(name);
        1560               0 :             mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        1561               0 :             continue;
        1562                 :           }
        1563                 :         }
        1564                 :       }
        1565                 :       case NS_HTML5TREE_BUILDER_IN_FRAMESET: {
        1566               0 :         switch(group) {
        1567                 :           case NS_HTML5TREE_BUILDER_FRAMESET: {
        1568               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1569               0 :             attributes = nsnull;
        1570               0 :             NS_HTML5_BREAK(starttagloop);
        1571                 :           }
        1572                 :           case NS_HTML5TREE_BUILDER_FRAME: {
        1573               0 :             appendVoidElementToCurrentMayFoster(elementName, attributes);
        1574               0 :             selfClosing = false;
        1575               0 :             attributes = nsnull;
        1576               0 :             NS_HTML5_BREAK(starttagloop);
        1577                 :           }
        1578                 :           default:
        1579                 :             ; // fall through
        1580                 :         }
        1581                 :       }
        1582                 :       case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: {
        1583               0 :         switch(group) {
        1584                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1585               0 :             errStrayStartTag(name);
        1586               0 :             if (!fragment) {
        1587               0 :               addAttributesToHtml(attributes);
        1588               0 :               attributes = nsnull;
        1589                 :             }
        1590               0 :             NS_HTML5_BREAK(starttagloop);
        1591                 :           }
        1592                 :           case NS_HTML5TREE_BUILDER_NOFRAMES: {
        1593               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1594               0 :             originalMode = mode;
        1595               0 :             mode = NS_HTML5TREE_BUILDER_TEXT;
        1596               0 :             tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName);
        1597               0 :             attributes = nsnull;
        1598               0 :             NS_HTML5_BREAK(starttagloop);
        1599                 :           }
        1600                 :           default: {
        1601               0 :             errStrayStartTag(name);
        1602               0 :             NS_HTML5_BREAK(starttagloop);
        1603                 :           }
        1604                 :         }
        1605                 :       }
        1606                 :       case NS_HTML5TREE_BUILDER_INITIAL: {
        1607              18 :         errStartTagWithoutDoctype();
        1608              18 :         documentModeInternal(QUIRKS_MODE, nsnull, nsnull, false);
        1609              18 :         mode = NS_HTML5TREE_BUILDER_BEFORE_HTML;
        1610              18 :         continue;
        1611                 :       }
        1612                 :       case NS_HTML5TREE_BUILDER_BEFORE_HTML: {
        1613              18 :         switch(group) {
        1614                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1615               0 :             if (attributes == nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES) {
        1616               0 :               appendHtmlElementToDocumentAndPush();
        1617                 :             } else {
        1618               0 :               appendHtmlElementToDocumentAndPush(attributes);
        1619                 :             }
        1620               0 :             mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD;
        1621               0 :             attributes = nsnull;
        1622               0 :             NS_HTML5_BREAK(starttagloop);
        1623                 :           }
        1624                 :           default: {
        1625              18 :             appendHtmlElementToDocumentAndPush();
        1626              18 :             mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD;
        1627              18 :             continue;
        1628                 :           }
        1629                 :         }
        1630                 :       }
        1631                 :       case NS_HTML5TREE_BUILDER_BEFORE_HEAD: {
        1632              18 :         switch(group) {
        1633                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1634               0 :             errStrayStartTag(name);
        1635               0 :             if (!fragment) {
        1636               0 :               addAttributesToHtml(attributes);
        1637               0 :               attributes = nsnull;
        1638                 :             }
        1639               0 :             NS_HTML5_BREAK(starttagloop);
        1640                 :           }
        1641                 :           case NS_HTML5TREE_BUILDER_HEAD: {
        1642               0 :             appendToCurrentNodeAndPushHeadElement(attributes);
        1643               0 :             mode = NS_HTML5TREE_BUILDER_IN_HEAD;
        1644               0 :             attributes = nsnull;
        1645               0 :             NS_HTML5_BREAK(starttagloop);
        1646                 :           }
        1647                 :           default: {
        1648              18 :             appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
        1649              18 :             mode = NS_HTML5TREE_BUILDER_IN_HEAD;
        1650              18 :             continue;
        1651                 :           }
        1652                 :         }
        1653                 :       }
        1654                 :       case NS_HTML5TREE_BUILDER_AFTER_HEAD: {
        1655              18 :         switch(group) {
        1656                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1657               0 :             errStrayStartTag(name);
        1658               0 :             if (!fragment) {
        1659               0 :               addAttributesToHtml(attributes);
        1660               0 :               attributes = nsnull;
        1661                 :             }
        1662               0 :             NS_HTML5_BREAK(starttagloop);
        1663                 :           }
        1664                 :           case NS_HTML5TREE_BUILDER_BODY: {
        1665               0 :             if (!attributes->getLength()) {
        1666               0 :               appendToCurrentNodeAndPushBodyElement();
        1667                 :             } else {
        1668               0 :               appendToCurrentNodeAndPushBodyElement(attributes);
        1669                 :             }
        1670               0 :             framesetOk = false;
        1671               0 :             mode = NS_HTML5TREE_BUILDER_IN_BODY;
        1672               0 :             attributes = nsnull;
        1673               0 :             NS_HTML5_BREAK(starttagloop);
        1674                 :           }
        1675                 :           case NS_HTML5TREE_BUILDER_FRAMESET: {
        1676               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1677               0 :             mode = NS_HTML5TREE_BUILDER_IN_FRAMESET;
        1678               0 :             attributes = nsnull;
        1679               0 :             NS_HTML5_BREAK(starttagloop);
        1680                 :           }
        1681                 :           case NS_HTML5TREE_BUILDER_BASE: {
        1682               0 :             errFooBetweenHeadAndBody(name);
        1683               0 :             pushHeadPointerOntoStack();
        1684               0 :             appendVoidElementToCurrentMayFoster(elementName, attributes);
        1685               0 :             selfClosing = false;
        1686               0 :             pop();
        1687               0 :             attributes = nsnull;
        1688               0 :             NS_HTML5_BREAK(starttagloop);
        1689                 :           }
        1690                 :           case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: {
        1691               0 :             errFooBetweenHeadAndBody(name);
        1692               0 :             pushHeadPointerOntoStack();
        1693               0 :             appendVoidElementToCurrentMayFoster(elementName, attributes);
        1694               0 :             selfClosing = false;
        1695               0 :             pop();
        1696               0 :             attributes = nsnull;
        1697               0 :             NS_HTML5_BREAK(starttagloop);
        1698                 :           }
        1699                 :           case NS_HTML5TREE_BUILDER_META: {
        1700               0 :             errFooBetweenHeadAndBody(name);
        1701               0 :             checkMetaCharset(attributes);
        1702               0 :             pushHeadPointerOntoStack();
        1703               0 :             appendVoidElementToCurrentMayFoster(elementName, attributes);
        1704               0 :             selfClosing = false;
        1705               0 :             pop();
        1706               0 :             attributes = nsnull;
        1707               0 :             NS_HTML5_BREAK(starttagloop);
        1708                 :           }
        1709                 :           case NS_HTML5TREE_BUILDER_SCRIPT: {
        1710               0 :             errFooBetweenHeadAndBody(name);
        1711               0 :             pushHeadPointerOntoStack();
        1712               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1713               0 :             originalMode = mode;
        1714               0 :             mode = NS_HTML5TREE_BUILDER_TEXT;
        1715               0 :             tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, elementName);
        1716               0 :             attributes = nsnull;
        1717               0 :             NS_HTML5_BREAK(starttagloop);
        1718                 :           }
        1719                 :           case NS_HTML5TREE_BUILDER_STYLE:
        1720                 :           case NS_HTML5TREE_BUILDER_NOFRAMES: {
        1721               0 :             errFooBetweenHeadAndBody(name);
        1722               0 :             pushHeadPointerOntoStack();
        1723               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1724               0 :             originalMode = mode;
        1725               0 :             mode = NS_HTML5TREE_BUILDER_TEXT;
        1726               0 :             tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName);
        1727               0 :             attributes = nsnull;
        1728               0 :             NS_HTML5_BREAK(starttagloop);
        1729                 :           }
        1730                 :           case NS_HTML5TREE_BUILDER_TITLE: {
        1731               0 :             errFooBetweenHeadAndBody(name);
        1732               0 :             pushHeadPointerOntoStack();
        1733               0 :             appendToCurrentNodeAndPushElement(elementName, attributes);
        1734               0 :             originalMode = mode;
        1735               0 :             mode = NS_HTML5TREE_BUILDER_TEXT;
        1736               0 :             tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, elementName);
        1737               0 :             attributes = nsnull;
        1738               0 :             NS_HTML5_BREAK(starttagloop);
        1739                 :           }
        1740                 :           case NS_HTML5TREE_BUILDER_HEAD: {
        1741               0 :             errStrayStartTag(name);
        1742               0 :             NS_HTML5_BREAK(starttagloop);
        1743                 :           }
        1744                 :           default: {
        1745              18 :             appendToCurrentNodeAndPushBodyElement();
        1746              18 :             mode = NS_HTML5TREE_BUILDER_FRAMESET_OK;
        1747              18 :             continue;
        1748                 :           }
        1749                 :         }
        1750                 :       }
        1751                 :       case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: {
        1752               0 :         switch(group) {
        1753                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1754               0 :             errStrayStartTag(name);
        1755               0 :             if (!fragment) {
        1756               0 :               addAttributesToHtml(attributes);
        1757               0 :               attributes = nsnull;
        1758                 :             }
        1759               0 :             NS_HTML5_BREAK(starttagloop);
        1760                 :           }
        1761                 :           default: {
        1762               0 :             errStrayStartTag(name);
        1763                 :
        1764               0 :             mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        1765               0 :             continue;
        1766                 :           }
        1767                 :         }
        1768                 :       }
        1769                 :       case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: {
        1770               0 :         switch(group) {
        1771                 :           case NS_HTML5TREE_BUILDER_HTML: {
        1772               0 :             errStrayStartTag(name);
        1773               0 :             if (!fragment) {
        1774               0 :               addAttributesToHtml(attributes);
        1775               0 :               attributes = nsnull;
        1776                 :             }
        1777               0 :             NS_HTML5_BREAK(starttagloop);
        1778                 :           }
        1779                 :           case NS_HTML5TREE_BUILDER_NOFRAMES: {
        1780               0 :             appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
        1781               0 :             originalMode = mode;
        1782               0 :             mode = NS_HTML5TREE_BUILDER_TEXT;
        1783               0 :             tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, elementName);
        1784               0 :             attributes = nsnull;
        1785               0 :             NS_HTML5_BREAK(starttagloop);
        1786                 :           }
        1787                 :           default: {
        1788               0 :             errStrayStartTag(name);
        1789               0 :             NS_HTML5_BREAK(starttagloop);
        1790                 :           }
        1791                 :         }
        1792                 :       }
        1793                 :       case NS_HTML5TREE_BUILDER_TEXT: {
        1794                 :
        1795               0 :         NS_HTML5_BREAK(starttagloop);
        1796                 :       }
        1797                 :     }
        1798                 :   }
        1799                 :   starttagloop_end: ;
        1800              74 :   if (selfClosing) {
        1801               0 :     errSelfClosing();
        1802                 :   }
        1803              74 :   if (attributes != nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES) {
        1804              74 :     delete attributes;
        1805                 :   }
        1806              74 : }
        1807                 :
        1808                 : bool
        1809             292 : nsHtml5TreeBuilder::isSpecialParentInForeign(nsHtml5StackNode* stackNode)
        1810                 : {
        1811             292 :   PRInt32 ns = stackNode->ns;
        1812             292 :   return (kNameSpaceID_XHTML == ns) || (stackNode->isHtmlIntegrationPoint()) || ((kNameSpaceID_MathML == ns) && (stackNode->getGroup() == NS_HTML5TREE_BUILDER_MI_MO_MN_MS_MTEXT));
        1813                 : }
        1814                 :
        1815                 : nsString*
        1816               0 : nsHtml5TreeBuilder::extractCharsetFromContent(nsString* attributeValue)
        1817                 : {
        1818               0 :   PRInt32 charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL;
        1819               0 :   PRInt32 start = -1;
        1820               0 :   PRInt32 end = -1;
        1821               0 :   autoJArray<PRUnichar,PRInt32> buffer = nsHtml5Portability::newCharArrayFromString(attributeValue);
        1822               0 :   for (PRInt32 i = 0; i < buffer.length; i++) {
        1823               0 :     PRUnichar c = buffer[i];
        1824               0 :     switch(charsetState) {
        1825                 :       case NS_HTML5TREE_BUILDER_CHARSET_INITIAL: {
        1826               0 :         switch(c) {
        1827                 :           case 'c':
        1828                 :           case 'C': {
        1829               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_C;
        1830               0 :             continue;
        1831                 :           }
        1832                 :           default: {
        1833               0 :             continue;
        1834                 :           }
        1835                 :         }
        1836                 :       }
        1837                 :       case NS_HTML5TREE_BUILDER_CHARSET_C: {
        1838               0 :         switch(c) {
        1839                 :           case 'h':
        1840                 :           case 'H': {
        1841               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_H;
        1842               0 :             continue;
        1843                 :           }
        1844                 :           default: {
        1845               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL;
        1846               0 :             continue;
        1847                 :           }
        1848                 :         }
        1849                 :       }
        1850                 :       case NS_HTML5TREE_BUILDER_CHARSET_H: {
        1851               0 :         switch(c) {
        1852                 :           case 'a':
        1853                 :           case 'A': {
        1854               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_A;
        1855               0 :             continue;
        1856                 :           }
        1857                 :           default: {
        1858               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL;
        1859               0 :             continue;
        1860                 :           }
        1861                 :         }
        1862                 :       }
        1863                 :       case NS_HTML5TREE_BUILDER_CHARSET_A: {
        1864               0 :         switch(c) {
        1865                 :           case 'r':
        1866                 :           case 'R': {
        1867               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_R;
        1868               0 :             continue;
        1869                 :           }
        1870                 :           default: {
        1871               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL;
        1872               0 :             continue;
        1873                 :           }
        1874                 :         }
        1875                 :       }
        1876                 :       case NS_HTML5TREE_BUILDER_CHARSET_R: {
        1877               0 :         switch(c) {
        1878                 :           case 's':
        1879                 :           case 'S': {
        1880               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_S;
        1881               0 :             continue;
        1882                 :           }
        1883                 :           default: {
        1884               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL;
        1885               0 :             continue;
        1886                 :           }
        1887                 :         }
        1888                 :       }
        1889                 :       case NS_HTML5TREE_BUILDER_CHARSET_S: {
        1890               0 :         switch(c) {
        1891                 :           case 'e':
        1892                 :           case 'E': {
        1893               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_E;
        1894               0 :             continue;
        1895                 :           }
        1896                 :           default: {
        1897               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL;
        1898               0 :             continue;
        1899                 :           }
        1900                 :         }
        1901                 :       }
        1902                 :       case NS_HTML5TREE_BUILDER_CHARSET_E: {
        1903               0 :         switch(c) {
        1904                 :           case 't':
        1905                 :           case 'T': {
        1906               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_T;
        1907               0 :             continue;
        1908                 :           }
        1909                 :           default: {
        1910               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL;
        1911               0 :             continue;
        1912                 :           }
        1913                 :         }
        1914                 :       }
        1915                 :       case NS_HTML5TREE_BUILDER_CHARSET_T: {
        1916               0 :         switch(c) {
        1917                 :           case '\t':
        1918                 :           case '\n':
        1919                 :           case '\f':
        1920                 :           case '\r':
        1921                 :           case ' ': {
        1922               0 :             continue;
        1923                 :           }
        1924                 :           case '=': {
        1925               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_EQUALS;
        1926               0 :             continue;
        1927                 :           }
        1928                 :           default: {
        1929               0 :             return nsnull;
        1930                 :           }
        1931                 :         }
        1932                 :       }
        1933                 :       case NS_HTML5TREE_BUILDER_CHARSET_EQUALS: {
        1934               0 :         switch(c) {
        1935                 :           case '\t':
        1936                 :           case '\n':
        1937                 :           case '\f':
        1938                 :           case '\r':
        1939                 :           case ' ': {
        1940               0 :             continue;
        1941                 :           }
        1942                 :           case '\'': {
        1943               0 :             start = i + 1;
        1944               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_SINGLE_QUOTED;
        1945               0 :             continue;
        1946                 :           }
        1947                 :           case '\"': {
        1948               0 :             start = i + 1;
        1949               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_DOUBLE_QUOTED;
        1950               0 :             continue;
        1951                 :           }
        1952                 :           default: {
        1953               0 :             start = i;
        1954               0 :             charsetState = NS_HTML5TREE_BUILDER_CHARSET_UNQUOTED;
        1955               0 :             continue;
        1956                 :           }
        1957                 :         }
        1958                 :       }
        1959                 :       case NS_HTML5TREE_BUILDER_CHARSET_SINGLE_QUOTED: {
        1960               0 :         switch(c) {
        1961                 :           case '\'': {
        1962               0 :             end = i;
        1963               0 :             NS_HTML5_BREAK(charsetloop);
        1964                 :           }
        1965                 :           default: {
        1966               0 :             continue;
        1967                 :           }
        1968                 :         }
        1969                 :       }
        1970                 :       case NS_HTML5TREE_BUILDER_CHARSET_DOUBLE_QUOTED: {
        1971               0 :         switch(c) {
        1972                 :           case '\"': {
        1973               0 :             end = i;
        1974               0 :             NS_HTML5_BREAK(charsetloop);
        1975                 :           }
        1976                 :           default: {
        1977               0 :             continue;
        1978                 :           }
        1979                 :         }
        1980                 :       }
        1981                 :       case NS_HTML5TREE_BUILDER_CHARSET_UNQUOTED: {
        1982               0 :         switch(c) {
        1983                 :           case '\t':
        1984                 :           case '\n':
        1985                 :           case '\f':
        1986                 :           case '\r':
        1987                 :           case ' ':
        1988                 :           case ';': {
        1989               0 :             end = i;
        1990               0 :             NS_HTML5_BREAK(charsetloop);
        1991                 :           }
        1992                 :           default: {
        1993               0 :             continue;
        1994                 :           }
        1995                 :         }
        1996                 :       }
        1997                 :     }
        1998                 :   }
        1999                 :   charsetloop_end: ;
        2000               0 :   nsString* charset = nsnull;
        2001               0 :   if (start != -1) {
        2002               0 :     if (end == -1) {
        2003               0 :       end = buffer.length;
        2004                 :     }
        2005               0 :     charset = nsHtml5Portability::newStringFromBuffer(buffer, start, end - start);
        2006                 :   }
        2007               0 :   return charset;
        2008                 : }
        2009                 :
        2010                 : void
        2011               0 : nsHtml5TreeBuilder::checkMetaCharset(nsHtml5HtmlAttributes* attributes)
        2012                 : {
        2013               0 :   nsString* charset = attributes->getValue(nsHtml5AttributeName::ATTR_CHARSET);
        2014               0 :   if (charset) {
        2015               0 :     if (tokenizer->internalEncodingDeclaration(charset)) {
        2016               0 :       requestSuspension();
        2017               0 :       return;
        2018                 :     }
        2019               0 :     return;
        2020                 :   }
        2021               0 :   if (!nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("content-type", attributes->getValue(nsHtml5AttributeName::ATTR_HTTP_EQUIV))) {
        2022               0 :     return;
        2023                 :   }
        2024               0 :   nsString* content = attributes->getValue(nsHtml5AttributeName::ATTR_CONTENT);
        2025               0 :   if (content) {
        2026               0 :     nsString* extract = nsHtml5TreeBuilder::extractCharsetFromContent(content);
        2027               0 :     if (extract) {
        2028               0 :       if (tokenizer->internalEncodingDeclaration(extract)) {
        2029               0 :         requestSuspension();
        2030                 :       }
        2031                 :     }
        2032               0 :     nsHtml5Portability::releaseString(extract);
        2033                 :   }
        2034                 : }
        2035                 :
        2036                 : void
        2037              26 : nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
        2038                 : {
        2039              26 :   flushCharacters();
        2040              26 :   needToDropLF = false;
        2041                 :   PRInt32 eltPos;
        2042              26 :   PRInt32 group = elementName->getGroup();
        2043              26 :   nsIAtom* name = elementName->name;
        2044               0 :   for (; ; ) {
        2045              26 :     if (isInForeign()) {
        2046               0 :       if (stack[currentPtr]->name != name) {
        2047               0 :         errEndTagDidNotMatchCurrentOpenElement(name, stack[currentPtr]->popName);
        2048                 :       }
        2049               0 :       eltPos = currentPtr;
        2050               0 :       for (; ; ) {
        2051               0 :         if (stack[eltPos]->name == name) {
        2052               0 :           while (currentPtr >= eltPos) {
        2053               0 :             pop();
        2054                 :           }
        2055               0 :           NS_HTML5_BREAK(endtagloop);
        2056                 :         }
        2057               0 :         if (stack[--eltPos]->ns == kNameSpaceID_XHTML) {
        2058                 :           break;
        2059                 :         }
        2060                 :       }
        2061                 :     }
        2062              26 :     switch(mode) {
        2063                 :       case NS_HTML5TREE_BUILDER_IN_ROW: {
        2064               0 :         switch(group) {
        2065                 :           case NS_HTML5TREE_BUILDER_TR: {
        2066               0 :             eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TR);
        2067               0 :             if (!eltPos) {
        2068                 :
        2069               0 :               errNoTableRowToClose();
        2070               0 :               NS_HTML5_BREAK(endtagloop);
        2071                 :             }
        2072               0 :             clearStackBackTo(eltPos);
        2073               0 :             pop();
        2074               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY;
        2075               0 :             NS_HTML5_BREAK(endtagloop);
        2076                 :           }
        2077                 :           case NS_HTML5TREE_BUILDER_TABLE: {
        2078               0 :             eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TR);
        2079               0 :             if (!eltPos) {
        2080                 :
        2081               0 :               errNoTableRowToClose();
        2082               0 :               NS_HTML5_BREAK(endtagloop);
        2083                 :             }
        2084               0 :             clearStackBackTo(eltPos);
        2085               0 :             pop();
        2086               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY;
        2087               0 :             continue;
        2088                 :           }
        2089                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: {
        2090               0 :             if (findLastInTableScope(name) == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2091               0 :               errStrayEndTag(name);
        2092               0 :               NS_HTML5_BREAK(endtagloop);
        2093                 :             }
        2094               0 :             eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TR);
        2095               0 :             if (!eltPos) {
        2096                 :
        2097               0 :               errNoTableRowToClose();
        2098               0 :               NS_HTML5_BREAK(endtagloop);
        2099                 :             }
        2100               0 :             clearStackBackTo(eltPos);
        2101               0 :             pop();
        2102               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY;
        2103               0 :             continue;
        2104                 :           }
        2105                 :           case NS_HTML5TREE_BUILDER_BODY:
        2106                 :           case NS_HTML5TREE_BUILDER_CAPTION:
        2107                 :           case NS_HTML5TREE_BUILDER_COL:
        2108                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
        2109                 :           case NS_HTML5TREE_BUILDER_HTML:
        2110                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH: {
        2111               0 :             errStrayEndTag(name);
        2112               0 :             NS_HTML5_BREAK(endtagloop);
        2113                 :           }
        2114                 :           default:
        2115                 :             ; // fall through
        2116                 :         }
        2117                 :       }
        2118                 :       case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: {
        2119               0 :         switch(group) {
        2120                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: {
        2121               0 :             eltPos = findLastOrRoot(name);
        2122               0 :             if (!eltPos) {
        2123               0 :               errStrayEndTag(name);
        2124               0 :               NS_HTML5_BREAK(endtagloop);
        2125                 :             }
        2126               0 :             clearStackBackTo(eltPos);
        2127               0 :             pop();
        2128               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        2129               0 :             NS_HTML5_BREAK(endtagloop);
        2130                 :           }
        2131                 :           case NS_HTML5TREE_BUILDER_TABLE: {
        2132               0 :             eltPos = findLastInTableScopeOrRootTbodyTheadTfoot();
        2133               0 :             if (!eltPos) {
        2134                 :
        2135               0 :               errStrayEndTag(name);
        2136               0 :               NS_HTML5_BREAK(endtagloop);
        2137                 :             }
        2138               0 :             clearStackBackTo(eltPos);
        2139               0 :             pop();
        2140               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        2141               0 :             continue;
        2142                 :           }
        2143                 :           case NS_HTML5TREE_BUILDER_BODY:
        2144                 :           case NS_HTML5TREE_BUILDER_CAPTION:
        2145                 :           case NS_HTML5TREE_BUILDER_COL:
        2146                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
        2147                 :           case NS_HTML5TREE_BUILDER_HTML:
        2148                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH:
        2149                 :           case NS_HTML5TREE_BUILDER_TR: {
        2150               0 :             errStrayEndTag(name);
        2151               0 :             NS_HTML5_BREAK(endtagloop);
        2152                 :           }
        2153                 :           default:
        2154                 :             ; // fall through
        2155                 :         }
        2156                 :       }
        2157                 :       case NS_HTML5TREE_BUILDER_IN_TABLE: {
        2158               0 :         switch(group) {
        2159                 :           case NS_HTML5TREE_BUILDER_TABLE: {
        2160               0 :             eltPos = findLast(nsHtml5Atoms::table);
        2161               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2162                 :
        2163               0 :               errStrayEndTag(name);
        2164               0 :               NS_HTML5_BREAK(endtagloop);
        2165                 :             }
        2166               0 :             while (currentPtr >= eltPos) {
        2167               0 :               pop();
        2168                 :             }
        2169               0 :             resetTheInsertionMode();
        2170               0 :             NS_HTML5_BREAK(endtagloop);
        2171                 :           }
        2172                 :           case NS_HTML5TREE_BUILDER_BODY:
        2173                 :           case NS_HTML5TREE_BUILDER_CAPTION:
        2174                 :           case NS_HTML5TREE_BUILDER_COL:
        2175                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
        2176                 :           case NS_HTML5TREE_BUILDER_HTML:
        2177                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
        2178                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH:
        2179                 :           case NS_HTML5TREE_BUILDER_TR: {
        2180               0 :             errStrayEndTag(name);
        2181               0 :             NS_HTML5_BREAK(endtagloop);
        2182                 :           }
        2183                 :           default: {
        2184               0 :             errStrayEndTag(name);
        2185                 :           }
        2186                 :         }
        2187                 :       }
        2188                 :       case NS_HTML5TREE_BUILDER_IN_CAPTION: {
        2189               0 :         switch(group) {
        2190                 :           case NS_HTML5TREE_BUILDER_CAPTION: {
        2191               0 :             eltPos = findLastInTableScope(nsHtml5Atoms::caption);
        2192               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2193               0 :               NS_HTML5_BREAK(endtagloop);
        2194                 :             }
        2195               0 :             generateImpliedEndTags();
        2196               0 :             if (!!NS_UNLIKELY(mViewSource) && currentPtr != eltPos) {
        2197               0 :               errUnclosedElements(eltPos, name);
        2198                 :             }
        2199               0 :             while (currentPtr >= eltPos) {
        2200               0 :               pop();
        2201                 :             }
        2202               0 :             clearTheListOfActiveFormattingElementsUpToTheLastMarker();
        2203               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        2204               0 :             NS_HTML5_BREAK(endtagloop);
        2205                 :           }
        2206                 :           case NS_HTML5TREE_BUILDER_TABLE: {
        2207               0 :             errTableClosedWhileCaptionOpen();
        2208               0 :             eltPos = findLastInTableScope(nsHtml5Atoms::caption);
        2209               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2210               0 :               NS_HTML5_BREAK(endtagloop);
        2211                 :             }
        2212               0 :             generateImpliedEndTags();
        2213               0 :             if (!!NS_UNLIKELY(mViewSource) && currentPtr != eltPos) {
        2214               0 :               errUnclosedElements(eltPos, name);
        2215                 :             }
        2216               0 :             while (currentPtr >= eltPos) {
        2217               0 :               pop();
        2218                 :             }
        2219               0 :             clearTheListOfActiveFormattingElementsUpToTheLastMarker();
        2220               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        2221               0 :             continue;
        2222                 :           }
        2223                 :           case NS_HTML5TREE_BUILDER_BODY:
        2224                 :           case NS_HTML5TREE_BUILDER_COL:
        2225                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
        2226                 :           case NS_HTML5TREE_BUILDER_HTML:
        2227                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
        2228                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH:
        2229                 :           case NS_HTML5TREE_BUILDER_TR: {
        2230               0 :             errStrayEndTag(name);
        2231               0 :             NS_HTML5_BREAK(endtagloop);
        2232                 :           }
        2233                 :           default:
        2234                 :             ; // fall through
        2235                 :         }
        2236                 :       }
        2237                 :       case NS_HTML5TREE_BUILDER_IN_CELL: {
        2238               0 :         switch(group) {
        2239                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH: {
        2240               0 :             eltPos = findLastInTableScope(name);
        2241               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2242               0 :               errStrayEndTag(name);
        2243               0 :               NS_HTML5_BREAK(endtagloop);
        2244                 :             }
        2245               0 :             generateImpliedEndTags();
        2246               0 :             if (!!NS_UNLIKELY(mViewSource) && !isCurrent(name)) {
        2247               0 :               errUnclosedElements(eltPos, name);
        2248                 :             }
        2249               0 :             while (currentPtr >= eltPos) {
        2250               0 :               pop();
        2251                 :             }
        2252               0 :             clearTheListOfActiveFormattingElementsUpToTheLastMarker();
        2253               0 :             mode = NS_HTML5TREE_BUILDER_IN_ROW;
        2254               0 :             NS_HTML5_BREAK(endtagloop);
        2255                 :           }
        2256                 :           case NS_HTML5TREE_BUILDER_TABLE:
        2257                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
        2258                 :           case NS_HTML5TREE_BUILDER_TR: {
        2259               0 :             if (findLastInTableScope(name) == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2260               0 :               errStrayEndTag(name);
        2261               0 :               NS_HTML5_BREAK(endtagloop);
        2262                 :             }
        2263               0 :             closeTheCell(findLastInTableScopeTdTh());
        2264               0 :             continue;
        2265                 :           }
        2266                 :           case NS_HTML5TREE_BUILDER_BODY:
        2267                 :           case NS_HTML5TREE_BUILDER_CAPTION:
        2268                 :           case NS_HTML5TREE_BUILDER_COL:
        2269                 :           case NS_HTML5TREE_BUILDER_COLGROUP:
        2270                 :           case NS_HTML5TREE_BUILDER_HTML: {
        2271               0 :             errStrayEndTag(name);
        2272               0 :             NS_HTML5_BREAK(endtagloop);
        2273                 :           }
        2274                 :           default:
        2275                 :             ; // fall through
        2276                 :         }
        2277                 :       }
        2278                 :       case NS_HTML5TREE_BUILDER_FRAMESET_OK:
        2279                 :       case NS_HTML5TREE_BUILDER_IN_BODY: {
        2280              26 :         switch(group) {
        2281                 :           case NS_HTML5TREE_BUILDER_BODY: {
        2282               0 :             if (!isSecondOnStackBody()) {
        2283                 :
        2284               0 :               errStrayEndTag(name);
        2285               0 :               NS_HTML5_BREAK(endtagloop);
        2286                 :             }
        2287                 :
        2288               0 :             if (NS_UNLIKELY(mViewSource)) {
        2289               0 :               for (PRInt32 i = 2; i <= currentPtr; i++) {
        2290               0 :                 switch(stack[i]->getGroup()) {
        2291                 :                   case NS_HTML5TREE_BUILDER_DD_OR_DT:
        2292                 :                   case NS_HTML5TREE_BUILDER_LI:
        2293                 :                   case NS_HTML5TREE_BUILDER_OPTGROUP:
        2294                 :                   case NS_HTML5TREE_BUILDER_OPTION:
        2295                 :                   case NS_HTML5TREE_BUILDER_P:
        2296                 :                   case NS_HTML5TREE_BUILDER_RT_OR_RP:
        2297                 :                   case NS_HTML5TREE_BUILDER_TD_OR_TH:
        2298                 :                   case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: {
        2299                 :                     break;
        2300                 :                   }
        2301                 :                   default: {
        2302               0 :                     errEndWithUnclosedElements(name);
        2303               0 :                     NS_HTML5_BREAK(uncloseloop1);
        2304                 :                   }
        2305                 :                 }
        2306                 :               }
        2307                 :               uncloseloop1_end: ;
        2308                 :             }
        2309               0 :             mode = NS_HTML5TREE_BUILDER_AFTER_BODY;
        2310               0 :             NS_HTML5_BREAK(endtagloop);
        2311                 :           }
        2312                 :           case NS_HTML5TREE_BUILDER_HTML: {
        2313               0 :             if (!isSecondOnStackBody()) {
        2314                 :
        2315               0 :               errStrayEndTag(name);
        2316               0 :               NS_HTML5_BREAK(endtagloop);
        2317                 :             }
        2318               0 :             if (NS_UNLIKELY(mViewSource)) {
        2319               0 :               for (PRInt32 i = 0; i <= currentPtr; i++) {
        2320               0 :                 switch(stack[i]->getGroup()) {
        2321                 :                   case NS_HTML5TREE_BUILDER_DD_OR_DT:
        2322                 :                   case NS_HTML5TREE_BUILDER_LI:
        2323                 :                   case NS_HTML5TREE_BUILDER_P:
        2324                 :                   case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
        2325                 :                   case NS_HTML5TREE_BUILDER_TD_OR_TH:
        2326                 :                   case NS_HTML5TREE_BUILDER_BODY:
        2327                 :                   case NS_HTML5TREE_BUILDER_HTML: {
        2328                 :                     break;
        2329                 :                   }
        2330                 :                   default: {
        2331               0 :                     errEndWithUnclosedElements(name);
        2332               0 :                     NS_HTML5_BREAK(uncloseloop2);
        2333                 :                   }
        2334                 :                 }
        2335                 :               }
        2336                 :               uncloseloop2_end: ;
        2337                 :             }
        2338               0 :             mode = NS_HTML5TREE_BUILDER_AFTER_BODY;
        2339               0 :             continue;
        2340                 :           }
        2341                 :           case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
        2342                 :           case NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL:
        2343                 :           case NS_HTML5TREE_BUILDER_PRE_OR_LISTING:
        2344                 :           case NS_HTML5TREE_BUILDER_FIELDSET:
        2345                 :           case NS_HTML5TREE_BUILDER_BUTTON:
        2346                 :           case NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_NAV_OR_SECTION_OR_SUMMARY: {
        2347               4 :             eltPos = findLastInScope(name);
        2348               4 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2349               0 :               errStrayEndTag(name);
        2350                 :             } else {
        2351               4 :               generateImpliedEndTags();
        2352               4 :               if (!!NS_UNLIKELY(mViewSource) && !isCurrent(name)) {
        2353               0 :                 errUnclosedElements(eltPos, name);
        2354                 :               }
        2355              12 :               while (currentPtr >= eltPos) {
        2356               4 :                 pop();
        2357                 :               }
        2358                 :             }
        2359               4 :             NS_HTML5_BREAK(endtagloop);
        2360                 :           }
        2361                 :           case NS_HTML5TREE_BUILDER_FORM: {
        2362               0 :             if (!formPointer) {
        2363               0 :               errStrayEndTag(name);
        2364               0 :               NS_HTML5_BREAK(endtagloop);
        2365                 :             }
        2366               0 :             formPointer = nsnull;
        2367               0 :             eltPos = findLastInScope(name);
        2368               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2369               0 :               errStrayEndTag(name);
        2370               0 :               NS_HTML5_BREAK(endtagloop);
        2371                 :             }
        2372               0 :             generateImpliedEndTags();
        2373               0 :             if (!!NS_UNLIKELY(mViewSource) && !isCurrent(name)) {
        2374               0 :               errUnclosedElements(eltPos, name);
        2375                 :             }
        2376               0 :             removeFromStack(eltPos);
        2377               0 :             NS_HTML5_BREAK(endtagloop);
        2378                 :           }
        2379                 :           case NS_HTML5TREE_BUILDER_P: {
        2380              18 :             eltPos = findLastInButtonScope(nsHtml5Atoms::p);
        2381              18 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2382               0 :               errNoElementToCloseButEndTagSeen(nsHtml5Atoms::p);
        2383               0 :               if (isInForeign()) {
        2384               0 :                 errHtmlStartTagInForeignContext(name);
        2385               0 :                 while (stack[currentPtr]->ns != kNameSpaceID_XHTML) {
        2386               0 :                   pop();
        2387                 :                 }
        2388                 :               }
        2389               0 :               appendVoidElementToCurrentMayFoster(elementName, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
        2390               0 :               NS_HTML5_BREAK(endtagloop);
        2391                 :             }
        2392              18 :             generateImpliedEndTagsExceptFor(nsHtml5Atoms::p);
        2393                 :
        2394              18 :             if (!!NS_UNLIKELY(mViewSource) && eltPos != currentPtr) {
        2395               0 :               errUnclosedElements(eltPos, name);
        2396                 :             }
        2397              54 :             while (currentPtr >= eltPos) {
        2398              18 :               pop();
        2399                 :             }
        2400              18 :             NS_HTML5_BREAK(endtagloop);
        2401                 :           }
        2402                 :           case NS_HTML5TREE_BUILDER_LI: {
        2403               0 :             eltPos = findLastInListScope(name);
        2404               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2405               0 :               errNoElementToCloseButEndTagSeen(name);
        2406                 :             } else {
        2407               0 :               generateImpliedEndTagsExceptFor(name);
        2408               0 :               if (!!NS_UNLIKELY(mViewSource) && eltPos != currentPtr) {
        2409               0 :                 errUnclosedElements(eltPos, name);
        2410                 :               }
        2411               0 :               while (currentPtr >= eltPos) {
        2412               0 :                 pop();
        2413                 :               }
        2414                 :             }
        2415               0 :             NS_HTML5_BREAK(endtagloop);
        2416                 :           }
        2417                 :           case NS_HTML5TREE_BUILDER_DD_OR_DT: {
        2418               0 :             eltPos = findLastInScope(name);
        2419               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2420               0 :               errNoElementToCloseButEndTagSeen(name);
        2421                 :             } else {
        2422               0 :               generateImpliedEndTagsExceptFor(name);
        2423               0 :               if (!!NS_UNLIKELY(mViewSource) && eltPos != currentPtr) {
        2424               0 :                 errUnclosedElements(eltPos, name);
        2425                 :               }
        2426               0 :               while (currentPtr >= eltPos) {
        2427               0 :                 pop();
        2428                 :               }
        2429                 :             }
        2430               0 :             NS_HTML5_BREAK(endtagloop);
        2431                 :           }
        2432                 :           case NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6: {
        2433               4 :             eltPos = findLastInScopeHn();
        2434               4 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2435               0 :               errStrayEndTag(name);
        2436                 :             } else {
        2437               4 :               generateImpliedEndTags();
        2438               4 :               if (!!NS_UNLIKELY(mViewSource) && !isCurrent(name)) {
        2439               0 :                 errUnclosedElements(eltPos, name);
        2440                 :               }
        2441              12 :               while (currentPtr >= eltPos) {
        2442               4 :                 pop();
        2443                 :               }
        2444                 :             }
        2445               4 :             NS_HTML5_BREAK(endtagloop);
        2446                 :           }
        2447                 :           case NS_HTML5TREE_BUILDER_OBJECT:
        2448                 :           case NS_HTML5TREE_BUILDER_MARQUEE_OR_APPLET: {
        2449               0 :             eltPos = findLastInScope(name);
        2450               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2451               0 :               errStrayEndTag(name);
        2452                 :             } else {
        2453               0 :               generateImpliedEndTags();
        2454               0 :               if (!!NS_UNLIKELY(mViewSource) && !isCurrent(name)) {
        2455               0 :                 errUnclosedElements(eltPos, name);
        2456                 :               }
        2457               0 :               while (currentPtr >= eltPos) {
        2458               0 :                 pop();
        2459                 :               }
        2460               0 :               clearTheListOfActiveFormattingElementsUpToTheLastMarker();
        2461                 :             }
        2462               0 :             NS_HTML5_BREAK(endtagloop);
        2463                 :           }
        2464                 :           case NS_HTML5TREE_BUILDER_BR: {
        2465               0 :             errEndTagBr();
        2466               0 :             if (isInForeign()) {
        2467               0 :               errHtmlStartTagInForeignContext(name);
        2468               0 :               while (stack[currentPtr]->ns != kNameSpaceID_XHTML) {
        2469               0 :                 pop();
        2470                 :               }
        2471                 :             }
        2472               0 :             reconstructTheActiveFormattingElements();
        2473               0 :             appendVoidElementToCurrentMayFoster(elementName, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
        2474               0 :             NS_HTML5_BREAK(endtagloop);
        2475                 :           }
        2476                 :           case NS_HTML5TREE_BUILDER_AREA_OR_WBR:
        2477                 : #ifdef ENABLE_VOID_MENUITEM
        2478                 :           case NS_HTML5TREE_BUILDER_MENUITEM:
        2479                 : #endif
        2480                 :           case NS_HTML5TREE_BUILDER_PARAM_OR_SOURCE_OR_TRACK:
        2481                 :           case NS_HTML5TREE_BUILDER_EMBED_OR_IMG:
        2482                 :           case NS_HTML5TREE_BUILDER_IMAGE:
        2483                 :           case NS_HTML5TREE_BUILDER_INPUT:
        2484                 :           case NS_HTML5TREE_BUILDER_KEYGEN:
        2485                 :           case NS_HTML5TREE_BUILDER_HR:
        2486                 :           case NS_HTML5TREE_BUILDER_ISINDEX:
        2487                 :           case NS_HTML5TREE_BUILDER_IFRAME:
        2488                 :           case NS_HTML5TREE_BUILDER_NOEMBED:
        2489                 :           case NS_HTML5TREE_BUILDER_NOFRAMES:
        2490                 :           case NS_HTML5TREE_BUILDER_SELECT:
        2491                 :           case NS_HTML5TREE_BUILDER_TABLE:
        2492                 :           case NS_HTML5TREE_BUILDER_TEXTAREA: {
        2493               0 :             errStrayEndTag(name);
        2494               0 :             NS_HTML5_BREAK(endtagloop);
        2495                 :           }
        2496                 :           case NS_HTML5TREE_BUILDER_NOSCRIPT: {
        2497               0 :             if (scriptingEnabled) {
        2498               0 :               errStrayEndTag(name);
        2499               0 :               NS_HTML5_BREAK(endtagloop);
        2500                 :             } else {
        2501                 :             }
        2502                 :           }
        2503                 :           case NS_HTML5TREE_BUILDER_A:
        2504                 :           case NS_HTML5TREE_BUILDER_B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
        2505                 :           case NS_HTML5TREE_BUILDER_FONT:
        2506                 :           case NS_HTML5TREE_BUILDER_NOBR: {
        2507               0 :             if (adoptionAgencyEndTag(name)) {
        2508               0 :               NS_HTML5_BREAK(endtagloop);
        2509                 :             }
        2510                 :           }
        2511                 :           default: {
        2512               0 :             if (isCurrent(name)) {
        2513               0 :               pop();
        2514               0 :               NS_HTML5_BREAK(endtagloop);
        2515                 :             }
        2516               0 :             eltPos = currentPtr;
        2517               0 :             for (; ; ) {
        2518               0 :               nsHtml5StackNode* node = stack[eltPos];
        2519               0 :               if (node->name == name) {
        2520               0 :                 generateImpliedEndTags();
        2521               0 :                 if (!!NS_UNLIKELY(mViewSource) && !isCurrent(name)) {
        2522               0 :                   errUnclosedElements(eltPos, name);
        2523                 :                 }
        2524               0 :                 while (currentPtr >= eltPos) {
        2525               0 :                   pop();
        2526                 :                 }
        2527               0 :                 NS_HTML5_BREAK(endtagloop);
        2528               0 :               } else if (node->isSpecial()) {
        2529               0 :                 errStrayEndTag(name);
        2530               0 :                 NS_HTML5_BREAK(endtagloop);
        2531                 :               }
        2532               0 :               eltPos--;
        2533                 :             }
        2534                 :           }
        2535                 :         }
        2536                 :       }
        2537                 :       case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: {
        2538               0 :         switch(group) {
        2539                 :           case NS_HTML5TREE_BUILDER_COLGROUP: {
        2540               0 :             if (!currentPtr) {
        2541                 :
        2542               0 :               errGarbageInColgroup();
        2543               0 :               NS_HTML5_BREAK(endtagloop);
        2544                 :             }
        2545               0 :             pop();
        2546               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        2547               0 :             NS_HTML5_BREAK(endtagloop);
        2548                 :           }
        2549                 :           case NS_HTML5TREE_BUILDER_COL: {
        2550               0 :             errStrayEndTag(name);
        2551               0 :             NS_HTML5_BREAK(endtagloop);
        2552                 :           }
        2553                 :           default: {
        2554               0 :             if (!currentPtr) {
        2555                 :
        2556               0 :               errGarbageInColgroup();
        2557               0 :               NS_HTML5_BREAK(endtagloop);
        2558                 :             }
        2559               0 :             pop();
        2560               0 :             mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        2561               0 :             continue;
        2562                 :           }
        2563                 :         }
        2564                 :       }
        2565                 :       case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: {
        2566               0 :         switch(group) {
        2567                 :           case NS_HTML5TREE_BUILDER_CAPTION:
        2568                 :           case NS_HTML5TREE_BUILDER_TABLE:
        2569                 :           case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT:
        2570                 :           case NS_HTML5TREE_BUILDER_TR:
        2571                 :           case NS_HTML5TREE_BUILDER_TD_OR_TH: {
        2572               0 :             errEndTagSeenWithSelectOpen(name);
        2573               0 :             if (findLastInTableScope(name) != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2574               0 :               eltPos = findLastInTableScope(nsHtml5Atoms::select);
        2575               0 :               if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2576                 :
        2577               0 :                 NS_HTML5_BREAK(endtagloop);
        2578                 :               }
        2579               0 :               while (currentPtr >= eltPos) {
        2580               0 :                 pop();
        2581                 :               }
        2582               0 :               resetTheInsertionMode();
        2583               0 :               continue;
        2584                 :             } else {
        2585               0 :               NS_HTML5_BREAK(endtagloop);
        2586                 :             }
        2587                 :           }
        2588                 :           default:
        2589                 :             ; // fall through
        2590                 :         }
        2591                 :       }
        2592                 :       case NS_HTML5TREE_BUILDER_IN_SELECT: {
        2593               0 :         switch(group) {
        2594                 :           case NS_HTML5TREE_BUILDER_OPTION: {
        2595               0 :             if (isCurrent(nsHtml5Atoms::option)) {
        2596               0 :               pop();
        2597               0 :               NS_HTML5_BREAK(endtagloop);
        2598                 :             } else {
        2599               0 :               errStrayEndTag(name);
        2600               0 :               NS_HTML5_BREAK(endtagloop);
        2601                 :             }
        2602                 :           }
        2603                 :           case NS_HTML5TREE_BUILDER_OPTGROUP: {
        2604               0 :             if (isCurrent(nsHtml5Atoms::option) && nsHtml5Atoms::optgroup == stack[currentPtr - 1]->name) {
        2605               0 :               pop();
        2606                 :             }
        2607               0 :             if (isCurrent(nsHtml5Atoms::optgroup)) {
        2608               0 :               pop();
        2609                 :             } else {
        2610               0 :               errStrayEndTag(name);
        2611                 :             }
        2612               0 :             NS_HTML5_BREAK(endtagloop);
        2613                 :           }
        2614                 :           case NS_HTML5TREE_BUILDER_SELECT: {
        2615               0 :             eltPos = findLastInTableScope(nsHtml5Atoms::select);
        2616               0 :             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        2617                 :
        2618               0 :               errStrayEndTag(name);
        2619               0 :               NS_HTML5_BREAK(endtagloop);
        2620                 :             }
        2621               0 :             while (currentPtr >= eltPos) {
        2622               0 :               pop();
        2623                 :             }
        2624               0 :             resetTheInsertionMode();
        2625               0 :             NS_HTML5_BREAK(endtagloop);
        2626                 :           }
        2627                 :           default: {
        2628               0 :             errStrayEndTag(name);
        2629               0 :             NS_HTML5_BREAK(endtagloop);
        2630                 :           }
        2631                 :         }
        2632                 :       }
        2633                 :       case NS_HTML5TREE_BUILDER_AFTER_BODY: {
        2634               0 :         switch(group) {
        2635                 :           case NS_HTML5TREE_BUILDER_HTML: {
        2636               0 :             if (fragment) {
        2637               0 :               errStrayEndTag(name);
        2638               0 :               NS_HTML5_BREAK(endtagloop);
        2639                 :             } else {
        2640               0 :               mode = NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY;
        2641               0 :               NS_HTML5_BREAK(endtagloop);
        2642                 :             }
        2643                 :           }
        2644                 :           default: {
        2645               0 :             errEndTagAfterBody();
        2646               0 :             mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        2647               0 :             continue;
        2648                 :           }
        2649                 :         }
        2650                 :       }
        2651                 :       case NS_HTML5TREE_BUILDER_IN_FRAMESET: {
        2652               0 :         switch(group) {
        2653                 :           case NS_HTML5TREE_BUILDER_FRAMESET: {
        2654               0 :             if (!currentPtr) {
        2655                 :
        2656               0 :               errStrayEndTag(name);
        2657               0 :               NS_HTML5_BREAK(endtagloop);
        2658                 :             }
        2659               0 :             pop();
        2660               0 :             if ((!fragment) && !isCurrent(nsHtml5Atoms::frameset)) {
        2661               0 :               mode = NS_HTML5TREE_BUILDER_AFTER_FRAMESET;
        2662                 :             }
        2663               0 :             NS_HTML5_BREAK(endtagloop);
        2664                 :           }
        2665                 :           default: {
        2666               0 :             errStrayEndTag(name);
        2667               0 :             NS_HTML5_BREAK(endtagloop);
        2668                 :           }
        2669                 :         }
        2670                 :       }
        2671                 :       case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: {
        2672               0 :         switch(group) {
        2673                 :           case NS_HTML5TREE_BUILDER_HTML: {
        2674               0 :             mode = NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET;
        2675               0 :             NS_HTML5_BREAK(endtagloop);
        2676                 :           }
        2677                 :           default: {
        2678               0 :             errStrayEndTag(name);
        2679               0 :             NS_HTML5_BREAK(endtagloop);
        2680                 :           }
        2681                 :         }
        2682                 :       }
        2683                 :       case NS_HTML5TREE_BUILDER_INITIAL: {
        2684               0 :         errEndTagSeenWithoutDoctype();
        2685               0 :         documentModeInternal(QUIRKS_MODE, nsnull, nsnull, false);
        2686               0 :         mode = NS_HTML5TREE_BUILDER_BEFORE_HTML;
        2687               0 :         continue;
        2688                 :       }
        2689                 :       case NS_HTML5TREE_BUILDER_BEFORE_HTML: {
        2690               0 :         switch(group) {
        2691                 :           case NS_HTML5TREE_BUILDER_HEAD:
        2692                 :           case NS_HTML5TREE_BUILDER_BR:
        2693                 :           case NS_HTML5TREE_BUILDER_HTML:
        2694                 :           case NS_HTML5TREE_BUILDER_BODY: {
        2695               0 :             appendHtmlElementToDocumentAndPush();
        2696               0 :             mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD;
        2697               0 :             continue;
        2698                 :           }
        2699                 :           default: {
        2700               0 :             errStrayEndTag(name);
        2701               0 :             NS_HTML5_BREAK(endtagloop);
        2702                 :           }
        2703                 :         }
        2704                 :       }
        2705                 :       case NS_HTML5TREE_BUILDER_BEFORE_HEAD: {
        2706               0 :         switch(group) {
        2707                 :           case NS_HTML5TREE_BUILDER_HEAD:
        2708                 :           case NS_HTML5TREE_BUILDER_BR:
        2709                 :           case NS_HTML5TREE_BUILDER_HTML:
        2710                 :           case NS_HTML5TREE_BUILDER_BODY: {
        2711               0 :             appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
        2712               0 :             mode = NS_HTML5TREE_BUILDER_IN_HEAD;
        2713               0 :             continue;
        2714                 :           }
        2715                 :           default: {
        2716               0 :             errStrayEndTag(name);
        2717               0 :             NS_HTML5_BREAK(endtagloop);
        2718                 :           }
        2719                 :         }
        2720                 :       }
        2721                 :       case NS_HTML5TREE_BUILDER_IN_HEAD: {
        2722               0 :         switch(group) {
        2723                 :           case NS_HTML5TREE_BUILDER_HEAD: {
        2724               0 :             pop();
        2725               0 :             mode = NS_HTML5TREE_BUILDER_AFTER_HEAD;
        2726               0 :             NS_HTML5_BREAK(endtagloop);
        2727                 :           }
        2728                 :           case NS_HTML5TREE_BUILDER_BR:
        2729                 :           case NS_HTML5TREE_BUILDER_HTML:
        2730                 :           case NS_HTML5TREE_BUILDER_BODY: {
        2731               0 :             pop();
        2732               0 :             mode = NS_HTML5TREE_BUILDER_AFTER_HEAD;
        2733               0 :             continue;
        2734                 :           }
        2735                 :           default: {
        2736               0 :             errStrayEndTag(name);
        2737               0 :             NS_HTML5_BREAK(endtagloop);
        2738                 :           }
        2739                 :         }
        2740                 :       }
        2741                 :       case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: {
        2742               0 :         switch(group) {
        2743                 :           case NS_HTML5TREE_BUILDER_NOSCRIPT: {
        2744               0 :             pop();
        2745               0 :             mode = NS_HTML5TREE_BUILDER_IN_HEAD;
        2746               0 :             NS_HTML5_BREAK(endtagloop);
        2747                 :           }
        2748                 :           case NS_HTML5TREE_BUILDER_BR: {
        2749               0 :             errStrayEndTag(name);
        2750               0 :             pop();
        2751               0 :             mode = NS_HTML5TREE_BUILDER_IN_HEAD;
        2752               0 :             continue;
        2753                 :           }
        2754                 :           default: {
        2755               0 :             errStrayEndTag(name);
        2756               0 :             NS_HTML5_BREAK(endtagloop);
        2757                 :           }
        2758                 :         }
        2759                 :       }
        2760                 :       case NS_HTML5TREE_BUILDER_AFTER_HEAD: {
        2761               0 :         switch(group) {
        2762                 :           case NS_HTML5TREE_BUILDER_HTML:
        2763                 :           case NS_HTML5TREE_BUILDER_BODY:
        2764                 :           case NS_HTML5TREE_BUILDER_BR: {
        2765               0 :             appendToCurrentNodeAndPushBodyElement();
        2766               0 :             mode = NS_HTML5TREE_BUILDER_FRAMESET_OK;
        2767               0 :             continue;
        2768                 :           }
        2769                 :           default: {
        2770               0 :             errStrayEndTag(name);
        2771               0 :             NS_HTML5_BREAK(endtagloop);
        2772                 :           }
        2773                 :         }
        2774                 :       }
        2775                 :       case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: {
        2776               0 :         errStrayEndTag(name);
        2777               0 :         mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        2778               0 :         continue;
        2779                 :       }
        2780                 :       case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: {
        2781               0 :         errStrayEndTag(name);
        2782               0 :         mode = NS_HTML5TREE_BUILDER_IN_FRAMESET;
        2783               0 :         continue;
        2784                 :       }
        2785                 :       case NS_HTML5TREE_BUILDER_TEXT: {
        2786               0 :         pop();
        2787               0 :         if (originalMode == NS_HTML5TREE_BUILDER_AFTER_HEAD) {
        2788               0 :           silentPop();
        2789                 :         }
        2790               0 :         mode = originalMode;
        2791               0 :         NS_HTML5_BREAK(endtagloop);
        2792                 :       }
        2793                 :     }
        2794                 :   }
        2795                 :   endtagloop_end: ;
        2796              26 : }
        2797                 :
        2798                 : PRInt32
        2799               0 : nsHtml5TreeBuilder::findLastInTableScopeOrRootTbodyTheadTfoot()
        2800                 : {
        2801               0 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        2802               0 :     if (stack[i]->getGroup() == NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT) {
        2803               0 :       return i;
        2804                 :     }
        2805                 :   }
        2806               0 :   return 0;
        2807                 : }
        2808                 :
        2809                 : PRInt32
        2810               0 : nsHtml5TreeBuilder::findLast(nsIAtom* name)
        2811                 : {
        2812               0 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        2813               0 :     if (stack[i]->name == name) {
        2814               0 :       return i;
        2815                 :     }
        2816                 :   }
        2817               0 :   return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2818                 : }
        2819                 :
        2820                 : PRInt32
        2821               0 : nsHtml5TreeBuilder::findLastInTableScope(nsIAtom* name)
        2822                 : {
        2823               0 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        2824               0 :     if (stack[i]->name == name) {
        2825               0 :       return i;
        2826               0 :     } else if (stack[i]->name == nsHtml5Atoms::table) {
        2827               0 :       return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2828                 :     }
        2829                 :   }
        2830               0 :   return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2831                 : }
        2832                 :
        2833                 : PRInt32
        2834              52 : nsHtml5TreeBuilder::findLastInButtonScope(nsIAtom* name)
        2835                 : {
        2836              94 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        2837              60 :     if (stack[i]->name == name) {
        2838              18 :       return i;
        2839              42 :     } else if (stack[i]->isScoping() || stack[i]->name == nsHtml5Atoms::button) {
        2840               0 :       return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2841                 :     }
        2842                 :   }
        2843              34 :   return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2844                 : }
        2845                 :
        2846                 : PRInt32
        2847               4 : nsHtml5TreeBuilder::findLastInScope(nsIAtom* name)
        2848                 : {
        2849               8 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        2850               8 :     if (stack[i]->name == name) {
        2851               4 :       return i;
        2852               4 :     } else if (stack[i]->isScoping()) {
        2853               0 :       return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2854                 :     }
        2855                 :   }
        2856               0 :   return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2857                 : }
        2858                 :
        2859                 : PRInt32
        2860               0 : nsHtml5TreeBuilder::findLastInListScope(nsIAtom* name)
        2861                 : {
        2862               0 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        2863               0 :     if (stack[i]->name == name) {
        2864               0 :       return i;
        2865               0 :     } else if (stack[i]->isScoping() || stack[i]->name == nsHtml5Atoms::ul || stack[i]->name == nsHtml5Atoms::ol) {
        2866               0 :       return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2867                 :     }
        2868                 :   }
        2869               0 :   return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2870                 : }
        2871                 :
        2872                 : PRInt32
        2873               4 : nsHtml5TreeBuilder::findLastInScopeHn()
        2874                 : {
        2875               4 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        2876               4 :     if (stack[i]->getGroup() == NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
        2877               4 :       return i;
        2878               0 :     } else if (stack[i]->isScoping()) {
        2879               0 :       return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2880                 :     }
        2881                 :   }
        2882               0 :   return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        2883                 : }
        2884                 :
        2885                 : void
        2886              22 : nsHtml5TreeBuilder::generateImpliedEndTagsExceptFor(nsIAtom* name)
        2887                 : {
        2888               0 :   for (; ; ) {
        2889              22 :     nsHtml5StackNode* node = stack[currentPtr];
        2890              22 :     switch(node->getGroup()) {
        2891                 :       case NS_HTML5TREE_BUILDER_P:
        2892                 :       case NS_HTML5TREE_BUILDER_LI:
        2893                 :       case NS_HTML5TREE_BUILDER_DD_OR_DT:
        2894                 :       case NS_HTML5TREE_BUILDER_OPTION:
        2895                 :       case NS_HTML5TREE_BUILDER_OPTGROUP:
        2896                 :       case NS_HTML5TREE_BUILDER_RT_OR_RP: {
        2897              22 :         if (node->name == name) {
        2898              22 :           return;
        2899                 :         }
        2900               0 :         pop();
        2901               0 :         continue;
        2902                 :       }
        2903                 :       default: {
        2904               0 :         return;
        2905                 :       }
        2906                 :     }
        2907                 :   }
        2908                 : }
        2909                 :
        2910                 : void
        2911              12 : nsHtml5TreeBuilder::generateImpliedEndTags()
        2912                 : {
        2913               4 :   for (; ; ) {
        2914              12 :     switch(stack[currentPtr]->getGroup()) {
        2915                 :       case NS_HTML5TREE_BUILDER_P:
        2916                 :       case NS_HTML5TREE_BUILDER_LI:
        2917                 :       case NS_HTML5TREE_BUILDER_DD_OR_DT:
        2918                 :       case NS_HTML5TREE_BUILDER_OPTION:
        2919                 :       case NS_HTML5TREE_BUILDER_OPTGROUP:
        2920                 :       case NS_HTML5TREE_BUILDER_RT_OR_RP: {
        2921               4 :         pop();
        2922               4 :         continue;
        2923                 :       }
        2924                 :       default: {
        2925                 :         return;
        2926                 :       }
        2927                 :     }
        2928                 :   }
        2929                 : }
        2930                 :
        2931                 : bool
        2932               0 : nsHtml5TreeBuilder::isSecondOnStackBody()
        2933                 : {
        2934               0 :   return currentPtr >= 1 && stack[1]->getGroup() == NS_HTML5TREE_BUILDER_BODY;
        2935                 : }
        2936                 :
        2937                 : void
        2938             216 : nsHtml5TreeBuilder::documentModeInternal(nsHtml5DocumentMode m, nsString* publicIdentifier, nsString* systemIdentifier, bool html4SpecificAdditionalErrorChecks)
        2939                 : {
        2940             216 :   quirks = (m == QUIRKS_MODE);
        2941             216 :   if (this) {
        2942             216 :     this->documentMode(m);
        2943                 :   }
        2944             216 : }
        2945                 :
        2946                 : bool
        2947               0 : nsHtml5TreeBuilder::isAlmostStandards(nsString* publicIdentifier, nsString* systemIdentifier)
        2948                 : {
        2949               0 :   if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd xhtml 1.0 transitional//en", publicIdentifier)) {
        2950               0 :     return true;
        2951                 :   }
        2952               0 :   if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd xhtml 1.0 frameset//en", publicIdentifier)) {
        2953               0 :     return true;
        2954                 :   }
        2955               0 :   if (systemIdentifier) {
        2956               0 :     if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 transitional//en", publicIdentifier)) {
        2957               0 :       return true;
        2958                 :     }
        2959               0 :     if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 frameset//en", publicIdentifier)) {
        2960               0 :       return true;
        2961                 :     }
        2962                 :   }
        2963               0 :   return false;
        2964                 : }
        2965                 :
        2966                 : bool
        2967               0 : nsHtml5TreeBuilder::isQuirky(nsIAtom* name, nsString* publicIdentifier, nsString* systemIdentifier, bool forceQuirks)
        2968                 : {
        2969               0 :   if (forceQuirks) {
        2970               0 :     return true;
        2971                 :   }
        2972               0 :   if (name != nsHtml5Atoms::html) {
        2973               0 :     return true;
        2974                 :   }
        2975               0 :   if (publicIdentifier) {
        2976               0 :     for (PRInt32 i = 0; i < nsHtml5TreeBuilder::QUIRKY_PUBLIC_IDS.length; i++) {
        2977               0 :       if (nsHtml5Portability::lowerCaseLiteralIsPrefixOfIgnoreAsciiCaseString(nsHtml5TreeBuilder::QUIRKY_PUBLIC_IDS[i], publicIdentifier)) {
        2978               0 :         return true;
        2979                 :       }
        2980                 :     }
        2981               0 :     if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3o//dtd w3 html strict 3.0//en//", publicIdentifier) || nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-/w3c/dtd html 4.0 transitional/en", publicIdentifier) || nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("html", publicIdentifier)) {
        2982               0 :       return true;
        2983                 :     }
        2984                 :   }
        2985               0 :   if (!systemIdentifier) {
        2986               0 :     if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 transitional//en", publicIdentifier)) {
        2987               0 :       return true;
        2988               0 :     } else if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 frameset//en", publicIdentifier)) {
        2989               0 :       return true;
        2990                 :     }
        2991               0 :   } else if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd", systemIdentifier)) {
        2992               0 :     return true;
        2993                 :   }
        2994               0 :   return false;
        2995                 : }
        2996                 :
        2997                 : void
        2998               0 : nsHtml5TreeBuilder::closeTheCell(PRInt32 eltPos)
        2999                 : {
        3000               0 :   generateImpliedEndTags();
        3001               0 :   if (!!NS_UNLIKELY(mViewSource) && eltPos != currentPtr) {
        3002               0 :     errUnclosedElementsCell(eltPos);
        3003                 :   }
        3004               0 :   while (currentPtr >= eltPos) {
        3005               0 :     pop();
        3006                 :   }
        3007               0 :   clearTheListOfActiveFormattingElementsUpToTheLastMarker();
        3008               0 :   mode = NS_HTML5TREE_BUILDER_IN_ROW;
        3009                 :   return;
        3010                 : }
        3011                 :
        3012                 : PRInt32
        3013               0 : nsHtml5TreeBuilder::findLastInTableScopeTdTh()
        3014                 : {
        3015               0 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        3016               0 :     nsIAtom* name = stack[i]->name;
        3017               0 :     if (nsHtml5Atoms::td == name || nsHtml5Atoms::th == name) {
        3018               0 :       return i;
        3019               0 :     } else if (name == nsHtml5Atoms::table) {
        3020               0 :       return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        3021                 :     }
        3022                 :   }
        3023               0 :   return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
        3024                 : }
        3025                 :
        3026                 : void
        3027               0 : nsHtml5TreeBuilder::clearStackBackTo(PRInt32 eltPos)
        3028                 : {
        3029               0 :   while (currentPtr > eltPos) {
        3030               0 :     pop();
        3031                 :   }
        3032               0 : }
        3033                 :
        3034                 : void
        3035               0 : nsHtml5TreeBuilder::resetTheInsertionMode()
        3036                 : {
        3037                 :   nsHtml5StackNode* node;
        3038                 :   nsIAtom* name;
        3039                 :   PRInt32 ns;
        3040               0 :   for (PRInt32 i = currentPtr; i >= 0; i--) {
        3041               0 :     node = stack[i];
        3042               0 :     name = node->name;
        3043               0 :     ns = node->ns;
        3044               0 :     if (!i) {
        3045               0 :       if (!(contextNamespace == kNameSpaceID_XHTML && (contextName == nsHtml5Atoms::td || contextName == nsHtml5Atoms::th))) {
        3046               0 :         name = contextName;
        3047               0 :         ns = contextNamespace;
        3048                 :       } else {
        3049               0 :         mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        3050               0 :         return;
        3051                 :       }
        3052                 :     }
        3053               0 :     if (nsHtml5Atoms::select == name) {
        3054               0 :       mode = NS_HTML5TREE_BUILDER_IN_SELECT;
        3055               0 :       return;
        3056               0 :     } else if (nsHtml5Atoms::td == name || nsHtml5Atoms::th == name) {
        3057               0 :       mode = NS_HTML5TREE_BUILDER_IN_CELL;
        3058               0 :       return;
        3059               0 :     } else if (nsHtml5Atoms::tr == name) {
        3060               0 :       mode = NS_HTML5TREE_BUILDER_IN_ROW;
        3061               0 :       return;
        3062               0 :     } else if (nsHtml5Atoms::tbody == name || nsHtml5Atoms::thead == name || nsHtml5Atoms::tfoot == name) {
        3063               0 :       mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY;
        3064               0 :       return;
        3065               0 :     } else if (nsHtml5Atoms::caption == name) {
        3066               0 :       mode = NS_HTML5TREE_BUILDER_IN_CAPTION;
        3067               0 :       return;
        3068               0 :     } else if (nsHtml5Atoms::colgroup == name) {
        3069               0 :       mode = NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP;
        3070               0 :       return;
        3071               0 :     } else if (nsHtml5Atoms::table == name) {
        3072               0 :       mode = NS_HTML5TREE_BUILDER_IN_TABLE;
        3073               0 :       return;
        3074               0 :     } else if (kNameSpaceID_XHTML != ns) {
        3075               0 :       mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        3076               0 :       return;
        3077               0 :     } else if (nsHtml5Atoms::head == name) {
        3078               0 :       mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        3079               0 :       return;
        3080               0 :     } else if (nsHtml5Atoms::body == name) {
        3081               0 :       mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        3082               0 :       return;
        3083               0 :     } else if (nsHtml5Atoms::frameset == name) {
        3084               0 :       mode = NS_HTML5TREE_BUILDER_IN_FRAMESET;
        3085               0 :       return;
        3086               0 :     } else if (nsHtml5Atoms::html == name) {
        3087               0 :       if (!headPointer) {
        3088               0 :         mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD;
        3089                 :       } else {
        3090               0 :         mode = NS_HTML5TREE_BUILDER_AFTER_HEAD;
        3091                 :       }
        3092               0 :       return;
        3093               0 :     } else if (!i) {
        3094               0 :       mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
        3095               0 :       return;
        3096                 :     }
        3097                 :   }
        3098                 : }
        3099                 :
        3100                 : void
        3101              34 : nsHtml5TreeBuilder::implicitlyCloseP()
        3102                 : {
        3103              34 :   PRInt32 eltPos = findLastInButtonScope(nsHtml5Atoms::p);
        3104              34 :   if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
        3105              34 :     return;
        3106                 :   }
        3107               0 :   generateImpliedEndTagsExceptFor(nsHtml5Atoms::p);
        3108               0 :   if (!!NS_UNLIKELY(mViewSource) && eltPos != currentPtr) {
        3109               0 :     errUnclosedElementsImplied(eltPos, nsHtml5Atoms::p);
        3110                 :   }
        3111               0 :   while (currentPtr >= eltPos) {
        3112               0 :     pop();
        3113                 :   }
        3114                 : }
        3115                 :
        3116                 : bool
        3117               0 : nsHtml5TreeBuilder::clearLastStackSlot()
        3118                 : {
        3119               0 :   stack[currentPtr] = nsnull;
        3120               0 :   return true;
        3121                 : }
        3122                 :
        3123                 : bool
        3124               0 : nsHtml5TreeBuilder::clearLastListSlot()
        3125                 : {
        3126               0 :   listOfActiveFormattingElements[listPtr] = nsnull;
        3127               0 :   return true;
        3128                 : }
        3129                 :
        3130                 : void
        3131             682 : nsHtml5TreeBuilder::push(nsHtml5StackNode* node)
        3132                 : {
        3133             682 :   currentPtr++;
        3134             682 :   if (currentPtr == stack.length) {
        3135               0 :     jArray<nsHtml5StackNode*,PRInt32> newStack = jArray<nsHtml5StackNode*,PRInt32>::newJArray(stack.length + 64);
        3136               0 :     nsHtml5ArrayCopy::arraycopy(stack, newStack, stack.length);
        3137               0 :     stack = newStack;
        3138                 :   }
        3139             682 :   stack[currentPtr] = node;
        3140             682 :   elementPushed(node->ns, node->popName, node->node);
        3141             682 : }
        3142                 :
        3143                 : void
        3144               0 : nsHtml5TreeBuilder::silentPush(nsHtml5StackNode* node)
        3145                 : {
        3146               0 :   currentPtr++;
        3147               0 :   if (currentPtr == stack.length) {
        3148               0 :     jArray<nsHtml5StackNode*,PRInt32> newStack = jArray<nsHtml5StackNode*,PRInt32>::newJArray(stack.length + 64);
        3149               0 :     nsHtml5ArrayCopy::arraycopy(stack, newStack, stack.length);
        3150               0 :     stack = newStack;
        3151                 :   }
        3152               0 :   stack[currentPtr] = node;
        3153               0 : }
        3154                 :
        3155                 : void
        3156               0 : nsHtml5TreeBuilder::append(nsHtml5StackNode* node)
        3157                 : {
        3158               0 :   listPtr++;
        3159               0 :   if (listPtr == listOfActiveFormattingElements.length) {
        3160               0 :     jArray<nsHtml5StackNode*,PRInt32> newList = jArray<nsHtml5StackNode*,PRInt32>::newJArray(listOfActiveFormattingElements.length + 64);
        3161               0 :     nsHtml5ArrayCopy::arraycopy(listOfActiveFormattingElements, newList, listOfActiveFormattingElements.length);
        3162               0 :     listOfActiveFormattingElements = newList;
        3163                 :   }
        3164               0 :   listOfActiveFormattingElements[listPtr] = node;
        3165               0 : }
        3166                 :
        3167                 : void
        3168               0 : nsHtml5TreeBuilder::clearTheListOfActiveFormattingElementsUpToTheLastMarker()
        3169                 : {
        3170               0 :   while (listPtr > -1) {
        3171               0 :     if (!listOfActiveFormattingElements[listPtr]) {
        3172               0 :       --listPtr;
        3173               0 :       return;
        3174                 :     }
        3175               0 :     listOfActiveFormattingElements[listPtr]->release();
        3176               0 :     --listPtr;
        3177                 :   }
        3178                 : }
        3179                 :
        3180                 : void
        3181               0 : nsHtml5TreeBuilder::removeFromStack(PRInt32 pos)
        3182                 : {
        3183               0 :   if (currentPtr == pos) {
        3184               0 :     pop();
        3185                 :   } else {
        3186                 :
        3187               0 :     stack[pos]->release();
        3188               0 :     nsHtml5ArrayCopy::arraycopy(stack, pos + 1, pos, currentPtr - pos);
        3189                 :
        3190               0 :     currentPtr--;
        3191                 :   }
        3192               0 : }
        3193                 :
        3194                 : void
        3195               0 : nsHtml5TreeBuilder::removeFromStack(nsHtml5StackNode* node)
        3196                 : {
        3197               0 :   if (stack[currentPtr] == node) {
        3198               0 :     pop();
        3199                 :   } else {
        3200               0 :     PRInt32 pos = currentPtr - 1;
        3201               0 :     while (pos >= 0 && stack[pos] != node) {
        3202               0 :       pos--;
        3203                 :     }
        3204               0 :     if (pos == -1) {
        3205               0 :       return;
        3206                 :     }
        3207                 :
        3208               0 :     node->release();
        3209               0 :     nsHtml5ArrayCopy::arraycopy(stack, pos + 1, pos, currentPtr - pos);
        3210               0 :     currentPtr--;
        3211                 :   }
        3212                 : }
        3213                 :
        3214                 : void
        3215               0 : nsHtml5TreeBuilder::removeFromListOfActiveFormattingElements(PRInt32 pos)
        3216                 : {
        3217                 :
        3218               0 :   listOfActiveFormattingElements[pos]->release();
        3219               0 :   if (pos == listPtr) {
        3220                 :
        3221               0 :     listPtr--;
        3222               0 :     return;
        3223                 :   }
        3224                 :
        3225               0 :   nsHtml5ArrayCopy::arraycopy(listOfActiveFormattingElements, pos + 1, pos, listPtr - pos);
        3226                 :
        3227               0 :   listPtr--;
        3228                 : }
        3229                 :
        3230                 : bool
        3231               0 : nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name)
        3232                 : {
        3233               0 :   for (PRInt32 i = 0; i < 8; ++i) {
        3234               0 :     PRInt32 formattingEltListPos = listPtr;
        3235               0 :     while (formattingEltListPos > -1) {
        3236               0 :       nsHtml5StackNode* listNode = listOfActiveFormattingElements[formattingEltListPos];
        3237               0 :       if (!listNode) {
        3238               0 :         formattingEltListPos = -1;
        3239               0 :         break;
        3240               0 :       } else if (listNode->name == name) {
        3241               0 :         break;
        3242                 :       }
        3243               0 :       formattingEltListPos--;
        3244                 :     }
        3245               0 :     if (formattingEltListPos == -1) {
        3246               0 :       return false;
        3247                 :     }
        3248               0 :     nsHtml5StackNode* formattingElt = listOfActiveFormattingElements[formattingEltListPos];
        3249               0 :     PRInt32 formattingEltStackPos = currentPtr;
        3250               0 :     bool inScope = true;
        3251               0 :     while (formattingEltStackPos > -1) {
        3252               0 :       nsHtml5StackNode* node = stack[formattingEltStackPos];
        3253               0 :       if (node == formattingElt) {
        3254               0 :         break;
        3255               0 :       } else if (node->isScoping()) {
        3256               0 :         inScope = false;
        3257                 :       }
        3258               0 :       formattingEltStackPos--;
        3259                 :     }
        3260               0 :     if (formattingEltStackPos == -1) {
        3261               0 :       errNoElementToCloseButEndTagSeen(name);
        3262               0 :       removeFromListOfActiveFormattingElements(formattingEltListPos);
        3263               0 :       return true;
        3264                 :     }
        3265               0 :     if (!inScope) {
        3266               0 :       errNoElementToCloseButEndTagSeen(name);
        3267               0 :       return true;
        3268                 :     }
        3269               0 :     if (formattingEltStackPos != currentPtr) {
        3270               0 :       errEndTagViolatesNestingRules(name);
        3271                 :     }
        3272               0 :     PRInt32 furthestBlockPos = formattingEltStackPos + 1;
        3273               0 :     while (furthestBlockPos <= currentPtr) {
        3274               0 :       nsHtml5StackNode* node = stack[furthestBlockPos];
        3275               0 :       if (node->isSpecial()) {
        3276               0 :         break;
        3277                 :       }
        3278               0 :       furthestBlockPos++;
        3279                 :     }
        3280               0 :     if (furthestBlockPos > currentPtr) {
        3281               0 :       while (currentPtr >= formattingEltStackPos) {
        3282               0 :         pop();
        3283                 :       }
        3284               0 :       removeFromListOfActiveFormattingElements(formattingEltListPos);
        3285               0 :       return true;
        3286                 :     }
        3287               0 :     nsHtml5StackNode* commonAncestor = stack[formattingEltStackPos - 1];
        3288               0 :     nsHtml5StackNode* furthestBlock = stack[furthestBlockPos];
        3289               0 :     PRInt32 bookmark = formattingEltListPos;
        3290               0 :     PRInt32 nodePos = furthestBlockPos;
        3291               0 :     nsHtml5StackNode* lastNode = furthestBlock;
        3292               0 :     for (PRInt32 j = 0; j < 3; ++j) {
        3293               0 :       nodePos--;
        3294               0 :       nsHtml5StackNode* node = stack[nodePos];
        3295               0 :       PRInt32 nodeListPos = findInListOfActiveFormattingElements(node);
        3296               0 :       if (nodeListPos == -1) {
        3297                 :
        3298                 :
        3299                 :
        3300               0 :         removeFromStack(nodePos);
        3301               0 :         furthestBlockPos--;
        3302               0 :         continue;
        3303                 :       }
        3304               0 :       if (nodePos == formattingEltStackPos) {
        3305               0 :         break;
        3306                 :       }
        3307               0 :       if (nodePos == furthestBlockPos) {
        3308               0 :         bookmark = nodeListPos + 1;
        3309                 :       }
        3310                 :
        3311                 :
        3312               0 :       nsIContent** clone = createElement(kNameSpaceID_XHTML, node->name, node->attributes->cloneAttributes(nsnull));
        3313               0 :       nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, node->name, clone, node->popName, node->attributes);
        3314               0 :       node->dropAttributes();
        3315               0 :       stack[nodePos] = newNode;
        3316               0 :       newNode->retain();
        3317               0 :       listOfActiveFormattingElements[nodeListPos] = newNode;
        3318               0 :       node->release();
        3319               0 :       node->release();
        3320               0 :       node = newNode;
        3321               0 :       detachFromParent(lastNode->node);
        3322               0 :       appendElement(lastNode->node, node->node);
        3323               0 :       lastNode = node;
        3324                 :     }
        3325               0 :     if (commonAncestor->isFosterParenting()) {
        3326                 :
        3327               0 :       detachFromParent(lastNode->node);
        3328               0 :       insertIntoFosterParent(lastNode->node);
        3329                 :     } else {
        3330               0 :       detachFromParent(lastNode->node);
        3331               0 :       appendElement(lastNode->node, commonAncestor->node);
        3332                 :     }
        3333               0 :     nsIContent** clone = createElement(kNameSpaceID_XHTML, formattingElt->name, formattingElt->attributes->cloneAttributes(nsnull));
        3334               0 :     nsHtml5StackNode* formattingClone = new nsHtml5StackNode(formattingElt->getFlags(), formattingElt->ns, formattingElt->name, clone, formattingElt->popName, formattingElt->attributes);
        3335               0 :     formattingElt->dropAttributes();
        3336               0 :     appendChildrenToNewParent(furthestBlock->node, clone);
        3337               0 :     appendElement(clone, furthestBlock->node);
        3338               0 :     removeFromListOfActiveFormattingElements(formattingEltListPos);
        3339               0 :     insertIntoListOfActiveFormattingElements(formattingClone, bookmark);
        3340                 :
        3341               0 :     removeFromStack(formattingEltStackPos);
        3342               0 :     insertIntoStack(formattingClone, furthestBlockPos);
        3343                 :   }
        3344               0 :   return true;
        3345                 : }
        3346                 :
        3347                 : void
        3348               0 : nsHtml5TreeBuilder::insertIntoStack(nsHtml5StackNode* node, PRInt32 position)
        3349                 : {
        3350                 :
        3351                 :
        3352               0 :   if (position == currentPtr + 1) {
        3353               0 :     push(node);
        3354                 :   } else {
        3355               0 :     nsHtml5ArrayCopy::arraycopy(stack, position, position + 1, (currentPtr - position) + 1);
        3356               0 :     currentPtr++;
        3357               0 :     stack[position] = node;
        3358                 :   }
        3359               0 : }
        3360                 :
        3361                 : void
        3362               0 : nsHtml5TreeBuilder::insertIntoListOfActiveFormattingElements(nsHtml5StackNode* formattingClone, PRInt32 bookmark)
        3363                 : {
        3364               0 :   formattingClone->retain();
        3365                 :
        3366               0 :   if (bookmark <= listPtr) {
        3367               0 :     nsHtml5ArrayCopy::arraycopy(listOfActiveFormattingElements, bookmark, bookmark + 1, (listPtr - bookmark) + 1);
        3368                 :   }
        3369               0 :   listPtr++;
        3370               0 :   listOfActiveFormattingElements[bookmark] = formattingClone;
        3371               0 : }
        3372                 :
        3373                 : PRInt32
        3374               0 : nsHtml5TreeBuilder::findInListOfActiveFormattingElements(nsHtml5StackNode* node)
        3375                 : {
        3376               0 :   for (PRInt32 i = listPtr; i >= 0; i--) {
        3377               0 :     if (node == listOfActiveFormattingElements[i]) {
        3378               0 :       return i;
        3379                 :     }
        3380                 :   }
        3381               0 :   return -1;
        3382                 : }
        3383                 :
        3384                 : PRInt32
        3385               0 : nsHtml5TreeBuilder::findInListOfActiveFormattingElementsContainsBetweenEndAndLastMarker(nsIAtom* name)
        3386                 : {
        3387               0 :   for (PRInt32 i = listPtr; i >= 0; i--) {
        3388               0 :     nsHtml5StackNode* node = listOfActiveFormattingElements[i];
        3389               0 :     if (!node) {
        3390               0 :       return -1;
        3391               0 :     } else if (node->name == name) {
        3392               0 :       return i;
        3393                 :     }
        3394                 :   }
        3395               0 :   return -1;
        3396                 : }
        3397                 :
        3398                 : void
        3399               0 : nsHtml5TreeBuilder::maybeForgetEarlierDuplicateFormattingElement(nsIAtom* name, nsHtml5HtmlAttributes* attributes)
        3400                 : {
        3401               0 :   PRInt32 candidate = -1;
        3402               0 :   PRInt32 count = 0;
        3403               0 :   for (PRInt32 i = listPtr; i >= 0; i--) {
        3404               0 :     nsHtml5StackNode* node = listOfActiveFormattingElements[i];
        3405               0 :     if (!node) {
        3406               0 :       break;
        3407                 :     }
        3408               0 :     if (node->name == name && node->attributes->equalsAnother(attributes)) {
        3409               0 :       candidate = i;
        3410               0 :       ++count;
        3411                 :     }
        3412                 :   }
        3413               0 :   if (count >= 3) {
        3414               0 :     removeFromListOfActiveFormattingElements(candidate);
        3415                 :   }
        3416               0 : }
        3417                 :
        3418                 : PRInt32
        3419               0 : nsHtml5TreeBuilder::findLastOrRoot(nsIAtom* name)
        3420                 : {
        3421               0 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        3422               0 :     if (stack[i]->name == name) {
        3423               0 :       return i;
        3424                 :     }
        3425                 :   }
        3426               0 :   return 0;
        3427                 : }
        3428                 :
        3429                 : PRInt32
        3430               0 : nsHtml5TreeBuilder::findLastOrRoot(PRInt32 group)
        3431                 : {
        3432               0 :   for (PRInt32 i = currentPtr; i > 0; i--) {
        3433               0 :     if (stack[i]->getGroup() == group) {
        3434               0 :       return i;
        3435                 :     }
        3436                 :   }
        3437               0 :   return 0;
        3438                 : }
        3439                 :
        3440                 : bool
        3441               0 : nsHtml5TreeBuilder::addAttributesToBody(nsHtml5HtmlAttributes* attributes)
        3442                 : {
        3443               0 :   if (currentPtr >= 1) {
        3444               0 :     nsHtml5StackNode* body = stack[1];
        3445               0 :     if (body->getGroup() == NS_HTML5TREE_BUILDER_BODY) {
        3446               0 :       addAttributesToElement(body->node, attributes);
        3447               0 :       return true;
        3448                 :     }
        3449                 :   }
        3450               0 :   return false;
        3451                 : }
        3452                 :
        3453                 : void
        3454               0 : nsHtml5TreeBuilder::addAttributesToHtml(nsHtml5HtmlAttributes* attributes)
        3455                 : {
        3456               0 :   addAttributesToElement(stack[0]->node, attributes);
        3457               0 : }
        3458                 :
        3459                 : void
        3460               0 : nsHtml5TreeBuilder::pushHeadPointerOntoStack()
        3461                 : {
        3462                 :
        3463                 :
        3464                 :
        3465                 :
        3466               0 :   silentPush(new nsHtml5StackNode(nsHtml5ElementName::ELT_HEAD, headPointer));
        3467               0 : }
        3468                 :
        3469                 : void
        3470             332 : nsHtml5TreeBuilder::reconstructTheActiveFormattingElements()
        3471                 : {
        3472             332 :   if (listPtr == -1) {
        3473             332 :     return;
        3474                 :   }
        3475               0 :   nsHtml5StackNode* mostRecent = listOfActiveFormattingElements[listPtr];
        3476               0 :   if (!mostRecent || isInStack(mostRecent)) {
        3477               0 :     return;
        3478                 :   }
        3479               0 :   PRInt32 entryPos = listPtr;
        3480               0 :   for (; ; ) {
        3481               0 :     entryPos--;
        3482               0 :     if (entryPos == -1) {
        3483               0 :       break;
        3484                 :     }
        3485               0 :     if (!listOfActiveFormattingElements[entryPos]) {
        3486               0 :       break;
        3487                 :     }
        3488               0 :     if (isInStack(listOfActiveFormattingElements[entryPos])) {
        3489               0 :       break;
        3490                 :     }
        3491                 :   }
        3492               0 :   while (entryPos < listPtr) {
        3493               0 :     entryPos++;
        3494               0 :     nsHtml5StackNode* entry = listOfActiveFormattingElements[entryPos];
        3495               0 :     nsIContent** clone = createElement(kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nsnull));
        3496               0 :     nsHtml5StackNode* entryClone = new nsHtml5StackNode(entry->getFlags(), entry->ns, entry->name, clone, entry->popName, entry->attributes);
        3497               0 :     entry->dropAttributes();
        3498               0 :     nsHtml5StackNode* currentNode = stack[currentPtr];
        3499               0 :     if (currentNode->isFosterParenting()) {
        3500               0 :       insertIntoFosterParent(clone);
        3501                 :     } else {
        3502               0 :       appendElement(clone, currentNode->node);
        3503                 :     }
        3504               0 :     push(entryClone);
        3505               0 :     listOfActiveFormattingElements[entryPos] = entryClone;
        3506               0 :     entry->release();
        3507               0 :     entryClone->retain();
        3508                 :   }
        3509                 : }
        3510                 :
        3511                 : void
        3512               0 : nsHtml5TreeBuilder::insertIntoFosterParent(nsIContent** child)
        3513                 : {
        3514               0 :   PRInt32 eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE);
        3515               0 :   nsHtml5StackNode* node = stack[eltPos];
        3516               0 :   nsIContent** elt = node->node;
        3517               0 :   if (!eltPos) {
        3518               0 :     appendElement(child, elt);
        3519               0 :     return;
        3520                 :   }
        3521               0 :   insertFosterParentedChild(child, elt, stack[eltPos - 1]->node);
        3522                 : }
        3523                 :
        3524                 : bool
        3525               0 : nsHtml5TreeBuilder::isInStack(nsHtml5StackNode* node)
        3526                 : {
        3527               0 :   for (PRInt32 i = currentPtr; i >= 0; i--) {
        3528               0 :     if (stack[i] == node) {
        3529               0 :       return true;
        3530                 :     }
        3531                 :   }
        3532               0 :   return false;
        3533                 : }
        3534                 :
        3535                 : void
        3536             250 : nsHtml5TreeBuilder::pop()
        3537                 : {
        3538             250 :   nsHtml5StackNode* node = stack[currentPtr];
        3539                 :
        3540             250 :   currentPtr--;
        3541             250 :   elementPopped(node->ns, node->popName, node->node);
        3542             250 :   node->release();
        3543             250 : }
        3544                 :
        3545                 : void
        3546               0 : nsHtml5TreeBuilder::silentPop()
        3547                 : {
        3548               0 :   nsHtml5StackNode* node = stack[currentPtr];
        3549                 :
        3550               0 :   currentPtr--;
        3551               0 :   node->release();
        3552               0 : }
        3553                 :
        3554                 : void
        3555             432 : nsHtml5TreeBuilder::popOnEof()
        3556                 : {
        3557             432 :   nsHtml5StackNode* node = stack[currentPtr];
        3558                 :
        3559             432 :   currentPtr--;
        3560             432 :   markMalformedIfScript(node->node);
        3561             432 :   elementPopped(node->ns, node->popName, node->node);
        3562             432 :   node->release();
        3563             432 : }
        3564                 :
        3565                 : void
        3566             216 : nsHtml5TreeBuilder::appendHtmlElementToDocumentAndPush(nsHtml5HtmlAttributes* attributes)
        3567                 : {
        3568             216 :   nsIContent** elt = createHtmlElementSetAsRoot(attributes);
        3569             216 :   nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_HTML, elt);
        3570             216 :   push(node);
        3571             216 : }
        3572                 :
        3573                 : void
        3574             216 : nsHtml5TreeBuilder::appendHtmlElementToDocumentAndPush()
        3575                 : {
        3576             216 :   appendHtmlElementToDocumentAndPush(tokenizer->emptyAttributes());
        3577             216 : }
        3578                 :
        3579                 : void
        3580             216 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes* attributes)
        3581                 : {
        3582             216 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, nsHtml5Atoms::head, attributes);
        3583             216 :   appendElement(elt, stack[currentPtr]->node);
        3584             216 :   headPointer = elt;
        3585             216 :   nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_HEAD, elt);
        3586             216 :   push(node);
        3587             216 : }
        3588                 :
        3589                 : void
        3590             216 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushBodyElement(nsHtml5HtmlAttributes* attributes)
        3591                 : {
        3592             216 :   appendToCurrentNodeAndPushElement(nsHtml5ElementName::ELT_BODY, attributes);
        3593             216 : }
        3594                 :
        3595                 : void
        3596             216 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushBodyElement()
        3597                 : {
        3598             216 :   appendToCurrentNodeAndPushBodyElement(tokenizer->emptyAttributes());
        3599             216 : }
        3600                 :
        3601                 : void
        3602               0 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormElementMayFoster(nsHtml5HtmlAttributes* attributes)
        3603                 : {
        3604               0 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, nsHtml5Atoms::form, attributes);
        3605               0 :   formPointer = elt;
        3606               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3607               0 :   if (current->isFosterParenting()) {
        3608                 :
        3609               0 :     insertIntoFosterParent(elt);
        3610                 :   } else {
        3611               0 :     appendElement(elt, current->node);
        3612                 :   }
        3613               0 :   nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_FORM, elt);
        3614               0 :   push(node);
        3615               0 : }
        3616                 :
        3617                 : void
        3618               0 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
        3619                 : {
        3620               0 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, elementName->name, attributes);
        3621               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3622               0 :   if (current->isFosterParenting()) {
        3623                 :
        3624               0 :     insertIntoFosterParent(elt);
        3625                 :   } else {
        3626               0 :     appendElement(elt, current->node);
        3627                 :   }
        3628               0 :   nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt, attributes->cloneAttributes(nsnull));
        3629               0 :   push(node);
        3630               0 :   append(node);
        3631               0 :   node->retain();
        3632               0 : }
        3633                 :
        3634                 : void
        3635             216 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushElement(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
        3636                 : {
        3637             216 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, elementName->name, attributes);
        3638             216 :   appendElement(elt, stack[currentPtr]->node);
        3639             216 :   nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt);
        3640             216 :   push(node);
        3641             216 : }
        3642                 :
        3643                 : void
        3644              34 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
        3645                 : {
        3646              34 :   nsIAtom* popName = elementName->name;
        3647              34 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, popName, attributes);
        3648              34 :   nsHtml5StackNode* current = stack[currentPtr];
        3649              34 :   if (current->isFosterParenting()) {
        3650                 :
        3651               0 :     insertIntoFosterParent(elt);
        3652                 :   } else {
        3653              34 :     appendElement(elt, current->node);
        3654                 :   }
        3655              34 :   nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt, popName);
        3656              34 :   push(node);
        3657              34 : }
        3658                 :
        3659                 : void
        3660               0 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterMathML(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
        3661                 : {
        3662               0 :   nsIAtom* popName = elementName->name;
        3663               0 :   nsIContent** elt = createElement(kNameSpaceID_MathML, popName, attributes);
        3664               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3665               0 :   if (current->isFosterParenting()) {
        3666                 :
        3667               0 :     insertIntoFosterParent(elt);
        3668                 :   } else {
        3669               0 :     appendElement(elt, current->node);
        3670                 :   }
        3671               0 :   bool markAsHtmlIntegrationPoint = false;
        3672               0 :   if (nsHtml5ElementName::ELT_ANNOTATION_XML == elementName && annotationXmlEncodingPermitsHtml(attributes)) {
        3673               0 :     markAsHtmlIntegrationPoint = true;
        3674                 :   }
        3675               0 :   nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt, popName, markAsHtmlIntegrationPoint);
        3676               0 :   push(node);
        3677               0 : }
        3678                 :
        3679                 : bool
        3680               0 : nsHtml5TreeBuilder::annotationXmlEncodingPermitsHtml(nsHtml5HtmlAttributes* attributes)
        3681                 : {
        3682               0 :   nsString* encoding = attributes->getValue(nsHtml5AttributeName::ATTR_ENCODING);
        3683               0 :   if (!encoding) {
        3684               0 :     return false;
        3685                 :   }
        3686               0 :   return nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("application/xhtml+xml", encoding) || nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("text/html", encoding);
        3687                 : }
        3688                 :
        3689                 : void
        3690               0 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterSVG(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
        3691                 : {
        3692               0 :   nsIAtom* popName = elementName->camelCaseName;
        3693               0 :   nsIContent** elt = createElement(kNameSpaceID_SVG, popName, attributes);
        3694               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3695               0 :   if (current->isFosterParenting()) {
        3696                 :
        3697               0 :     insertIntoFosterParent(elt);
        3698                 :   } else {
        3699               0 :     appendElement(elt, current->node);
        3700                 :   }
        3701               0 :   nsHtml5StackNode* node = new nsHtml5StackNode(elementName, popName, elt);
        3702               0 :   push(node);
        3703               0 : }
        3704                 :
        3705                 : void
        3706               0 : nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, nsIContent** form)
        3707                 : {
        3708               0 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, elementName->name, attributes, fragment ? nsnull : form);
        3709               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3710               0 :   if (current->isFosterParenting()) {
        3711                 :
        3712               0 :     insertIntoFosterParent(elt);
        3713                 :   } else {
        3714               0 :     appendElement(elt, current->node);
        3715                 :   }
        3716               0 :   nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt);
        3717               0 :   push(node);
        3718               0 : }
        3719                 :
        3720                 : void
        3721               0 : nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContent** form)
        3722                 : {
        3723               0 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, name, attributes, fragment ? nsnull : form);
        3724               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3725               0 :   if (current->isFosterParenting()) {
        3726                 :
        3727               0 :     insertIntoFosterParent(elt);
        3728                 :   } else {
        3729               0 :     appendElement(elt, current->node);
        3730                 :   }
        3731               0 :   elementPushed(kNameSpaceID_XHTML, name, elt);
        3732               0 :   elementPopped(kNameSpaceID_XHTML, name, elt);
        3733               0 : }
        3734                 :
        3735                 : void
        3736              40 : nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
        3737                 : {
        3738              40 :   nsIAtom* popName = elementName->name;
        3739              40 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, popName, attributes);
        3740              40 :   nsHtml5StackNode* current = stack[currentPtr];
        3741              40 :   if (current->isFosterParenting()) {
        3742                 :
        3743               0 :     insertIntoFosterParent(elt);
        3744                 :   } else {
        3745              40 :     appendElement(elt, current->node);
        3746                 :   }
        3747              40 :   elementPushed(kNameSpaceID_XHTML, popName, elt);
        3748              40 :   elementPopped(kNameSpaceID_XHTML, popName, elt);
        3749              40 : }
        3750                 :
        3751                 : void
        3752               0 : nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterSVG(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
        3753                 : {
        3754               0 :   nsIAtom* popName = elementName->camelCaseName;
        3755               0 :   nsIContent** elt = createElement(kNameSpaceID_SVG, popName, attributes);
        3756               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3757               0 :   if (current->isFosterParenting()) {
        3758                 :
        3759               0 :     insertIntoFosterParent(elt);
        3760                 :   } else {
        3761               0 :     appendElement(elt, current->node);
        3762                 :   }
        3763               0 :   elementPushed(kNameSpaceID_SVG, popName, elt);
        3764               0 :   elementPopped(kNameSpaceID_SVG, popName, elt);
        3765               0 : }
        3766                 :
        3767                 : void
        3768               0 : nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterMathML(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
        3769                 : {
        3770               0 :   nsIAtom* popName = elementName->name;
        3771               0 :   nsIContent** elt = createElement(kNameSpaceID_MathML, popName, attributes);
        3772               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3773               0 :   if (current->isFosterParenting()) {
        3774                 :
        3775               0 :     insertIntoFosterParent(elt);
        3776                 :   } else {
        3777               0 :     appendElement(elt, current->node);
        3778                 :   }
        3779               0 :   elementPushed(kNameSpaceID_MathML, popName, elt);
        3780               0 :   elementPopped(kNameSpaceID_MathML, popName, elt);
        3781               0 : }
        3782                 :
        3783                 : void
        3784               0 : nsHtml5TreeBuilder::appendVoidElementToCurrent(nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContent** form)
        3785                 : {
        3786               0 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, name, attributes, fragment ? nsnull : form);
        3787               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3788               0 :   appendElement(elt, current->node);
        3789               0 :   elementPushed(kNameSpaceID_XHTML, name, elt);
        3790               0 :   elementPopped(kNameSpaceID_XHTML, name, elt);
        3791               0 : }
        3792                 :
        3793                 : void
        3794               0 : nsHtml5TreeBuilder::appendVoidFormToCurrent(nsHtml5HtmlAttributes* attributes)
        3795                 : {
        3796               0 :   nsIContent** elt = createElement(kNameSpaceID_XHTML, nsHtml5Atoms::form, attributes);
        3797               0 :   formPointer = elt;
        3798               0 :   nsHtml5StackNode* current = stack[currentPtr];
        3799               0 :   appendElement(elt, current->node);
        3800               0 :   elementPushed(kNameSpaceID_XHTML, nsHtml5Atoms::form, elt);
        3801               0 :   elementPopped(kNameSpaceID_XHTML, nsHtml5Atoms::form, elt);
        3802               0 : }
        3803                 :
        3804                 : void
        3805               0 : nsHtml5TreeBuilder::requestSuspension()
        3806                 : {
        3807               0 :   tokenizer->requestSuspension();
        3808               0 : }
        3809                 :
        3810                 : bool
        3811             406 : nsHtml5TreeBuilder::isInForeign()
        3812                 : {
        3813             406 :   return currentPtr >= 0 && stack[currentPtr]->ns != kNameSpaceID_XHTML;
        3814                 : }
        3815                 :
        3816                 : bool
        3817             292 : nsHtml5TreeBuilder::isInForeignButNotHtmlOrMathTextIntegrationPoint()
        3818                 : {
        3819             292 :   if (currentPtr < 0) {
        3820               0 :     return false;
        3821                 :   }
        3822             292 :   return !isSpecialParentInForeign(stack[currentPtr]);
        3823                 : }
        3824                 :
        3825                 : void
        3826             216 : nsHtml5TreeBuilder::setFragmentContext(nsIAtom* context, PRInt32 ns, nsIContent** node, bool quirks)
        3827                 : {
        3828             216 :   this->contextName = context;
        3829             216 :   this->contextNamespace = ns;
        3830             216 :   this->contextNode = node;
        3831             216 :   this->fragment = (!!contextName);
        3832             216 :   this->quirks = quirks;
        3833             216 : }
        3834                 :
        3835                 : nsIContent**
        3836             264 : nsHtml5TreeBuilder::currentNode()
        3837                 : {
        3838             264 :   return stack[currentPtr]->node;
        3839                 : }
        3840                 :
        3841                 : bool
        3842               0 : nsHtml5TreeBuilder::isScriptingEnabled()
        3843                 : {
        3844               0 :   return scriptingEnabled;
        3845                 : }
        3846                 :
        3847                 : void
        3848             216 : nsHtml5TreeBuilder::setScriptingEnabled(bool scriptingEnabled)
        3849                 : {
        3850             216 :   this->scriptingEnabled = scriptingEnabled;
        3851             216 : }
        3852                 :
        3853                 : void
        3854            1342 : nsHtml5TreeBuilder::flushCharacters()
        3855                 : {
        3856            1342 :   if (charBufferLen > 0) {
        3857             264 :     if ((mode == NS_HTML5TREE_BUILDER_IN_TABLE || mode == NS_HTML5TREE_BUILDER_IN_TABLE_BODY || mode == NS_HTML5TREE_BUILDER_IN_ROW) && charBufferContainsNonWhitespace()) {
        3858               0 :       errNonSpaceInTable();
        3859               0 :       reconstructTheActiveFormattingElements();
        3860               0 :       if (!stack[currentPtr]->isFosterParenting()) {
        3861               0 :         appendCharacters(currentNode(), charBuffer, 0, charBufferLen);
        3862               0 :         charBufferLen = 0;
        3863               0 :         return;
        3864                 :       }
        3865               0 :       PRInt32 eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE);
        3866               0 :       nsHtml5StackNode* node = stack[eltPos];
        3867               0 :       nsIContent** elt = node->node;
        3868               0 :       if (!eltPos) {
        3869               0 :         appendCharacters(elt, charBuffer, 0, charBufferLen);
        3870               0 :         charBufferLen = 0;
        3871               0 :         return;
        3872                 :       }
        3873               0 :       insertFosterParentedCharacters(charBuffer, 0, charBufferLen, elt, stack[eltPos - 1]->node);
        3874               0 :       charBufferLen = 0;
        3875               0 :       return;
        3876                 :     }
        3877             264 :     appendCharacters(currentNode(), charBuffer, 0, charBufferLen);
        3878             264 :     charBufferLen = 0;
        3879                 :   }
        3880                 : }
        3881                 :
        3882                 : bool
        3883               0 : nsHtml5TreeBuilder::charBufferContainsNonWhitespace()
        3884                 : {
        3885               0 :   for (PRInt32 i = 0; i < charBufferLen; i++) {
        3886               0 :     switch(charBuffer[i]) {
        3887                 :       case ' ':
        3888                 :       case '\t':
        3889                 :       case '\n':
        3890                 :       case '\r':
        3891                 :       case '\f': {
        3892               0 :         continue;
        3893                 :       }
        3894                 :       default: {
        3895               0 :         return true;
        3896                 :       }
        3897                 :     }
        3898                 :   }
        3899               0 :   return false;
        3900                 : }
        3901                 :
        3902                 : nsAHtml5TreeBuilderState*
        3903               0 : nsHtml5TreeBuilder::newSnapshot()
        3904                 : {
        3905               0 :   jArray<nsHtml5StackNode*,PRInt32> listCopy = jArray<nsHtml5StackNode*,PRInt32>::newJArray(listPtr + 1);
        3906               0 :   for (PRInt32 i = 0; i < listCopy.length; i++) {
        3907               0 :     nsHtml5StackNode* node = listOfActiveFormattingElements[i];
        3908               0 :     if (node) {
        3909               0 :       nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, node->name, node->node, node->popName, node->attributes->cloneAttributes(nsnull));
        3910               0 :       listCopy[i] = newNode;
        3911                 :     } else {
        3912               0 :       listCopy[i] = nsnull;
        3913                 :     }
        3914                 :   }
        3915               0 :   jArray<nsHtml5StackNode*,PRInt32> stackCopy = jArray<nsHtml5StackNode*,PRInt32>::newJArray(currentPtr + 1);
        3916               0 :   for (PRInt32 i = 0; i < stackCopy.length; i++) {
        3917               0 :     nsHtml5StackNode* node = stack[i];
        3918               0 :     PRInt32 listIndex = findInListOfActiveFormattingElements(node);
        3919               0 :     if (listIndex == -1) {
        3920               0 :       nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, node->name, node->node, node->popName, nsnull);
        3921               0 :       stackCopy[i] = newNode;
        3922                 :     } else {
        3923               0 :       stackCopy[i] = listCopy[listIndex];
        3924               0 :       stackCopy[i]->retain();
        3925                 :     }
        3926                 :   }
        3927               0 :   return new nsHtml5StateSnapshot(stackCopy, listCopy, formPointer, headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, needToDropLF, quirks);
        3928                 : }
        3929                 :
        3930                 : bool
        3931               0 : nsHtml5TreeBuilder::snapshotMatches(nsAHtml5TreeBuilderState* snapshot)
        3932                 : {
        3933               0 :   jArray<nsHtml5StackNode*,PRInt32> stackCopy = snapshot->getStack();
        3934               0 :   PRInt32 stackLen = snapshot->getStackLength();
        3935               0 :   jArray<nsHtml5StackNode*,PRInt32> listCopy = snapshot->getListOfActiveFormattingElements();
        3936               0 :   PRInt32 listLen = snapshot->getListOfActiveFormattingElementsLength();
        3937               0 :   if (stackLen != currentPtr + 1 || listLen != listPtr + 1 || formPointer != snapshot->getFormPointer() || headPointer != snapshot->getHeadPointer() || deepTreeSurrogateParent != snapshot->getDeepTreeSurrogateParent() || mode != snapshot->getMode() || originalMode != snapshot->getOriginalMode() || framesetOk != snapshot->isFramesetOk() || needToDropLF != snapshot->isNeedToDropLF() || quirks != snapshot->isQuirks()) {
        3938               0 :     return false;
        3939                 :   }
        3940               0 :   for (PRInt32 i = listLen - 1; i >= 0; i--) {
        3941               0 :     if (!listCopy[i] && !listOfActiveFormattingElements[i]) {
        3942               0 :       continue;
        3943               0 :     } else if (!listCopy[i] || !listOfActiveFormattingElements[i]) {
        3944               0 :       return false;
        3945                 :     }
        3946               0 :     if (listCopy[i]->node != listOfActiveFormattingElements[i]->node) {
        3947               0 :       return false;
        3948                 :     }
        3949                 :   }
        3950               0 :   for (PRInt32 i = stackLen - 1; i >= 0; i--) {
        3951               0 :     if (stackCopy[i]->node != stack[i]->node) {
        3952               0 :       return false;
        3953                 :     }
        3954                 :   }
        3955               0 :   return true;
        3956                 : }
        3957                 :
        3958                 : void
        3959               0 : nsHtml5TreeBuilder::loadState(nsAHtml5TreeBuilderState* snapshot, nsHtml5AtomTable* interner)
        3960                 : {
        3961               0 :   jArray<nsHtml5StackNode*,PRInt32> stackCopy = snapshot->getStack();
        3962               0 :   PRInt32 stackLen = snapshot->getStackLength();
        3963               0 :   jArray<nsHtml5StackNode*,PRInt32> listCopy = snapshot->getListOfActiveFormattingElements();
        3964               0 :   PRInt32 listLen = snapshot->getListOfActiveFormattingElementsLength();
        3965               0 :   for (PRInt32 i = 0; i <= listPtr; i++) {
        3966               0 :     if (listOfActiveFormattingElements[i]) {
        3967               0 :       listOfActiveFormattingElements[i]->release();
        3968                 :     }
        3969                 :   }
        3970               0 :   if (listOfActiveFormattingElements.length < listLen) {
        3971               0 :     listOfActiveFormattingElements = jArray<nsHtml5StackNode*,PRInt32>::newJArray(listLen);
        3972                 :   }
        3973               0 :   listPtr = listLen - 1;
        3974               0 :   for (PRInt32 i = 0; i <= currentPtr; i++) {
        3975               0 :     stack[i]->release();
        3976                 :   }
        3977               0 :   if (stack.length < stackLen) {
        3978               0 :     stack = jArray<nsHtml5StackNode*,PRInt32>::newJArray(stackLen);
        3979                 :   }
        3980               0 :   currentPtr = stackLen - 1;
        3981               0 :   for (PRInt32 i = 0; i < listLen; i++) {
        3982               0 :     nsHtml5StackNode* node = listCopy[i];
        3983               0 :     if (node) {
        3984               0 :       nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, nsHtml5Portability::newLocalFromLocal(node->name, interner), node->node, nsHtml5Portability::newLocalFromLocal(node->popName, interner), node->attributes->cloneAttributes(nsnull));
        3985               0 :       listOfActiveFormattingElements[i] = newNode;
        3986                 :     } else {
        3987               0 :       listOfActiveFormattingElements[i] = nsnull;
        3988                 :     }
        3989                 :   }
        3990               0 :   for (PRInt32 i = 0; i < stackLen; i++) {
        3991               0 :     nsHtml5StackNode* node = stackCopy[i];
        3992               0 :     PRInt32 listIndex = findInArray(node, listCopy);
        3993               0 :     if (listIndex == -1) {
        3994               0 :       nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, nsHtml5Portability::newLocalFromLocal(node->name, interner), node->node, nsHtml5Portability::newLocalFromLocal(node->popName, interner), nsnull);
        3995               0 :       stack[i] = newNode;
        3996                 :     } else {
        3997               0 :       stack[i] = listOfActiveFormattingElements[listIndex];
        3998               0 :       stack[i]->retain();
        3999                 :     }
        4000                 :   }
        4001               0 :   formPointer = snapshot->getFormPointer();
        4002               0 :   headPointer = snapshot->getHeadPointer();
        4003               0 :   deepTreeSurrogateParent = snapshot->getDeepTreeSurrogateParent();
        4004               0 :   mode = snapshot->getMode();
        4005               0 :   originalMode = snapshot->getOriginalMode();
        4006               0 :   framesetOk = snapshot->isFramesetOk();
        4007               0 :   needToDropLF = snapshot->isNeedToDropLF();
        4008               0 :   quirks = snapshot->isQuirks();
        4009               0 : }
        4010                 :
        4011                 : PRInt32
        4012               0 : nsHtml5TreeBuilder::findInArray(nsHtml5StackNode* node, jArray<nsHtml5StackNode*,PRInt32> arr)
        4013                 : {
        4014               0 :   for (PRInt32 i = listPtr; i >= 0; i--) {
        4015               0 :     if (node == arr[i]) {
        4016               0 :       return i;
        4017                 :     }
        4018                 :   }
        4019               0 :   return -1;
        4020                 : }
        4021                 :
        4022                 : nsIContent**
        4023               0 : nsHtml5TreeBuilder::getFormPointer()
        4024                 : {
        4025               0 :   return formPointer;
        4026                 : }
        4027                 :
        4028                 : nsIContent**
        4029               0 : nsHtml5TreeBuilder::getHeadPointer()
        4030                 : {
        4031               0 :   return headPointer;
        4032                 : }
        4033                 :
        4034                 : nsIContent**
        4035               0 : nsHtml5TreeBuilder::getDeepTreeSurrogateParent()
        4036                 : {
        4037               0 :   return deepTreeSurrogateParent;
        4038                 : }
        4039                 :
        4040                 : jArray<nsHtml5StackNode*,PRInt32>
        4041               0 : nsHtml5TreeBuilder::getListOfActiveFormattingElements()
        4042                 : {
        4043               0 :   return listOfActiveFormattingElements;
        4044                 : }
        4045                 :
        4046                 : jArray<nsHtml5StackNode*,PRInt32>
        4047               0 : nsHtml5TreeBuilder::getStack()
        4048                 : {
        4049               0 :   return stack;
        4050                 : }
        4051                 :
        4052                 : PRInt32
        4053               0 : nsHtml5TreeBuilder::getMode()
        4054                 : {
        4055               0 :   return mode;
        4056                 : }
        4057                 :
        4058                 : PRInt32
        4059               0 : nsHtml5TreeBuilder::getOriginalMode()
        4060                 : {
        4061               0 :   return originalMode;
        4062                 : }
        4063                 :
        4064                 : bool
        4065               0 : nsHtml5TreeBuilder::isFramesetOk()
        4066                 : {
        4067               0 :   return framesetOk;
        4068                 : }
        4069                 :
        4070                 : bool
        4071               0 : nsHtml5TreeBuilder::isNeedToDropLF()
        4072                 : {
        4073               0 :   return needToDropLF;
        4074                 : }
        4075                 :
        4076                 : bool
        4077               0 : nsHtml5TreeBuilder::isQuirks()
        4078                 : {
        4079               0 :   return quirks;
        4080                 : }
        4081                 :
        4082                 : PRInt32
        4083               0 : nsHtml5TreeBuilder::getListOfActiveFormattingElementsLength()
        4084                 : {
        4085               0 :   return listPtr + 1;
        4086                 : }
        4087                 :
        4088                 : PRInt32
        4089               0 : nsHtml5TreeBuilder::getStackLength()
        4090                 : {
        4091               0 :   return currentPtr + 1;
        4092                 : }
        4093                 :
        4094                 : void
        4095            1365 : nsHtml5TreeBuilder::initializeStatics()
        4096                 : {
        4097            1365 : }
        4098                 :
        4099                 : void
        4100            1364 : nsHtml5TreeBuilder::releaseStatics()
        4101                 : {
        4102            1364 : }
        4103                 :
        4104                 :
        4105                 : #include "nsHtml5TreeBuilderCppSupplement.h"
        4106                 :

Generated by: LCOV version 1.7