1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/parser/html/nsHtml5TreeBuilder.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,4438 @@ 1.4 +/* 1.5 + * Copyright (c) 2007 Henri Sivonen 1.6 + * Copyright (c) 2007-2011 Mozilla Foundation 1.7 + * Portions of comments Copyright 2004-2008 Apple Computer, Inc., Mozilla 1.8 + * Foundation, and Opera Software ASA. 1.9 + * 1.10 + * Permission is hereby granted, free of charge, to any person obtaining a 1.11 + * copy of this software and associated documentation files (the "Software"), 1.12 + * to deal in the Software without restriction, including without limitation 1.13 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1.14 + * and/or sell copies of the Software, and to permit persons to whom the 1.15 + * Software is furnished to do so, subject to the following conditions: 1.16 + * 1.17 + * The above copyright notice and this permission notice shall be included in 1.18 + * all copies or substantial portions of the Software. 1.19 + * 1.20 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1.21 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1.22 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1.23 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1.24 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 1.25 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 1.26 + * DEALINGS IN THE SOFTWARE. 1.27 + */ 1.28 + 1.29 +/* 1.30 + * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT. 1.31 + * Please edit TreeBuilder.java instead and regenerate. 1.32 + */ 1.33 + 1.34 +#define nsHtml5TreeBuilder_cpp__ 1.35 + 1.36 +#include "nsContentUtils.h" 1.37 +#include "nsIAtom.h" 1.38 +#include "nsHtml5AtomTable.h" 1.39 +#include "nsITimer.h" 1.40 +#include "nsString.h" 1.41 +#include "nsNameSpaceManager.h" 1.42 +#include "nsIContent.h" 1.43 +#include "nsTraceRefcnt.h" 1.44 +#include "jArray.h" 1.45 +#include "nsHtml5DocumentMode.h" 1.46 +#include "nsHtml5ArrayCopy.h" 1.47 +#include "nsHtml5Parser.h" 1.48 +#include "nsHtml5Atoms.h" 1.49 +#include "nsHtml5TreeOperation.h" 1.50 +#include "nsHtml5PendingNotification.h" 1.51 +#include "nsHtml5StateSnapshot.h" 1.52 +#include "nsHtml5StackNode.h" 1.53 +#include "nsHtml5TreeOpExecutor.h" 1.54 +#include "nsHtml5StreamParser.h" 1.55 +#include "nsAHtml5TreeBuilderState.h" 1.56 +#include "nsHtml5Highlighter.h" 1.57 +#include "nsHtml5PlainTextUtils.h" 1.58 +#include "nsHtml5ViewSourceUtils.h" 1.59 +#include "mozilla/Likely.h" 1.60 +#include "nsIContentHandle.h" 1.61 +#include "nsHtml5OplessBuilder.h" 1.62 + 1.63 +#include "nsHtml5Tokenizer.h" 1.64 +#include "nsHtml5MetaScanner.h" 1.65 +#include "nsHtml5AttributeName.h" 1.66 +#include "nsHtml5ElementName.h" 1.67 +#include "nsHtml5HtmlAttributes.h" 1.68 +#include "nsHtml5StackNode.h" 1.69 +#include "nsHtml5UTF16Buffer.h" 1.70 +#include "nsHtml5StateSnapshot.h" 1.71 +#include "nsHtml5Portability.h" 1.72 + 1.73 +#include "nsHtml5TreeBuilder.h" 1.74 + 1.75 +char16_t nsHtml5TreeBuilder::REPLACEMENT_CHARACTER[] = { 0xfffd }; 1.76 +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//" }; 1.77 +staticJArray<const char*,int32_t> nsHtml5TreeBuilder::QUIRKY_PUBLIC_IDS = { QUIRKY_PUBLIC_IDS_DATA, MOZ_ARRAY_LENGTH(QUIRKY_PUBLIC_IDS_DATA) }; 1.78 +void 1.79 +nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self) 1.80 +{ 1.81 + tokenizer = self; 1.82 + stack = jArray<nsHtml5StackNode*,int32_t>::newJArray(64); 1.83 + templateModeStack = jArray<int32_t,int32_t>::newJArray(64); 1.84 + listOfActiveFormattingElements = jArray<nsHtml5StackNode*,int32_t>::newJArray(64); 1.85 + needToDropLF = false; 1.86 + originalMode = NS_HTML5TREE_BUILDER_INITIAL; 1.87 + templateModePtr = -1; 1.88 + currentPtr = -1; 1.89 + listPtr = -1; 1.90 + formPointer = nullptr; 1.91 + headPointer = nullptr; 1.92 + deepTreeSurrogateParent = nullptr; 1.93 + start(fragment); 1.94 + charBufferLen = 0; 1.95 + charBuffer = jArray<char16_t,int32_t>::newJArray(1024); 1.96 + framesetOk = true; 1.97 + if (fragment) { 1.98 + nsIContentHandle* elt; 1.99 + if (contextNode) { 1.100 + elt = contextNode; 1.101 + } else { 1.102 + elt = createHtmlElementSetAsRoot(tokenizer->emptyAttributes()); 1.103 + } 1.104 + nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_HTML, elt); 1.105 + currentPtr++; 1.106 + stack[currentPtr] = node; 1.107 + if (nsHtml5Atoms::template_ == contextName) { 1.108 + pushTemplateMode(NS_HTML5TREE_BUILDER_IN_TEMPLATE); 1.109 + } 1.110 + resetTheInsertionMode(); 1.111 + formPointer = getFormPointerForContext(contextNode); 1.112 + if (nsHtml5Atoms::title == contextName || nsHtml5Atoms::textarea == contextName) { 1.113 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, contextName); 1.114 + } else if (nsHtml5Atoms::style == contextName || nsHtml5Atoms::xmp == contextName || nsHtml5Atoms::iframe == contextName || nsHtml5Atoms::noembed == contextName || nsHtml5Atoms::noframes == contextName || (scriptingEnabled && nsHtml5Atoms::noscript == contextName)) { 1.115 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, contextName); 1.116 + } else if (nsHtml5Atoms::plaintext == contextName) { 1.117 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_PLAINTEXT, contextName); 1.118 + } else if (nsHtml5Atoms::script == contextName) { 1.119 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, contextName); 1.120 + } else { 1.121 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_DATA, contextName); 1.122 + } 1.123 + contextName = nullptr; 1.124 + contextNode = nullptr; 1.125 + } else { 1.126 + mode = NS_HTML5TREE_BUILDER_INITIAL; 1.127 + if (tokenizer->isViewingXmlSource()) { 1.128 + nsIContentHandle* elt = createElement(kNameSpaceID_SVG, nsHtml5Atoms::svg, tokenizer->emptyAttributes()); 1.129 + nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_SVG, nsHtml5Atoms::svg, elt); 1.130 + currentPtr++; 1.131 + stack[currentPtr] = node; 1.132 + } 1.133 + } 1.134 +} 1.135 + 1.136 +void 1.137 +nsHtml5TreeBuilder::doctype(nsIAtom* name, nsString* publicIdentifier, nsString* systemIdentifier, bool forceQuirks) 1.138 +{ 1.139 + needToDropLF = false; 1.140 + if (!isInForeign() && mode == NS_HTML5TREE_BUILDER_INITIAL) { 1.141 + nsString* emptyString = nsHtml5Portability::newEmptyString(); 1.142 + appendDoctypeToDocument(!name ? nsHtml5Atoms::emptystring : name, !publicIdentifier ? emptyString : publicIdentifier, !systemIdentifier ? emptyString : systemIdentifier); 1.143 + nsHtml5Portability::releaseString(emptyString); 1.144 + if (isQuirky(name, publicIdentifier, systemIdentifier, forceQuirks)) { 1.145 + errQuirkyDoctype(); 1.146 + documentModeInternal(QUIRKS_MODE, publicIdentifier, systemIdentifier, false); 1.147 + } else if (isAlmostStandards(publicIdentifier, systemIdentifier)) { 1.148 + errAlmostStandardsDoctype(); 1.149 + documentModeInternal(ALMOST_STANDARDS_MODE, publicIdentifier, systemIdentifier, false); 1.150 + } else { 1.151 + documentModeInternal(STANDARDS_MODE, publicIdentifier, systemIdentifier, false); 1.152 + } 1.153 + mode = NS_HTML5TREE_BUILDER_BEFORE_HTML; 1.154 + return; 1.155 + } 1.156 + errStrayDoctype(); 1.157 + return; 1.158 +} 1.159 + 1.160 +void 1.161 +nsHtml5TreeBuilder::comment(char16_t* buf, int32_t start, int32_t length) 1.162 +{ 1.163 + needToDropLF = false; 1.164 + if (!isInForeign()) { 1.165 + switch(mode) { 1.166 + case NS_HTML5TREE_BUILDER_INITIAL: 1.167 + case NS_HTML5TREE_BUILDER_BEFORE_HTML: 1.168 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: 1.169 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: { 1.170 + appendCommentToDocument(buf, start, length); 1.171 + return; 1.172 + } 1.173 + case NS_HTML5TREE_BUILDER_AFTER_BODY: { 1.174 + flushCharacters(); 1.175 + appendComment(stack[0]->node, buf, start, length); 1.176 + return; 1.177 + } 1.178 + default: { 1.179 + break; 1.180 + } 1.181 + } 1.182 + } 1.183 + flushCharacters(); 1.184 + appendComment(stack[currentPtr]->node, buf, start, length); 1.185 + return; 1.186 +} 1.187 + 1.188 +void 1.189 +nsHtml5TreeBuilder::characters(const char16_t* buf, int32_t start, int32_t length) 1.190 +{ 1.191 + if (tokenizer->isViewingXmlSource()) { 1.192 + return; 1.193 + } 1.194 + if (needToDropLF) { 1.195 + needToDropLF = false; 1.196 + if (buf[start] == '\n') { 1.197 + start++; 1.198 + length--; 1.199 + if (!length) { 1.200 + return; 1.201 + } 1.202 + } 1.203 + } 1.204 + switch(mode) { 1.205 + case NS_HTML5TREE_BUILDER_IN_BODY: 1.206 + case NS_HTML5TREE_BUILDER_IN_CELL: 1.207 + case NS_HTML5TREE_BUILDER_IN_CAPTION: { 1.208 + if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) { 1.209 + reconstructTheActiveFormattingElements(); 1.210 + } 1.211 + } 1.212 + case NS_HTML5TREE_BUILDER_TEXT: { 1.213 + accumulateCharacters(buf, start, length); 1.214 + return; 1.215 + } 1.216 + case NS_HTML5TREE_BUILDER_IN_TABLE: 1.217 + case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: 1.218 + case NS_HTML5TREE_BUILDER_IN_ROW: { 1.219 + accumulateCharactersForced(buf, start, length); 1.220 + return; 1.221 + } 1.222 + default: { 1.223 + int32_t end = start + length; 1.224 + for (int32_t i = start; i < end; i++) { 1.225 + switch(buf[i]) { 1.226 + case ' ': 1.227 + case '\t': 1.228 + case '\n': 1.229 + case '\r': 1.230 + case '\f': { 1.231 + switch(mode) { 1.232 + case NS_HTML5TREE_BUILDER_INITIAL: 1.233 + case NS_HTML5TREE_BUILDER_BEFORE_HTML: 1.234 + case NS_HTML5TREE_BUILDER_BEFORE_HEAD: { 1.235 + start = i + 1; 1.236 + continue; 1.237 + } 1.238 + case NS_HTML5TREE_BUILDER_IN_HEAD: 1.239 + case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: 1.240 + case NS_HTML5TREE_BUILDER_AFTER_HEAD: 1.241 + case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: 1.242 + case NS_HTML5TREE_BUILDER_IN_FRAMESET: 1.243 + case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: { 1.244 + continue; 1.245 + } 1.246 + case NS_HTML5TREE_BUILDER_FRAMESET_OK: 1.247 + case NS_HTML5TREE_BUILDER_IN_TEMPLATE: 1.248 + case NS_HTML5TREE_BUILDER_IN_BODY: 1.249 + case NS_HTML5TREE_BUILDER_IN_CELL: 1.250 + case NS_HTML5TREE_BUILDER_IN_CAPTION: { 1.251 + if (start < i) { 1.252 + accumulateCharacters(buf, start, i - start); 1.253 + start = i; 1.254 + } 1.255 + if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) { 1.256 + flushCharacters(); 1.257 + reconstructTheActiveFormattingElements(); 1.258 + } 1.259 + NS_HTML5_BREAK(charactersloop); 1.260 + } 1.261 + case NS_HTML5TREE_BUILDER_IN_SELECT: 1.262 + case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: { 1.263 + NS_HTML5_BREAK(charactersloop); 1.264 + } 1.265 + case NS_HTML5TREE_BUILDER_IN_TABLE: 1.266 + case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: 1.267 + case NS_HTML5TREE_BUILDER_IN_ROW: { 1.268 + accumulateCharactersForced(buf, i, 1); 1.269 + start = i + 1; 1.270 + continue; 1.271 + } 1.272 + case NS_HTML5TREE_BUILDER_AFTER_BODY: 1.273 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: 1.274 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: { 1.275 + if (start < i) { 1.276 + accumulateCharacters(buf, start, i - start); 1.277 + start = i; 1.278 + } 1.279 + flushCharacters(); 1.280 + reconstructTheActiveFormattingElements(); 1.281 + continue; 1.282 + } 1.283 + } 1.284 + } 1.285 + default: { 1.286 + switch(mode) { 1.287 + case NS_HTML5TREE_BUILDER_INITIAL: { 1.288 + documentModeInternal(QUIRKS_MODE, nullptr, nullptr, false); 1.289 + mode = NS_HTML5TREE_BUILDER_BEFORE_HTML; 1.290 + i--; 1.291 + continue; 1.292 + } 1.293 + case NS_HTML5TREE_BUILDER_BEFORE_HTML: { 1.294 + appendHtmlElementToDocumentAndPush(); 1.295 + mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD; 1.296 + i--; 1.297 + continue; 1.298 + } 1.299 + case NS_HTML5TREE_BUILDER_BEFORE_HEAD: { 1.300 + if (start < i) { 1.301 + accumulateCharacters(buf, start, i - start); 1.302 + start = i; 1.303 + } 1.304 + flushCharacters(); 1.305 + appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.306 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.307 + i--; 1.308 + continue; 1.309 + } 1.310 + case NS_HTML5TREE_BUILDER_IN_HEAD: { 1.311 + if (start < i) { 1.312 + accumulateCharacters(buf, start, i - start); 1.313 + start = i; 1.314 + } 1.315 + flushCharacters(); 1.316 + pop(); 1.317 + mode = NS_HTML5TREE_BUILDER_AFTER_HEAD; 1.318 + i--; 1.319 + continue; 1.320 + } 1.321 + case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: { 1.322 + if (start < i) { 1.323 + accumulateCharacters(buf, start, i - start); 1.324 + start = i; 1.325 + } 1.326 + errNonSpaceInNoscriptInHead(); 1.327 + flushCharacters(); 1.328 + pop(); 1.329 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.330 + i--; 1.331 + continue; 1.332 + } 1.333 + case NS_HTML5TREE_BUILDER_AFTER_HEAD: { 1.334 + if (start < i) { 1.335 + accumulateCharacters(buf, start, i - start); 1.336 + start = i; 1.337 + } 1.338 + flushCharacters(); 1.339 + appendToCurrentNodeAndPushBodyElement(); 1.340 + mode = NS_HTML5TREE_BUILDER_FRAMESET_OK; 1.341 + i--; 1.342 + continue; 1.343 + } 1.344 + case NS_HTML5TREE_BUILDER_FRAMESET_OK: { 1.345 + framesetOk = false; 1.346 + mode = NS_HTML5TREE_BUILDER_IN_BODY; 1.347 + i--; 1.348 + continue; 1.349 + } 1.350 + case NS_HTML5TREE_BUILDER_IN_TEMPLATE: 1.351 + case NS_HTML5TREE_BUILDER_IN_BODY: 1.352 + case NS_HTML5TREE_BUILDER_IN_CELL: 1.353 + case NS_HTML5TREE_BUILDER_IN_CAPTION: { 1.354 + if (start < i) { 1.355 + accumulateCharacters(buf, start, i - start); 1.356 + start = i; 1.357 + } 1.358 + if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) { 1.359 + flushCharacters(); 1.360 + reconstructTheActiveFormattingElements(); 1.361 + } 1.362 + NS_HTML5_BREAK(charactersloop); 1.363 + } 1.364 + case NS_HTML5TREE_BUILDER_IN_TABLE: 1.365 + case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: 1.366 + case NS_HTML5TREE_BUILDER_IN_ROW: { 1.367 + accumulateCharactersForced(buf, i, 1); 1.368 + start = i + 1; 1.369 + continue; 1.370 + } 1.371 + case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: { 1.372 + if (start < i) { 1.373 + accumulateCharacters(buf, start, i - start); 1.374 + start = i; 1.375 + } 1.376 + if (!currentPtr || stack[currentPtr]->getGroup() == NS_HTML5TREE_BUILDER_TEMPLATE) { 1.377 + errNonSpaceInColgroupInFragment(); 1.378 + start = i + 1; 1.379 + continue; 1.380 + } 1.381 + flushCharacters(); 1.382 + pop(); 1.383 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.384 + i--; 1.385 + continue; 1.386 + } 1.387 + case NS_HTML5TREE_BUILDER_IN_SELECT: 1.388 + case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: { 1.389 + NS_HTML5_BREAK(charactersloop); 1.390 + } 1.391 + case NS_HTML5TREE_BUILDER_AFTER_BODY: { 1.392 + errNonSpaceAfterBody(); 1.393 + 1.394 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.395 + i--; 1.396 + continue; 1.397 + } 1.398 + case NS_HTML5TREE_BUILDER_IN_FRAMESET: { 1.399 + if (start < i) { 1.400 + accumulateCharacters(buf, start, i - start); 1.401 + start = i; 1.402 + } 1.403 + errNonSpaceInFrameset(); 1.404 + start = i + 1; 1.405 + continue; 1.406 + } 1.407 + case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: { 1.408 + if (start < i) { 1.409 + accumulateCharacters(buf, start, i - start); 1.410 + start = i; 1.411 + } 1.412 + errNonSpaceAfterFrameset(); 1.413 + start = i + 1; 1.414 + continue; 1.415 + } 1.416 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: { 1.417 + errNonSpaceInTrailer(); 1.418 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.419 + i--; 1.420 + continue; 1.421 + } 1.422 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: { 1.423 + errNonSpaceInTrailer(); 1.424 + mode = NS_HTML5TREE_BUILDER_IN_FRAMESET; 1.425 + i--; 1.426 + continue; 1.427 + } 1.428 + } 1.429 + } 1.430 + } 1.431 + } 1.432 + charactersloop_end: ; 1.433 + if (start < end) { 1.434 + accumulateCharacters(buf, start, end - start); 1.435 + } 1.436 + } 1.437 + } 1.438 +} 1.439 + 1.440 +void 1.441 +nsHtml5TreeBuilder::zeroOriginatingReplacementCharacter() 1.442 +{ 1.443 + if (mode == NS_HTML5TREE_BUILDER_TEXT) { 1.444 + accumulateCharacters(REPLACEMENT_CHARACTER, 0, 1); 1.445 + return; 1.446 + } 1.447 + if (currentPtr >= 0) { 1.448 + if (isSpecialParentInForeign(stack[currentPtr])) { 1.449 + return; 1.450 + } 1.451 + accumulateCharacters(REPLACEMENT_CHARACTER, 0, 1); 1.452 + } 1.453 +} 1.454 + 1.455 +void 1.456 +nsHtml5TreeBuilder::eof() 1.457 +{ 1.458 + flushCharacters(); 1.459 + for (; ; ) { 1.460 + switch(mode) { 1.461 + case NS_HTML5TREE_BUILDER_INITIAL: { 1.462 + documentModeInternal(QUIRKS_MODE, nullptr, nullptr, false); 1.463 + mode = NS_HTML5TREE_BUILDER_BEFORE_HTML; 1.464 + continue; 1.465 + } 1.466 + case NS_HTML5TREE_BUILDER_BEFORE_HTML: { 1.467 + appendHtmlElementToDocumentAndPush(); 1.468 + mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD; 1.469 + continue; 1.470 + } 1.471 + case NS_HTML5TREE_BUILDER_BEFORE_HEAD: { 1.472 + appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.473 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.474 + continue; 1.475 + } 1.476 + case NS_HTML5TREE_BUILDER_IN_HEAD: { 1.477 + while (currentPtr > 0) { 1.478 + popOnEof(); 1.479 + } 1.480 + mode = NS_HTML5TREE_BUILDER_AFTER_HEAD; 1.481 + continue; 1.482 + } 1.483 + case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: { 1.484 + while (currentPtr > 1) { 1.485 + popOnEof(); 1.486 + } 1.487 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.488 + continue; 1.489 + } 1.490 + case NS_HTML5TREE_BUILDER_AFTER_HEAD: { 1.491 + appendToCurrentNodeAndPushBodyElement(); 1.492 + mode = NS_HTML5TREE_BUILDER_IN_BODY; 1.493 + continue; 1.494 + } 1.495 + case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: 1.496 + case NS_HTML5TREE_BUILDER_IN_ROW: 1.497 + case NS_HTML5TREE_BUILDER_IN_TABLE: 1.498 + case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: 1.499 + case NS_HTML5TREE_BUILDER_IN_SELECT: 1.500 + case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: 1.501 + case NS_HTML5TREE_BUILDER_FRAMESET_OK: 1.502 + case NS_HTML5TREE_BUILDER_IN_CAPTION: 1.503 + case NS_HTML5TREE_BUILDER_IN_CELL: 1.504 + case NS_HTML5TREE_BUILDER_IN_BODY: { 1.505 + if (isTemplateModeStackEmpty()) { 1.506 + NS_HTML5_BREAK(eofloop); 1.507 + } 1.508 + } 1.509 + case NS_HTML5TREE_BUILDER_IN_TEMPLATE: { 1.510 + int32_t eltPos = findLast(nsHtml5Atoms::template_); 1.511 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.512 + MOZ_ASSERT(fragment); 1.513 + NS_HTML5_BREAK(eofloop); 1.514 + } 1.515 + if (MOZ_UNLIKELY(mViewSource)) { 1.516 + errUnclosedElements(eltPos, nsHtml5Atoms::template_); 1.517 + } 1.518 + while (currentPtr >= eltPos) { 1.519 + pop(); 1.520 + } 1.521 + clearTheListOfActiveFormattingElementsUpToTheLastMarker(); 1.522 + popTemplateMode(); 1.523 + resetTheInsertionMode(); 1.524 + continue; 1.525 + } 1.526 + case NS_HTML5TREE_BUILDER_TEXT: { 1.527 + if (originalMode == NS_HTML5TREE_BUILDER_AFTER_HEAD) { 1.528 + popOnEof(); 1.529 + } 1.530 + popOnEof(); 1.531 + mode = originalMode; 1.532 + continue; 1.533 + } 1.534 + case NS_HTML5TREE_BUILDER_IN_FRAMESET: { 1.535 + NS_HTML5_BREAK(eofloop); 1.536 + } 1.537 + case NS_HTML5TREE_BUILDER_AFTER_BODY: 1.538 + case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: 1.539 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: 1.540 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: 1.541 + default: { 1.542 + NS_HTML5_BREAK(eofloop); 1.543 + } 1.544 + } 1.545 + } 1.546 + eofloop_end: ; 1.547 + while (currentPtr > 0) { 1.548 + popOnEof(); 1.549 + } 1.550 + if (!fragment) { 1.551 + popOnEof(); 1.552 + } 1.553 +} 1.554 + 1.555 +void 1.556 +nsHtml5TreeBuilder::endTokenization() 1.557 +{ 1.558 + formPointer = nullptr; 1.559 + headPointer = nullptr; 1.560 + deepTreeSurrogateParent = nullptr; 1.561 + templateModeStack = nullptr; 1.562 + if (stack) { 1.563 + while (currentPtr > -1) { 1.564 + stack[currentPtr]->release(); 1.565 + currentPtr--; 1.566 + } 1.567 + stack = nullptr; 1.568 + } 1.569 + if (listOfActiveFormattingElements) { 1.570 + while (listPtr > -1) { 1.571 + if (listOfActiveFormattingElements[listPtr]) { 1.572 + listOfActiveFormattingElements[listPtr]->release(); 1.573 + } 1.574 + listPtr--; 1.575 + } 1.576 + listOfActiveFormattingElements = nullptr; 1.577 + } 1.578 + charBuffer = nullptr; 1.579 + end(); 1.580 +} 1.581 + 1.582 +void 1.583 +nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, bool selfClosing) 1.584 +{ 1.585 + flushCharacters(); 1.586 + int32_t eltPos; 1.587 + needToDropLF = false; 1.588 + starttagloop: for (; ; ) { 1.589 + int32_t group = elementName->getGroup(); 1.590 + nsIAtom* name = elementName->name; 1.591 + if (isInForeign()) { 1.592 + nsHtml5StackNode* currentNode = stack[currentPtr]; 1.593 + int32_t currNs = currentNode->ns; 1.594 + 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))))) { 1.595 + switch(group) { 1.596 + 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: 1.597 + case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU: 1.598 + case NS_HTML5TREE_BUILDER_BODY: 1.599 + case NS_HTML5TREE_BUILDER_BR: 1.600 + case NS_HTML5TREE_BUILDER_RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR: 1.601 + case NS_HTML5TREE_BUILDER_DD_OR_DT: 1.602 + case NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL: 1.603 + case NS_HTML5TREE_BUILDER_EMBED: 1.604 + case NS_HTML5TREE_BUILDER_IMG: 1.605 + case NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6: 1.606 + case NS_HTML5TREE_BUILDER_HEAD: 1.607 + case NS_HTML5TREE_BUILDER_HR: 1.608 + case NS_HTML5TREE_BUILDER_LI: 1.609 + case NS_HTML5TREE_BUILDER_META: 1.610 + case NS_HTML5TREE_BUILDER_NOBR: 1.611 + case NS_HTML5TREE_BUILDER_P: 1.612 + case NS_HTML5TREE_BUILDER_PRE_OR_LISTING: 1.613 + case NS_HTML5TREE_BUILDER_TABLE: { 1.614 + errHtmlStartTagInForeignContext(name); 1.615 + while (!isSpecialParentInForeign(stack[currentPtr])) { 1.616 + pop(); 1.617 + } 1.618 + NS_HTML5_CONTINUE(starttagloop); 1.619 + } 1.620 + case NS_HTML5TREE_BUILDER_FONT: { 1.621 + if (attributes->contains(nsHtml5AttributeName::ATTR_COLOR) || attributes->contains(nsHtml5AttributeName::ATTR_FACE) || attributes->contains(nsHtml5AttributeName::ATTR_SIZE)) { 1.622 + errHtmlStartTagInForeignContext(name); 1.623 + while (!isSpecialParentInForeign(stack[currentPtr])) { 1.624 + pop(); 1.625 + } 1.626 + NS_HTML5_CONTINUE(starttagloop); 1.627 + } 1.628 + } 1.629 + default: { 1.630 + if (kNameSpaceID_SVG == currNs) { 1.631 + attributes->adjustForSvg(); 1.632 + if (selfClosing) { 1.633 + appendVoidElementToCurrentMayFosterSVG(elementName, attributes); 1.634 + selfClosing = false; 1.635 + } else { 1.636 + appendToCurrentNodeAndPushElementMayFosterSVG(elementName, attributes); 1.637 + } 1.638 + attributes = nullptr; 1.639 + NS_HTML5_BREAK(starttagloop); 1.640 + } else { 1.641 + attributes->adjustForMath(); 1.642 + if (selfClosing) { 1.643 + appendVoidElementToCurrentMayFosterMathML(elementName, attributes); 1.644 + selfClosing = false; 1.645 + } else { 1.646 + appendToCurrentNodeAndPushElementMayFosterMathML(elementName, attributes); 1.647 + } 1.648 + attributes = nullptr; 1.649 + NS_HTML5_BREAK(starttagloop); 1.650 + } 1.651 + } 1.652 + } 1.653 + } 1.654 + } 1.655 + switch(mode) { 1.656 + case NS_HTML5TREE_BUILDER_IN_TEMPLATE: { 1.657 + switch(group) { 1.658 + case NS_HTML5TREE_BUILDER_COL: { 1.659 + popTemplateMode(); 1.660 + pushTemplateMode(NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP); 1.661 + mode = NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP; 1.662 + continue; 1.663 + } 1.664 + case NS_HTML5TREE_BUILDER_CAPTION: 1.665 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.666 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: { 1.667 + popTemplateMode(); 1.668 + pushTemplateMode(NS_HTML5TREE_BUILDER_IN_TABLE); 1.669 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.670 + continue; 1.671 + } 1.672 + case NS_HTML5TREE_BUILDER_TR: { 1.673 + popTemplateMode(); 1.674 + pushTemplateMode(NS_HTML5TREE_BUILDER_IN_TABLE_BODY); 1.675 + mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY; 1.676 + continue; 1.677 + } 1.678 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.679 + popTemplateMode(); 1.680 + pushTemplateMode(NS_HTML5TREE_BUILDER_IN_ROW); 1.681 + mode = NS_HTML5TREE_BUILDER_IN_ROW; 1.682 + continue; 1.683 + } 1.684 + case NS_HTML5TREE_BUILDER_META: { 1.685 + checkMetaCharset(attributes); 1.686 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.687 + selfClosing = false; 1.688 + attributes = nullptr; 1.689 + NS_HTML5_BREAK(starttagloop); 1.690 + } 1.691 + case NS_HTML5TREE_BUILDER_TITLE: { 1.692 + startTagTitleInHead(elementName, attributes); 1.693 + attributes = nullptr; 1.694 + NS_HTML5_BREAK(starttagloop); 1.695 + } 1.696 + case NS_HTML5TREE_BUILDER_BASE: 1.697 + case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: { 1.698 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.699 + selfClosing = false; 1.700 + attributes = nullptr; 1.701 + NS_HTML5_BREAK(starttagloop); 1.702 + } 1.703 + case NS_HTML5TREE_BUILDER_SCRIPT: { 1.704 + startTagScriptInHead(elementName, attributes); 1.705 + attributes = nullptr; 1.706 + NS_HTML5_BREAK(starttagloop); 1.707 + } 1.708 + case NS_HTML5TREE_BUILDER_NOFRAMES: 1.709 + case NS_HTML5TREE_BUILDER_STYLE: { 1.710 + startTagGenericRawText(elementName, attributes); 1.711 + attributes = nullptr; 1.712 + NS_HTML5_BREAK(starttagloop); 1.713 + } 1.714 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.715 + startTagTemplateInHead(elementName, attributes); 1.716 + attributes = nullptr; 1.717 + NS_HTML5_BREAK(starttagloop); 1.718 + } 1.719 + default: { 1.720 + popTemplateMode(); 1.721 + pushTemplateMode(NS_HTML5TREE_BUILDER_IN_BODY); 1.722 + mode = NS_HTML5TREE_BUILDER_IN_BODY; 1.723 + continue; 1.724 + } 1.725 + } 1.726 + } 1.727 + case NS_HTML5TREE_BUILDER_IN_ROW: { 1.728 + switch(group) { 1.729 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.730 + clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TR)); 1.731 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.732 + mode = NS_HTML5TREE_BUILDER_IN_CELL; 1.733 + insertMarker(); 1.734 + attributes = nullptr; 1.735 + NS_HTML5_BREAK(starttagloop); 1.736 + } 1.737 + case NS_HTML5TREE_BUILDER_CAPTION: 1.738 + case NS_HTML5TREE_BUILDER_COL: 1.739 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.740 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.741 + case NS_HTML5TREE_BUILDER_TR: { 1.742 + eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TR); 1.743 + if (!eltPos) { 1.744 + MOZ_ASSERT(fragment || isTemplateContents()); 1.745 + errNoTableRowToClose(); 1.746 + NS_HTML5_BREAK(starttagloop); 1.747 + } 1.748 + clearStackBackTo(eltPos); 1.749 + pop(); 1.750 + mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY; 1.751 + continue; 1.752 + } 1.753 + default: 1.754 + ; // fall through 1.755 + } 1.756 + } 1.757 + case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: { 1.758 + switch(group) { 1.759 + case NS_HTML5TREE_BUILDER_TR: { 1.760 + clearStackBackTo(findLastInTableScopeOrRootTemplateTbodyTheadTfoot()); 1.761 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.762 + mode = NS_HTML5TREE_BUILDER_IN_ROW; 1.763 + attributes = nullptr; 1.764 + NS_HTML5_BREAK(starttagloop); 1.765 + } 1.766 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.767 + errStartTagInTableBody(name); 1.768 + clearStackBackTo(findLastInTableScopeOrRootTemplateTbodyTheadTfoot()); 1.769 + appendToCurrentNodeAndPushElement(nsHtml5ElementName::ELT_TR, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.770 + mode = NS_HTML5TREE_BUILDER_IN_ROW; 1.771 + continue; 1.772 + } 1.773 + case NS_HTML5TREE_BUILDER_CAPTION: 1.774 + case NS_HTML5TREE_BUILDER_COL: 1.775 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.776 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: { 1.777 + eltPos = findLastInTableScopeOrRootTemplateTbodyTheadTfoot(); 1.778 + if (!eltPos || stack[eltPos]->getGroup() == NS_HTML5TREE_BUILDER_TEMPLATE) { 1.779 + MOZ_ASSERT(fragment || isTemplateContents()); 1.780 + errStrayStartTag(name); 1.781 + NS_HTML5_BREAK(starttagloop); 1.782 + } else { 1.783 + clearStackBackTo(eltPos); 1.784 + pop(); 1.785 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.786 + continue; 1.787 + } 1.788 + } 1.789 + default: 1.790 + ; // fall through 1.791 + } 1.792 + } 1.793 + case NS_HTML5TREE_BUILDER_IN_TABLE: { 1.794 + for (; ; ) { 1.795 + switch(group) { 1.796 + case NS_HTML5TREE_BUILDER_CAPTION: { 1.797 + clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE)); 1.798 + insertMarker(); 1.799 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.800 + mode = NS_HTML5TREE_BUILDER_IN_CAPTION; 1.801 + attributes = nullptr; 1.802 + NS_HTML5_BREAK(starttagloop); 1.803 + } 1.804 + case NS_HTML5TREE_BUILDER_COLGROUP: { 1.805 + clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE)); 1.806 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.807 + mode = NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP; 1.808 + attributes = nullptr; 1.809 + NS_HTML5_BREAK(starttagloop); 1.810 + } 1.811 + case NS_HTML5TREE_BUILDER_COL: { 1.812 + clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE)); 1.813 + appendToCurrentNodeAndPushElement(nsHtml5ElementName::ELT_COLGROUP, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.814 + mode = NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP; 1.815 + NS_HTML5_CONTINUE(starttagloop); 1.816 + } 1.817 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: { 1.818 + clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE)); 1.819 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.820 + mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY; 1.821 + attributes = nullptr; 1.822 + NS_HTML5_BREAK(starttagloop); 1.823 + } 1.824 + case NS_HTML5TREE_BUILDER_TR: 1.825 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.826 + clearStackBackTo(findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE)); 1.827 + appendToCurrentNodeAndPushElement(nsHtml5ElementName::ELT_TBODY, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.828 + mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY; 1.829 + NS_HTML5_CONTINUE(starttagloop); 1.830 + } 1.831 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.832 + NS_HTML5_BREAK(intableloop); 1.833 + } 1.834 + case NS_HTML5TREE_BUILDER_TABLE: { 1.835 + errTableSeenWhileTableOpen(); 1.836 + eltPos = findLastInTableScope(name); 1.837 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.838 + MOZ_ASSERT(fragment || isTemplateContents()); 1.839 + NS_HTML5_BREAK(starttagloop); 1.840 + } 1.841 + generateImpliedEndTags(); 1.842 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(nsHtml5Atoms::table)) { 1.843 + errNoCheckUnclosedElementsOnStack(); 1.844 + } 1.845 + while (currentPtr >= eltPos) { 1.846 + pop(); 1.847 + } 1.848 + resetTheInsertionMode(); 1.849 + NS_HTML5_CONTINUE(starttagloop); 1.850 + } 1.851 + case NS_HTML5TREE_BUILDER_SCRIPT: { 1.852 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.853 + originalMode = mode; 1.854 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.855 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, elementName); 1.856 + attributes = nullptr; 1.857 + NS_HTML5_BREAK(starttagloop); 1.858 + } 1.859 + case NS_HTML5TREE_BUILDER_STYLE: { 1.860 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.861 + originalMode = mode; 1.862 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.863 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName); 1.864 + attributes = nullptr; 1.865 + NS_HTML5_BREAK(starttagloop); 1.866 + } 1.867 + case NS_HTML5TREE_BUILDER_INPUT: { 1.868 + errStartTagInTable(name); 1.869 + if (!nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("hidden", attributes->getValue(nsHtml5AttributeName::ATTR_TYPE))) { 1.870 + NS_HTML5_BREAK(intableloop); 1.871 + } 1.872 + appendVoidElementToCurrent(name, attributes, formPointer); 1.873 + selfClosing = false; 1.874 + attributes = nullptr; 1.875 + NS_HTML5_BREAK(starttagloop); 1.876 + } 1.877 + case NS_HTML5TREE_BUILDER_FORM: { 1.878 + if (!!formPointer || isTemplateContents()) { 1.879 + errFormWhenFormOpen(); 1.880 + NS_HTML5_BREAK(starttagloop); 1.881 + } else { 1.882 + errStartTagInTable(name); 1.883 + appendVoidFormToCurrent(attributes); 1.884 + attributes = nullptr; 1.885 + NS_HTML5_BREAK(starttagloop); 1.886 + } 1.887 + } 1.888 + default: { 1.889 + errStartTagInTable(name); 1.890 + NS_HTML5_BREAK(intableloop); 1.891 + } 1.892 + } 1.893 + } 1.894 + intableloop_end: ; 1.895 + } 1.896 + case NS_HTML5TREE_BUILDER_IN_CAPTION: { 1.897 + switch(group) { 1.898 + case NS_HTML5TREE_BUILDER_CAPTION: 1.899 + case NS_HTML5TREE_BUILDER_COL: 1.900 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.901 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.902 + case NS_HTML5TREE_BUILDER_TR: 1.903 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.904 + errStrayStartTag(name); 1.905 + eltPos = findLastInTableScope(nsHtml5Atoms::caption); 1.906 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.907 + NS_HTML5_BREAK(starttagloop); 1.908 + } 1.909 + generateImpliedEndTags(); 1.910 + if (!!MOZ_UNLIKELY(mViewSource) && currentPtr != eltPos) { 1.911 + errNoCheckUnclosedElementsOnStack(); 1.912 + } 1.913 + while (currentPtr >= eltPos) { 1.914 + pop(); 1.915 + } 1.916 + clearTheListOfActiveFormattingElementsUpToTheLastMarker(); 1.917 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.918 + continue; 1.919 + } 1.920 + default: 1.921 + ; // fall through 1.922 + } 1.923 + } 1.924 + case NS_HTML5TREE_BUILDER_IN_CELL: { 1.925 + switch(group) { 1.926 + case NS_HTML5TREE_BUILDER_CAPTION: 1.927 + case NS_HTML5TREE_BUILDER_COL: 1.928 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.929 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.930 + case NS_HTML5TREE_BUILDER_TR: 1.931 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.932 + eltPos = findLastInTableScopeTdTh(); 1.933 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.934 + errNoCellToClose(); 1.935 + NS_HTML5_BREAK(starttagloop); 1.936 + } else { 1.937 + closeTheCell(eltPos); 1.938 + continue; 1.939 + } 1.940 + } 1.941 + default: 1.942 + ; // fall through 1.943 + } 1.944 + } 1.945 + case NS_HTML5TREE_BUILDER_FRAMESET_OK: { 1.946 + switch(group) { 1.947 + case NS_HTML5TREE_BUILDER_FRAMESET: { 1.948 + if (mode == NS_HTML5TREE_BUILDER_FRAMESET_OK) { 1.949 + if (!currentPtr || stack[1]->getGroup() != NS_HTML5TREE_BUILDER_BODY) { 1.950 + MOZ_ASSERT(fragment || isTemplateContents()); 1.951 + errStrayStartTag(name); 1.952 + NS_HTML5_BREAK(starttagloop); 1.953 + } else { 1.954 + errFramesetStart(); 1.955 + detachFromParent(stack[1]->node); 1.956 + while (currentPtr > 0) { 1.957 + pop(); 1.958 + } 1.959 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.960 + mode = NS_HTML5TREE_BUILDER_IN_FRAMESET; 1.961 + attributes = nullptr; 1.962 + NS_HTML5_BREAK(starttagloop); 1.963 + } 1.964 + } else { 1.965 + errStrayStartTag(name); 1.966 + NS_HTML5_BREAK(starttagloop); 1.967 + } 1.968 + } 1.969 + case NS_HTML5TREE_BUILDER_PRE_OR_LISTING: 1.970 + case NS_HTML5TREE_BUILDER_LI: 1.971 + case NS_HTML5TREE_BUILDER_DD_OR_DT: 1.972 + case NS_HTML5TREE_BUILDER_BUTTON: 1.973 + case NS_HTML5TREE_BUILDER_MARQUEE_OR_APPLET: 1.974 + case NS_HTML5TREE_BUILDER_OBJECT: 1.975 + case NS_HTML5TREE_BUILDER_TABLE: 1.976 + case NS_HTML5TREE_BUILDER_AREA_OR_WBR: 1.977 + case NS_HTML5TREE_BUILDER_BR: 1.978 + case NS_HTML5TREE_BUILDER_EMBED: 1.979 + case NS_HTML5TREE_BUILDER_IMG: 1.980 + case NS_HTML5TREE_BUILDER_INPUT: 1.981 + case NS_HTML5TREE_BUILDER_KEYGEN: 1.982 + case NS_HTML5TREE_BUILDER_HR: 1.983 + case NS_HTML5TREE_BUILDER_TEXTAREA: 1.984 + case NS_HTML5TREE_BUILDER_XMP: 1.985 + case NS_HTML5TREE_BUILDER_IFRAME: 1.986 + case NS_HTML5TREE_BUILDER_SELECT: { 1.987 + if (mode == NS_HTML5TREE_BUILDER_FRAMESET_OK && !(group == NS_HTML5TREE_BUILDER_INPUT && nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("hidden", attributes->getValue(nsHtml5AttributeName::ATTR_TYPE)))) { 1.988 + framesetOk = false; 1.989 + mode = NS_HTML5TREE_BUILDER_IN_BODY; 1.990 + } 1.991 + } 1.992 + default: 1.993 + ; // fall through 1.994 + } 1.995 + } 1.996 + case NS_HTML5TREE_BUILDER_IN_BODY: { 1.997 + for (; ; ) { 1.998 + switch(group) { 1.999 + case NS_HTML5TREE_BUILDER_HTML: { 1.1000 + errStrayStartTag(name); 1.1001 + if (!fragment && !isTemplateContents()) { 1.1002 + addAttributesToHtml(attributes); 1.1003 + attributes = nullptr; 1.1004 + } 1.1005 + NS_HTML5_BREAK(starttagloop); 1.1006 + } 1.1007 + case NS_HTML5TREE_BUILDER_BASE: 1.1008 + case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: 1.1009 + case NS_HTML5TREE_BUILDER_META: 1.1010 + case NS_HTML5TREE_BUILDER_STYLE: 1.1011 + case NS_HTML5TREE_BUILDER_SCRIPT: 1.1012 + case NS_HTML5TREE_BUILDER_TITLE: 1.1013 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.1014 + NS_HTML5_BREAK(inbodyloop); 1.1015 + } 1.1016 + case NS_HTML5TREE_BUILDER_BODY: { 1.1017 + if (!currentPtr || stack[1]->getGroup() != NS_HTML5TREE_BUILDER_BODY || isTemplateContents()) { 1.1018 + MOZ_ASSERT(fragment || isTemplateContents()); 1.1019 + errStrayStartTag(name); 1.1020 + NS_HTML5_BREAK(starttagloop); 1.1021 + } 1.1022 + errFooSeenWhenFooOpen(name); 1.1023 + framesetOk = false; 1.1024 + if (mode == NS_HTML5TREE_BUILDER_FRAMESET_OK) { 1.1025 + mode = NS_HTML5TREE_BUILDER_IN_BODY; 1.1026 + } 1.1027 + if (addAttributesToBody(attributes)) { 1.1028 + attributes = nullptr; 1.1029 + } 1.1030 + NS_HTML5_BREAK(starttagloop); 1.1031 + } 1.1032 + case NS_HTML5TREE_BUILDER_P: 1.1033 + case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU: 1.1034 + case NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL: 1.1035 + case NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY: { 1.1036 + implicitlyCloseP(); 1.1037 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1038 + attributes = nullptr; 1.1039 + NS_HTML5_BREAK(starttagloop); 1.1040 + } 1.1041 + case NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6: { 1.1042 + implicitlyCloseP(); 1.1043 + if (stack[currentPtr]->getGroup() == NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) { 1.1044 + errHeadingWhenHeadingOpen(); 1.1045 + pop(); 1.1046 + } 1.1047 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1048 + attributes = nullptr; 1.1049 + NS_HTML5_BREAK(starttagloop); 1.1050 + } 1.1051 + case NS_HTML5TREE_BUILDER_FIELDSET: { 1.1052 + implicitlyCloseP(); 1.1053 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer); 1.1054 + attributes = nullptr; 1.1055 + NS_HTML5_BREAK(starttagloop); 1.1056 + } 1.1057 + case NS_HTML5TREE_BUILDER_PRE_OR_LISTING: { 1.1058 + implicitlyCloseP(); 1.1059 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1060 + needToDropLF = true; 1.1061 + attributes = nullptr; 1.1062 + NS_HTML5_BREAK(starttagloop); 1.1063 + } 1.1064 + case NS_HTML5TREE_BUILDER_FORM: { 1.1065 + if (!!formPointer && !isTemplateContents()) { 1.1066 + errFormWhenFormOpen(); 1.1067 + NS_HTML5_BREAK(starttagloop); 1.1068 + } else { 1.1069 + implicitlyCloseP(); 1.1070 + appendToCurrentNodeAndPushFormElementMayFoster(attributes); 1.1071 + attributes = nullptr; 1.1072 + NS_HTML5_BREAK(starttagloop); 1.1073 + } 1.1074 + } 1.1075 + case NS_HTML5TREE_BUILDER_LI: 1.1076 + case NS_HTML5TREE_BUILDER_DD_OR_DT: { 1.1077 + eltPos = currentPtr; 1.1078 + for (; ; ) { 1.1079 + nsHtml5StackNode* node = stack[eltPos]; 1.1080 + if (node->getGroup() == group) { 1.1081 + generateImpliedEndTagsExceptFor(node->name); 1.1082 + if (!!MOZ_UNLIKELY(mViewSource) && eltPos != currentPtr) { 1.1083 + errUnclosedElementsImplied(eltPos, name); 1.1084 + } 1.1085 + while (currentPtr >= eltPos) { 1.1086 + pop(); 1.1087 + } 1.1088 + break; 1.1089 + } else if (node->isSpecial() && (node->ns != kNameSpaceID_XHTML || (node->name != nsHtml5Atoms::p && node->name != nsHtml5Atoms::address && node->name != nsHtml5Atoms::div))) { 1.1090 + break; 1.1091 + } 1.1092 + eltPos--; 1.1093 + } 1.1094 + implicitlyCloseP(); 1.1095 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1096 + attributes = nullptr; 1.1097 + NS_HTML5_BREAK(starttagloop); 1.1098 + } 1.1099 + case NS_HTML5TREE_BUILDER_PLAINTEXT: { 1.1100 + implicitlyCloseP(); 1.1101 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1102 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_PLAINTEXT, elementName); 1.1103 + attributes = nullptr; 1.1104 + NS_HTML5_BREAK(starttagloop); 1.1105 + } 1.1106 + case NS_HTML5TREE_BUILDER_A: { 1.1107 + int32_t activeAPos = findInListOfActiveFormattingElementsContainsBetweenEndAndLastMarker(nsHtml5Atoms::a); 1.1108 + if (activeAPos != -1) { 1.1109 + errFooSeenWhenFooOpen(name); 1.1110 + nsHtml5StackNode* activeA = listOfActiveFormattingElements[activeAPos]; 1.1111 + activeA->retain(); 1.1112 + adoptionAgencyEndTag(nsHtml5Atoms::a); 1.1113 + removeFromStack(activeA); 1.1114 + activeAPos = findInListOfActiveFormattingElements(activeA); 1.1115 + if (activeAPos != -1) { 1.1116 + removeFromListOfActiveFormattingElements(activeAPos); 1.1117 + } 1.1118 + activeA->release(); 1.1119 + } 1.1120 + reconstructTheActiveFormattingElements(); 1.1121 + appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes); 1.1122 + attributes = nullptr; 1.1123 + NS_HTML5_BREAK(starttagloop); 1.1124 + } 1.1125 + 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: 1.1126 + case NS_HTML5TREE_BUILDER_FONT: { 1.1127 + reconstructTheActiveFormattingElements(); 1.1128 + maybeForgetEarlierDuplicateFormattingElement(elementName->name, attributes); 1.1129 + appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes); 1.1130 + attributes = nullptr; 1.1131 + NS_HTML5_BREAK(starttagloop); 1.1132 + } 1.1133 + case NS_HTML5TREE_BUILDER_NOBR: { 1.1134 + reconstructTheActiveFormattingElements(); 1.1135 + if (NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK != findLastInScope(nsHtml5Atoms::nobr)) { 1.1136 + errFooSeenWhenFooOpen(name); 1.1137 + adoptionAgencyEndTag(nsHtml5Atoms::nobr); 1.1138 + reconstructTheActiveFormattingElements(); 1.1139 + } 1.1140 + appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes); 1.1141 + attributes = nullptr; 1.1142 + NS_HTML5_BREAK(starttagloop); 1.1143 + } 1.1144 + case NS_HTML5TREE_BUILDER_BUTTON: { 1.1145 + eltPos = findLastInScope(name); 1.1146 + if (eltPos != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.1147 + errFooSeenWhenFooOpen(name); 1.1148 + generateImpliedEndTags(); 1.1149 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) { 1.1150 + errUnclosedElementsImplied(eltPos, name); 1.1151 + } 1.1152 + while (currentPtr >= eltPos) { 1.1153 + pop(); 1.1154 + } 1.1155 + NS_HTML5_CONTINUE(starttagloop); 1.1156 + } else { 1.1157 + reconstructTheActiveFormattingElements(); 1.1158 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer); 1.1159 + attributes = nullptr; 1.1160 + NS_HTML5_BREAK(starttagloop); 1.1161 + } 1.1162 + } 1.1163 + case NS_HTML5TREE_BUILDER_OBJECT: { 1.1164 + reconstructTheActiveFormattingElements(); 1.1165 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer); 1.1166 + insertMarker(); 1.1167 + attributes = nullptr; 1.1168 + NS_HTML5_BREAK(starttagloop); 1.1169 + } 1.1170 + case NS_HTML5TREE_BUILDER_MARQUEE_OR_APPLET: { 1.1171 + reconstructTheActiveFormattingElements(); 1.1172 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1173 + insertMarker(); 1.1174 + attributes = nullptr; 1.1175 + NS_HTML5_BREAK(starttagloop); 1.1176 + } 1.1177 + case NS_HTML5TREE_BUILDER_TABLE: { 1.1178 + if (!quirks) { 1.1179 + implicitlyCloseP(); 1.1180 + } 1.1181 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1182 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.1183 + attributes = nullptr; 1.1184 + NS_HTML5_BREAK(starttagloop); 1.1185 + } 1.1186 + case NS_HTML5TREE_BUILDER_BR: 1.1187 + case NS_HTML5TREE_BUILDER_EMBED: 1.1188 + case NS_HTML5TREE_BUILDER_AREA_OR_WBR: { 1.1189 + reconstructTheActiveFormattingElements(); 1.1190 + } 1.1191 +#ifdef ENABLE_VOID_MENUITEM 1.1192 + case NS_HTML5TREE_BUILDER_MENUITEM: 1.1193 +#endif 1.1194 + case NS_HTML5TREE_BUILDER_PARAM_OR_SOURCE_OR_TRACK: { 1.1195 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1196 + selfClosing = false; 1.1197 + attributes = nullptr; 1.1198 + NS_HTML5_BREAK(starttagloop); 1.1199 + } 1.1200 + case NS_HTML5TREE_BUILDER_HR: { 1.1201 + implicitlyCloseP(); 1.1202 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1203 + selfClosing = false; 1.1204 + attributes = nullptr; 1.1205 + NS_HTML5_BREAK(starttagloop); 1.1206 + } 1.1207 + case NS_HTML5TREE_BUILDER_IMAGE: { 1.1208 + errImage(); 1.1209 + elementName = nsHtml5ElementName::ELT_IMG; 1.1210 + NS_HTML5_CONTINUE(starttagloop); 1.1211 + } 1.1212 + case NS_HTML5TREE_BUILDER_IMG: 1.1213 + case NS_HTML5TREE_BUILDER_KEYGEN: 1.1214 + case NS_HTML5TREE_BUILDER_INPUT: { 1.1215 + reconstructTheActiveFormattingElements(); 1.1216 + appendVoidElementToCurrentMayFoster(name, attributes, formPointer); 1.1217 + selfClosing = false; 1.1218 + attributes = nullptr; 1.1219 + NS_HTML5_BREAK(starttagloop); 1.1220 + } 1.1221 + case NS_HTML5TREE_BUILDER_ISINDEX: { 1.1222 + errIsindex(); 1.1223 + if (!!formPointer && !isTemplateContents()) { 1.1224 + NS_HTML5_BREAK(starttagloop); 1.1225 + } 1.1226 + implicitlyCloseP(); 1.1227 + nsHtml5HtmlAttributes* formAttrs = new nsHtml5HtmlAttributes(0); 1.1228 + int32_t actionIndex = attributes->getIndex(nsHtml5AttributeName::ATTR_ACTION); 1.1229 + if (actionIndex > -1) { 1.1230 + formAttrs->addAttribute(nsHtml5AttributeName::ATTR_ACTION, attributes->getValueNoBoundsCheck(actionIndex)); 1.1231 + } 1.1232 + appendToCurrentNodeAndPushFormElementMayFoster(formAttrs); 1.1233 + appendVoidElementToCurrentMayFoster(nsHtml5ElementName::ELT_HR, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.1234 + appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName::ELT_LABEL, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.1235 + int32_t promptIndex = attributes->getIndex(nsHtml5AttributeName::ATTR_PROMPT); 1.1236 + if (promptIndex > -1) { 1.1237 + autoJArray<char16_t,int32_t> prompt = nsHtml5Portability::newCharArrayFromString(attributes->getValueNoBoundsCheck(promptIndex)); 1.1238 + appendCharacters(stack[currentPtr]->node, prompt, 0, prompt.length); 1.1239 + } else { 1.1240 + appendIsindexPrompt(stack[currentPtr]->node); 1.1241 + } 1.1242 + nsHtml5HtmlAttributes* inputAttributes = new nsHtml5HtmlAttributes(0); 1.1243 + inputAttributes->addAttribute(nsHtml5AttributeName::ATTR_NAME, nsHtml5Portability::newStringFromLiteral("isindex")); 1.1244 + for (int32_t i = 0; i < attributes->getLength(); i++) { 1.1245 + nsHtml5AttributeName* attributeQName = attributes->getAttributeNameNoBoundsCheck(i); 1.1246 + if (nsHtml5AttributeName::ATTR_NAME == attributeQName || nsHtml5AttributeName::ATTR_PROMPT == attributeQName) { 1.1247 + attributes->releaseValue(i); 1.1248 + } else if (nsHtml5AttributeName::ATTR_ACTION != attributeQName) { 1.1249 + inputAttributes->addAttribute(attributeQName, attributes->getValueNoBoundsCheck(i)); 1.1250 + } 1.1251 + } 1.1252 + attributes->clearWithoutReleasingContents(); 1.1253 + appendVoidElementToCurrentMayFoster(nsHtml5Atoms::input, inputAttributes, formPointer); 1.1254 + pop(); 1.1255 + appendVoidElementToCurrentMayFoster(nsHtml5ElementName::ELT_HR, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.1256 + pop(); 1.1257 + if (!isTemplateContents()) { 1.1258 + formPointer = nullptr; 1.1259 + } 1.1260 + selfClosing = false; 1.1261 + NS_HTML5_BREAK(starttagloop); 1.1262 + } 1.1263 + case NS_HTML5TREE_BUILDER_TEXTAREA: { 1.1264 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer); 1.1265 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, elementName); 1.1266 + originalMode = mode; 1.1267 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1268 + needToDropLF = true; 1.1269 + attributes = nullptr; 1.1270 + NS_HTML5_BREAK(starttagloop); 1.1271 + } 1.1272 + case NS_HTML5TREE_BUILDER_XMP: { 1.1273 + implicitlyCloseP(); 1.1274 + reconstructTheActiveFormattingElements(); 1.1275 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1276 + originalMode = mode; 1.1277 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1278 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName); 1.1279 + attributes = nullptr; 1.1280 + NS_HTML5_BREAK(starttagloop); 1.1281 + } 1.1282 + case NS_HTML5TREE_BUILDER_NOSCRIPT: { 1.1283 + if (!scriptingEnabled) { 1.1284 + reconstructTheActiveFormattingElements(); 1.1285 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1286 + attributes = nullptr; 1.1287 + NS_HTML5_BREAK(starttagloop); 1.1288 + } else { 1.1289 + } 1.1290 + } 1.1291 + case NS_HTML5TREE_BUILDER_NOFRAMES: 1.1292 + case NS_HTML5TREE_BUILDER_IFRAME: 1.1293 + case NS_HTML5TREE_BUILDER_NOEMBED: { 1.1294 + startTagGenericRawText(elementName, attributes); 1.1295 + attributes = nullptr; 1.1296 + NS_HTML5_BREAK(starttagloop); 1.1297 + } 1.1298 + case NS_HTML5TREE_BUILDER_SELECT: { 1.1299 + reconstructTheActiveFormattingElements(); 1.1300 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer); 1.1301 + switch(mode) { 1.1302 + case NS_HTML5TREE_BUILDER_IN_TABLE: 1.1303 + case NS_HTML5TREE_BUILDER_IN_CAPTION: 1.1304 + case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: 1.1305 + case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: 1.1306 + case NS_HTML5TREE_BUILDER_IN_ROW: 1.1307 + case NS_HTML5TREE_BUILDER_IN_CELL: { 1.1308 + mode = NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE; 1.1309 + break; 1.1310 + } 1.1311 + default: { 1.1312 + mode = NS_HTML5TREE_BUILDER_IN_SELECT; 1.1313 + break; 1.1314 + } 1.1315 + } 1.1316 + attributes = nullptr; 1.1317 + NS_HTML5_BREAK(starttagloop); 1.1318 + } 1.1319 + case NS_HTML5TREE_BUILDER_OPTGROUP: 1.1320 + case NS_HTML5TREE_BUILDER_OPTION: { 1.1321 + if (isCurrent(nsHtml5Atoms::option)) { 1.1322 + pop(); 1.1323 + } 1.1324 + reconstructTheActiveFormattingElements(); 1.1325 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1326 + attributes = nullptr; 1.1327 + NS_HTML5_BREAK(starttagloop); 1.1328 + } 1.1329 + case NS_HTML5TREE_BUILDER_RT_OR_RP: { 1.1330 + eltPos = findLastInScope(nsHtml5Atoms::ruby); 1.1331 + if (eltPos != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.1332 + generateImpliedEndTags(); 1.1333 + } 1.1334 + if (eltPos != currentPtr) { 1.1335 + if (eltPos != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.1336 + errStartTagSeenWithoutRuby(name); 1.1337 + } else { 1.1338 + errUnclosedChildrenInRuby(); 1.1339 + } 1.1340 + } 1.1341 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1342 + attributes = nullptr; 1.1343 + NS_HTML5_BREAK(starttagloop); 1.1344 + } 1.1345 + case NS_HTML5TREE_BUILDER_MATH: { 1.1346 + reconstructTheActiveFormattingElements(); 1.1347 + attributes->adjustForMath(); 1.1348 + if (selfClosing) { 1.1349 + appendVoidElementToCurrentMayFosterMathML(elementName, attributes); 1.1350 + selfClosing = false; 1.1351 + } else { 1.1352 + appendToCurrentNodeAndPushElementMayFosterMathML(elementName, attributes); 1.1353 + } 1.1354 + attributes = nullptr; 1.1355 + NS_HTML5_BREAK(starttagloop); 1.1356 + } 1.1357 + case NS_HTML5TREE_BUILDER_SVG: { 1.1358 + reconstructTheActiveFormattingElements(); 1.1359 + attributes->adjustForSvg(); 1.1360 + if (selfClosing) { 1.1361 + appendVoidElementToCurrentMayFosterSVG(elementName, attributes); 1.1362 + selfClosing = false; 1.1363 + } else { 1.1364 + appendToCurrentNodeAndPushElementMayFosterSVG(elementName, attributes); 1.1365 + } 1.1366 + attributes = nullptr; 1.1367 + NS_HTML5_BREAK(starttagloop); 1.1368 + } 1.1369 + case NS_HTML5TREE_BUILDER_CAPTION: 1.1370 + case NS_HTML5TREE_BUILDER_COL: 1.1371 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.1372 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.1373 + case NS_HTML5TREE_BUILDER_TR: 1.1374 + case NS_HTML5TREE_BUILDER_TD_OR_TH: 1.1375 + case NS_HTML5TREE_BUILDER_FRAME: 1.1376 + case NS_HTML5TREE_BUILDER_FRAMESET: 1.1377 + case NS_HTML5TREE_BUILDER_HEAD: { 1.1378 + errStrayStartTag(name); 1.1379 + NS_HTML5_BREAK(starttagloop); 1.1380 + } 1.1381 + case NS_HTML5TREE_BUILDER_OUTPUT_OR_LABEL: { 1.1382 + reconstructTheActiveFormattingElements(); 1.1383 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer); 1.1384 + attributes = nullptr; 1.1385 + NS_HTML5_BREAK(starttagloop); 1.1386 + } 1.1387 + default: { 1.1388 + reconstructTheActiveFormattingElements(); 1.1389 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1390 + attributes = nullptr; 1.1391 + NS_HTML5_BREAK(starttagloop); 1.1392 + } 1.1393 + } 1.1394 + } 1.1395 + inbodyloop_end: ; 1.1396 + } 1.1397 + case NS_HTML5TREE_BUILDER_IN_HEAD: { 1.1398 + for (; ; ) { 1.1399 + switch(group) { 1.1400 + case NS_HTML5TREE_BUILDER_HTML: { 1.1401 + errStrayStartTag(name); 1.1402 + if (!fragment && !isTemplateContents()) { 1.1403 + addAttributesToHtml(attributes); 1.1404 + attributes = nullptr; 1.1405 + } 1.1406 + NS_HTML5_BREAK(starttagloop); 1.1407 + } 1.1408 + case NS_HTML5TREE_BUILDER_BASE: 1.1409 + case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: { 1.1410 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1411 + selfClosing = false; 1.1412 + attributes = nullptr; 1.1413 + NS_HTML5_BREAK(starttagloop); 1.1414 + } 1.1415 + case NS_HTML5TREE_BUILDER_META: { 1.1416 + NS_HTML5_BREAK(inheadloop); 1.1417 + } 1.1418 + case NS_HTML5TREE_BUILDER_TITLE: { 1.1419 + startTagTitleInHead(elementName, attributes); 1.1420 + attributes = nullptr; 1.1421 + NS_HTML5_BREAK(starttagloop); 1.1422 + } 1.1423 + case NS_HTML5TREE_BUILDER_NOSCRIPT: { 1.1424 + if (scriptingEnabled) { 1.1425 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1426 + originalMode = mode; 1.1427 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1428 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName); 1.1429 + } else { 1.1430 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1431 + mode = NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT; 1.1432 + } 1.1433 + attributes = nullptr; 1.1434 + NS_HTML5_BREAK(starttagloop); 1.1435 + } 1.1436 + case NS_HTML5TREE_BUILDER_SCRIPT: { 1.1437 + startTagScriptInHead(elementName, attributes); 1.1438 + attributes = nullptr; 1.1439 + NS_HTML5_BREAK(starttagloop); 1.1440 + } 1.1441 + case NS_HTML5TREE_BUILDER_STYLE: 1.1442 + case NS_HTML5TREE_BUILDER_NOFRAMES: { 1.1443 + startTagGenericRawText(elementName, attributes); 1.1444 + attributes = nullptr; 1.1445 + NS_HTML5_BREAK(starttagloop); 1.1446 + } 1.1447 + case NS_HTML5TREE_BUILDER_HEAD: { 1.1448 + errFooSeenWhenFooOpen(name); 1.1449 + NS_HTML5_BREAK(starttagloop); 1.1450 + } 1.1451 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.1452 + startTagTemplateInHead(elementName, attributes); 1.1453 + attributes = nullptr; 1.1454 + NS_HTML5_BREAK(starttagloop); 1.1455 + } 1.1456 + default: { 1.1457 + pop(); 1.1458 + mode = NS_HTML5TREE_BUILDER_AFTER_HEAD; 1.1459 + NS_HTML5_CONTINUE(starttagloop); 1.1460 + } 1.1461 + } 1.1462 + } 1.1463 + inheadloop_end: ; 1.1464 + } 1.1465 + case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: { 1.1466 + switch(group) { 1.1467 + case NS_HTML5TREE_BUILDER_HTML: { 1.1468 + errStrayStartTag(name); 1.1469 + if (!fragment && !isTemplateContents()) { 1.1470 + addAttributesToHtml(attributes); 1.1471 + attributes = nullptr; 1.1472 + } 1.1473 + NS_HTML5_BREAK(starttagloop); 1.1474 + } 1.1475 + case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: { 1.1476 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1477 + selfClosing = false; 1.1478 + attributes = nullptr; 1.1479 + NS_HTML5_BREAK(starttagloop); 1.1480 + } 1.1481 + case NS_HTML5TREE_BUILDER_META: { 1.1482 + checkMetaCharset(attributes); 1.1483 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1484 + selfClosing = false; 1.1485 + attributes = nullptr; 1.1486 + NS_HTML5_BREAK(starttagloop); 1.1487 + } 1.1488 + case NS_HTML5TREE_BUILDER_STYLE: 1.1489 + case NS_HTML5TREE_BUILDER_NOFRAMES: { 1.1490 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1491 + originalMode = mode; 1.1492 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1493 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName); 1.1494 + attributes = nullptr; 1.1495 + NS_HTML5_BREAK(starttagloop); 1.1496 + } 1.1497 + case NS_HTML5TREE_BUILDER_HEAD: { 1.1498 + errFooSeenWhenFooOpen(name); 1.1499 + NS_HTML5_BREAK(starttagloop); 1.1500 + } 1.1501 + case NS_HTML5TREE_BUILDER_NOSCRIPT: { 1.1502 + errFooSeenWhenFooOpen(name); 1.1503 + NS_HTML5_BREAK(starttagloop); 1.1504 + } 1.1505 + default: { 1.1506 + errBadStartTagInHead(name); 1.1507 + pop(); 1.1508 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.1509 + continue; 1.1510 + } 1.1511 + } 1.1512 + } 1.1513 + case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: { 1.1514 + switch(group) { 1.1515 + case NS_HTML5TREE_BUILDER_HTML: { 1.1516 + errStrayStartTag(name); 1.1517 + if (!fragment && !isTemplateContents()) { 1.1518 + addAttributesToHtml(attributes); 1.1519 + attributes = nullptr; 1.1520 + } 1.1521 + NS_HTML5_BREAK(starttagloop); 1.1522 + } 1.1523 + case NS_HTML5TREE_BUILDER_COL: { 1.1524 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1525 + selfClosing = false; 1.1526 + attributes = nullptr; 1.1527 + NS_HTML5_BREAK(starttagloop); 1.1528 + } 1.1529 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.1530 + startTagTemplateInHead(elementName, attributes); 1.1531 + attributes = nullptr; 1.1532 + NS_HTML5_BREAK(starttagloop); 1.1533 + } 1.1534 + default: { 1.1535 + if (!currentPtr || stack[currentPtr]->getGroup() == NS_HTML5TREE_BUILDER_TEMPLATE) { 1.1536 + MOZ_ASSERT(fragment || isTemplateContents()); 1.1537 + errGarbageInColgroup(); 1.1538 + NS_HTML5_BREAK(starttagloop); 1.1539 + } 1.1540 + pop(); 1.1541 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.1542 + continue; 1.1543 + } 1.1544 + } 1.1545 + } 1.1546 + case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: { 1.1547 + switch(group) { 1.1548 + case NS_HTML5TREE_BUILDER_CAPTION: 1.1549 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.1550 + case NS_HTML5TREE_BUILDER_TR: 1.1551 + case NS_HTML5TREE_BUILDER_TD_OR_TH: 1.1552 + case NS_HTML5TREE_BUILDER_TABLE: { 1.1553 + errStartTagWithSelectOpen(name); 1.1554 + eltPos = findLastInTableScope(nsHtml5Atoms::select); 1.1555 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.1556 + MOZ_ASSERT(fragment); 1.1557 + NS_HTML5_BREAK(starttagloop); 1.1558 + } 1.1559 + while (currentPtr >= eltPos) { 1.1560 + pop(); 1.1561 + } 1.1562 + resetTheInsertionMode(); 1.1563 + continue; 1.1564 + } 1.1565 + default: 1.1566 + ; // fall through 1.1567 + } 1.1568 + } 1.1569 + case NS_HTML5TREE_BUILDER_IN_SELECT: { 1.1570 + switch(group) { 1.1571 + case NS_HTML5TREE_BUILDER_HTML: { 1.1572 + errStrayStartTag(name); 1.1573 + if (!fragment) { 1.1574 + addAttributesToHtml(attributes); 1.1575 + attributes = nullptr; 1.1576 + } 1.1577 + NS_HTML5_BREAK(starttagloop); 1.1578 + } 1.1579 + case NS_HTML5TREE_BUILDER_OPTION: { 1.1580 + if (isCurrent(nsHtml5Atoms::option)) { 1.1581 + pop(); 1.1582 + } 1.1583 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1584 + attributes = nullptr; 1.1585 + NS_HTML5_BREAK(starttagloop); 1.1586 + } 1.1587 + case NS_HTML5TREE_BUILDER_OPTGROUP: { 1.1588 + if (isCurrent(nsHtml5Atoms::option)) { 1.1589 + pop(); 1.1590 + } 1.1591 + if (isCurrent(nsHtml5Atoms::optgroup)) { 1.1592 + pop(); 1.1593 + } 1.1594 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1595 + attributes = nullptr; 1.1596 + NS_HTML5_BREAK(starttagloop); 1.1597 + } 1.1598 + case NS_HTML5TREE_BUILDER_SELECT: { 1.1599 + errStartSelectWhereEndSelectExpected(); 1.1600 + eltPos = findLastInTableScope(name); 1.1601 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.1602 + MOZ_ASSERT(fragment); 1.1603 + errNoSelectInTableScope(); 1.1604 + NS_HTML5_BREAK(starttagloop); 1.1605 + } else { 1.1606 + while (currentPtr >= eltPos) { 1.1607 + pop(); 1.1608 + } 1.1609 + resetTheInsertionMode(); 1.1610 + NS_HTML5_BREAK(starttagloop); 1.1611 + } 1.1612 + } 1.1613 + case NS_HTML5TREE_BUILDER_INPUT: 1.1614 + case NS_HTML5TREE_BUILDER_TEXTAREA: 1.1615 + case NS_HTML5TREE_BUILDER_KEYGEN: { 1.1616 + errStartTagWithSelectOpen(name); 1.1617 + eltPos = findLastInTableScope(nsHtml5Atoms::select); 1.1618 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.1619 + MOZ_ASSERT(fragment); 1.1620 + NS_HTML5_BREAK(starttagloop); 1.1621 + } 1.1622 + while (currentPtr >= eltPos) { 1.1623 + pop(); 1.1624 + } 1.1625 + resetTheInsertionMode(); 1.1626 + continue; 1.1627 + } 1.1628 + case NS_HTML5TREE_BUILDER_SCRIPT: { 1.1629 + startTagScriptInHead(elementName, attributes); 1.1630 + attributes = nullptr; 1.1631 + NS_HTML5_BREAK(starttagloop); 1.1632 + } 1.1633 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.1634 + startTagTemplateInHead(elementName, attributes); 1.1635 + attributes = nullptr; 1.1636 + NS_HTML5_BREAK(starttagloop); 1.1637 + } 1.1638 + default: { 1.1639 + errStrayStartTag(name); 1.1640 + NS_HTML5_BREAK(starttagloop); 1.1641 + } 1.1642 + } 1.1643 + } 1.1644 + case NS_HTML5TREE_BUILDER_AFTER_BODY: { 1.1645 + switch(group) { 1.1646 + case NS_HTML5TREE_BUILDER_HTML: { 1.1647 + errStrayStartTag(name); 1.1648 + if (!fragment && !isTemplateContents()) { 1.1649 + addAttributesToHtml(attributes); 1.1650 + attributes = nullptr; 1.1651 + } 1.1652 + NS_HTML5_BREAK(starttagloop); 1.1653 + } 1.1654 + default: { 1.1655 + errStrayStartTag(name); 1.1656 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.1657 + continue; 1.1658 + } 1.1659 + } 1.1660 + } 1.1661 + case NS_HTML5TREE_BUILDER_IN_FRAMESET: { 1.1662 + switch(group) { 1.1663 + case NS_HTML5TREE_BUILDER_FRAMESET: { 1.1664 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1665 + attributes = nullptr; 1.1666 + NS_HTML5_BREAK(starttagloop); 1.1667 + } 1.1668 + case NS_HTML5TREE_BUILDER_FRAME: { 1.1669 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1670 + selfClosing = false; 1.1671 + attributes = nullptr; 1.1672 + NS_HTML5_BREAK(starttagloop); 1.1673 + } 1.1674 + default: 1.1675 + ; // fall through 1.1676 + } 1.1677 + } 1.1678 + case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: { 1.1679 + switch(group) { 1.1680 + case NS_HTML5TREE_BUILDER_HTML: { 1.1681 + errStrayStartTag(name); 1.1682 + if (!fragment && !isTemplateContents()) { 1.1683 + addAttributesToHtml(attributes); 1.1684 + attributes = nullptr; 1.1685 + } 1.1686 + NS_HTML5_BREAK(starttagloop); 1.1687 + } 1.1688 + case NS_HTML5TREE_BUILDER_NOFRAMES: { 1.1689 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1690 + originalMode = mode; 1.1691 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1692 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName); 1.1693 + attributes = nullptr; 1.1694 + NS_HTML5_BREAK(starttagloop); 1.1695 + } 1.1696 + default: { 1.1697 + errStrayStartTag(name); 1.1698 + NS_HTML5_BREAK(starttagloop); 1.1699 + } 1.1700 + } 1.1701 + } 1.1702 + case NS_HTML5TREE_BUILDER_INITIAL: { 1.1703 + errStartTagWithoutDoctype(); 1.1704 + documentModeInternal(QUIRKS_MODE, nullptr, nullptr, false); 1.1705 + mode = NS_HTML5TREE_BUILDER_BEFORE_HTML; 1.1706 + continue; 1.1707 + } 1.1708 + case NS_HTML5TREE_BUILDER_BEFORE_HTML: { 1.1709 + switch(group) { 1.1710 + case NS_HTML5TREE_BUILDER_HTML: { 1.1711 + if (attributes == nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES) { 1.1712 + appendHtmlElementToDocumentAndPush(); 1.1713 + } else { 1.1714 + appendHtmlElementToDocumentAndPush(attributes); 1.1715 + } 1.1716 + mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD; 1.1717 + attributes = nullptr; 1.1718 + NS_HTML5_BREAK(starttagloop); 1.1719 + } 1.1720 + default: { 1.1721 + appendHtmlElementToDocumentAndPush(); 1.1722 + mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD; 1.1723 + continue; 1.1724 + } 1.1725 + } 1.1726 + } 1.1727 + case NS_HTML5TREE_BUILDER_BEFORE_HEAD: { 1.1728 + switch(group) { 1.1729 + case NS_HTML5TREE_BUILDER_HTML: { 1.1730 + errStrayStartTag(name); 1.1731 + if (!fragment && !isTemplateContents()) { 1.1732 + addAttributesToHtml(attributes); 1.1733 + attributes = nullptr; 1.1734 + } 1.1735 + NS_HTML5_BREAK(starttagloop); 1.1736 + } 1.1737 + case NS_HTML5TREE_BUILDER_HEAD: { 1.1738 + appendToCurrentNodeAndPushHeadElement(attributes); 1.1739 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.1740 + attributes = nullptr; 1.1741 + NS_HTML5_BREAK(starttagloop); 1.1742 + } 1.1743 + default: { 1.1744 + appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.1745 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.1746 + continue; 1.1747 + } 1.1748 + } 1.1749 + } 1.1750 + case NS_HTML5TREE_BUILDER_AFTER_HEAD: { 1.1751 + switch(group) { 1.1752 + case NS_HTML5TREE_BUILDER_HTML: { 1.1753 + errStrayStartTag(name); 1.1754 + if (!fragment && !isTemplateContents()) { 1.1755 + addAttributesToHtml(attributes); 1.1756 + attributes = nullptr; 1.1757 + } 1.1758 + NS_HTML5_BREAK(starttagloop); 1.1759 + } 1.1760 + case NS_HTML5TREE_BUILDER_BODY: { 1.1761 + if (!attributes->getLength()) { 1.1762 + appendToCurrentNodeAndPushBodyElement(); 1.1763 + } else { 1.1764 + appendToCurrentNodeAndPushBodyElement(attributes); 1.1765 + } 1.1766 + framesetOk = false; 1.1767 + mode = NS_HTML5TREE_BUILDER_IN_BODY; 1.1768 + attributes = nullptr; 1.1769 + NS_HTML5_BREAK(starttagloop); 1.1770 + } 1.1771 + case NS_HTML5TREE_BUILDER_FRAMESET: { 1.1772 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1773 + mode = NS_HTML5TREE_BUILDER_IN_FRAMESET; 1.1774 + attributes = nullptr; 1.1775 + NS_HTML5_BREAK(starttagloop); 1.1776 + } 1.1777 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.1778 + errFooBetweenHeadAndBody(name); 1.1779 + pushHeadPointerOntoStack(); 1.1780 + nsHtml5StackNode* headOnStack = stack[currentPtr]; 1.1781 + startTagTemplateInHead(elementName, attributes); 1.1782 + removeFromStack(headOnStack); 1.1783 + attributes = nullptr; 1.1784 + NS_HTML5_BREAK(starttagloop); 1.1785 + } 1.1786 + case NS_HTML5TREE_BUILDER_BASE: 1.1787 + case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: { 1.1788 + errFooBetweenHeadAndBody(name); 1.1789 + pushHeadPointerOntoStack(); 1.1790 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1791 + selfClosing = false; 1.1792 + pop(); 1.1793 + attributes = nullptr; 1.1794 + NS_HTML5_BREAK(starttagloop); 1.1795 + } 1.1796 + case NS_HTML5TREE_BUILDER_META: { 1.1797 + errFooBetweenHeadAndBody(name); 1.1798 + checkMetaCharset(attributes); 1.1799 + pushHeadPointerOntoStack(); 1.1800 + appendVoidElementToCurrentMayFoster(elementName, attributes); 1.1801 + selfClosing = false; 1.1802 + pop(); 1.1803 + attributes = nullptr; 1.1804 + NS_HTML5_BREAK(starttagloop); 1.1805 + } 1.1806 + case NS_HTML5TREE_BUILDER_SCRIPT: { 1.1807 + errFooBetweenHeadAndBody(name); 1.1808 + pushHeadPointerOntoStack(); 1.1809 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1810 + originalMode = mode; 1.1811 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1812 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, elementName); 1.1813 + attributes = nullptr; 1.1814 + NS_HTML5_BREAK(starttagloop); 1.1815 + } 1.1816 + case NS_HTML5TREE_BUILDER_STYLE: 1.1817 + case NS_HTML5TREE_BUILDER_NOFRAMES: { 1.1818 + errFooBetweenHeadAndBody(name); 1.1819 + pushHeadPointerOntoStack(); 1.1820 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1821 + originalMode = mode; 1.1822 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1823 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName); 1.1824 + attributes = nullptr; 1.1825 + NS_HTML5_BREAK(starttagloop); 1.1826 + } 1.1827 + case NS_HTML5TREE_BUILDER_TITLE: { 1.1828 + errFooBetweenHeadAndBody(name); 1.1829 + pushHeadPointerOntoStack(); 1.1830 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1831 + originalMode = mode; 1.1832 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1833 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, elementName); 1.1834 + attributes = nullptr; 1.1835 + NS_HTML5_BREAK(starttagloop); 1.1836 + } 1.1837 + case NS_HTML5TREE_BUILDER_HEAD: { 1.1838 + errStrayStartTag(name); 1.1839 + NS_HTML5_BREAK(starttagloop); 1.1840 + } 1.1841 + default: { 1.1842 + appendToCurrentNodeAndPushBodyElement(); 1.1843 + mode = NS_HTML5TREE_BUILDER_FRAMESET_OK; 1.1844 + continue; 1.1845 + } 1.1846 + } 1.1847 + } 1.1848 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: { 1.1849 + switch(group) { 1.1850 + case NS_HTML5TREE_BUILDER_HTML: { 1.1851 + errStrayStartTag(name); 1.1852 + if (!fragment && !isTemplateContents()) { 1.1853 + addAttributesToHtml(attributes); 1.1854 + attributes = nullptr; 1.1855 + } 1.1856 + NS_HTML5_BREAK(starttagloop); 1.1857 + } 1.1858 + default: { 1.1859 + errStrayStartTag(name); 1.1860 + 1.1861 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.1862 + continue; 1.1863 + } 1.1864 + } 1.1865 + } 1.1866 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: { 1.1867 + switch(group) { 1.1868 + case NS_HTML5TREE_BUILDER_HTML: { 1.1869 + errStrayStartTag(name); 1.1870 + if (!fragment && !isTemplateContents()) { 1.1871 + addAttributesToHtml(attributes); 1.1872 + attributes = nullptr; 1.1873 + } 1.1874 + NS_HTML5_BREAK(starttagloop); 1.1875 + } 1.1876 + case NS_HTML5TREE_BUILDER_NOFRAMES: { 1.1877 + startTagGenericRawText(elementName, attributes); 1.1878 + attributes = nullptr; 1.1879 + NS_HTML5_BREAK(starttagloop); 1.1880 + } 1.1881 + default: { 1.1882 + errStrayStartTag(name); 1.1883 + NS_HTML5_BREAK(starttagloop); 1.1884 + } 1.1885 + } 1.1886 + } 1.1887 + case NS_HTML5TREE_BUILDER_TEXT: { 1.1888 + MOZ_ASSERT(false); 1.1889 + NS_HTML5_BREAK(starttagloop); 1.1890 + } 1.1891 + } 1.1892 + } 1.1893 + starttagloop_end: ; 1.1894 + if (selfClosing) { 1.1895 + errSelfClosing(); 1.1896 + } 1.1897 + if (!mBuilder && attributes != nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES) { 1.1898 + delete attributes; 1.1899 + } 1.1900 +} 1.1901 + 1.1902 +void 1.1903 +nsHtml5TreeBuilder::startTagTitleInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.1904 +{ 1.1905 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1906 + originalMode = mode; 1.1907 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1908 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, elementName); 1.1909 +} 1.1910 + 1.1911 +void 1.1912 +nsHtml5TreeBuilder::startTagGenericRawText(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.1913 +{ 1.1914 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1915 + originalMode = mode; 1.1916 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1917 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, elementName); 1.1918 +} 1.1919 + 1.1920 +void 1.1921 +nsHtml5TreeBuilder::startTagScriptInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.1922 +{ 1.1923 + appendToCurrentNodeAndPushElementMayFoster(elementName, attributes); 1.1924 + originalMode = mode; 1.1925 + mode = NS_HTML5TREE_BUILDER_TEXT; 1.1926 + tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, elementName); 1.1927 +} 1.1928 + 1.1929 +void 1.1930 +nsHtml5TreeBuilder::startTagTemplateInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.1931 +{ 1.1932 + appendToCurrentNodeAndPushElement(elementName, attributes); 1.1933 + insertMarker(); 1.1934 + framesetOk = false; 1.1935 + originalMode = mode; 1.1936 + mode = NS_HTML5TREE_BUILDER_IN_TEMPLATE; 1.1937 + pushTemplateMode(NS_HTML5TREE_BUILDER_IN_TEMPLATE); 1.1938 +} 1.1939 + 1.1940 +bool 1.1941 +nsHtml5TreeBuilder::isTemplateContents() 1.1942 +{ 1.1943 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK != findLast(nsHtml5Atoms::template_); 1.1944 +} 1.1945 + 1.1946 +bool 1.1947 +nsHtml5TreeBuilder::isTemplateModeStackEmpty() 1.1948 +{ 1.1949 + return templateModePtr == -1; 1.1950 +} 1.1951 + 1.1952 +bool 1.1953 +nsHtml5TreeBuilder::isSpecialParentInForeign(nsHtml5StackNode* stackNode) 1.1954 +{ 1.1955 + int32_t ns = stackNode->ns; 1.1956 + return (kNameSpaceID_XHTML == ns) || (stackNode->isHtmlIntegrationPoint()) || ((kNameSpaceID_MathML == ns) && (stackNode->getGroup() == NS_HTML5TREE_BUILDER_MI_MO_MN_MS_MTEXT)); 1.1957 +} 1.1958 + 1.1959 +nsString* 1.1960 +nsHtml5TreeBuilder::extractCharsetFromContent(nsString* attributeValue) 1.1961 +{ 1.1962 + int32_t charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL; 1.1963 + int32_t start = -1; 1.1964 + int32_t end = -1; 1.1965 + autoJArray<char16_t,int32_t> buffer = nsHtml5Portability::newCharArrayFromString(attributeValue); 1.1966 + for (int32_t i = 0; i < buffer.length; i++) { 1.1967 + char16_t c = buffer[i]; 1.1968 + switch(charsetState) { 1.1969 + case NS_HTML5TREE_BUILDER_CHARSET_INITIAL: { 1.1970 + switch(c) { 1.1971 + case 'c': 1.1972 + case 'C': { 1.1973 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_C; 1.1974 + continue; 1.1975 + } 1.1976 + default: { 1.1977 + continue; 1.1978 + } 1.1979 + } 1.1980 + } 1.1981 + case NS_HTML5TREE_BUILDER_CHARSET_C: { 1.1982 + switch(c) { 1.1983 + case 'h': 1.1984 + case 'H': { 1.1985 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_H; 1.1986 + continue; 1.1987 + } 1.1988 + default: { 1.1989 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL; 1.1990 + continue; 1.1991 + } 1.1992 + } 1.1993 + } 1.1994 + case NS_HTML5TREE_BUILDER_CHARSET_H: { 1.1995 + switch(c) { 1.1996 + case 'a': 1.1997 + case 'A': { 1.1998 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_A; 1.1999 + continue; 1.2000 + } 1.2001 + default: { 1.2002 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL; 1.2003 + continue; 1.2004 + } 1.2005 + } 1.2006 + } 1.2007 + case NS_HTML5TREE_BUILDER_CHARSET_A: { 1.2008 + switch(c) { 1.2009 + case 'r': 1.2010 + case 'R': { 1.2011 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_R; 1.2012 + continue; 1.2013 + } 1.2014 + default: { 1.2015 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL; 1.2016 + continue; 1.2017 + } 1.2018 + } 1.2019 + } 1.2020 + case NS_HTML5TREE_BUILDER_CHARSET_R: { 1.2021 + switch(c) { 1.2022 + case 's': 1.2023 + case 'S': { 1.2024 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_S; 1.2025 + continue; 1.2026 + } 1.2027 + default: { 1.2028 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL; 1.2029 + continue; 1.2030 + } 1.2031 + } 1.2032 + } 1.2033 + case NS_HTML5TREE_BUILDER_CHARSET_S: { 1.2034 + switch(c) { 1.2035 + case 'e': 1.2036 + case 'E': { 1.2037 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_E; 1.2038 + continue; 1.2039 + } 1.2040 + default: { 1.2041 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL; 1.2042 + continue; 1.2043 + } 1.2044 + } 1.2045 + } 1.2046 + case NS_HTML5TREE_BUILDER_CHARSET_E: { 1.2047 + switch(c) { 1.2048 + case 't': 1.2049 + case 'T': { 1.2050 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_T; 1.2051 + continue; 1.2052 + } 1.2053 + default: { 1.2054 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_INITIAL; 1.2055 + continue; 1.2056 + } 1.2057 + } 1.2058 + } 1.2059 + case NS_HTML5TREE_BUILDER_CHARSET_T: { 1.2060 + switch(c) { 1.2061 + case '\t': 1.2062 + case '\n': 1.2063 + case '\f': 1.2064 + case '\r': 1.2065 + case ' ': { 1.2066 + continue; 1.2067 + } 1.2068 + case '=': { 1.2069 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_EQUALS; 1.2070 + continue; 1.2071 + } 1.2072 + default: { 1.2073 + return nullptr; 1.2074 + } 1.2075 + } 1.2076 + } 1.2077 + case NS_HTML5TREE_BUILDER_CHARSET_EQUALS: { 1.2078 + switch(c) { 1.2079 + case '\t': 1.2080 + case '\n': 1.2081 + case '\f': 1.2082 + case '\r': 1.2083 + case ' ': { 1.2084 + continue; 1.2085 + } 1.2086 + case '\'': { 1.2087 + start = i + 1; 1.2088 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_SINGLE_QUOTED; 1.2089 + continue; 1.2090 + } 1.2091 + case '\"': { 1.2092 + start = i + 1; 1.2093 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_DOUBLE_QUOTED; 1.2094 + continue; 1.2095 + } 1.2096 + default: { 1.2097 + start = i; 1.2098 + charsetState = NS_HTML5TREE_BUILDER_CHARSET_UNQUOTED; 1.2099 + continue; 1.2100 + } 1.2101 + } 1.2102 + } 1.2103 + case NS_HTML5TREE_BUILDER_CHARSET_SINGLE_QUOTED: { 1.2104 + switch(c) { 1.2105 + case '\'': { 1.2106 + end = i; 1.2107 + NS_HTML5_BREAK(charsetloop); 1.2108 + } 1.2109 + default: { 1.2110 + continue; 1.2111 + } 1.2112 + } 1.2113 + } 1.2114 + case NS_HTML5TREE_BUILDER_CHARSET_DOUBLE_QUOTED: { 1.2115 + switch(c) { 1.2116 + case '\"': { 1.2117 + end = i; 1.2118 + NS_HTML5_BREAK(charsetloop); 1.2119 + } 1.2120 + default: { 1.2121 + continue; 1.2122 + } 1.2123 + } 1.2124 + } 1.2125 + case NS_HTML5TREE_BUILDER_CHARSET_UNQUOTED: { 1.2126 + switch(c) { 1.2127 + case '\t': 1.2128 + case '\n': 1.2129 + case '\f': 1.2130 + case '\r': 1.2131 + case ' ': 1.2132 + case ';': { 1.2133 + end = i; 1.2134 + NS_HTML5_BREAK(charsetloop); 1.2135 + } 1.2136 + default: { 1.2137 + continue; 1.2138 + } 1.2139 + } 1.2140 + } 1.2141 + } 1.2142 + } 1.2143 + charsetloop_end: ; 1.2144 + nsString* charset = nullptr; 1.2145 + if (start != -1) { 1.2146 + if (end == -1) { 1.2147 + end = buffer.length; 1.2148 + } 1.2149 + charset = nsHtml5Portability::newStringFromBuffer(buffer, start, end - start); 1.2150 + } 1.2151 + return charset; 1.2152 +} 1.2153 + 1.2154 +void 1.2155 +nsHtml5TreeBuilder::checkMetaCharset(nsHtml5HtmlAttributes* attributes) 1.2156 +{ 1.2157 + nsString* charset = attributes->getValue(nsHtml5AttributeName::ATTR_CHARSET); 1.2158 + if (charset) { 1.2159 + if (tokenizer->internalEncodingDeclaration(charset)) { 1.2160 + requestSuspension(); 1.2161 + return; 1.2162 + } 1.2163 + return; 1.2164 + } 1.2165 + if (!nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("content-type", attributes->getValue(nsHtml5AttributeName::ATTR_HTTP_EQUIV))) { 1.2166 + return; 1.2167 + } 1.2168 + nsString* content = attributes->getValue(nsHtml5AttributeName::ATTR_CONTENT); 1.2169 + if (content) { 1.2170 + nsString* extract = nsHtml5TreeBuilder::extractCharsetFromContent(content); 1.2171 + if (extract) { 1.2172 + if (tokenizer->internalEncodingDeclaration(extract)) { 1.2173 + requestSuspension(); 1.2174 + } 1.2175 + } 1.2176 + nsHtml5Portability::releaseString(extract); 1.2177 + } 1.2178 +} 1.2179 + 1.2180 +void 1.2181 +nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName) 1.2182 +{ 1.2183 + flushCharacters(); 1.2184 + needToDropLF = false; 1.2185 + int32_t eltPos; 1.2186 + int32_t group = elementName->getGroup(); 1.2187 + nsIAtom* name = elementName->name; 1.2188 + for (; ; ) { 1.2189 + if (isInForeign()) { 1.2190 + if (stack[currentPtr]->name != name) { 1.2191 + errEndTagDidNotMatchCurrentOpenElement(name, stack[currentPtr]->popName); 1.2192 + } 1.2193 + eltPos = currentPtr; 1.2194 + for (; ; ) { 1.2195 + if (stack[eltPos]->name == name) { 1.2196 + while (currentPtr >= eltPos) { 1.2197 + pop(); 1.2198 + } 1.2199 + NS_HTML5_BREAK(endtagloop); 1.2200 + } 1.2201 + if (stack[--eltPos]->ns == kNameSpaceID_XHTML) { 1.2202 + break; 1.2203 + } 1.2204 + } 1.2205 + } 1.2206 + switch(mode) { 1.2207 + case NS_HTML5TREE_BUILDER_IN_TEMPLATE: { 1.2208 + switch(group) { 1.2209 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.2210 + break; 1.2211 + } 1.2212 + default: { 1.2213 + errStrayEndTag(name); 1.2214 + NS_HTML5_BREAK(endtagloop); 1.2215 + } 1.2216 + } 1.2217 + } 1.2218 + case NS_HTML5TREE_BUILDER_IN_ROW: { 1.2219 + switch(group) { 1.2220 + case NS_HTML5TREE_BUILDER_TR: { 1.2221 + eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TR); 1.2222 + if (!eltPos) { 1.2223 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2224 + errNoTableRowToClose(); 1.2225 + NS_HTML5_BREAK(endtagloop); 1.2226 + } 1.2227 + clearStackBackTo(eltPos); 1.2228 + pop(); 1.2229 + mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY; 1.2230 + NS_HTML5_BREAK(endtagloop); 1.2231 + } 1.2232 + case NS_HTML5TREE_BUILDER_TABLE: { 1.2233 + eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TR); 1.2234 + if (!eltPos) { 1.2235 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2236 + errNoTableRowToClose(); 1.2237 + NS_HTML5_BREAK(endtagloop); 1.2238 + } 1.2239 + clearStackBackTo(eltPos); 1.2240 + pop(); 1.2241 + mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY; 1.2242 + continue; 1.2243 + } 1.2244 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: { 1.2245 + if (findLastInTableScope(name) == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2246 + errStrayEndTag(name); 1.2247 + NS_HTML5_BREAK(endtagloop); 1.2248 + } 1.2249 + eltPos = findLastOrRoot(NS_HTML5TREE_BUILDER_TR); 1.2250 + if (!eltPos) { 1.2251 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2252 + errNoTableRowToClose(); 1.2253 + NS_HTML5_BREAK(endtagloop); 1.2254 + } 1.2255 + clearStackBackTo(eltPos); 1.2256 + pop(); 1.2257 + mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY; 1.2258 + continue; 1.2259 + } 1.2260 + case NS_HTML5TREE_BUILDER_BODY: 1.2261 + case NS_HTML5TREE_BUILDER_CAPTION: 1.2262 + case NS_HTML5TREE_BUILDER_COL: 1.2263 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.2264 + case NS_HTML5TREE_BUILDER_HTML: 1.2265 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.2266 + errStrayEndTag(name); 1.2267 + NS_HTML5_BREAK(endtagloop); 1.2268 + } 1.2269 + default: 1.2270 + ; // fall through 1.2271 + } 1.2272 + } 1.2273 + case NS_HTML5TREE_BUILDER_IN_TABLE_BODY: { 1.2274 + switch(group) { 1.2275 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: { 1.2276 + eltPos = findLastOrRoot(name); 1.2277 + if (!eltPos) { 1.2278 + errStrayEndTag(name); 1.2279 + NS_HTML5_BREAK(endtagloop); 1.2280 + } 1.2281 + clearStackBackTo(eltPos); 1.2282 + pop(); 1.2283 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.2284 + NS_HTML5_BREAK(endtagloop); 1.2285 + } 1.2286 + case NS_HTML5TREE_BUILDER_TABLE: { 1.2287 + eltPos = findLastInTableScopeOrRootTemplateTbodyTheadTfoot(); 1.2288 + if (!eltPos || stack[eltPos]->getGroup() == NS_HTML5TREE_BUILDER_TEMPLATE) { 1.2289 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2290 + errStrayEndTag(name); 1.2291 + NS_HTML5_BREAK(endtagloop); 1.2292 + } 1.2293 + clearStackBackTo(eltPos); 1.2294 + pop(); 1.2295 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.2296 + continue; 1.2297 + } 1.2298 + case NS_HTML5TREE_BUILDER_BODY: 1.2299 + case NS_HTML5TREE_BUILDER_CAPTION: 1.2300 + case NS_HTML5TREE_BUILDER_COL: 1.2301 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.2302 + case NS_HTML5TREE_BUILDER_HTML: 1.2303 + case NS_HTML5TREE_BUILDER_TD_OR_TH: 1.2304 + case NS_HTML5TREE_BUILDER_TR: { 1.2305 + errStrayEndTag(name); 1.2306 + NS_HTML5_BREAK(endtagloop); 1.2307 + } 1.2308 + default: 1.2309 + ; // fall through 1.2310 + } 1.2311 + } 1.2312 + case NS_HTML5TREE_BUILDER_IN_TABLE: { 1.2313 + switch(group) { 1.2314 + case NS_HTML5TREE_BUILDER_TABLE: { 1.2315 + eltPos = findLast(nsHtml5Atoms::table); 1.2316 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2317 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2318 + errStrayEndTag(name); 1.2319 + NS_HTML5_BREAK(endtagloop); 1.2320 + } 1.2321 + while (currentPtr >= eltPos) { 1.2322 + pop(); 1.2323 + } 1.2324 + resetTheInsertionMode(); 1.2325 + NS_HTML5_BREAK(endtagloop); 1.2326 + } 1.2327 + case NS_HTML5TREE_BUILDER_BODY: 1.2328 + case NS_HTML5TREE_BUILDER_CAPTION: 1.2329 + case NS_HTML5TREE_BUILDER_COL: 1.2330 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.2331 + case NS_HTML5TREE_BUILDER_HTML: 1.2332 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.2333 + case NS_HTML5TREE_BUILDER_TD_OR_TH: 1.2334 + case NS_HTML5TREE_BUILDER_TR: { 1.2335 + errStrayEndTag(name); 1.2336 + NS_HTML5_BREAK(endtagloop); 1.2337 + } 1.2338 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.2339 + break; 1.2340 + } 1.2341 + default: { 1.2342 + errStrayEndTag(name); 1.2343 + } 1.2344 + } 1.2345 + } 1.2346 + case NS_HTML5TREE_BUILDER_IN_CAPTION: { 1.2347 + switch(group) { 1.2348 + case NS_HTML5TREE_BUILDER_CAPTION: { 1.2349 + eltPos = findLastInTableScope(nsHtml5Atoms::caption); 1.2350 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2351 + NS_HTML5_BREAK(endtagloop); 1.2352 + } 1.2353 + generateImpliedEndTags(); 1.2354 + if (!!MOZ_UNLIKELY(mViewSource) && currentPtr != eltPos) { 1.2355 + errUnclosedElements(eltPos, name); 1.2356 + } 1.2357 + while (currentPtr >= eltPos) { 1.2358 + pop(); 1.2359 + } 1.2360 + clearTheListOfActiveFormattingElementsUpToTheLastMarker(); 1.2361 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.2362 + NS_HTML5_BREAK(endtagloop); 1.2363 + } 1.2364 + case NS_HTML5TREE_BUILDER_TABLE: { 1.2365 + errTableClosedWhileCaptionOpen(); 1.2366 + eltPos = findLastInTableScope(nsHtml5Atoms::caption); 1.2367 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2368 + NS_HTML5_BREAK(endtagloop); 1.2369 + } 1.2370 + generateImpliedEndTags(); 1.2371 + if (!!MOZ_UNLIKELY(mViewSource) && currentPtr != eltPos) { 1.2372 + errUnclosedElements(eltPos, name); 1.2373 + } 1.2374 + while (currentPtr >= eltPos) { 1.2375 + pop(); 1.2376 + } 1.2377 + clearTheListOfActiveFormattingElementsUpToTheLastMarker(); 1.2378 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.2379 + continue; 1.2380 + } 1.2381 + case NS_HTML5TREE_BUILDER_BODY: 1.2382 + case NS_HTML5TREE_BUILDER_COL: 1.2383 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.2384 + case NS_HTML5TREE_BUILDER_HTML: 1.2385 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.2386 + case NS_HTML5TREE_BUILDER_TD_OR_TH: 1.2387 + case NS_HTML5TREE_BUILDER_TR: { 1.2388 + errStrayEndTag(name); 1.2389 + NS_HTML5_BREAK(endtagloop); 1.2390 + } 1.2391 + default: 1.2392 + ; // fall through 1.2393 + } 1.2394 + } 1.2395 + case NS_HTML5TREE_BUILDER_IN_CELL: { 1.2396 + switch(group) { 1.2397 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.2398 + eltPos = findLastInTableScope(name); 1.2399 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2400 + errStrayEndTag(name); 1.2401 + NS_HTML5_BREAK(endtagloop); 1.2402 + } 1.2403 + generateImpliedEndTags(); 1.2404 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) { 1.2405 + errUnclosedElements(eltPos, name); 1.2406 + } 1.2407 + while (currentPtr >= eltPos) { 1.2408 + pop(); 1.2409 + } 1.2410 + clearTheListOfActiveFormattingElementsUpToTheLastMarker(); 1.2411 + mode = NS_HTML5TREE_BUILDER_IN_ROW; 1.2412 + NS_HTML5_BREAK(endtagloop); 1.2413 + } 1.2414 + case NS_HTML5TREE_BUILDER_TABLE: 1.2415 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.2416 + case NS_HTML5TREE_BUILDER_TR: { 1.2417 + if (findLastInTableScope(name) == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2418 + MOZ_ASSERT(name == nsHtml5Atoms::tbody || name == nsHtml5Atoms::tfoot || name == nsHtml5Atoms::thead || fragment || isTemplateContents()); 1.2419 + errStrayEndTag(name); 1.2420 + NS_HTML5_BREAK(endtagloop); 1.2421 + } 1.2422 + closeTheCell(findLastInTableScopeTdTh()); 1.2423 + continue; 1.2424 + } 1.2425 + case NS_HTML5TREE_BUILDER_BODY: 1.2426 + case NS_HTML5TREE_BUILDER_CAPTION: 1.2427 + case NS_HTML5TREE_BUILDER_COL: 1.2428 + case NS_HTML5TREE_BUILDER_COLGROUP: 1.2429 + case NS_HTML5TREE_BUILDER_HTML: { 1.2430 + errStrayEndTag(name); 1.2431 + NS_HTML5_BREAK(endtagloop); 1.2432 + } 1.2433 + default: 1.2434 + ; // fall through 1.2435 + } 1.2436 + } 1.2437 + case NS_HTML5TREE_BUILDER_FRAMESET_OK: 1.2438 + case NS_HTML5TREE_BUILDER_IN_BODY: { 1.2439 + switch(group) { 1.2440 + case NS_HTML5TREE_BUILDER_BODY: { 1.2441 + if (!isSecondOnStackBody()) { 1.2442 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2443 + errStrayEndTag(name); 1.2444 + NS_HTML5_BREAK(endtagloop); 1.2445 + } 1.2446 + MOZ_ASSERT(currentPtr >= 1); 1.2447 + if (MOZ_UNLIKELY(mViewSource)) { 1.2448 + for (int32_t i = 2; i <= currentPtr; i++) { 1.2449 + switch(stack[i]->getGroup()) { 1.2450 + case NS_HTML5TREE_BUILDER_DD_OR_DT: 1.2451 + case NS_HTML5TREE_BUILDER_LI: 1.2452 + case NS_HTML5TREE_BUILDER_OPTGROUP: 1.2453 + case NS_HTML5TREE_BUILDER_OPTION: 1.2454 + case NS_HTML5TREE_BUILDER_P: 1.2455 + case NS_HTML5TREE_BUILDER_RT_OR_RP: 1.2456 + case NS_HTML5TREE_BUILDER_TD_OR_TH: 1.2457 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: { 1.2458 + break; 1.2459 + } 1.2460 + default: { 1.2461 + errEndWithUnclosedElements(name); 1.2462 + NS_HTML5_BREAK(uncloseloop1); 1.2463 + } 1.2464 + } 1.2465 + } 1.2466 + uncloseloop1_end: ; 1.2467 + } 1.2468 + mode = NS_HTML5TREE_BUILDER_AFTER_BODY; 1.2469 + NS_HTML5_BREAK(endtagloop); 1.2470 + } 1.2471 + case NS_HTML5TREE_BUILDER_HTML: { 1.2472 + if (!isSecondOnStackBody()) { 1.2473 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2474 + errStrayEndTag(name); 1.2475 + NS_HTML5_BREAK(endtagloop); 1.2476 + } 1.2477 + if (MOZ_UNLIKELY(mViewSource)) { 1.2478 + for (int32_t i = 0; i <= currentPtr; i++) { 1.2479 + switch(stack[i]->getGroup()) { 1.2480 + case NS_HTML5TREE_BUILDER_DD_OR_DT: 1.2481 + case NS_HTML5TREE_BUILDER_LI: 1.2482 + case NS_HTML5TREE_BUILDER_P: 1.2483 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.2484 + case NS_HTML5TREE_BUILDER_TD_OR_TH: 1.2485 + case NS_HTML5TREE_BUILDER_BODY: 1.2486 + case NS_HTML5TREE_BUILDER_HTML: { 1.2487 + break; 1.2488 + } 1.2489 + default: { 1.2490 + errEndWithUnclosedElements(name); 1.2491 + NS_HTML5_BREAK(uncloseloop2); 1.2492 + } 1.2493 + } 1.2494 + } 1.2495 + uncloseloop2_end: ; 1.2496 + } 1.2497 + mode = NS_HTML5TREE_BUILDER_AFTER_BODY; 1.2498 + continue; 1.2499 + } 1.2500 + case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU: 1.2501 + case NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL: 1.2502 + case NS_HTML5TREE_BUILDER_PRE_OR_LISTING: 1.2503 + case NS_HTML5TREE_BUILDER_FIELDSET: 1.2504 + case NS_HTML5TREE_BUILDER_BUTTON: 1.2505 + case NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY: { 1.2506 + eltPos = findLastInScope(name); 1.2507 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2508 + errStrayEndTag(name); 1.2509 + } else { 1.2510 + generateImpliedEndTags(); 1.2511 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) { 1.2512 + errUnclosedElements(eltPos, name); 1.2513 + } 1.2514 + while (currentPtr >= eltPos) { 1.2515 + pop(); 1.2516 + } 1.2517 + } 1.2518 + NS_HTML5_BREAK(endtagloop); 1.2519 + } 1.2520 + case NS_HTML5TREE_BUILDER_FORM: { 1.2521 + if (!isTemplateContents()) { 1.2522 + if (!formPointer) { 1.2523 + errStrayEndTag(name); 1.2524 + NS_HTML5_BREAK(endtagloop); 1.2525 + } 1.2526 + formPointer = nullptr; 1.2527 + eltPos = findLastInScope(name); 1.2528 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2529 + errStrayEndTag(name); 1.2530 + NS_HTML5_BREAK(endtagloop); 1.2531 + } 1.2532 + generateImpliedEndTags(); 1.2533 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) { 1.2534 + errUnclosedElements(eltPos, name); 1.2535 + } 1.2536 + removeFromStack(eltPos); 1.2537 + NS_HTML5_BREAK(endtagloop); 1.2538 + } else { 1.2539 + eltPos = findLastInScope(name); 1.2540 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2541 + errStrayEndTag(name); 1.2542 + NS_HTML5_BREAK(endtagloop); 1.2543 + } 1.2544 + generateImpliedEndTags(); 1.2545 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) { 1.2546 + errUnclosedElements(eltPos, name); 1.2547 + } 1.2548 + while (currentPtr >= eltPos) { 1.2549 + pop(); 1.2550 + } 1.2551 + NS_HTML5_BREAK(endtagloop); 1.2552 + } 1.2553 + } 1.2554 + case NS_HTML5TREE_BUILDER_P: { 1.2555 + eltPos = findLastInButtonScope(nsHtml5Atoms::p); 1.2556 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2557 + errNoElementToCloseButEndTagSeen(nsHtml5Atoms::p); 1.2558 + if (isInForeign()) { 1.2559 + errHtmlStartTagInForeignContext(name); 1.2560 + while (stack[currentPtr]->ns != kNameSpaceID_XHTML) { 1.2561 + pop(); 1.2562 + } 1.2563 + } 1.2564 + appendVoidElementToCurrentMayFoster(elementName, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.2565 + NS_HTML5_BREAK(endtagloop); 1.2566 + } 1.2567 + generateImpliedEndTagsExceptFor(nsHtml5Atoms::p); 1.2568 + MOZ_ASSERT(eltPos != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK); 1.2569 + if (!!MOZ_UNLIKELY(mViewSource) && eltPos != currentPtr) { 1.2570 + errUnclosedElements(eltPos, name); 1.2571 + } 1.2572 + while (currentPtr >= eltPos) { 1.2573 + pop(); 1.2574 + } 1.2575 + NS_HTML5_BREAK(endtagloop); 1.2576 + } 1.2577 + case NS_HTML5TREE_BUILDER_LI: { 1.2578 + eltPos = findLastInListScope(name); 1.2579 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2580 + errNoElementToCloseButEndTagSeen(name); 1.2581 + } else { 1.2582 + generateImpliedEndTagsExceptFor(name); 1.2583 + if (!!MOZ_UNLIKELY(mViewSource) && eltPos != currentPtr) { 1.2584 + errUnclosedElements(eltPos, name); 1.2585 + } 1.2586 + while (currentPtr >= eltPos) { 1.2587 + pop(); 1.2588 + } 1.2589 + } 1.2590 + NS_HTML5_BREAK(endtagloop); 1.2591 + } 1.2592 + case NS_HTML5TREE_BUILDER_DD_OR_DT: { 1.2593 + eltPos = findLastInScope(name); 1.2594 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2595 + errNoElementToCloseButEndTagSeen(name); 1.2596 + } else { 1.2597 + generateImpliedEndTagsExceptFor(name); 1.2598 + if (!!MOZ_UNLIKELY(mViewSource) && eltPos != currentPtr) { 1.2599 + errUnclosedElements(eltPos, name); 1.2600 + } 1.2601 + while (currentPtr >= eltPos) { 1.2602 + pop(); 1.2603 + } 1.2604 + } 1.2605 + NS_HTML5_BREAK(endtagloop); 1.2606 + } 1.2607 + case NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6: { 1.2608 + eltPos = findLastInScopeHn(); 1.2609 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2610 + errStrayEndTag(name); 1.2611 + } else { 1.2612 + generateImpliedEndTags(); 1.2613 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) { 1.2614 + errUnclosedElements(eltPos, name); 1.2615 + } 1.2616 + while (currentPtr >= eltPos) { 1.2617 + pop(); 1.2618 + } 1.2619 + } 1.2620 + NS_HTML5_BREAK(endtagloop); 1.2621 + } 1.2622 + case NS_HTML5TREE_BUILDER_OBJECT: 1.2623 + case NS_HTML5TREE_BUILDER_MARQUEE_OR_APPLET: { 1.2624 + eltPos = findLastInScope(name); 1.2625 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2626 + errStrayEndTag(name); 1.2627 + } else { 1.2628 + generateImpliedEndTags(); 1.2629 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) { 1.2630 + errUnclosedElements(eltPos, name); 1.2631 + } 1.2632 + while (currentPtr >= eltPos) { 1.2633 + pop(); 1.2634 + } 1.2635 + clearTheListOfActiveFormattingElementsUpToTheLastMarker(); 1.2636 + } 1.2637 + NS_HTML5_BREAK(endtagloop); 1.2638 + } 1.2639 + case NS_HTML5TREE_BUILDER_BR: { 1.2640 + errEndTagBr(); 1.2641 + if (isInForeign()) { 1.2642 + errHtmlStartTagInForeignContext(name); 1.2643 + while (stack[currentPtr]->ns != kNameSpaceID_XHTML) { 1.2644 + pop(); 1.2645 + } 1.2646 + } 1.2647 + reconstructTheActiveFormattingElements(); 1.2648 + appendVoidElementToCurrentMayFoster(elementName, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.2649 + NS_HTML5_BREAK(endtagloop); 1.2650 + } 1.2651 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.2652 + break; 1.2653 + } 1.2654 + case NS_HTML5TREE_BUILDER_AREA_OR_WBR: 1.2655 +#ifdef ENABLE_VOID_MENUITEM 1.2656 + case NS_HTML5TREE_BUILDER_MENUITEM: 1.2657 +#endif 1.2658 + case NS_HTML5TREE_BUILDER_PARAM_OR_SOURCE_OR_TRACK: 1.2659 + case NS_HTML5TREE_BUILDER_EMBED: 1.2660 + case NS_HTML5TREE_BUILDER_IMG: 1.2661 + case NS_HTML5TREE_BUILDER_IMAGE: 1.2662 + case NS_HTML5TREE_BUILDER_INPUT: 1.2663 + case NS_HTML5TREE_BUILDER_KEYGEN: 1.2664 + case NS_HTML5TREE_BUILDER_HR: 1.2665 + case NS_HTML5TREE_BUILDER_ISINDEX: 1.2666 + case NS_HTML5TREE_BUILDER_IFRAME: 1.2667 + case NS_HTML5TREE_BUILDER_NOEMBED: 1.2668 + case NS_HTML5TREE_BUILDER_NOFRAMES: 1.2669 + case NS_HTML5TREE_BUILDER_SELECT: 1.2670 + case NS_HTML5TREE_BUILDER_TABLE: 1.2671 + case NS_HTML5TREE_BUILDER_TEXTAREA: { 1.2672 + errStrayEndTag(name); 1.2673 + NS_HTML5_BREAK(endtagloop); 1.2674 + } 1.2675 + case NS_HTML5TREE_BUILDER_NOSCRIPT: { 1.2676 + if (scriptingEnabled) { 1.2677 + errStrayEndTag(name); 1.2678 + NS_HTML5_BREAK(endtagloop); 1.2679 + } else { 1.2680 + } 1.2681 + } 1.2682 + case NS_HTML5TREE_BUILDER_A: 1.2683 + 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: 1.2684 + case NS_HTML5TREE_BUILDER_FONT: 1.2685 + case NS_HTML5TREE_BUILDER_NOBR: { 1.2686 + if (adoptionAgencyEndTag(name)) { 1.2687 + NS_HTML5_BREAK(endtagloop); 1.2688 + } 1.2689 + } 1.2690 + default: { 1.2691 + if (isCurrent(name)) { 1.2692 + pop(); 1.2693 + NS_HTML5_BREAK(endtagloop); 1.2694 + } 1.2695 + eltPos = currentPtr; 1.2696 + for (; ; ) { 1.2697 + nsHtml5StackNode* node = stack[eltPos]; 1.2698 + if (node->ns == kNameSpaceID_XHTML && node->name == name) { 1.2699 + generateImpliedEndTags(); 1.2700 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) { 1.2701 + errUnclosedElements(eltPos, name); 1.2702 + } 1.2703 + while (currentPtr >= eltPos) { 1.2704 + pop(); 1.2705 + } 1.2706 + NS_HTML5_BREAK(endtagloop); 1.2707 + } else if (node->isSpecial()) { 1.2708 + errStrayEndTag(name); 1.2709 + NS_HTML5_BREAK(endtagloop); 1.2710 + } 1.2711 + eltPos--; 1.2712 + } 1.2713 + } 1.2714 + } 1.2715 + } 1.2716 + case NS_HTML5TREE_BUILDER_IN_HEAD: { 1.2717 + switch(group) { 1.2718 + case NS_HTML5TREE_BUILDER_HEAD: { 1.2719 + pop(); 1.2720 + mode = NS_HTML5TREE_BUILDER_AFTER_HEAD; 1.2721 + NS_HTML5_BREAK(endtagloop); 1.2722 + } 1.2723 + case NS_HTML5TREE_BUILDER_BR: 1.2724 + case NS_HTML5TREE_BUILDER_HTML: 1.2725 + case NS_HTML5TREE_BUILDER_BODY: { 1.2726 + pop(); 1.2727 + mode = NS_HTML5TREE_BUILDER_AFTER_HEAD; 1.2728 + continue; 1.2729 + } 1.2730 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.2731 + endTagTemplateInHead(); 1.2732 + NS_HTML5_BREAK(endtagloop); 1.2733 + } 1.2734 + default: { 1.2735 + errStrayEndTag(name); 1.2736 + NS_HTML5_BREAK(endtagloop); 1.2737 + } 1.2738 + } 1.2739 + } 1.2740 + case NS_HTML5TREE_BUILDER_IN_HEAD_NOSCRIPT: { 1.2741 + switch(group) { 1.2742 + case NS_HTML5TREE_BUILDER_NOSCRIPT: { 1.2743 + pop(); 1.2744 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.2745 + NS_HTML5_BREAK(endtagloop); 1.2746 + } 1.2747 + case NS_HTML5TREE_BUILDER_BR: { 1.2748 + errStrayEndTag(name); 1.2749 + pop(); 1.2750 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.2751 + continue; 1.2752 + } 1.2753 + default: { 1.2754 + errStrayEndTag(name); 1.2755 + NS_HTML5_BREAK(endtagloop); 1.2756 + } 1.2757 + } 1.2758 + } 1.2759 + case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: { 1.2760 + switch(group) { 1.2761 + case NS_HTML5TREE_BUILDER_COLGROUP: { 1.2762 + if (!currentPtr || stack[currentPtr]->getGroup() == NS_HTML5TREE_BUILDER_TEMPLATE) { 1.2763 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2764 + errGarbageInColgroup(); 1.2765 + NS_HTML5_BREAK(endtagloop); 1.2766 + } 1.2767 + pop(); 1.2768 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.2769 + NS_HTML5_BREAK(endtagloop); 1.2770 + } 1.2771 + case NS_HTML5TREE_BUILDER_COL: { 1.2772 + errStrayEndTag(name); 1.2773 + NS_HTML5_BREAK(endtagloop); 1.2774 + } 1.2775 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.2776 + endTagTemplateInHead(); 1.2777 + NS_HTML5_BREAK(endtagloop); 1.2778 + } 1.2779 + default: { 1.2780 + if (!currentPtr || stack[currentPtr]->getGroup() == NS_HTML5TREE_BUILDER_TEMPLATE) { 1.2781 + MOZ_ASSERT(fragment || isTemplateContents()); 1.2782 + errGarbageInColgroup(); 1.2783 + NS_HTML5_BREAK(endtagloop); 1.2784 + } 1.2785 + pop(); 1.2786 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.2787 + continue; 1.2788 + } 1.2789 + } 1.2790 + } 1.2791 + case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE: { 1.2792 + switch(group) { 1.2793 + case NS_HTML5TREE_BUILDER_CAPTION: 1.2794 + case NS_HTML5TREE_BUILDER_TABLE: 1.2795 + case NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT: 1.2796 + case NS_HTML5TREE_BUILDER_TR: 1.2797 + case NS_HTML5TREE_BUILDER_TD_OR_TH: { 1.2798 + errEndTagSeenWithSelectOpen(name); 1.2799 + if (findLastInTableScope(name) != NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2800 + eltPos = findLastInTableScope(nsHtml5Atoms::select); 1.2801 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2802 + MOZ_ASSERT(fragment); 1.2803 + NS_HTML5_BREAK(endtagloop); 1.2804 + } 1.2805 + while (currentPtr >= eltPos) { 1.2806 + pop(); 1.2807 + } 1.2808 + resetTheInsertionMode(); 1.2809 + continue; 1.2810 + } else { 1.2811 + NS_HTML5_BREAK(endtagloop); 1.2812 + } 1.2813 + } 1.2814 + default: 1.2815 + ; // fall through 1.2816 + } 1.2817 + } 1.2818 + case NS_HTML5TREE_BUILDER_IN_SELECT: { 1.2819 + switch(group) { 1.2820 + case NS_HTML5TREE_BUILDER_OPTION: { 1.2821 + if (isCurrent(nsHtml5Atoms::option)) { 1.2822 + pop(); 1.2823 + NS_HTML5_BREAK(endtagloop); 1.2824 + } else { 1.2825 + errStrayEndTag(name); 1.2826 + NS_HTML5_BREAK(endtagloop); 1.2827 + } 1.2828 + } 1.2829 + case NS_HTML5TREE_BUILDER_OPTGROUP: { 1.2830 + if (isCurrent(nsHtml5Atoms::option) && nsHtml5Atoms::optgroup == stack[currentPtr - 1]->name) { 1.2831 + pop(); 1.2832 + } 1.2833 + if (isCurrent(nsHtml5Atoms::optgroup)) { 1.2834 + pop(); 1.2835 + } else { 1.2836 + errStrayEndTag(name); 1.2837 + } 1.2838 + NS_HTML5_BREAK(endtagloop); 1.2839 + } 1.2840 + case NS_HTML5TREE_BUILDER_SELECT: { 1.2841 + eltPos = findLastInTableScope(nsHtml5Atoms::select); 1.2842 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2843 + MOZ_ASSERT(fragment); 1.2844 + errStrayEndTag(name); 1.2845 + NS_HTML5_BREAK(endtagloop); 1.2846 + } 1.2847 + while (currentPtr >= eltPos) { 1.2848 + pop(); 1.2849 + } 1.2850 + resetTheInsertionMode(); 1.2851 + NS_HTML5_BREAK(endtagloop); 1.2852 + } 1.2853 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.2854 + endTagTemplateInHead(); 1.2855 + NS_HTML5_BREAK(endtagloop); 1.2856 + } 1.2857 + default: { 1.2858 + errStrayEndTag(name); 1.2859 + NS_HTML5_BREAK(endtagloop); 1.2860 + } 1.2861 + } 1.2862 + } 1.2863 + case NS_HTML5TREE_BUILDER_AFTER_BODY: { 1.2864 + switch(group) { 1.2865 + case NS_HTML5TREE_BUILDER_HTML: { 1.2866 + if (fragment) { 1.2867 + errStrayEndTag(name); 1.2868 + NS_HTML5_BREAK(endtagloop); 1.2869 + } else { 1.2870 + mode = NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY; 1.2871 + NS_HTML5_BREAK(endtagloop); 1.2872 + } 1.2873 + } 1.2874 + default: { 1.2875 + errEndTagAfterBody(); 1.2876 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.2877 + continue; 1.2878 + } 1.2879 + } 1.2880 + } 1.2881 + case NS_HTML5TREE_BUILDER_IN_FRAMESET: { 1.2882 + switch(group) { 1.2883 + case NS_HTML5TREE_BUILDER_FRAMESET: { 1.2884 + if (!currentPtr) { 1.2885 + MOZ_ASSERT(fragment); 1.2886 + errStrayEndTag(name); 1.2887 + NS_HTML5_BREAK(endtagloop); 1.2888 + } 1.2889 + pop(); 1.2890 + if ((!fragment) && !isCurrent(nsHtml5Atoms::frameset)) { 1.2891 + mode = NS_HTML5TREE_BUILDER_AFTER_FRAMESET; 1.2892 + } 1.2893 + NS_HTML5_BREAK(endtagloop); 1.2894 + } 1.2895 + default: { 1.2896 + errStrayEndTag(name); 1.2897 + NS_HTML5_BREAK(endtagloop); 1.2898 + } 1.2899 + } 1.2900 + } 1.2901 + case NS_HTML5TREE_BUILDER_AFTER_FRAMESET: { 1.2902 + switch(group) { 1.2903 + case NS_HTML5TREE_BUILDER_HTML: { 1.2904 + mode = NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET; 1.2905 + NS_HTML5_BREAK(endtagloop); 1.2906 + } 1.2907 + default: { 1.2908 + errStrayEndTag(name); 1.2909 + NS_HTML5_BREAK(endtagloop); 1.2910 + } 1.2911 + } 1.2912 + } 1.2913 + case NS_HTML5TREE_BUILDER_INITIAL: { 1.2914 + errEndTagSeenWithoutDoctype(); 1.2915 + documentModeInternal(QUIRKS_MODE, nullptr, nullptr, false); 1.2916 + mode = NS_HTML5TREE_BUILDER_BEFORE_HTML; 1.2917 + continue; 1.2918 + } 1.2919 + case NS_HTML5TREE_BUILDER_BEFORE_HTML: { 1.2920 + switch(group) { 1.2921 + case NS_HTML5TREE_BUILDER_HEAD: 1.2922 + case NS_HTML5TREE_BUILDER_BR: 1.2923 + case NS_HTML5TREE_BUILDER_HTML: 1.2924 + case NS_HTML5TREE_BUILDER_BODY: { 1.2925 + appendHtmlElementToDocumentAndPush(); 1.2926 + mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD; 1.2927 + continue; 1.2928 + } 1.2929 + default: { 1.2930 + errStrayEndTag(name); 1.2931 + NS_HTML5_BREAK(endtagloop); 1.2932 + } 1.2933 + } 1.2934 + } 1.2935 + case NS_HTML5TREE_BUILDER_BEFORE_HEAD: { 1.2936 + switch(group) { 1.2937 + case NS_HTML5TREE_BUILDER_HEAD: 1.2938 + case NS_HTML5TREE_BUILDER_BR: 1.2939 + case NS_HTML5TREE_BUILDER_HTML: 1.2940 + case NS_HTML5TREE_BUILDER_BODY: { 1.2941 + appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES); 1.2942 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.2943 + continue; 1.2944 + } 1.2945 + default: { 1.2946 + errStrayEndTag(name); 1.2947 + NS_HTML5_BREAK(endtagloop); 1.2948 + } 1.2949 + } 1.2950 + } 1.2951 + case NS_HTML5TREE_BUILDER_AFTER_HEAD: { 1.2952 + switch(group) { 1.2953 + case NS_HTML5TREE_BUILDER_TEMPLATE: { 1.2954 + endTagTemplateInHead(); 1.2955 + NS_HTML5_BREAK(endtagloop); 1.2956 + } 1.2957 + case NS_HTML5TREE_BUILDER_HTML: 1.2958 + case NS_HTML5TREE_BUILDER_BODY: 1.2959 + case NS_HTML5TREE_BUILDER_BR: { 1.2960 + appendToCurrentNodeAndPushBodyElement(); 1.2961 + mode = NS_HTML5TREE_BUILDER_FRAMESET_OK; 1.2962 + continue; 1.2963 + } 1.2964 + default: { 1.2965 + errStrayEndTag(name); 1.2966 + NS_HTML5_BREAK(endtagloop); 1.2967 + } 1.2968 + } 1.2969 + } 1.2970 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY: { 1.2971 + errStrayEndTag(name); 1.2972 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.2973 + continue; 1.2974 + } 1.2975 + case NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET: { 1.2976 + errStrayEndTag(name); 1.2977 + NS_HTML5_BREAK(endtagloop); 1.2978 + } 1.2979 + case NS_HTML5TREE_BUILDER_TEXT: { 1.2980 + pop(); 1.2981 + if (originalMode == NS_HTML5TREE_BUILDER_AFTER_HEAD) { 1.2982 + silentPop(); 1.2983 + } 1.2984 + mode = originalMode; 1.2985 + NS_HTML5_BREAK(endtagloop); 1.2986 + } 1.2987 + } 1.2988 + } 1.2989 + endtagloop_end: ; 1.2990 +} 1.2991 + 1.2992 +void 1.2993 +nsHtml5TreeBuilder::endTagTemplateInHead() 1.2994 +{ 1.2995 + int32_t eltPos = findLast(nsHtml5Atoms::template_); 1.2996 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.2997 + errStrayEndTag(nsHtml5Atoms::template_); 1.2998 + return; 1.2999 + } 1.3000 + generateImpliedEndTags(); 1.3001 + if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(nsHtml5Atoms::template_)) { 1.3002 + errUnclosedElements(eltPos, nsHtml5Atoms::template_); 1.3003 + } 1.3004 + while (currentPtr >= eltPos) { 1.3005 + pop(); 1.3006 + } 1.3007 + clearTheListOfActiveFormattingElementsUpToTheLastMarker(); 1.3008 + popTemplateMode(); 1.3009 + resetTheInsertionMode(); 1.3010 +} 1.3011 + 1.3012 +int32_t 1.3013 +nsHtml5TreeBuilder::findLastInTableScopeOrRootTemplateTbodyTheadTfoot() 1.3014 +{ 1.3015 + for (int32_t i = currentPtr; i > 0; i--) { 1.3016 + if (stack[i]->getGroup() == NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT || stack[i]->getGroup() == NS_HTML5TREE_BUILDER_TEMPLATE) { 1.3017 + return i; 1.3018 + } 1.3019 + } 1.3020 + return 0; 1.3021 +} 1.3022 + 1.3023 +int32_t 1.3024 +nsHtml5TreeBuilder::findLast(nsIAtom* name) 1.3025 +{ 1.3026 + for (int32_t i = currentPtr; i > 0; i--) { 1.3027 + if (stack[i]->ns == kNameSpaceID_XHTML && stack[i]->name == name) { 1.3028 + return i; 1.3029 + } 1.3030 + } 1.3031 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3032 +} 1.3033 + 1.3034 +int32_t 1.3035 +nsHtml5TreeBuilder::findLastInTableScope(nsIAtom* name) 1.3036 +{ 1.3037 + for (int32_t i = currentPtr; i > 0; i--) { 1.3038 + if (stack[i]->ns == kNameSpaceID_XHTML) { 1.3039 + if (stack[i]->name == name) { 1.3040 + return i; 1.3041 + } else if (stack[i]->name == nsHtml5Atoms::table || stack[i]->name == nsHtml5Atoms::template_) { 1.3042 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3043 + } 1.3044 + } 1.3045 + } 1.3046 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3047 +} 1.3048 + 1.3049 +int32_t 1.3050 +nsHtml5TreeBuilder::findLastInButtonScope(nsIAtom* name) 1.3051 +{ 1.3052 + for (int32_t i = currentPtr; i > 0; i--) { 1.3053 + if (stack[i]->ns == kNameSpaceID_XHTML) { 1.3054 + if (stack[i]->name == name) { 1.3055 + return i; 1.3056 + } else if (stack[i]->name == nsHtml5Atoms::button) { 1.3057 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3058 + } 1.3059 + } 1.3060 + if (stack[i]->isScoping()) { 1.3061 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3062 + } 1.3063 + } 1.3064 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3065 +} 1.3066 + 1.3067 +int32_t 1.3068 +nsHtml5TreeBuilder::findLastInScope(nsIAtom* name) 1.3069 +{ 1.3070 + for (int32_t i = currentPtr; i > 0; i--) { 1.3071 + if (stack[i]->ns == kNameSpaceID_XHTML && stack[i]->name == name) { 1.3072 + return i; 1.3073 + } else if (stack[i]->isScoping()) { 1.3074 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3075 + } 1.3076 + } 1.3077 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3078 +} 1.3079 + 1.3080 +int32_t 1.3081 +nsHtml5TreeBuilder::findLastInListScope(nsIAtom* name) 1.3082 +{ 1.3083 + for (int32_t i = currentPtr; i > 0; i--) { 1.3084 + if (stack[i]->ns == kNameSpaceID_XHTML) { 1.3085 + if (stack[i]->name == name) { 1.3086 + return i; 1.3087 + } else if (stack[i]->name == nsHtml5Atoms::ul || stack[i]->name == nsHtml5Atoms::ol) { 1.3088 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3089 + } 1.3090 + } 1.3091 + if (stack[i]->isScoping()) { 1.3092 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3093 + } 1.3094 + } 1.3095 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3096 +} 1.3097 + 1.3098 +int32_t 1.3099 +nsHtml5TreeBuilder::findLastInScopeHn() 1.3100 +{ 1.3101 + for (int32_t i = currentPtr; i > 0; i--) { 1.3102 + if (stack[i]->getGroup() == NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) { 1.3103 + return i; 1.3104 + } else if (stack[i]->isScoping()) { 1.3105 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3106 + } 1.3107 + } 1.3108 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3109 +} 1.3110 + 1.3111 +void 1.3112 +nsHtml5TreeBuilder::generateImpliedEndTagsExceptFor(nsIAtom* name) 1.3113 +{ 1.3114 + for (; ; ) { 1.3115 + nsHtml5StackNode* node = stack[currentPtr]; 1.3116 + switch(node->getGroup()) { 1.3117 + case NS_HTML5TREE_BUILDER_P: 1.3118 + case NS_HTML5TREE_BUILDER_LI: 1.3119 + case NS_HTML5TREE_BUILDER_DD_OR_DT: 1.3120 + case NS_HTML5TREE_BUILDER_OPTION: 1.3121 + case NS_HTML5TREE_BUILDER_OPTGROUP: 1.3122 + case NS_HTML5TREE_BUILDER_RT_OR_RP: { 1.3123 + if (node->ns == kNameSpaceID_XHTML && node->name == name) { 1.3124 + return; 1.3125 + } 1.3126 + pop(); 1.3127 + continue; 1.3128 + } 1.3129 + default: { 1.3130 + return; 1.3131 + } 1.3132 + } 1.3133 + } 1.3134 +} 1.3135 + 1.3136 +void 1.3137 +nsHtml5TreeBuilder::generateImpliedEndTags() 1.3138 +{ 1.3139 + for (; ; ) { 1.3140 + switch(stack[currentPtr]->getGroup()) { 1.3141 + case NS_HTML5TREE_BUILDER_P: 1.3142 + case NS_HTML5TREE_BUILDER_LI: 1.3143 + case NS_HTML5TREE_BUILDER_DD_OR_DT: 1.3144 + case NS_HTML5TREE_BUILDER_OPTION: 1.3145 + case NS_HTML5TREE_BUILDER_OPTGROUP: 1.3146 + case NS_HTML5TREE_BUILDER_RT_OR_RP: { 1.3147 + pop(); 1.3148 + continue; 1.3149 + } 1.3150 + default: { 1.3151 + return; 1.3152 + } 1.3153 + } 1.3154 + } 1.3155 +} 1.3156 + 1.3157 +bool 1.3158 +nsHtml5TreeBuilder::isSecondOnStackBody() 1.3159 +{ 1.3160 + return currentPtr >= 1 && stack[1]->getGroup() == NS_HTML5TREE_BUILDER_BODY; 1.3161 +} 1.3162 + 1.3163 +void 1.3164 +nsHtml5TreeBuilder::documentModeInternal(nsHtml5DocumentMode m, nsString* publicIdentifier, nsString* systemIdentifier, bool html4SpecificAdditionalErrorChecks) 1.3165 +{ 1.3166 + if (isSrcdocDocument) { 1.3167 + quirks = false; 1.3168 + if (this) { 1.3169 + this->documentMode(STANDARDS_MODE); 1.3170 + } 1.3171 + return; 1.3172 + } 1.3173 + quirks = (m == QUIRKS_MODE); 1.3174 + if (this) { 1.3175 + this->documentMode(m); 1.3176 + } 1.3177 +} 1.3178 + 1.3179 +bool 1.3180 +nsHtml5TreeBuilder::isAlmostStandards(nsString* publicIdentifier, nsString* systemIdentifier) 1.3181 +{ 1.3182 + if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd xhtml 1.0 transitional//en", publicIdentifier)) { 1.3183 + return true; 1.3184 + } 1.3185 + if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd xhtml 1.0 frameset//en", publicIdentifier)) { 1.3186 + return true; 1.3187 + } 1.3188 + if (systemIdentifier) { 1.3189 + if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 transitional//en", publicIdentifier)) { 1.3190 + return true; 1.3191 + } 1.3192 + if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 frameset//en", publicIdentifier)) { 1.3193 + return true; 1.3194 + } 1.3195 + } 1.3196 + return false; 1.3197 +} 1.3198 + 1.3199 +bool 1.3200 +nsHtml5TreeBuilder::isQuirky(nsIAtom* name, nsString* publicIdentifier, nsString* systemIdentifier, bool forceQuirks) 1.3201 +{ 1.3202 + if (forceQuirks) { 1.3203 + return true; 1.3204 + } 1.3205 + if (name != nsHtml5Atoms::html) { 1.3206 + return true; 1.3207 + } 1.3208 + if (publicIdentifier) { 1.3209 + for (int32_t i = 0; i < nsHtml5TreeBuilder::QUIRKY_PUBLIC_IDS.length; i++) { 1.3210 + if (nsHtml5Portability::lowerCaseLiteralIsPrefixOfIgnoreAsciiCaseString(nsHtml5TreeBuilder::QUIRKY_PUBLIC_IDS[i], publicIdentifier)) { 1.3211 + return true; 1.3212 + } 1.3213 + } 1.3214 + 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)) { 1.3215 + return true; 1.3216 + } 1.3217 + } 1.3218 + if (!systemIdentifier) { 1.3219 + if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 transitional//en", publicIdentifier)) { 1.3220 + return true; 1.3221 + } else if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 frameset//en", publicIdentifier)) { 1.3222 + return true; 1.3223 + } 1.3224 + } else if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd", systemIdentifier)) { 1.3225 + return true; 1.3226 + } 1.3227 + return false; 1.3228 +} 1.3229 + 1.3230 +void 1.3231 +nsHtml5TreeBuilder::closeTheCell(int32_t eltPos) 1.3232 +{ 1.3233 + generateImpliedEndTags(); 1.3234 + if (!!MOZ_UNLIKELY(mViewSource) && eltPos != currentPtr) { 1.3235 + errUnclosedElementsCell(eltPos); 1.3236 + } 1.3237 + while (currentPtr >= eltPos) { 1.3238 + pop(); 1.3239 + } 1.3240 + clearTheListOfActiveFormattingElementsUpToTheLastMarker(); 1.3241 + mode = NS_HTML5TREE_BUILDER_IN_ROW; 1.3242 + return; 1.3243 +} 1.3244 + 1.3245 +int32_t 1.3246 +nsHtml5TreeBuilder::findLastInTableScopeTdTh() 1.3247 +{ 1.3248 + for (int32_t i = currentPtr; i > 0; i--) { 1.3249 + nsIAtom* name = stack[i]->name; 1.3250 + if (stack[i]->ns == kNameSpaceID_XHTML) { 1.3251 + if (nsHtml5Atoms::td == name || nsHtml5Atoms::th == name) { 1.3252 + return i; 1.3253 + } else if (name == nsHtml5Atoms::table || name == nsHtml5Atoms::template_) { 1.3254 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3255 + } 1.3256 + } 1.3257 + } 1.3258 + return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK; 1.3259 +} 1.3260 + 1.3261 +void 1.3262 +nsHtml5TreeBuilder::clearStackBackTo(int32_t eltPos) 1.3263 +{ 1.3264 + int32_t eltGroup = stack[eltPos]->getGroup(); 1.3265 + while (currentPtr > eltPos) { 1.3266 + if (stack[currentPtr]->ns == kNameSpaceID_XHTML && stack[currentPtr]->getGroup() == NS_HTML5TREE_BUILDER_TEMPLATE && (eltGroup == NS_HTML5TREE_BUILDER_TABLE || eltGroup == NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT || eltGroup == NS_HTML5TREE_BUILDER_TR || eltGroup == NS_HTML5TREE_BUILDER_HTML)) { 1.3267 + return; 1.3268 + } 1.3269 + pop(); 1.3270 + } 1.3271 +} 1.3272 + 1.3273 +void 1.3274 +nsHtml5TreeBuilder::resetTheInsertionMode() 1.3275 +{ 1.3276 + nsHtml5StackNode* node; 1.3277 + nsIAtom* name; 1.3278 + int32_t ns; 1.3279 + for (int32_t i = currentPtr; i >= 0; i--) { 1.3280 + node = stack[i]; 1.3281 + name = node->name; 1.3282 + ns = node->ns; 1.3283 + if (!i) { 1.3284 + if (!(contextNamespace == kNameSpaceID_XHTML && (contextName == nsHtml5Atoms::td || contextName == nsHtml5Atoms::th))) { 1.3285 + if (fragment) { 1.3286 + name = contextName; 1.3287 + ns = contextNamespace; 1.3288 + } 1.3289 + } else { 1.3290 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.3291 + return; 1.3292 + } 1.3293 + } 1.3294 + if (nsHtml5Atoms::select == name) { 1.3295 + int32_t ancestorIndex = i; 1.3296 + while (ancestorIndex > 0) { 1.3297 + nsHtml5StackNode* ancestor = stack[ancestorIndex--]; 1.3298 + if (kNameSpaceID_XHTML == ancestor->ns) { 1.3299 + if (nsHtml5Atoms::template_ == ancestor->name) { 1.3300 + break; 1.3301 + } 1.3302 + if (nsHtml5Atoms::table == ancestor->name) { 1.3303 + mode = NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE; 1.3304 + return; 1.3305 + } 1.3306 + } 1.3307 + } 1.3308 + mode = NS_HTML5TREE_BUILDER_IN_SELECT; 1.3309 + return; 1.3310 + } else if (nsHtml5Atoms::td == name || nsHtml5Atoms::th == name) { 1.3311 + mode = NS_HTML5TREE_BUILDER_IN_CELL; 1.3312 + return; 1.3313 + } else if (nsHtml5Atoms::tr == name) { 1.3314 + mode = NS_HTML5TREE_BUILDER_IN_ROW; 1.3315 + return; 1.3316 + } else if (nsHtml5Atoms::tbody == name || nsHtml5Atoms::thead == name || nsHtml5Atoms::tfoot == name) { 1.3317 + mode = NS_HTML5TREE_BUILDER_IN_TABLE_BODY; 1.3318 + return; 1.3319 + } else if (nsHtml5Atoms::caption == name) { 1.3320 + mode = NS_HTML5TREE_BUILDER_IN_CAPTION; 1.3321 + return; 1.3322 + } else if (nsHtml5Atoms::colgroup == name) { 1.3323 + mode = NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP; 1.3324 + return; 1.3325 + } else if (nsHtml5Atoms::table == name) { 1.3326 + mode = NS_HTML5TREE_BUILDER_IN_TABLE; 1.3327 + return; 1.3328 + } else if (kNameSpaceID_XHTML != ns) { 1.3329 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.3330 + return; 1.3331 + } else if (nsHtml5Atoms::template_ == name) { 1.3332 + MOZ_ASSERT(templateModePtr >= 0); 1.3333 + mode = templateModeStack[templateModePtr]; 1.3334 + return; 1.3335 + } else if (nsHtml5Atoms::head == name) { 1.3336 + if (name == contextName) { 1.3337 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.3338 + } else { 1.3339 + mode = NS_HTML5TREE_BUILDER_IN_HEAD; 1.3340 + } 1.3341 + return; 1.3342 + } else if (nsHtml5Atoms::body == name) { 1.3343 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.3344 + return; 1.3345 + } else if (nsHtml5Atoms::frameset == name) { 1.3346 + mode = NS_HTML5TREE_BUILDER_IN_FRAMESET; 1.3347 + return; 1.3348 + } else if (nsHtml5Atoms::html == name) { 1.3349 + if (!headPointer) { 1.3350 + mode = NS_HTML5TREE_BUILDER_BEFORE_HEAD; 1.3351 + } else { 1.3352 + mode = NS_HTML5TREE_BUILDER_AFTER_HEAD; 1.3353 + } 1.3354 + return; 1.3355 + } else if (!i) { 1.3356 + mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY; 1.3357 + return; 1.3358 + } 1.3359 + } 1.3360 +} 1.3361 + 1.3362 +void 1.3363 +nsHtml5TreeBuilder::implicitlyCloseP() 1.3364 +{ 1.3365 + int32_t eltPos = findLastInButtonScope(nsHtml5Atoms::p); 1.3366 + if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) { 1.3367 + return; 1.3368 + } 1.3369 + generateImpliedEndTagsExceptFor(nsHtml5Atoms::p); 1.3370 + if (!!MOZ_UNLIKELY(mViewSource) && eltPos != currentPtr) { 1.3371 + errUnclosedElementsImplied(eltPos, nsHtml5Atoms::p); 1.3372 + } 1.3373 + while (currentPtr >= eltPos) { 1.3374 + pop(); 1.3375 + } 1.3376 +} 1.3377 + 1.3378 +bool 1.3379 +nsHtml5TreeBuilder::debugOnlyClearLastStackSlot() 1.3380 +{ 1.3381 + stack[currentPtr] = nullptr; 1.3382 + return true; 1.3383 +} 1.3384 + 1.3385 +bool 1.3386 +nsHtml5TreeBuilder::debugOnlyClearLastListSlot() 1.3387 +{ 1.3388 + listOfActiveFormattingElements[listPtr] = nullptr; 1.3389 + return true; 1.3390 +} 1.3391 + 1.3392 +void 1.3393 +nsHtml5TreeBuilder::pushTemplateMode(int32_t mode) 1.3394 +{ 1.3395 + templateModePtr++; 1.3396 + if (templateModePtr == templateModeStack.length) { 1.3397 + jArray<int32_t,int32_t> newStack = jArray<int32_t,int32_t>::newJArray(templateModeStack.length + 64); 1.3398 + nsHtml5ArrayCopy::arraycopy(templateModeStack, newStack, templateModeStack.length); 1.3399 + templateModeStack = newStack; 1.3400 + } 1.3401 + templateModeStack[templateModePtr] = mode; 1.3402 +} 1.3403 + 1.3404 +void 1.3405 +nsHtml5TreeBuilder::push(nsHtml5StackNode* node) 1.3406 +{ 1.3407 + currentPtr++; 1.3408 + if (currentPtr == stack.length) { 1.3409 + jArray<nsHtml5StackNode*,int32_t> newStack = jArray<nsHtml5StackNode*,int32_t>::newJArray(stack.length + 64); 1.3410 + nsHtml5ArrayCopy::arraycopy(stack, newStack, stack.length); 1.3411 + stack = newStack; 1.3412 + } 1.3413 + stack[currentPtr] = node; 1.3414 + elementPushed(node->ns, node->popName, node->node); 1.3415 +} 1.3416 + 1.3417 +void 1.3418 +nsHtml5TreeBuilder::silentPush(nsHtml5StackNode* node) 1.3419 +{ 1.3420 + currentPtr++; 1.3421 + if (currentPtr == stack.length) { 1.3422 + jArray<nsHtml5StackNode*,int32_t> newStack = jArray<nsHtml5StackNode*,int32_t>::newJArray(stack.length + 64); 1.3423 + nsHtml5ArrayCopy::arraycopy(stack, newStack, stack.length); 1.3424 + stack = newStack; 1.3425 + } 1.3426 + stack[currentPtr] = node; 1.3427 +} 1.3428 + 1.3429 +void 1.3430 +nsHtml5TreeBuilder::append(nsHtml5StackNode* node) 1.3431 +{ 1.3432 + listPtr++; 1.3433 + if (listPtr == listOfActiveFormattingElements.length) { 1.3434 + jArray<nsHtml5StackNode*,int32_t> newList = jArray<nsHtml5StackNode*,int32_t>::newJArray(listOfActiveFormattingElements.length + 64); 1.3435 + nsHtml5ArrayCopy::arraycopy(listOfActiveFormattingElements, newList, listOfActiveFormattingElements.length); 1.3436 + listOfActiveFormattingElements = newList; 1.3437 + } 1.3438 + listOfActiveFormattingElements[listPtr] = node; 1.3439 +} 1.3440 + 1.3441 +void 1.3442 +nsHtml5TreeBuilder::clearTheListOfActiveFormattingElementsUpToTheLastMarker() 1.3443 +{ 1.3444 + while (listPtr > -1) { 1.3445 + if (!listOfActiveFormattingElements[listPtr]) { 1.3446 + --listPtr; 1.3447 + return; 1.3448 + } 1.3449 + listOfActiveFormattingElements[listPtr]->release(); 1.3450 + --listPtr; 1.3451 + } 1.3452 +} 1.3453 + 1.3454 +void 1.3455 +nsHtml5TreeBuilder::removeFromStack(int32_t pos) 1.3456 +{ 1.3457 + if (currentPtr == pos) { 1.3458 + pop(); 1.3459 + } else { 1.3460 + 1.3461 + stack[pos]->release(); 1.3462 + nsHtml5ArrayCopy::arraycopy(stack, pos + 1, pos, currentPtr - pos); 1.3463 + MOZ_ASSERT(debugOnlyClearLastStackSlot()); 1.3464 + currentPtr--; 1.3465 + } 1.3466 +} 1.3467 + 1.3468 +void 1.3469 +nsHtml5TreeBuilder::removeFromStack(nsHtml5StackNode* node) 1.3470 +{ 1.3471 + if (stack[currentPtr] == node) { 1.3472 + pop(); 1.3473 + } else { 1.3474 + int32_t pos = currentPtr - 1; 1.3475 + while (pos >= 0 && stack[pos] != node) { 1.3476 + pos--; 1.3477 + } 1.3478 + if (pos == -1) { 1.3479 + return; 1.3480 + } 1.3481 + 1.3482 + node->release(); 1.3483 + nsHtml5ArrayCopy::arraycopy(stack, pos + 1, pos, currentPtr - pos); 1.3484 + currentPtr--; 1.3485 + } 1.3486 +} 1.3487 + 1.3488 +void 1.3489 +nsHtml5TreeBuilder::removeFromListOfActiveFormattingElements(int32_t pos) 1.3490 +{ 1.3491 + MOZ_ASSERT(!!listOfActiveFormattingElements[pos]); 1.3492 + listOfActiveFormattingElements[pos]->release(); 1.3493 + if (pos == listPtr) { 1.3494 + MOZ_ASSERT(debugOnlyClearLastListSlot()); 1.3495 + listPtr--; 1.3496 + return; 1.3497 + } 1.3498 + MOZ_ASSERT(pos < listPtr); 1.3499 + nsHtml5ArrayCopy::arraycopy(listOfActiveFormattingElements, pos + 1, pos, listPtr - pos); 1.3500 + MOZ_ASSERT(debugOnlyClearLastListSlot()); 1.3501 + listPtr--; 1.3502 +} 1.3503 + 1.3504 +bool 1.3505 +nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name) 1.3506 +{ 1.3507 + if (stack[currentPtr]->ns == kNameSpaceID_XHTML && stack[currentPtr]->name == name && findInListOfActiveFormattingElements(stack[currentPtr]) == -1) { 1.3508 + pop(); 1.3509 + return true; 1.3510 + } 1.3511 + for (int32_t i = 0; i < 8; ++i) { 1.3512 + int32_t formattingEltListPos = listPtr; 1.3513 + while (formattingEltListPos > -1) { 1.3514 + nsHtml5StackNode* listNode = listOfActiveFormattingElements[formattingEltListPos]; 1.3515 + if (!listNode) { 1.3516 + formattingEltListPos = -1; 1.3517 + break; 1.3518 + } else if (listNode->name == name) { 1.3519 + break; 1.3520 + } 1.3521 + formattingEltListPos--; 1.3522 + } 1.3523 + if (formattingEltListPos == -1) { 1.3524 + return false; 1.3525 + } 1.3526 + nsHtml5StackNode* formattingElt = listOfActiveFormattingElements[formattingEltListPos]; 1.3527 + int32_t formattingEltStackPos = currentPtr; 1.3528 + bool inScope = true; 1.3529 + while (formattingEltStackPos > -1) { 1.3530 + nsHtml5StackNode* node = stack[formattingEltStackPos]; 1.3531 + if (node == formattingElt) { 1.3532 + break; 1.3533 + } else if (node->isScoping()) { 1.3534 + inScope = false; 1.3535 + } 1.3536 + formattingEltStackPos--; 1.3537 + } 1.3538 + if (formattingEltStackPos == -1) { 1.3539 + errNoElementToCloseButEndTagSeen(name); 1.3540 + removeFromListOfActiveFormattingElements(formattingEltListPos); 1.3541 + return true; 1.3542 + } 1.3543 + if (!inScope) { 1.3544 + errNoElementToCloseButEndTagSeen(name); 1.3545 + return true; 1.3546 + } 1.3547 + if (formattingEltStackPos != currentPtr) { 1.3548 + errEndTagViolatesNestingRules(name); 1.3549 + } 1.3550 + int32_t furthestBlockPos = formattingEltStackPos + 1; 1.3551 + while (furthestBlockPos <= currentPtr) { 1.3552 + nsHtml5StackNode* node = stack[furthestBlockPos]; 1.3553 + if (node->isSpecial()) { 1.3554 + break; 1.3555 + } 1.3556 + furthestBlockPos++; 1.3557 + } 1.3558 + if (furthestBlockPos > currentPtr) { 1.3559 + while (currentPtr >= formattingEltStackPos) { 1.3560 + pop(); 1.3561 + } 1.3562 + removeFromListOfActiveFormattingElements(formattingEltListPos); 1.3563 + return true; 1.3564 + } 1.3565 + nsHtml5StackNode* commonAncestor = stack[formattingEltStackPos - 1]; 1.3566 + nsHtml5StackNode* furthestBlock = stack[furthestBlockPos]; 1.3567 + int32_t bookmark = formattingEltListPos; 1.3568 + int32_t nodePos = furthestBlockPos; 1.3569 + nsHtml5StackNode* lastNode = furthestBlock; 1.3570 + int32_t j = 0; 1.3571 + for (; ; ) { 1.3572 + ++j; 1.3573 + nodePos--; 1.3574 + if (nodePos == formattingEltStackPos) { 1.3575 + break; 1.3576 + } 1.3577 + nsHtml5StackNode* node = stack[nodePos]; 1.3578 + int32_t nodeListPos = findInListOfActiveFormattingElements(node); 1.3579 + if (j > 3 && nodeListPos != -1) { 1.3580 + removeFromListOfActiveFormattingElements(nodeListPos); 1.3581 + if (nodeListPos <= formattingEltListPos) { 1.3582 + formattingEltListPos--; 1.3583 + } 1.3584 + if (nodeListPos <= bookmark) { 1.3585 + bookmark--; 1.3586 + } 1.3587 + nodeListPos = -1; 1.3588 + } 1.3589 + if (nodeListPos == -1) { 1.3590 + MOZ_ASSERT(formattingEltStackPos < nodePos); 1.3591 + MOZ_ASSERT(bookmark < nodePos); 1.3592 + MOZ_ASSERT(furthestBlockPos > nodePos); 1.3593 + removeFromStack(nodePos); 1.3594 + furthestBlockPos--; 1.3595 + continue; 1.3596 + } 1.3597 + if (nodePos == furthestBlockPos) { 1.3598 + bookmark = nodeListPos + 1; 1.3599 + } 1.3600 + MOZ_ASSERT(node == listOfActiveFormattingElements[nodeListPos]); 1.3601 + MOZ_ASSERT(node == stack[nodePos]); 1.3602 + nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, node->name, node->attributes->cloneAttributes(nullptr)); 1.3603 + nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, node->name, clone, node->popName, node->attributes); 1.3604 + node->dropAttributes(); 1.3605 + stack[nodePos] = newNode; 1.3606 + newNode->retain(); 1.3607 + listOfActiveFormattingElements[nodeListPos] = newNode; 1.3608 + node->release(); 1.3609 + node->release(); 1.3610 + node = newNode; 1.3611 + detachFromParent(lastNode->node); 1.3612 + appendElement(lastNode->node, node->node); 1.3613 + lastNode = node; 1.3614 + } 1.3615 + if (commonAncestor->isFosterParenting()) { 1.3616 + 1.3617 + detachFromParent(lastNode->node); 1.3618 + insertIntoFosterParent(lastNode->node); 1.3619 + } else { 1.3620 + detachFromParent(lastNode->node); 1.3621 + appendElement(lastNode->node, commonAncestor->node); 1.3622 + } 1.3623 + nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, formattingElt->name, formattingElt->attributes->cloneAttributes(nullptr)); 1.3624 + nsHtml5StackNode* formattingClone = new nsHtml5StackNode(formattingElt->getFlags(), formattingElt->ns, formattingElt->name, clone, formattingElt->popName, formattingElt->attributes); 1.3625 + formattingElt->dropAttributes(); 1.3626 + appendChildrenToNewParent(furthestBlock->node, clone); 1.3627 + appendElement(clone, furthestBlock->node); 1.3628 + removeFromListOfActiveFormattingElements(formattingEltListPos); 1.3629 + insertIntoListOfActiveFormattingElements(formattingClone, bookmark); 1.3630 + MOZ_ASSERT(formattingEltStackPos < furthestBlockPos); 1.3631 + removeFromStack(formattingEltStackPos); 1.3632 + insertIntoStack(formattingClone, furthestBlockPos); 1.3633 + } 1.3634 + return true; 1.3635 +} 1.3636 + 1.3637 +void 1.3638 +nsHtml5TreeBuilder::insertIntoStack(nsHtml5StackNode* node, int32_t position) 1.3639 +{ 1.3640 + MOZ_ASSERT(currentPtr + 1 < stack.length); 1.3641 + MOZ_ASSERT(position <= currentPtr + 1); 1.3642 + if (position == currentPtr + 1) { 1.3643 + push(node); 1.3644 + } else { 1.3645 + nsHtml5ArrayCopy::arraycopy(stack, position, position + 1, (currentPtr - position) + 1); 1.3646 + currentPtr++; 1.3647 + stack[position] = node; 1.3648 + } 1.3649 +} 1.3650 + 1.3651 +void 1.3652 +nsHtml5TreeBuilder::insertIntoListOfActiveFormattingElements(nsHtml5StackNode* formattingClone, int32_t bookmark) 1.3653 +{ 1.3654 + formattingClone->retain(); 1.3655 + MOZ_ASSERT(listPtr + 1 < listOfActiveFormattingElements.length); 1.3656 + if (bookmark <= listPtr) { 1.3657 + nsHtml5ArrayCopy::arraycopy(listOfActiveFormattingElements, bookmark, bookmark + 1, (listPtr - bookmark) + 1); 1.3658 + } 1.3659 + listPtr++; 1.3660 + listOfActiveFormattingElements[bookmark] = formattingClone; 1.3661 +} 1.3662 + 1.3663 +int32_t 1.3664 +nsHtml5TreeBuilder::findInListOfActiveFormattingElements(nsHtml5StackNode* node) 1.3665 +{ 1.3666 + for (int32_t i = listPtr; i >= 0; i--) { 1.3667 + if (node == listOfActiveFormattingElements[i]) { 1.3668 + return i; 1.3669 + } 1.3670 + } 1.3671 + return -1; 1.3672 +} 1.3673 + 1.3674 +int32_t 1.3675 +nsHtml5TreeBuilder::findInListOfActiveFormattingElementsContainsBetweenEndAndLastMarker(nsIAtom* name) 1.3676 +{ 1.3677 + for (int32_t i = listPtr; i >= 0; i--) { 1.3678 + nsHtml5StackNode* node = listOfActiveFormattingElements[i]; 1.3679 + if (!node) { 1.3680 + return -1; 1.3681 + } else if (node->name == name) { 1.3682 + return i; 1.3683 + } 1.3684 + } 1.3685 + return -1; 1.3686 +} 1.3687 + 1.3688 +void 1.3689 +nsHtml5TreeBuilder::maybeForgetEarlierDuplicateFormattingElement(nsIAtom* name, nsHtml5HtmlAttributes* attributes) 1.3690 +{ 1.3691 + int32_t candidate = -1; 1.3692 + int32_t count = 0; 1.3693 + for (int32_t i = listPtr; i >= 0; i--) { 1.3694 + nsHtml5StackNode* node = listOfActiveFormattingElements[i]; 1.3695 + if (!node) { 1.3696 + break; 1.3697 + } 1.3698 + if (node->name == name && node->attributes->equalsAnother(attributes)) { 1.3699 + candidate = i; 1.3700 + ++count; 1.3701 + } 1.3702 + } 1.3703 + if (count >= 3) { 1.3704 + removeFromListOfActiveFormattingElements(candidate); 1.3705 + } 1.3706 +} 1.3707 + 1.3708 +int32_t 1.3709 +nsHtml5TreeBuilder::findLastOrRoot(nsIAtom* name) 1.3710 +{ 1.3711 + for (int32_t i = currentPtr; i > 0; i--) { 1.3712 + if (stack[i]->ns == kNameSpaceID_XHTML && stack[i]->name == name) { 1.3713 + return i; 1.3714 + } 1.3715 + } 1.3716 + return 0; 1.3717 +} 1.3718 + 1.3719 +int32_t 1.3720 +nsHtml5TreeBuilder::findLastOrRoot(int32_t group) 1.3721 +{ 1.3722 + for (int32_t i = currentPtr; i > 0; i--) { 1.3723 + if (stack[i]->getGroup() == group) { 1.3724 + return i; 1.3725 + } 1.3726 + } 1.3727 + return 0; 1.3728 +} 1.3729 + 1.3730 +bool 1.3731 +nsHtml5TreeBuilder::addAttributesToBody(nsHtml5HtmlAttributes* attributes) 1.3732 +{ 1.3733 + if (currentPtr >= 1) { 1.3734 + nsHtml5StackNode* body = stack[1]; 1.3735 + if (body->getGroup() == NS_HTML5TREE_BUILDER_BODY) { 1.3736 + addAttributesToElement(body->node, attributes); 1.3737 + return true; 1.3738 + } 1.3739 + } 1.3740 + return false; 1.3741 +} 1.3742 + 1.3743 +void 1.3744 +nsHtml5TreeBuilder::addAttributesToHtml(nsHtml5HtmlAttributes* attributes) 1.3745 +{ 1.3746 + addAttributesToElement(stack[0]->node, attributes); 1.3747 +} 1.3748 + 1.3749 +void 1.3750 +nsHtml5TreeBuilder::pushHeadPointerOntoStack() 1.3751 +{ 1.3752 + MOZ_ASSERT(!!headPointer); 1.3753 + MOZ_ASSERT(mode == NS_HTML5TREE_BUILDER_AFTER_HEAD); 1.3754 + 1.3755 + silentPush(new nsHtml5StackNode(nsHtml5ElementName::ELT_HEAD, headPointer)); 1.3756 +} 1.3757 + 1.3758 +void 1.3759 +nsHtml5TreeBuilder::reconstructTheActiveFormattingElements() 1.3760 +{ 1.3761 + if (listPtr == -1) { 1.3762 + return; 1.3763 + } 1.3764 + nsHtml5StackNode* mostRecent = listOfActiveFormattingElements[listPtr]; 1.3765 + if (!mostRecent || isInStack(mostRecent)) { 1.3766 + return; 1.3767 + } 1.3768 + int32_t entryPos = listPtr; 1.3769 + for (; ; ) { 1.3770 + entryPos--; 1.3771 + if (entryPos == -1) { 1.3772 + break; 1.3773 + } 1.3774 + if (!listOfActiveFormattingElements[entryPos]) { 1.3775 + break; 1.3776 + } 1.3777 + if (isInStack(listOfActiveFormattingElements[entryPos])) { 1.3778 + break; 1.3779 + } 1.3780 + } 1.3781 + while (entryPos < listPtr) { 1.3782 + entryPos++; 1.3783 + nsHtml5StackNode* entry = listOfActiveFormattingElements[entryPos]; 1.3784 + nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr)); 1.3785 + nsHtml5StackNode* entryClone = new nsHtml5StackNode(entry->getFlags(), entry->ns, entry->name, clone, entry->popName, entry->attributes); 1.3786 + entry->dropAttributes(); 1.3787 + nsHtml5StackNode* currentNode = stack[currentPtr]; 1.3788 + if (currentNode->isFosterParenting()) { 1.3789 + insertIntoFosterParent(clone); 1.3790 + } else { 1.3791 + appendElement(clone, currentNode->node); 1.3792 + } 1.3793 + push(entryClone); 1.3794 + listOfActiveFormattingElements[entryPos] = entryClone; 1.3795 + entry->release(); 1.3796 + entryClone->retain(); 1.3797 + } 1.3798 +} 1.3799 + 1.3800 +void 1.3801 +nsHtml5TreeBuilder::insertIntoFosterParent(nsIContentHandle* child) 1.3802 +{ 1.3803 + int32_t tablePos = findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE); 1.3804 + int32_t templatePos = findLastOrRoot(NS_HTML5TREE_BUILDER_TEMPLATE); 1.3805 + if (templatePos >= tablePos) { 1.3806 + appendElement(child, stack[templatePos]->node); 1.3807 + return; 1.3808 + } 1.3809 + nsHtml5StackNode* node = stack[tablePos]; 1.3810 + insertFosterParentedChild(child, node->node, stack[tablePos - 1]->node); 1.3811 +} 1.3812 + 1.3813 +bool 1.3814 +nsHtml5TreeBuilder::isInStack(nsHtml5StackNode* node) 1.3815 +{ 1.3816 + for (int32_t i = currentPtr; i >= 0; i--) { 1.3817 + if (stack[i] == node) { 1.3818 + return true; 1.3819 + } 1.3820 + } 1.3821 + return false; 1.3822 +} 1.3823 + 1.3824 +void 1.3825 +nsHtml5TreeBuilder::popTemplateMode() 1.3826 +{ 1.3827 + templateModePtr--; 1.3828 +} 1.3829 + 1.3830 +void 1.3831 +nsHtml5TreeBuilder::pop() 1.3832 +{ 1.3833 + nsHtml5StackNode* node = stack[currentPtr]; 1.3834 + MOZ_ASSERT(debugOnlyClearLastStackSlot()); 1.3835 + currentPtr--; 1.3836 + elementPopped(node->ns, node->popName, node->node); 1.3837 + node->release(); 1.3838 +} 1.3839 + 1.3840 +void 1.3841 +nsHtml5TreeBuilder::silentPop() 1.3842 +{ 1.3843 + nsHtml5StackNode* node = stack[currentPtr]; 1.3844 + MOZ_ASSERT(debugOnlyClearLastStackSlot()); 1.3845 + currentPtr--; 1.3846 + node->release(); 1.3847 +} 1.3848 + 1.3849 +void 1.3850 +nsHtml5TreeBuilder::popOnEof() 1.3851 +{ 1.3852 + nsHtml5StackNode* node = stack[currentPtr]; 1.3853 + MOZ_ASSERT(debugOnlyClearLastStackSlot()); 1.3854 + currentPtr--; 1.3855 + markMalformedIfScript(node->node); 1.3856 + elementPopped(node->ns, node->popName, node->node); 1.3857 + node->release(); 1.3858 +} 1.3859 + 1.3860 +void 1.3861 +nsHtml5TreeBuilder::appendHtmlElementToDocumentAndPush(nsHtml5HtmlAttributes* attributes) 1.3862 +{ 1.3863 + nsIContentHandle* elt = createHtmlElementSetAsRoot(attributes); 1.3864 + nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_HTML, elt); 1.3865 + push(node); 1.3866 +} 1.3867 + 1.3868 +void 1.3869 +nsHtml5TreeBuilder::appendHtmlElementToDocumentAndPush() 1.3870 +{ 1.3871 + appendHtmlElementToDocumentAndPush(tokenizer->emptyAttributes()); 1.3872 +} 1.3873 + 1.3874 +void 1.3875 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes* attributes) 1.3876 +{ 1.3877 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsHtml5Atoms::head, attributes); 1.3878 + appendElement(elt, stack[currentPtr]->node); 1.3879 + headPointer = elt; 1.3880 + nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_HEAD, elt); 1.3881 + push(node); 1.3882 +} 1.3883 + 1.3884 +void 1.3885 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushBodyElement(nsHtml5HtmlAttributes* attributes) 1.3886 +{ 1.3887 + appendToCurrentNodeAndPushElement(nsHtml5ElementName::ELT_BODY, attributes); 1.3888 +} 1.3889 + 1.3890 +void 1.3891 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushBodyElement() 1.3892 +{ 1.3893 + appendToCurrentNodeAndPushBodyElement(tokenizer->emptyAttributes()); 1.3894 +} 1.3895 + 1.3896 +void 1.3897 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormElementMayFoster(nsHtml5HtmlAttributes* attributes) 1.3898 +{ 1.3899 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsHtml5Atoms::form, attributes); 1.3900 + if (!isTemplateContents()) { 1.3901 + formPointer = elt; 1.3902 + } 1.3903 + nsHtml5StackNode* current = stack[currentPtr]; 1.3904 + if (current->isFosterParenting()) { 1.3905 + 1.3906 + insertIntoFosterParent(elt); 1.3907 + } else { 1.3908 + appendElement(elt, current->node); 1.3909 + } 1.3910 + nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_FORM, elt); 1.3911 + push(node); 1.3912 +} 1.3913 + 1.3914 +void 1.3915 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.3916 +{ 1.3917 + nsHtml5HtmlAttributes* clone = attributes->cloneAttributes(nullptr); 1.3918 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, elementName->name, attributes); 1.3919 + nsHtml5StackNode* current = stack[currentPtr]; 1.3920 + if (current->isFosterParenting()) { 1.3921 + 1.3922 + insertIntoFosterParent(elt); 1.3923 + } else { 1.3924 + appendElement(elt, current->node); 1.3925 + } 1.3926 + nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt, clone); 1.3927 + push(node); 1.3928 + append(node); 1.3929 + node->retain(); 1.3930 +} 1.3931 + 1.3932 +void 1.3933 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushElement(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.3934 +{ 1.3935 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, elementName->name, attributes); 1.3936 + appendElement(elt, stack[currentPtr]->node); 1.3937 + if (nsHtml5ElementName::ELT_TEMPLATE == elementName) { 1.3938 + elt = getDocumentFragmentForTemplate(elt); 1.3939 + } 1.3940 + nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt); 1.3941 + push(node); 1.3942 +} 1.3943 + 1.3944 +void 1.3945 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.3946 +{ 1.3947 + nsIAtom* popName = elementName->name; 1.3948 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, popName, attributes); 1.3949 + nsHtml5StackNode* current = stack[currentPtr]; 1.3950 + if (current->isFosterParenting()) { 1.3951 + 1.3952 + insertIntoFosterParent(elt); 1.3953 + } else { 1.3954 + appendElement(elt, current->node); 1.3955 + } 1.3956 + nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt, popName); 1.3957 + push(node); 1.3958 +} 1.3959 + 1.3960 +void 1.3961 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterMathML(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.3962 +{ 1.3963 + nsIAtom* popName = elementName->name; 1.3964 + bool markAsHtmlIntegrationPoint = false; 1.3965 + if (nsHtml5ElementName::ELT_ANNOTATION_XML == elementName && annotationXmlEncodingPermitsHtml(attributes)) { 1.3966 + markAsHtmlIntegrationPoint = true; 1.3967 + } 1.3968 + nsIContentHandle* elt = createElement(kNameSpaceID_MathML, popName, attributes); 1.3969 + nsHtml5StackNode* current = stack[currentPtr]; 1.3970 + if (current->isFosterParenting()) { 1.3971 + 1.3972 + insertIntoFosterParent(elt); 1.3973 + } else { 1.3974 + appendElement(elt, current->node); 1.3975 + } 1.3976 + nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt, popName, markAsHtmlIntegrationPoint); 1.3977 + push(node); 1.3978 +} 1.3979 + 1.3980 +bool 1.3981 +nsHtml5TreeBuilder::annotationXmlEncodingPermitsHtml(nsHtml5HtmlAttributes* attributes) 1.3982 +{ 1.3983 + nsString* encoding = attributes->getValue(nsHtml5AttributeName::ATTR_ENCODING); 1.3984 + if (!encoding) { 1.3985 + return false; 1.3986 + } 1.3987 + return nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("application/xhtml+xml", encoding) || nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("text/html", encoding); 1.3988 +} 1.3989 + 1.3990 +void 1.3991 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterSVG(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.3992 +{ 1.3993 + nsIAtom* popName = elementName->camelCaseName; 1.3994 + nsIContentHandle* elt = createElement(kNameSpaceID_SVG, popName, attributes); 1.3995 + nsHtml5StackNode* current = stack[currentPtr]; 1.3996 + if (current->isFosterParenting()) { 1.3997 + 1.3998 + insertIntoFosterParent(elt); 1.3999 + } else { 1.4000 + appendElement(elt, current->node); 1.4001 + } 1.4002 + nsHtml5StackNode* node = new nsHtml5StackNode(elementName, popName, elt); 1.4003 + push(node); 1.4004 +} 1.4005 + 1.4006 +void 1.4007 +nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form) 1.4008 +{ 1.4009 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, elementName->name, attributes, !form || fragment || isTemplateContents() ? nullptr : form); 1.4010 + nsHtml5StackNode* current = stack[currentPtr]; 1.4011 + if (current->isFosterParenting()) { 1.4012 + 1.4013 + insertIntoFosterParent(elt); 1.4014 + } else { 1.4015 + appendElement(elt, current->node); 1.4016 + } 1.4017 + nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt); 1.4018 + push(node); 1.4019 +} 1.4020 + 1.4021 +void 1.4022 +nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form) 1.4023 +{ 1.4024 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, name, attributes, !form || fragment || isTemplateContents() ? nullptr : form); 1.4025 + nsHtml5StackNode* current = stack[currentPtr]; 1.4026 + if (current->isFosterParenting()) { 1.4027 + 1.4028 + insertIntoFosterParent(elt); 1.4029 + } else { 1.4030 + appendElement(elt, current->node); 1.4031 + } 1.4032 + elementPushed(kNameSpaceID_XHTML, name, elt); 1.4033 + elementPopped(kNameSpaceID_XHTML, name, elt); 1.4034 +} 1.4035 + 1.4036 +void 1.4037 +nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.4038 +{ 1.4039 + nsIAtom* popName = elementName->name; 1.4040 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, popName, attributes); 1.4041 + nsHtml5StackNode* current = stack[currentPtr]; 1.4042 + if (current->isFosterParenting()) { 1.4043 + 1.4044 + insertIntoFosterParent(elt); 1.4045 + } else { 1.4046 + appendElement(elt, current->node); 1.4047 + } 1.4048 + elementPushed(kNameSpaceID_XHTML, popName, elt); 1.4049 + elementPopped(kNameSpaceID_XHTML, popName, elt); 1.4050 +} 1.4051 + 1.4052 +void 1.4053 +nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterSVG(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.4054 +{ 1.4055 + nsIAtom* popName = elementName->camelCaseName; 1.4056 + nsIContentHandle* elt = createElement(kNameSpaceID_SVG, popName, attributes); 1.4057 + nsHtml5StackNode* current = stack[currentPtr]; 1.4058 + if (current->isFosterParenting()) { 1.4059 + 1.4060 + insertIntoFosterParent(elt); 1.4061 + } else { 1.4062 + appendElement(elt, current->node); 1.4063 + } 1.4064 + elementPushed(kNameSpaceID_SVG, popName, elt); 1.4065 + elementPopped(kNameSpaceID_SVG, popName, elt); 1.4066 +} 1.4067 + 1.4068 +void 1.4069 +nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterMathML(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes) 1.4070 +{ 1.4071 + nsIAtom* popName = elementName->name; 1.4072 + nsIContentHandle* elt = createElement(kNameSpaceID_MathML, popName, attributes); 1.4073 + nsHtml5StackNode* current = stack[currentPtr]; 1.4074 + if (current->isFosterParenting()) { 1.4075 + 1.4076 + insertIntoFosterParent(elt); 1.4077 + } else { 1.4078 + appendElement(elt, current->node); 1.4079 + } 1.4080 + elementPushed(kNameSpaceID_MathML, popName, elt); 1.4081 + elementPopped(kNameSpaceID_MathML, popName, elt); 1.4082 +} 1.4083 + 1.4084 +void 1.4085 +nsHtml5TreeBuilder::appendVoidElementToCurrent(nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form) 1.4086 +{ 1.4087 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, name, attributes, !form || fragment || isTemplateContents() ? nullptr : form); 1.4088 + nsHtml5StackNode* current = stack[currentPtr]; 1.4089 + appendElement(elt, current->node); 1.4090 + elementPushed(kNameSpaceID_XHTML, name, elt); 1.4091 + elementPopped(kNameSpaceID_XHTML, name, elt); 1.4092 +} 1.4093 + 1.4094 +void 1.4095 +nsHtml5TreeBuilder::appendVoidFormToCurrent(nsHtml5HtmlAttributes* attributes) 1.4096 +{ 1.4097 + nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsHtml5Atoms::form, attributes); 1.4098 + formPointer = elt; 1.4099 + nsHtml5StackNode* current = stack[currentPtr]; 1.4100 + appendElement(elt, current->node); 1.4101 + elementPushed(kNameSpaceID_XHTML, nsHtml5Atoms::form, elt); 1.4102 + elementPopped(kNameSpaceID_XHTML, nsHtml5Atoms::form, elt); 1.4103 +} 1.4104 + 1.4105 +void 1.4106 +nsHtml5TreeBuilder::requestSuspension() 1.4107 +{ 1.4108 + tokenizer->requestSuspension(); 1.4109 +} 1.4110 + 1.4111 +bool 1.4112 +nsHtml5TreeBuilder::isInForeign() 1.4113 +{ 1.4114 + return currentPtr >= 0 && stack[currentPtr]->ns != kNameSpaceID_XHTML; 1.4115 +} 1.4116 + 1.4117 +bool 1.4118 +nsHtml5TreeBuilder::isInForeignButNotHtmlOrMathTextIntegrationPoint() 1.4119 +{ 1.4120 + if (currentPtr < 0) { 1.4121 + return false; 1.4122 + } 1.4123 + return !isSpecialParentInForeign(stack[currentPtr]); 1.4124 +} 1.4125 + 1.4126 +void 1.4127 +nsHtml5TreeBuilder::setFragmentContext(nsIAtom* context, int32_t ns, nsIContentHandle* node, bool quirks) 1.4128 +{ 1.4129 + this->contextName = context; 1.4130 + this->contextNamespace = ns; 1.4131 + this->contextNode = node; 1.4132 + this->fragment = (!!contextName); 1.4133 + this->quirks = quirks; 1.4134 +} 1.4135 + 1.4136 +nsIContentHandle* 1.4137 +nsHtml5TreeBuilder::currentNode() 1.4138 +{ 1.4139 + return stack[currentPtr]->node; 1.4140 +} 1.4141 + 1.4142 +bool 1.4143 +nsHtml5TreeBuilder::isScriptingEnabled() 1.4144 +{ 1.4145 + return scriptingEnabled; 1.4146 +} 1.4147 + 1.4148 +void 1.4149 +nsHtml5TreeBuilder::setScriptingEnabled(bool scriptingEnabled) 1.4150 +{ 1.4151 + this->scriptingEnabled = scriptingEnabled; 1.4152 +} 1.4153 + 1.4154 +void 1.4155 +nsHtml5TreeBuilder::setIsSrcdocDocument(bool isSrcdocDocument) 1.4156 +{ 1.4157 + this->isSrcdocDocument = isSrcdocDocument; 1.4158 +} 1.4159 + 1.4160 +void 1.4161 +nsHtml5TreeBuilder::flushCharacters() 1.4162 +{ 1.4163 + if (charBufferLen > 0) { 1.4164 + if ((mode == NS_HTML5TREE_BUILDER_IN_TABLE || mode == NS_HTML5TREE_BUILDER_IN_TABLE_BODY || mode == NS_HTML5TREE_BUILDER_IN_ROW) && charBufferContainsNonWhitespace()) { 1.4165 + errNonSpaceInTable(); 1.4166 + reconstructTheActiveFormattingElements(); 1.4167 + if (!stack[currentPtr]->isFosterParenting()) { 1.4168 + appendCharacters(currentNode(), charBuffer, 0, charBufferLen); 1.4169 + charBufferLen = 0; 1.4170 + return; 1.4171 + } 1.4172 + int32_t tablePos = findLastOrRoot(NS_HTML5TREE_BUILDER_TABLE); 1.4173 + int32_t templatePos = findLastOrRoot(NS_HTML5TREE_BUILDER_TEMPLATE); 1.4174 + if (templatePos >= tablePos) { 1.4175 + appendCharacters(stack[templatePos]->node, charBuffer, 0, charBufferLen); 1.4176 + charBufferLen = 0; 1.4177 + return; 1.4178 + } 1.4179 + nsHtml5StackNode* tableElt = stack[tablePos]; 1.4180 + insertFosterParentedCharacters(charBuffer, 0, charBufferLen, tableElt->node, stack[tablePos - 1]->node); 1.4181 + charBufferLen = 0; 1.4182 + return; 1.4183 + } 1.4184 + appendCharacters(currentNode(), charBuffer, 0, charBufferLen); 1.4185 + charBufferLen = 0; 1.4186 + } 1.4187 +} 1.4188 + 1.4189 +bool 1.4190 +nsHtml5TreeBuilder::charBufferContainsNonWhitespace() 1.4191 +{ 1.4192 + for (int32_t i = 0; i < charBufferLen; i++) { 1.4193 + switch(charBuffer[i]) { 1.4194 + case ' ': 1.4195 + case '\t': 1.4196 + case '\n': 1.4197 + case '\r': 1.4198 + case '\f': { 1.4199 + continue; 1.4200 + } 1.4201 + default: { 1.4202 + return true; 1.4203 + } 1.4204 + } 1.4205 + } 1.4206 + return false; 1.4207 +} 1.4208 + 1.4209 +nsAHtml5TreeBuilderState* 1.4210 +nsHtml5TreeBuilder::newSnapshot() 1.4211 +{ 1.4212 + jArray<nsHtml5StackNode*,int32_t> listCopy = jArray<nsHtml5StackNode*,int32_t>::newJArray(listPtr + 1); 1.4213 + for (int32_t i = 0; i < listCopy.length; i++) { 1.4214 + nsHtml5StackNode* node = listOfActiveFormattingElements[i]; 1.4215 + if (node) { 1.4216 + nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, node->name, node->node, node->popName, node->attributes->cloneAttributes(nullptr)); 1.4217 + listCopy[i] = newNode; 1.4218 + } else { 1.4219 + listCopy[i] = nullptr; 1.4220 + } 1.4221 + } 1.4222 + jArray<nsHtml5StackNode*,int32_t> stackCopy = jArray<nsHtml5StackNode*,int32_t>::newJArray(currentPtr + 1); 1.4223 + for (int32_t i = 0; i < stackCopy.length; i++) { 1.4224 + nsHtml5StackNode* node = stack[i]; 1.4225 + int32_t listIndex = findInListOfActiveFormattingElements(node); 1.4226 + if (listIndex == -1) { 1.4227 + nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, node->name, node->node, node->popName, nullptr); 1.4228 + stackCopy[i] = newNode; 1.4229 + } else { 1.4230 + stackCopy[i] = listCopy[listIndex]; 1.4231 + stackCopy[i]->retain(); 1.4232 + } 1.4233 + } 1.4234 + jArray<int32_t,int32_t> templateModeStackCopy = jArray<int32_t,int32_t>::newJArray(templateModePtr + 1); 1.4235 + nsHtml5ArrayCopy::arraycopy(templateModeStack, templateModeStackCopy, templateModeStackCopy.length); 1.4236 + return new nsHtml5StateSnapshot(stackCopy, listCopy, templateModeStackCopy, formPointer, headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, needToDropLF, quirks); 1.4237 +} 1.4238 + 1.4239 +bool 1.4240 +nsHtml5TreeBuilder::snapshotMatches(nsAHtml5TreeBuilderState* snapshot) 1.4241 +{ 1.4242 + jArray<nsHtml5StackNode*,int32_t> stackCopy = snapshot->getStack(); 1.4243 + int32_t stackLen = snapshot->getStackLength(); 1.4244 + jArray<nsHtml5StackNode*,int32_t> listCopy = snapshot->getListOfActiveFormattingElements(); 1.4245 + int32_t listLen = snapshot->getListOfActiveFormattingElementsLength(); 1.4246 + jArray<int32_t,int32_t> templateModeStackCopy = snapshot->getTemplateModeStack(); 1.4247 + int32_t templateModeStackLen = snapshot->getTemplateModeStackLength(); 1.4248 + if (stackLen != currentPtr + 1 || listLen != listPtr + 1 || templateModeStackLen != templateModePtr + 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()) { 1.4249 + return false; 1.4250 + } 1.4251 + for (int32_t i = listLen - 1; i >= 0; i--) { 1.4252 + if (!listCopy[i] && !listOfActiveFormattingElements[i]) { 1.4253 + continue; 1.4254 + } else if (!listCopy[i] || !listOfActiveFormattingElements[i]) { 1.4255 + return false; 1.4256 + } 1.4257 + if (listCopy[i]->node != listOfActiveFormattingElements[i]->node) { 1.4258 + return false; 1.4259 + } 1.4260 + } 1.4261 + for (int32_t i = stackLen - 1; i >= 0; i--) { 1.4262 + if (stackCopy[i]->node != stack[i]->node) { 1.4263 + return false; 1.4264 + } 1.4265 + } 1.4266 + for (int32_t i = templateModeStackLen - 1; i >= 0; i--) { 1.4267 + if (templateModeStackCopy[i] != templateModeStack[i]) { 1.4268 + return false; 1.4269 + } 1.4270 + } 1.4271 + return true; 1.4272 +} 1.4273 + 1.4274 +void 1.4275 +nsHtml5TreeBuilder::loadState(nsAHtml5TreeBuilderState* snapshot, nsHtml5AtomTable* interner) 1.4276 +{ 1.4277 + jArray<nsHtml5StackNode*,int32_t> stackCopy = snapshot->getStack(); 1.4278 + int32_t stackLen = snapshot->getStackLength(); 1.4279 + jArray<nsHtml5StackNode*,int32_t> listCopy = snapshot->getListOfActiveFormattingElements(); 1.4280 + int32_t listLen = snapshot->getListOfActiveFormattingElementsLength(); 1.4281 + jArray<int32_t,int32_t> templateModeStackCopy = snapshot->getTemplateModeStack(); 1.4282 + int32_t templateModeStackLen = snapshot->getTemplateModeStackLength(); 1.4283 + for (int32_t i = 0; i <= listPtr; i++) { 1.4284 + if (listOfActiveFormattingElements[i]) { 1.4285 + listOfActiveFormattingElements[i]->release(); 1.4286 + } 1.4287 + } 1.4288 + if (listOfActiveFormattingElements.length < listLen) { 1.4289 + listOfActiveFormattingElements = jArray<nsHtml5StackNode*,int32_t>::newJArray(listLen); 1.4290 + } 1.4291 + listPtr = listLen - 1; 1.4292 + for (int32_t i = 0; i <= currentPtr; i++) { 1.4293 + stack[i]->release(); 1.4294 + } 1.4295 + if (stack.length < stackLen) { 1.4296 + stack = jArray<nsHtml5StackNode*,int32_t>::newJArray(stackLen); 1.4297 + } 1.4298 + currentPtr = stackLen - 1; 1.4299 + if (templateModeStack.length < templateModeStackLen) { 1.4300 + templateModeStack = jArray<int32_t,int32_t>::newJArray(templateModeStackLen); 1.4301 + } 1.4302 + templateModePtr = templateModeStackLen - 1; 1.4303 + for (int32_t i = 0; i < listLen; i++) { 1.4304 + nsHtml5StackNode* node = listCopy[i]; 1.4305 + if (node) { 1.4306 + nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, nsHtml5Portability::newLocalFromLocal(node->name, interner), node->node, nsHtml5Portability::newLocalFromLocal(node->popName, interner), node->attributes->cloneAttributes(nullptr)); 1.4307 + listOfActiveFormattingElements[i] = newNode; 1.4308 + } else { 1.4309 + listOfActiveFormattingElements[i] = nullptr; 1.4310 + } 1.4311 + } 1.4312 + for (int32_t i = 0; i < stackLen; i++) { 1.4313 + nsHtml5StackNode* node = stackCopy[i]; 1.4314 + int32_t listIndex = findInArray(node, listCopy); 1.4315 + if (listIndex == -1) { 1.4316 + nsHtml5StackNode* newNode = new nsHtml5StackNode(node->getFlags(), node->ns, nsHtml5Portability::newLocalFromLocal(node->name, interner), node->node, nsHtml5Portability::newLocalFromLocal(node->popName, interner), nullptr); 1.4317 + stack[i] = newNode; 1.4318 + } else { 1.4319 + stack[i] = listOfActiveFormattingElements[listIndex]; 1.4320 + stack[i]->retain(); 1.4321 + } 1.4322 + } 1.4323 + nsHtml5ArrayCopy::arraycopy(templateModeStackCopy, templateModeStack, templateModeStackLen); 1.4324 + formPointer = snapshot->getFormPointer(); 1.4325 + headPointer = snapshot->getHeadPointer(); 1.4326 + deepTreeSurrogateParent = snapshot->getDeepTreeSurrogateParent(); 1.4327 + mode = snapshot->getMode(); 1.4328 + originalMode = snapshot->getOriginalMode(); 1.4329 + framesetOk = snapshot->isFramesetOk(); 1.4330 + needToDropLF = snapshot->isNeedToDropLF(); 1.4331 + quirks = snapshot->isQuirks(); 1.4332 +} 1.4333 + 1.4334 +int32_t 1.4335 +nsHtml5TreeBuilder::findInArray(nsHtml5StackNode* node, jArray<nsHtml5StackNode*,int32_t> arr) 1.4336 +{ 1.4337 + for (int32_t i = listPtr; i >= 0; i--) { 1.4338 + if (node == arr[i]) { 1.4339 + return i; 1.4340 + } 1.4341 + } 1.4342 + return -1; 1.4343 +} 1.4344 + 1.4345 +nsIContentHandle* 1.4346 +nsHtml5TreeBuilder::getFormPointer() 1.4347 +{ 1.4348 + return formPointer; 1.4349 +} 1.4350 + 1.4351 +nsIContentHandle* 1.4352 +nsHtml5TreeBuilder::getHeadPointer() 1.4353 +{ 1.4354 + return headPointer; 1.4355 +} 1.4356 + 1.4357 +nsIContentHandle* 1.4358 +nsHtml5TreeBuilder::getDeepTreeSurrogateParent() 1.4359 +{ 1.4360 + return deepTreeSurrogateParent; 1.4361 +} 1.4362 + 1.4363 +jArray<nsHtml5StackNode*,int32_t> 1.4364 +nsHtml5TreeBuilder::getListOfActiveFormattingElements() 1.4365 +{ 1.4366 + return listOfActiveFormattingElements; 1.4367 +} 1.4368 + 1.4369 +jArray<nsHtml5StackNode*,int32_t> 1.4370 +nsHtml5TreeBuilder::getStack() 1.4371 +{ 1.4372 + return stack; 1.4373 +} 1.4374 + 1.4375 +jArray<int32_t,int32_t> 1.4376 +nsHtml5TreeBuilder::getTemplateModeStack() 1.4377 +{ 1.4378 + return templateModeStack; 1.4379 +} 1.4380 + 1.4381 +int32_t 1.4382 +nsHtml5TreeBuilder::getMode() 1.4383 +{ 1.4384 + return mode; 1.4385 +} 1.4386 + 1.4387 +int32_t 1.4388 +nsHtml5TreeBuilder::getOriginalMode() 1.4389 +{ 1.4390 + return originalMode; 1.4391 +} 1.4392 + 1.4393 +bool 1.4394 +nsHtml5TreeBuilder::isFramesetOk() 1.4395 +{ 1.4396 + return framesetOk; 1.4397 +} 1.4398 + 1.4399 +bool 1.4400 +nsHtml5TreeBuilder::isNeedToDropLF() 1.4401 +{ 1.4402 + return needToDropLF; 1.4403 +} 1.4404 + 1.4405 +bool 1.4406 +nsHtml5TreeBuilder::isQuirks() 1.4407 +{ 1.4408 + return quirks; 1.4409 +} 1.4410 + 1.4411 +int32_t 1.4412 +nsHtml5TreeBuilder::getListOfActiveFormattingElementsLength() 1.4413 +{ 1.4414 + return listPtr + 1; 1.4415 +} 1.4416 + 1.4417 +int32_t 1.4418 +nsHtml5TreeBuilder::getStackLength() 1.4419 +{ 1.4420 + return currentPtr + 1; 1.4421 +} 1.4422 + 1.4423 +int32_t 1.4424 +nsHtml5TreeBuilder::getTemplateModeStackLength() 1.4425 +{ 1.4426 + return templateModePtr + 1; 1.4427 +} 1.4428 + 1.4429 +void 1.4430 +nsHtml5TreeBuilder::initializeStatics() 1.4431 +{ 1.4432 +} 1.4433 + 1.4434 +void 1.4435 +nsHtml5TreeBuilder::releaseStatics() 1.4436 +{ 1.4437 +} 1.4438 + 1.4439 + 1.4440 +#include "nsHtml5TreeBuilderCppSupplement.h" 1.4441 +