Bug 256180 parser part - Insert elements as siblings instead of children at the Blink-defined magic depth for compatibility. r=smaug

MozReview-Commit-ID: K8fgv3rgklt
This commit is contained in:
Henri Sivonen
2017-09-12 16:57:05 +03:00
parent cd6d40a679
commit d2c77a8997
19 changed files with 6405 additions and 208 deletions

View File

@@ -87,7 +87,6 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self)
listPtr = -1;
formPointer = nullptr;
headPointer = nullptr;
deepTreeSurrogateParent = nullptr;
start(fragment);
charBufferLen = 0;
charBuffer = nullptr;
@@ -609,7 +608,6 @@ nsHtml5TreeBuilder::endTokenization()
{
formPointer = nullptr;
headPointer = nullptr;
deepTreeSurrogateParent = nullptr;
templateModeStack = nullptr;
if (stack) {
while (currentPtr > -1) {
@@ -3675,6 +3673,8 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name)
return true;
}
nsHtml5StackNode* commonAncestor = stack[formattingEltStackPos - 1];
nsIContentHandle* insertionCommonAncestor =
nodeFromStackWithBlinkCompat(formattingEltStackPos - 1);
nsHtml5StackNode* furthestBlock = stack[furthestBlockPos];
int32_t bookmark = formattingEltListPos;
int32_t nodePos = furthestBlockPos;
@@ -3715,7 +3715,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name)
createElement(kNameSpaceID_XHTML,
node->name,
node->attributes->cloneAttributes(nullptr),
commonAncestor->node,
insertionCommonAncestor,
htmlCreator(node->getHtmlCreator()));
nsHtml5StackNode* newNode = createStackNode(node->getFlags(),
node->ns,
@@ -3732,7 +3732,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name)
node->release(this);
node = newNode;
detachFromParent(lastNode->node);
appendElement(lastNode->node, node->node);
appendElement(lastNode->node, nodeFromStackWithBlinkCompat(nodePos));
lastNode = node;
}
if (commonAncestor->isFosterParenting()) {
@@ -3741,7 +3741,7 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag(nsIAtom* name)
insertIntoFosterParent(lastNode->node);
} else {
detachFromParent(lastNode->node);
appendElement(lastNode->node, commonAncestor->node);
appendElement(lastNode->node, insertionCommonAncestor);
}
nsIContentHandle* clone =
createElement(kNameSpaceID_XHTML,
@@ -3916,21 +3916,22 @@ nsHtml5TreeBuilder::reconstructTheActiveFormattingElements()
while (entryPos < listPtr) {
entryPos++;
nsHtml5StackNode* entry = listOfActiveFormattingElements[entryPos];
nsHtml5StackNode* currentNode = stack[currentPtr];
nsHtml5StackNode* current = stack[currentPtr];
nsIContentHandle* clone;
if (currentNode->isFosterParenting()) {
if (current->isFosterParenting()) {
clone = createAndInsertFosterParentedElement(
kNameSpaceID_XHTML,
entry->name,
entry->attributes->cloneAttributes(nullptr),
htmlCreator(entry->getHtmlCreator()));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
clone = createElement(kNameSpaceID_XHTML,
entry->name,
entry->attributes->cloneAttributes(nullptr),
currentNode->node,
currentNode,
htmlCreator(entry->getHtmlCreator()));
appendElement(clone, currentNode->node);
appendElement(clone, currentNode);
}
nsHtml5StackNode* entryClone = createStackNode(entry->getFlags(),
entry->ns,
@@ -4152,7 +4153,7 @@ nsHtml5TreeBuilder::appendHtmlElementToDocumentAndPush()
void
nsHtml5TreeBuilder::appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes* attributes)
{
nsIContentHandle* currentNode = stack[currentPtr]->node;
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
nsIContentHandle* elt = createElement(kNameSpaceID_XHTML,
nsGkAtoms::head,
attributes,
@@ -4189,12 +4190,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormElementMayFoster(nsHtml5HtmlAt
attributes,
htmlCreator(NS_NewHTMLFormElement));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_XHTML,
nsGkAtoms::form,
attributes,
current->node,
currentNode,
htmlCreator(NS_NewHTMLFormElement));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
if (!isTemplateContents()) {
formPointer = elt;
@@ -4217,12 +4219,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5
attributes,
htmlCreator(elementName->getHtmlCreator()));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_XHTML,
elementName->getName(),
attributes,
current->node,
currentNode,
htmlCreator(elementName->getHtmlCreator()));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
nsHtml5StackNode* node = createStackNode(elementName, elt, clone);
push(node);
@@ -4233,7 +4236,7 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5
void
nsHtml5TreeBuilder::appendToCurrentNodeAndPushElement(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
{
nsIContentHandle* currentNode = stack[currentPtr]->node;
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
nsIContentHandle* elt =
createElement(kNameSpaceID_XHTML,
elementName->getName(),
@@ -4262,12 +4265,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementNam
attributes,
htmlCreator(elementName->getHtmlCreator()));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_XHTML,
popName,
attributes,
current->node,
currentNode,
htmlCreator(elementName->getHtmlCreator()));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
nsHtml5StackNode* node = createStackNode(elementName, elt, popName);
push(node);
@@ -4288,12 +4292,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterMathML(nsHtml5Elem
elt = createAndInsertFosterParentedElement(
kNameSpaceID_MathML, popName, attributes, htmlCreator(nullptr));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_MathML,
popName,
attributes,
current->node,
currentNode,
htmlCreator(nullptr));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
nsHtml5StackNode* node =
createStackNode(elementName, elt, popName, markAsHtmlIntegrationPoint);
@@ -4325,12 +4330,13 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterSVG(nsHtml5Element
attributes,
svgCreator(elementName->getSvgCreator()));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_SVG,
popName,
attributes,
current->node,
currentNode,
svgCreator(elementName->getSvgCreator()));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
nsHtml5StackNode* node = createStackNode(elementName, popName, elt);
push(node);
@@ -4351,13 +4357,14 @@ nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementNam
formOwner,
htmlCreator(elementName->getHtmlCreator()));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_XHTML,
elementName->getName(),
attributes,
formOwner,
current->node,
currentNode,
htmlCreator(elementName->getHtmlCreator()));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
nsHtml5StackNode* node = createStackNode(elementName, elt);
push(node);
@@ -4382,13 +4389,14 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(
formOwner,
htmlCreator(elementName->getHtmlCreator()));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_XHTML,
name,
attributes,
formOwner,
current->node,
currentNode,
htmlCreator(elementName->getHtmlCreator()));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
elementPushed(kNameSpaceID_XHTML, name, elt);
elementPopped(kNameSpaceID_XHTML, name, elt);
@@ -4408,12 +4416,13 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elem
attributes,
htmlCreator(elementName->getHtmlCreator()));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_XHTML,
popName,
attributes,
current->node,
currentNode,
htmlCreator(elementName->getHtmlCreator()));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
elementPushed(kNameSpaceID_XHTML, popName, elt);
elementPopped(kNameSpaceID_XHTML, popName, elt);
@@ -4433,12 +4442,13 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterSVG(nsHtml5ElementName* e
attributes,
svgCreator(elementName->getSvgCreator()));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_SVG,
popName,
attributes,
current->node,
currentNode,
svgCreator(elementName->getSvgCreator()));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
elementPushed(kNameSpaceID_SVG, popName, elt);
elementPopped(kNameSpaceID_SVG, popName, elt);
@@ -4455,12 +4465,13 @@ nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterMathML(nsHtml5ElementName
elt = createAndInsertFosterParentedElement(
kNameSpaceID_MathML, popName, attributes, htmlCreator(nullptr));
} else {
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
elt = createElement(kNameSpaceID_MathML,
popName,
attributes,
current->node,
currentNode,
htmlCreator(nullptr));
appendElement(elt, current->node);
appendElement(elt, currentNode);
}
elementPushed(kNameSpaceID_MathML, popName, elt);
elementPopped(kNameSpaceID_MathML, popName, elt);
@@ -4470,7 +4481,7 @@ void
nsHtml5TreeBuilder::appendVoidInputToCurrent(nsHtml5HtmlAttributes* attributes,
nsIContentHandle* form)
{
nsIContentHandle* currentNode = stack[currentPtr]->node;
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
nsIContentHandle* elt =
createElement(kNameSpaceID_XHTML,
nsGkAtoms::input,
@@ -4486,7 +4497,7 @@ nsHtml5TreeBuilder::appendVoidInputToCurrent(nsHtml5HtmlAttributes* attributes,
void
nsHtml5TreeBuilder::appendVoidFormToCurrent(nsHtml5HtmlAttributes* attributes)
{
nsIContentHandle* currentNode = stack[currentPtr]->node;
nsIContentHandle* currentNode = nodeFromStackWithBlinkCompat(currentPtr);
nsIContentHandle* elt = createElement(kNameSpaceID_XHTML,
nsGkAtoms::form,
attributes,
@@ -4644,7 +4655,16 @@ nsHtml5TreeBuilder::newSnapshot()
}
jArray<int32_t,int32_t> templateModeStackCopy = jArray<int32_t,int32_t>::newJArray(templateModePtr + 1);
nsHtml5ArrayCopy::arraycopy(templateModeStack, templateModeStackCopy, templateModeStackCopy.length);
return new nsHtml5StateSnapshot(stackCopy, listCopy, templateModeStackCopy, formPointer, headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, needToDropLF, quirks);
return new nsHtml5StateSnapshot(stackCopy,
listCopy,
templateModeStackCopy,
formPointer,
headPointer,
mode,
originalMode,
framesetOk,
needToDropLF,
quirks);
}
bool
@@ -4656,7 +4676,15 @@ nsHtml5TreeBuilder::snapshotMatches(nsAHtml5TreeBuilderState* snapshot)
int32_t listLen = snapshot->getListOfActiveFormattingElementsLength();
jArray<int32_t,int32_t> templateModeStackCopy = snapshot->getTemplateModeStack();
int32_t templateModeStackLen = snapshot->getTemplateModeStackLength();
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()) {
if (stackLen != currentPtr + 1 || listLen != listPtr + 1 ||
templateModeStackLen != templateModePtr + 1 ||
formPointer != snapshot->getFormPointer() ||
headPointer != snapshot->getHeadPointer() ||
mode != snapshot->getMode() ||
originalMode != snapshot->getOriginalMode() ||
framesetOk != snapshot->isFramesetOk() ||
needToDropLF != snapshot->isNeedToDropLF() ||
quirks != snapshot->isQuirks()) {
return false;
}
for (int32_t i = listLen - 1; i >= 0; i--) {
@@ -4748,7 +4776,6 @@ nsHtml5TreeBuilder::loadState(nsAHtml5TreeBuilderState* snapshot, nsHtml5AtomTab
nsHtml5ArrayCopy::arraycopy(templateModeStackCopy, templateModeStack, templateModeStackLen);
formPointer = snapshot->getFormPointer();
headPointer = snapshot->getHeadPointer();
deepTreeSurrogateParent = snapshot->getDeepTreeSurrogateParent();
mode = snapshot->getMode();
originalMode = snapshot->getOriginalMode();
framesetOk = snapshot->isFramesetOk();
@@ -4767,24 +4794,28 @@ nsHtml5TreeBuilder::findInArray(nsHtml5StackNode* node, jArray<nsHtml5StackNode*
return -1;
}
nsIContentHandle*
nsIContentHandle*
nsHtml5TreeBuilder::nodeFromStackWithBlinkCompat(int32_t stackPos)
{
if (stackPos > 511) {
errDeepTree();
return stack[511]->node;
}
return stack[stackPos]->node;
}
nsIContentHandle*
nsHtml5TreeBuilder::getFormPointer()
{
return formPointer;
}
nsIContentHandle*
nsIContentHandle*
nsHtml5TreeBuilder::getHeadPointer()
{
return headPointer;
}
nsIContentHandle*
nsHtml5TreeBuilder::getDeepTreeSurrogateParent()
{
return deepTreeSurrogateParent;
}
jArray<nsHtml5StackNode*,int32_t>
nsHtml5TreeBuilder::getListOfActiveFormattingElements()
{