Bug 897153 - Update parsing of template element to spec as of July 15, 2013. r=hsivonen

This commit is contained in:
William Chen 2013-08-12 14:46:12 -07:00
parent 33d6dd2ae8
commit 5dfa68445b
5 changed files with 156 additions and 145 deletions

View File

@ -726,7 +726,7 @@ public final class ElementName
public static final ElementName QUOTIENT = new ElementName("quotient", "quotient", TreeBuilder.OTHER);
public static final ElementName SELECTOR = new ElementName("selector", "selector", TreeBuilder.OTHER);
public static final ElementName TEXTAREA = new ElementName("textarea", "textarea", TreeBuilder.TEXTAREA | SPECIAL);
public static final ElementName TEMPLATE = new ElementName("template", "template", TreeBuilder.TEMPLATE | SPECIAL);
public static final ElementName TEMPLATE = new ElementName("template", "template", TreeBuilder.TEMPLATE | SPECIAL | SCOPING);
public static final ElementName TEXTPATH = new ElementName("textpath", "textPath", TreeBuilder.OTHER);
public static final ElementName VARIANCE = new ElementName("variance", "variance", TreeBuilder.OTHER);
public static final ElementName ANIMATION = new ElementName("animation", "animation", TreeBuilder.OTHER);

View File

