Bug 606925 - Get rid of the "in foreign content" insertion mode. Check the namespace of the current node instead. rs=jonas, a=blocking2.0-betaN.

This commit is contained in:
Henri Sivonen
2010-12-09 11:27:58 +02:00
parent 94033d9ccb
commit 0e46554119
8 changed files with 51 additions and 186 deletions

View File

@@ -111,7 +111,6 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self)
contextNode = nsnull;
} else {
mode = NS_HTML5TREE_BUILDER_INITIAL;
inForeign = PR_FALSE;
}
}
@@ -119,7 +118,7 @@ void
nsHtml5TreeBuilder::doctype(nsIAtom* name, nsString* publicIdentifier, nsString* systemIdentifier, PRBool forceQuirks)
{
needToDropLF = PR_FALSE;
if (!inForeign) {
if (!isInForeign()) {
switch(mode) {
case NS_HTML5TREE_BUILDER_INITIAL: {
nsString* emptyString = nsHtml5Portability::newEmptyString();
@@ -150,7 +149,7 @@ void
nsHtml5TreeBuilder::comment(PRUnichar* buf, PRInt32 start, PRInt32 length)
{
needToDropLF = PR_FALSE;
if (!inForeign) {
if (!isInForeign()) {
switch(mode) {
case NS_HTML5TREE_BUILDER_INITIAL:
case NS_HTML5TREE_BUILDER_BEFORE_HTML:
@@ -191,7 +190,7 @@ nsHtml5TreeBuilder::characters(const PRUnichar* buf, PRInt32 start, PRInt32 leng
case NS_HTML5TREE_BUILDER_IN_BODY:
case NS_HTML5TREE_BUILDER_IN_CELL:
case NS_HTML5TREE_BUILDER_IN_CAPTION: {
if (!inForeign) {
if (!isInForeign()) {
reconstructTheActiveFormattingElements();
}
}
@@ -237,7 +236,7 @@ nsHtml5TreeBuilder::characters(const PRUnichar* buf, PRInt32 start, PRInt32 leng
accumulateCharacters(buf, start, i - start);
start = i;
}
if (!inForeign) {
if (!isInForeign()) {
flushCharacters();
reconstructTheActiveFormattingElements();
}
@@ -339,7 +338,7 @@ nsHtml5TreeBuilder::characters(const PRUnichar* buf, PRInt32 start, PRInt32 leng
accumulateCharacters(buf, start, i - start);
start = i;
}
if (!inForeign) {
if (!isInForeign()) {
flushCharacters();
reconstructTheActiveFormattingElements();
}
@@ -424,7 +423,7 @@ nsHtml5TreeBuilder::characters(const PRUnichar* buf, PRInt32 start, PRInt32 leng
void
nsHtml5TreeBuilder::zeroOriginatingReplacementCharacter()
{
if (inForeign || mode == NS_HTML5TREE_BUILDER_TEXT) {
if (isInForeign() || mode == NS_HTML5TREE_BUILDER_TEXT) {
characters(REPLACEMENT_CHARACTER, 0, 1);
}
}
@@ -434,7 +433,7 @@ nsHtml5TreeBuilder::eof()
{
flushCharacters();
for (; ; ) {
if (inForeign) {
if (isInForeign()) {
NS_HTML5_BREAK(eofloop);
}
@@ -559,16 +558,13 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
flushCharacters();
PRInt32 eltPos;
needToDropLF = PR_FALSE;
PRBool needsPostProcessing = PR_FALSE;
starttagloop: for (; ; ) {
PRInt32 group = elementName->getGroup();
nsIAtom* name = elementName->name;
if (inForeign) {
if (isInForeign()) {
nsHtml5StackNode* currentNode = stack[currentPtr];
PRInt32 currNs = currentNode->ns;
if ((kNameSpaceID_XHTML == currNs) || 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)))) {
needsPostProcessing = PR_TRUE;
} else {
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))))) {
switch(group) {
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:
case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
@@ -591,9 +587,6 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
while (!isSpecialParentInForeign(stack[currentPtr])) {
pop();
}
if (!hasForeignInScope()) {
inForeign = PR_FALSE;
}
NS_HTML5_CONTINUE(starttagloop);
}
case NS_HTML5TREE_BUILDER_FONT: {
@@ -602,9 +595,6 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
while (!isSpecialParentInForeign(stack[currentPtr])) {
pop();
}
if (!hasForeignInScope()) {
inForeign = PR_FALSE;
}
NS_HTML5_CONTINUE(starttagloop);
}
}
@@ -1250,7 +1240,6 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
selfClosing = PR_FALSE;
} else {
appendToCurrentNodeAndPushElementMayFosterMathML(elementName, attributes);
inForeign = PR_TRUE;
}
attributes = nsnull;
NS_HTML5_BREAK(starttagloop);
@@ -1263,7 +1252,6 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
selfClosing = PR_FALSE;
} else {
appendToCurrentNodeAndPushElementMayFosterSVG(elementName, attributes);
inForeign = PR_TRUE;
}
attributes = nsnull;
NS_HTML5_BREAK(starttagloop);
@@ -1792,9 +1780,6 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
}
}
starttagloop_end: ;
if (needsPostProcessing && inForeign && !hasForeignInScope()) {
inForeign = PR_FALSE;
}
if (attributes != nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES) {
delete attributes;
@@ -1805,14 +1790,7 @@ PRBool
nsHtml5TreeBuilder::isSpecialParentInForeign(nsHtml5StackNode* stackNode)
{
PRInt32 ns = stackNode->ns;
if (kNameSpaceID_XHTML == ns) {
return PR_TRUE;
}
if (ns == kNameSpaceID_SVG) {
return stackNode->getGroup() == NS_HTML5TREE_BUILDER_FOREIGNOBJECT_OR_DESC || stackNode->getGroup() == NS_HTML5TREE_BUILDER_TITLE;
}
return stackNode->getGroup() == NS_HTML5TREE_BUILDER_MI_MO_MN_MS_MTEXT;
return (kNameSpaceID_XHTML == ns) || (stackNode->isHtmlIntegrationPoint()) || ((kNameSpaceID_MathML == ns) && (stackNode->getGroup() == NS_HTML5TREE_BUILDER_MI_MO_MN_MS_MTEXT));
}
nsString*
@@ -2045,8 +2023,7 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
PRInt32 group = elementName->getGroup();
nsIAtom* name = elementName->name;
for (; ; ) {
if (inForeign && stack[currentPtr]->ns != kNameSpaceID_XHTML) {
if (isInForeign()) {
eltPos = currentPtr;
for (; ; ) {
@@ -2330,12 +2307,11 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
eltPos = findLastInButtonScope(nsHtml5Atoms::p);
if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
if (inForeign) {
if (isInForeign()) {
while (stack[currentPtr]->ns != kNameSpaceID_XHTML) {
pop();
}
inForeign = PR_FALSE;
}
appendVoidElementToCurrentMayFoster(elementName, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
NS_HTML5_BREAK(endtagloop);
@@ -2396,12 +2372,11 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
}
case NS_HTML5TREE_BUILDER_BR: {
if (inForeign) {
if (isInForeign()) {
while (stack[currentPtr]->ns != kNameSpaceID_XHTML) {
pop();
}
inForeign = PR_FALSE;
}
reconstructTheActiveFormattingElements();
appendVoidElementToCurrentMayFoster(elementName, nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES);
@@ -2719,9 +2694,6 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
}
}
endtagloop_end: ;
if (inForeign && !hasForeignInScope()) {
inForeign = PR_FALSE;
}
}
PRInt32
@@ -2811,19 +2783,6 @@ nsHtml5TreeBuilder::findLastInScopeHn()
return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK;
}
PRBool
nsHtml5TreeBuilder::hasForeignInScope()
{
for (PRInt32 i = currentPtr; i > 0; i--) {
if (stack[i]->ns != kNameSpaceID_XHTML) {
return PR_TRUE;
} else if (stack[i]->isScoping()) {
return PR_FALSE;
}
}
return PR_FALSE;
}
void
nsHtml5TreeBuilder::generateImpliedEndTagsExceptFor(nsIAtom* name)
{
@@ -2974,7 +2933,6 @@ nsHtml5TreeBuilder::clearStackBackTo(PRInt32 eltPos)
void
nsHtml5TreeBuilder::resetTheInsertionMode()
{
inForeign = PR_FALSE;
nsHtml5StackNode* node;
nsIAtom* name;
PRInt32 ns;
@@ -3013,7 +2971,6 @@ nsHtml5TreeBuilder::resetTheInsertionMode()
mode = NS_HTML5TREE_BUILDER_IN_TABLE;
return;
} else if (kNameSpaceID_XHTML != ns) {
inForeign = PR_TRUE;
mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
return;
} else if (nsHtml5Atoms::head == name) {
@@ -3746,9 +3703,9 @@ nsHtml5TreeBuilder::requestSuspension()
}
PRBool
nsHtml5TreeBuilder::cdataSectionAllowed()
nsHtml5TreeBuilder::isInForeign()
{
return inForeign && currentPtr >= 0 && stack[currentPtr]->ns != kNameSpaceID_XHTML;
return currentPtr >= 0 && stack[currentPtr]->ns != kNameSpaceID_XHTML;
}
void
@@ -3853,7 +3810,7 @@ nsHtml5TreeBuilder::newSnapshot()
stackCopy[i]->retain();
}
}
return new nsHtml5StateSnapshot(stackCopy, listCopy, formPointer, headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, inForeign, needToDropLF, quirks);
return new nsHtml5StateSnapshot(stackCopy, listCopy, formPointer, headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk, needToDropLF, quirks);
}
PRBool
@@ -3863,7 +3820,7 @@ nsHtml5TreeBuilder::snapshotMatches(nsAHtml5TreeBuilderState* snapshot)
PRInt32 stackLen = snapshot->getStackLength();
jArray<nsHtml5StackNode*,PRInt32> listCopy = snapshot->getListOfActiveFormattingElements();
PRInt32 listLen = snapshot->getListOfActiveFormattingElementsLength();
if (stackLen != currentPtr + 1 || listLen != listPtr + 1 || formPointer != snapshot->getFormPointer() || headPointer != snapshot->getHeadPointer() || deepTreeSurrogateParent != snapshot->getDeepTreeSurrogateParent() || mode != snapshot->getMode() || originalMode != snapshot->getOriginalMode() || framesetOk != snapshot->isFramesetOk() || inForeign != snapshot->isInForeign() || needToDropLF != snapshot->isNeedToDropLF() || quirks != snapshot->isQuirks()) {
if (stackLen != currentPtr + 1 || listLen != listPtr + 1 || formPointer != snapshot->getFormPointer() || headPointer != snapshot->getHeadPointer() || deepTreeSurrogateParent != snapshot->getDeepTreeSurrogateParent() || mode != snapshot->getMode() || originalMode != snapshot->getOriginalMode() || framesetOk != snapshot->isFramesetOk() || needToDropLF != snapshot->isNeedToDropLF() || quirks != snapshot->isQuirks()) {
return PR_FALSE;
}
for (PRInt32 i = listLen - 1; i >= 0; i--) {
@@ -3933,7 +3890,6 @@ nsHtml5TreeBuilder::loadState(nsAHtml5TreeBuilderState* snapshot, nsHtml5AtomTab
mode = snapshot->getMode();
originalMode = snapshot->getOriginalMode();
framesetOk = snapshot->isFramesetOk();
inForeign = snapshot->isInForeign();
needToDropLF = snapshot->isNeedToDropLF();
quirks = snapshot->isQuirks();
}
@@ -3997,12 +3953,6 @@ nsHtml5TreeBuilder::isFramesetOk()
return framesetOk;
}
PRBool
nsHtml5TreeBuilder::isInForeign()
{
return inForeign;
}
PRBool
nsHtml5TreeBuilder::isNeedToDropLF()
{