@ -273,7 +273,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
private static final int TEXT = 21;
private static final int TEMPLATE_CONTENTS = 22;
private static final int IN_TEMPLATE = 22;
// start charset states
@ -619,7 +619,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
currentPtr++;
stack[currentPtr] = node;
if ("template" == contextName) {
pushTemplateMode(TEMPLATE_CONTENTS);
pushTemplateMode(IN_TEMPLATE);
}
resetTheInsertionMode();
if ("title" == contextName || "textarea" == contextName) {
@ -1011,7 +1011,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
*/
continue;
case FRAMESET_OK:
case TEMPLATE_CONTENTS:
case IN_TEMPLATE:
case IN_BODY:
case IN_CELL:
case IN_CAPTION:
@ -1210,7 +1210,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
mode = IN_BODY;
i--;
continue;
case TEMPLATE_CONTENTS:
case IN_TEMPLATE:
case IN_BODY:
case IN_CELL:
case IN_CAPTION:
@ -1428,15 +1428,12 @@ public abstract class TreeBuilder<T> implements TokenHandler,
appendToCurrentNodeAndPushBodyElement();
mode = IN_BODY;
continue;
case IN_TABLE_BODY:
case IN_ROW:
case IN_TABLE:
case IN_SELECT_IN_TABLE:
case IN_SELECT:
case IN_COLUMN_GROUP:
if (currentPtr == 0) {
assert fragment;
break eofloop;
} else {
popOnEof();
mode = IN_TABLE;
continue;
}
case FRAMESET_OK:
case IN_CAPTION:
case IN_CELL:
@ -1459,7 +1456,30 @@ public abstract class TreeBuilder<T> implements TokenHandler,
}
}
// ]NOCPP]
break eofloop;
if (isTemplateModeStackEmpty()) {
break eofloop;
}
// fall through to IN_TEMPLATE
case IN_TEMPLATE:
int eltPos = findLast("template");
if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
assert fragment;
break eofloop;
}
if (errorHandler != null) {
errUnclosedElements(eltPos, "template");
}
while (currentPtr >= eltPos) {
pop();
}
clearTheListOfActiveFormattingElementsUpToTheLastMarker();
popTemplateMode();
resetTheInsertionMode();
// Reprocess token.
continue;
case TEXT:
// [NOCPP[
if (errorHandler != null) {
@ -1474,11 +1494,6 @@ public abstract class TreeBuilder<T> implements TokenHandler,
popOnEof();
mode = originalMode;
continue;
case IN_TABLE_BODY:
case IN_ROW:
case IN_TABLE:
case IN_SELECT:
case IN_SELECT_IN_TABLE:
case IN_FRAMESET:
// [NOCPP[
if (errorHandler != null && currentPtr > 0) {
@ -1486,17 +1501,6 @@ public abstract class TreeBuilder<T> implements TokenHandler,
}
// ]NOCPP]
break eofloop;
case TEMPLATE_CONTENTS:
if (currentPtr == 0) {
assert fragment;
break eofloop;
}
// TODO: Parse error. Add error reporting.
popOnEof();
resetTheInsertionMode();
// Reprocess token.
continue;
case AFTER_BODY:
case AFTER_FRAMESET:
case AFTER_AFTER_BODY:
@ -1648,14 +1652,8 @@ public abstract class TreeBuilder<T> implements TokenHandler,
} // foreignObject / annotation-xml
}
switch (mode) {
case TEMPLATE_CONTENTS:
case IN_TEMPLATE:
switch (group) {
case FRAME:
popTemplateMode();
pushTemplateMode(IN_FRAMESET);
mode = IN_FRAMESET;
// Reprocess token.
continue;
case COL:
popTemplateMode();
pushTemplateMode(IN_COLUMN_GROUP);
@ -1690,6 +1688,11 @@ public abstract class TreeBuilder<T> implements TokenHandler,
selfClosing = false;
attributes = null; // CPP
break starttagloop;
case TITLE:
startTagTitleInHead(elementName, attributes);
attributes = null; // CPP
break starttagloop;
case BASE:
case LINK_OR_BASEFONT_OR_BGSOUND:
appendVoidElementToCurrentMayFoster(
elementName,
@ -1701,6 +1704,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
startTagScriptInHead(elementName, attributes);
attributes = null; // CPP
break starttagloop;
case NOFRAMES:
case STYLE:
startTagGenericRawText(elementName, attributes);
attributes = null; // CPP
@ -2469,6 +2473,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
break starttagloop;
case BASE:
case COMMAND:
case LINK_OR_BASEFONT_OR_BGSOUND:
appendVoidElementToCurrentMayFoster(
elementName,
attributes);
@ -2476,17 +2481,10 @@ public abstract class TreeBuilder<T> implements TokenHandler,
attributes = null; // CPP
break starttagloop;
case META:
case LINK_OR_BASEFONT_OR_BGSOUND:
// Fall through to IN_HEAD_NOSCRIPT
break inheadloop;
case TITLE:
appendToCurrentNodeAndPushElementMayFoster(
elementName,
attributes);
originalMode = mode;
mode = TEXT;
tokenizer.setStateAndEndTagExpectation(
Tokenizer.RCDATA, elementName);
startTagTitleInHead(elementName, attributes);
attributes = null; // CPP
break starttagloop;
case NOSCRIPT:
@ -2729,10 +2727,6 @@ public abstract class TreeBuilder<T> implements TokenHandler,
selfClosing = false;
attributes = null; // CPP
break starttagloop;
case TEMPLATE:
startTagTemplateInHead(elementName, attributes);
attributes = null; // CPP
break starttagloop;
default:
// fall through to AFTER_FRAMESET
}
@ -3028,6 +3022,13 @@ public abstract class TreeBuilder<T> implements TokenHandler,
}
}
private void startTagTitleInHead(ElementName elementName, HtmlAttributes attributes) throws SAXException {
appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
originalMode = mode;
mode = TEXT;
tokenizer.setStateAndEndTagExpectation(Tokenizer.RCDATA, elementName);
}
private void startTagGenericRawText(ElementName elementName, HtmlAttributes attributes) throws SAXException {
appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
originalMode = mode;
@ -3044,17 +3045,22 @@ public abstract class TreeBuilder<T> implements TokenHandler,
}
private void startTagTemplateInHead(ElementName elementName, HtmlAttributes attributes) throws SAXException {
insertMarker();
appendToCurrentNodeAndPushElement(elementName, attributes);
insertMarker();
framesetOk = false;
originalMode = mode;
mode = TEMPLATE_CONTENTS;
pushTemplateMode(TEMPLATE_CONTENTS);
mode = IN_TEMPLATE;
pushTemplateMode(IN_TEMPLATE);
}
private boolean isTemplateContents() {
return TreeBuilder.NOT_FOUND_ON_STACK != findLast("template");
}
private boolean isTemplateModeStackEmpty() {
return templateModePtr == -1;
}
private boolean isSpecialParentInForeign(StackNode<T> stackNode) {
@NsUri String ns = stackNode.ns;
return ("http://www.w3.org/1999/xhtml" == ns)
@ -3281,7 +3287,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
}
}
switch (mode) {
case TEMPLATE_CONTENTS:
case IN_TEMPLATE:
switch (group) {
case TEMPLATE:
// fall through to IN_HEAD
@ -3753,7 +3759,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
mode = AFTER_HEAD;
continue;
case TEMPLATE:
endTagTemplateInHead(name);
endTagTemplateInHead();
break endtagloop;
default:
errStrayEndTag(name);
@ -3790,7 +3796,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
errStrayEndTag(name);
break endtagloop;
case TEMPLATE:
endTagTemplateInHead(name);
endTagTemplateInHead();
break endtagloop;
default:
if (currentPtr == 0 || stack[currentPtr].getGroup() ==
@ -3862,7 +3868,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
resetTheInsertionMode();
break endtagloop;
case TEMPLATE:
endTagTemplateInHead(name);
endTagTemplateInHead();
break endtagloop;
default:
errStrayEndTag(name);
@ -3886,8 +3892,8 @@ public abstract class TreeBuilder<T> implements TokenHandler,
case IN_FRAMESET:
switch (group) {
case FRAMESET:
if (currentPtr == 0 || isTemplateContents()) {
assert fragment || isTemplateContents();
if (currentPtr == 0) {
assert fragment;
errStrayEndTag(name);
break endtagloop;
}
@ -3896,9 +3902,6 @@ public abstract class TreeBuilder<T> implements TokenHandler,
mode = AFTER_FRAMESET;
}
break endtagloop;
case TEMPLATE:
endTagTemplateInHead(name);
break endtagloop;
default:
errStrayEndTag(name);
break endtagloop;
@ -4017,15 +4020,15 @@ public abstract class TreeBuilder<T> implements TokenHandler,
} // endtagloop
}
private void endTagTemplateInHead(@Local String name) throws SAXException {
int eltPos = findLast(name);
private void endTagTemplateInHead() throws SAXException {
int eltPos = findLast("template");
if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
errStrayEndTag(name);
errStrayEndTag("template");
return;
}
generateImpliedEndTags();
if (errorHandler != null && !isCurrent(name)) {
errUnclosedElements(eltPos, name);
if (errorHandler != null && !isCurrent("template")) {
errUnclosedElements(eltPos, "template");
}
while (currentPtr >= eltPos) {
pop();
@ -4320,11 +4323,7 @@ public abstract class TreeBuilder<T> implements TokenHandler,
return;
}
}
if ("template" == name) {
assert templateModePtr >= 0;
mode = templateModeStack[templateModePtr];
return;
} else if ("select" == name) {
if ("select" == name) {
// TODO: Fragment case. Add error reporting.
mode = IN_SELECT;
return;
@ -4350,7 +4349,11 @@ public abstract class TreeBuilder<T> implements TokenHandler,
} else if ("http://www.w3.org/1999/xhtml" != ns) {
mode = framesetOk ? FRAMESET_OK : IN_BODY;
return;
} else if ("head" == name) {
} else if ("template" == name) {
assert templateModePtr >= 0;
mode = templateModeStack[templateModePtr];
return;
} else if ("head" == name) {
if (name == contextName) {
// TODO: Fragment case. Add error reporting.
mode = framesetOk ? FRAMESET_OK : IN_BODY; // really

View File

@ -852,7 +852,7 @@ nsHtml5ElementName::initializeStatics()
ELT_QUOTIENT = new nsHtml5ElementName(nsHtml5Atoms::quotient, nsHtml5Atoms::quotient, NS_HTML5TREE_BUILDER_OTHER);
ELT_SELECTOR = new nsHtml5ElementName(nsHtml5Atoms::selector, nsHtml5Atoms::selector, NS_HTML5TREE_BUILDER_OTHER);
ELT_TEXTAREA = new nsHtml5ElementName(nsHtml5Atoms::textarea, nsHtml5Atoms::textarea, NS_HTML5TREE_BUILDER_TEXTAREA | NS_HTML5ELEMENT_NAME_SPECIAL);
ELT_TEMPLATE = new nsHtml5ElementName(nsHtml5Atoms::template_, nsHtml5Atoms::template_, NS_HTML5TREE_BUILDER_TEMPLATE | NS_HTML5ELEMENT_NAME_SPECIAL);
ELT_TEMPLATE = new nsHtml5ElementName(nsHtml5Atoms::template_, nsHtml5Atoms::template_, NS_HTML5TREE_BUILDER_TEMPLATE | NS_HTML5ELEMENT_NAME_SPECIAL | NS_HTML5ELEMENT_NAME_SCOPING);
ELT_TEXTPATH = new nsHtml5ElementName(nsHtml5Atoms::textpath, nsHtml5Atoms::textPath, NS_HTML5TREE_BUILDER_OTHER);
ELT_VARIANCE = new nsHtml5ElementName(nsHtml5Atoms::variance, nsHtml5Atoms::variance, NS_HTML5TREE_BUILDER_OTHER);
ELT_ANIMATION = new nsHtml5ElementName(nsHtml5Atoms::animation, nsHtml5Atoms::animation, NS_HTML5TREE_BUILDER_OTHER);

View File

@ -99,7 +99,7 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self)
currentPtr++;
stack[currentPtr] = node;
if (nsHtml5Atoms::template_ == contextName) {
pushTemplateMode(NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS);
pushTemplateMode(NS_HTML5TREE_BUILDER_IN_TEMPLATE);
}
resetTheInsertionMode();
if (nsHtml5Atoms::title == contextName || nsHtml5Atoms::textarea == contextName) {
@ -237,7 +237,7 @@ nsHtml5TreeBuilder::characters(const PRUnichar* buf, int32_t start, int32_t leng
continue;
}
case NS_HTML5TREE_BUILDER_FRAMESET_OK:
case NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS:
case NS_HTML5TREE_BUILDER_IN_TEMPLATE:
case NS_HTML5TREE_BUILDER_IN_BODY:
case NS_HTML5TREE_BUILDER_IN_CELL:
case NS_HTML5TREE_BUILDER_IN_CAPTION: {
@ -340,7 +340,7 @@ nsHtml5TreeBuilder::characters(const PRUnichar* buf, int32_t start, int32_t leng
i--;
continue;
}
case NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS:
case NS_HTML5TREE_BUILDER_IN_TEMPLATE:
case NS_HTML5TREE_BUILDER_IN_BODY:
case NS_HTML5TREE_BUILDER_IN_CELL:
case NS_HTML5TREE_BUILDER_IN_CAPTION: {
@ -485,21 +485,36 @@ nsHtml5TreeBuilder::eof()
mode = NS_HTML5TREE_BUILDER_IN_BODY;
continue;
}
case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP: {
if (!currentPtr) {
MOZ_ASSERT(fragment);
NS_HTML5_BREAK(eofloop);
} else {
popOnEof();
mode = NS_HTML5TREE_BUILDER_IN_TABLE;
continue;
}
}
case NS_HTML5TREE_BUILDER_IN_TABLE_BODY:
case NS_HTML5TREE_BUILDER_IN_ROW:
case NS_HTML5TREE_BUILDER_IN_TABLE:
case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE:
case NS_HTML5TREE_BUILDER_IN_SELECT:
case NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP:
case NS_HTML5TREE_BUILDER_FRAMESET_OK:
case NS_HTML5TREE_BUILDER_IN_CAPTION:
case NS_HTML5TREE_BUILDER_IN_CELL:
case NS_HTML5TREE_BUILDER_IN_BODY: {
NS_HTML5_BREAK(eofloop);
if (isTemplateModeStackEmpty()) {
NS_HTML5_BREAK(eofloop);
}
}
case NS_HTML5TREE_BUILDER_IN_TEMPLATE: {
int32_t eltPos = findLast(nsHtml5Atoms::template_);
if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
MOZ_ASSERT(fragment);
NS_HTML5_BREAK(eofloop);
}
if (MOZ_UNLIKELY(mViewSource)) {
errUnclosedElements(eltPos, nsHtml5Atoms::template_);
}
while (currentPtr >= eltPos) {
pop();
}
clearTheListOfActiveFormattingElementsUpToTheLastMarker();
popTemplateMode();
resetTheInsertionMode();
continue;
}
case NS_HTML5TREE_BUILDER_TEXT: {
if (originalMode == NS_HTML5TREE_BUILDER_AFTER_HEAD) {
@ -509,23 +524,9 @@ nsHtml5TreeBuilder::eof()
mode = originalMode;
continue;
}
case NS_HTML5TREE_BUILDER_IN_TABLE_BODY:
case NS_HTML5TREE_BUILDER_IN_ROW:
case NS_HTML5TREE_BUILDER_IN_TABLE:
case NS_HTML5TREE_BUILDER_IN_SELECT:
case NS_HTML5TREE_BUILDER_IN_SELECT_IN_TABLE:
case NS_HTML5TREE_BUILDER_IN_FRAMESET: {
NS_HTML5_BREAK(eofloop);
}
case NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS: {
if (!currentPtr) {
MOZ_ASSERT(fragment);
NS_HTML5_BREAK(eofloop);
}
popOnEof();
resetTheInsertionMode();
continue;
}
case NS_HTML5TREE_BUILDER_AFTER_BODY:
case NS_HTML5TREE_BUILDER_AFTER_FRAMESET:
case NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY:
@ -645,14 +646,8 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
}
}
switch(mode) {
case NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS: {
case NS_HTML5TREE_BUILDER_IN_TEMPLATE: {
switch(group) {
case NS_HTML5TREE_BUILDER_FRAME: {
popTemplateMode();
pushTemplateMode(NS_HTML5TREE_BUILDER_IN_FRAMESET);
mode = NS_HTML5TREE_BUILDER_IN_FRAMESET;
continue;
}
case NS_HTML5TREE_BUILDER_COL: {
popTemplateMode();
pushTemplateMode(NS_HTML5TREE_BUILDER_IN_COLUMN_GROUP);
@ -686,6 +681,12 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
attributes = nullptr;
NS_HTML5_BREAK(starttagloop);
}
case NS_HTML5TREE_BUILDER_TITLE: {
startTagTitleInHead(elementName, attributes);
attributes = nullptr;
NS_HTML5_BREAK(starttagloop);
}
case NS_HTML5TREE_BUILDER_BASE:
case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: {
appendVoidElementToCurrentMayFoster(elementName, attributes);
selfClosing = false;
@ -697,6 +698,7 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
attributes = nullptr;
NS_HTML5_BREAK(starttagloop);
}
case NS_HTML5TREE_BUILDER_NOFRAMES:
case NS_HTML5TREE_BUILDER_STYLE: {
startTagGenericRawText(elementName, attributes);
attributes = nullptr;
@ -1394,21 +1396,18 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
NS_HTML5_BREAK(starttagloop);
}
case NS_HTML5TREE_BUILDER_BASE:
case NS_HTML5TREE_BUILDER_COMMAND: {
case NS_HTML5TREE_BUILDER_COMMAND:
case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: {
appendVoidElementToCurrentMayFoster(elementName, attributes);
selfClosing = false;
attributes = nullptr;
NS_HTML5_BREAK(starttagloop);
}
case NS_HTML5TREE_BUILDER_META:
case NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND: {
case NS_HTML5TREE_BUILDER_META: {
NS_HTML5_BREAK(inheadloop);
}
case NS_HTML5TREE_BUILDER_TITLE: {
appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
originalMode = mode;
mode = NS_HTML5TREE_BUILDER_TEXT;
tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, elementName);
startTagTitleInHead(elementName, attributes);
attributes = nullptr;
NS_HTML5_BREAK(starttagloop);
}
@ -1663,11 +1662,6 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
attributes = nullptr;
NS_HTML5_BREAK(starttagloop);
}
case NS_HTML5TREE_BUILDER_TEMPLATE: {
startTagTemplateInHead(elementName, attributes);
attributes = nullptr;
NS_HTML5_BREAK(starttagloop);
}
default:
; // fall through
}
@ -1895,6 +1889,15 @@ nsHtml5TreeBuilder::startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttribu
}
}
void
nsHtml5TreeBuilder::startTagTitleInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
{
appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
originalMode = mode;
mode = NS_HTML5TREE_BUILDER_TEXT;
tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, elementName);
}
void
nsHtml5TreeBuilder::startTagGenericRawText(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
{
@ -1916,11 +1919,12 @@ nsHtml5TreeBuilder::startTagScriptInHead(nsHtml5ElementName* elementName, nsHtml
void
nsHtml5TreeBuilder::startTagTemplateInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
{
insertMarker();
appendToCurrentNodeAndPushElement(elementName, attributes);
insertMarker();
framesetOk = false;
originalMode = mode;
mode = NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS;
pushTemplateMode(NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS);
mode = NS_HTML5TREE_BUILDER_IN_TEMPLATE;
pushTemplateMode(NS_HTML5TREE_BUILDER_IN_TEMPLATE);
}
bool
@ -1929,6 +1933,12 @@ nsHtml5TreeBuilder::isTemplateContents()
return NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK != findLast(nsHtml5Atoms::template_);
}
bool
nsHtml5TreeBuilder::isTemplateModeStackEmpty()
{
return templateModePtr == -1;
}
bool
nsHtml5TreeBuilder::isSpecialParentInForeign(nsHtml5StackNode* stackNode)
{
@ -2184,7 +2194,7 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
}
}
switch(mode) {
case NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS: {
case NS_HTML5TREE_BUILDER_IN_TEMPLATE: {
switch(group) {
case NS_HTML5TREE_BUILDER_TEMPLATE: {
break;
@ -2692,7 +2702,7 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
continue;
}
case NS_HTML5TREE_BUILDER_TEMPLATE: {
endTagTemplateInHead(name);
endTagTemplateInHead();
NS_HTML5_BREAK(endtagloop);
}
default: {
@ -2737,7 +2747,7 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
NS_HTML5_BREAK(endtagloop);
}
case NS_HTML5TREE_BUILDER_TEMPLATE: {
endTagTemplateInHead(name);
endTagTemplateInHead();
NS_HTML5_BREAK(endtagloop);
}
default: {
@ -2815,7 +2825,7 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
NS_HTML5_BREAK(endtagloop);
}
case NS_HTML5TREE_BUILDER_TEMPLATE: {
endTagTemplateInHead(name);
endTagTemplateInHead();
NS_HTML5_BREAK(endtagloop);
}
default: {
@ -2845,8 +2855,8 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
case NS_HTML5TREE_BUILDER_IN_FRAMESET: {
switch(group) {
case NS_HTML5TREE_BUILDER_FRAMESET: {
if (!currentPtr || isTemplateContents()) {
MOZ_ASSERT(fragment || isTemplateContents());
if (!currentPtr) {
MOZ_ASSERT(fragment);
errStrayEndTag(name);
NS_HTML5_BREAK(endtagloop);
}
@ -2856,10 +2866,6 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
}
NS_HTML5_BREAK(endtagloop);
}
case NS_HTML5TREE_BUILDER_TEMPLATE: {
endTagTemplateInHead(name);
NS_HTML5_BREAK(endtagloop);
}
default: {
errStrayEndTag(name);
NS_HTML5_BREAK(endtagloop);
@ -2955,16 +2961,16 @@ nsHtml5TreeBuilder::endTag(nsHtml5ElementName* elementName)
}
void
nsHtml5TreeBuilder::endTagTemplateInHead(nsIAtom* name)
nsHtml5TreeBuilder::endTagTemplateInHead()
{
int32_t eltPos = findLast(name);
int32_t eltPos = findLast(nsHtml5Atoms::template_);
if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
errStrayEndTag(name);
errStrayEndTag(nsHtml5Atoms::template_);
return;
}
generateImpliedEndTags();
if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) {
errUnclosedElements(eltPos, name);
if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(nsHtml5Atoms::template_)) {
errUnclosedElements(eltPos, nsHtml5Atoms::template_);
}
while (currentPtr >= eltPos) {
pop();
@ -3254,11 +3260,7 @@ nsHtml5TreeBuilder::resetTheInsertionMode()
return;
}
}
if (nsHtml5Atoms::template_ == name) {
MOZ_ASSERT(templateModePtr >= 0);
mode = templateModeStack[templateModePtr];
return;
} else if (nsHtml5Atoms::select == name) {
if (nsHtml5Atoms::select == name) {
mode = NS_HTML5TREE_BUILDER_IN_SELECT;
return;
} else if (nsHtml5Atoms::td == name || nsHtml5Atoms::th == name) {
@ -3282,6 +3284,10 @@ nsHtml5TreeBuilder::resetTheInsertionMode()
} else if (kNameSpaceID_XHTML != ns) {
mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;
return;
} else if (nsHtml5Atoms::template_ == name) {
MOZ_ASSERT(templateModePtr >= 0);
mode = templateModeStack[templateModePtr];
return;
} else if (nsHtml5Atoms::head == name) {
if (name == contextName) {
mode = framesetOk ? NS_HTML5TREE_BUILDER_FRAMESET_OK : NS_HTML5TREE_BUILDER_IN_BODY;

View File

@ -109,10 +109,12 @@ class nsHtml5TreeBuilder : public nsAHtml5TreeBuilderState
void endTokenization();
void startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, bool selfClosing);
private:
void startTagTitleInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
void startTagGenericRawText(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
void startTagScriptInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
void startTagTemplateInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
bool isTemplateContents();
bool isTemplateModeStackEmpty();
bool isSpecialParentInForeign(nsHtml5StackNode* stackNode);
public:
static nsString* extractCharsetFromContent(nsString* attributeValue);
@ -121,7 +123,7 @@ class nsHtml5TreeBuilder : public nsAHtml5TreeBuilderState
public:
void endTag(nsHtml5ElementName* elementName);
private:
void endTagTemplateInHead(nsIAtom* name);
void endTagTemplateInHead();
int32_t findLastInTableScopeOrRootTemplateTbodyTheadTfoot();
int32_t findLast(nsIAtom* name);
int32_t findLastInTableScope(nsIAtom* name);
@ -357,7 +359,7 @@ class nsHtml5TreeBuilder : public nsAHtml5TreeBuilderState
#define NS_HTML5TREE_BUILDER_AFTER_AFTER_BODY 19
#define NS_HTML5TREE_BUILDER_AFTER_AFTER_FRAMESET 20
#define NS_HTML5TREE_BUILDER_TEXT 21
#define NS_HTML5TREE_BUILDER_TEMPLATE_CONTENTS 22
#define NS_HTML5TREE_BUILDER_IN_TEMPLATE 22
#define NS_HTML5TREE_BUILDER_CHARSET_INITIAL 0
#define NS_HTML5TREE_BUILDER_CHARSET_C 1
#define NS_HTML5TREE_BUILDER_CHARSET_H 2