Bug 1355779 - Skip interned nsHtml5ElementName lookup for Custom Elements (ones with hyphen). r=wchen

MozReview-Commit-ID: 4xQlhExyo7d
This commit is contained in:
Henri Sivonen
2017-04-12 14:28:49 +03:00
parent 9c3ac1b327
commit 89dc7f5ddb
6 changed files with 189 additions and 138 deletions

View File

@@ -190,6 +190,8 @@ public final class ElementName
assert this.flags == (TreeBuilder.OTHER | NOT_INTERNED); assert this.flags == (TreeBuilder.OTHER | NOT_INTERNED);
} }
public static final ElementName ANNOTATION_XML = new ElementName("annotation-xml", "annotation-xml", TreeBuilder.ANNOTATION_XML | SCOPING_AS_MATHML);
// START CODE ONLY USED FOR GENERATING CODE uncomment and run to regenerate // START CODE ONLY USED FOR GENERATING CODE uncomment and run to regenerate
// /** // /**
@@ -228,6 +230,9 @@ public final class ElementName
// for (int i = 0; i < name.length(); i++) { // for (int i = 0; i < name.length(); i++) {
// char c = name.charAt(i); // char c = name.charAt(i);
// if (c == '-') { // if (c == '-') {
// if (!"annotation-xml".equals(name)) {
// throw new RuntimeException("Non-annotation-xml element name with hyphen: " + name);
// }
// buf[i] = '_'; // buf[i] = '_';
// } else if (c >= '0' && c <= '9') { // } else if (c >= '0' && c <= '9') {
// buf[i] = c; // buf[i] = c;
@@ -547,7 +552,6 @@ public final class ElementName
public static final ElementName MASK = new ElementName("mask", "mask", TreeBuilder.OTHER); public static final ElementName MASK = new ElementName("mask", "mask", TreeBuilder.OTHER);
public static final ElementName TRACK = new ElementName("track", "track", TreeBuilder.PARAM_OR_SOURCE_OR_TRACK | SPECIAL); public static final ElementName TRACK = new ElementName("track", "track", TreeBuilder.PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
public static final ElementName DL = new ElementName("dl", "dl", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL); public static final ElementName DL = new ElementName("dl", "dl", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
public static final ElementName ANNOTATION_XML = new ElementName("annotation-xml", "annotation-xml", TreeBuilder.ANNOTATION_XML | SCOPING_AS_MATHML);
public static final ElementName HTML = new ElementName("html", "html", TreeBuilder.HTML | SPECIAL | SCOPING | OPTIONAL_END_TAG); public static final ElementName HTML = new ElementName("html", "html", TreeBuilder.HTML | SPECIAL | SCOPING | OPTIONAL_END_TAG);
public static final ElementName OL = new ElementName("ol", "ol", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL); public static final ElementName OL = new ElementName("ol", "ol", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
public static final ElementName LABEL = new ElementName("label", "label", TreeBuilder.OTHER); public static final ElementName LABEL = new ElementName("label", "label", TreeBuilder.OTHER);
@@ -753,7 +757,6 @@ public final class ElementName
MASK, MASK,
TRACK, TRACK,
DL, DL,
ANNOTATION_XML,
HTML, HTML,
OL, OL,
LABEL, LABEL,
@@ -960,7 +963,6 @@ public final class ElementName
1854245076, 1854245076,
1857653029, 1857653029,
1864368130, 1864368130,
1864643294,
1868312196, 1868312196,
1870135298, 1870135298,
1870268949, 1870268949,

View File

@@ -414,6 +414,12 @@ public class Tokenizer implements Locator {
*/ */
protected boolean endTag; protected boolean endTag;
/**
* <code>true</code> iff the current element/attribute name contains
* a hyphen.
*/
private boolean containsHyphen;
/** /**
* The current tag token name. One of * The current tag token name. One of
* 1) null, * 1) null,
@@ -525,6 +531,7 @@ public class Tokenizer implements Locator {
this.charRefBuf = new char[32]; this.charRefBuf = new char[32];
this.bmpChar = new char[1]; this.bmpChar = new char[1];
this.astralChar = new char[2]; this.astralChar = new char[2];
this.containsHyphen = false;
this.tagName = null; this.tagName = null;
this.nonInternedTagName = new ElementName(); this.nonInternedTagName = new ElementName();
this.attributeName = null; this.attributeName = null;
@@ -555,6 +562,7 @@ public class Tokenizer implements Locator {
this.charRefBuf = new char[32]; this.charRefBuf = new char[32];
this.bmpChar = new char[1]; this.bmpChar = new char[1];
this.astralChar = new char[2]; this.astralChar = new char[2];
this.containsHyphen = false;
this.tagName = null; this.tagName = null;
this.nonInternedTagName = new ElementName(); this.nonInternedTagName = new ElementName();
this.attributeName = null; this.attributeName = null;
@@ -1101,13 +1109,26 @@ public class Tokenizer implements Locator {
} }
private void strBufToElementNameString() { private void strBufToElementNameString() {
tagName = ElementName.elementNameByBuffer(strBuf, 0, strBufLen, if (containsHyphen) {
interner); // We've got a custom element or annotation-xml.
if (tagName == null) { @Local String annotationName = ElementName.ANNOTATION_XML.getName();
nonInternedTagName.setNameForNonInterned(Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen, if (Portability.localEqualsBuffer(annotationName, strBuf, 0, strBufLen)) {
interner)); tagName = ElementName.ANNOTATION_XML;
tagName = nonInternedTagName; } else {
nonInternedTagName.setNameForNonInterned(Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen,
interner));
tagName = nonInternedTagName;
}
} else {
tagName = ElementName.elementNameByBuffer(strBuf, 0, strBufLen,
interner);
if (tagName == null) {
nonInternedTagName.setNameForNonInterned(Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen,
interner));
tagName = nonInternedTagName;
}
} }
containsHyphen = false;
clearStrBufAfterUse(); clearStrBufAfterUse();
} }
@@ -1558,6 +1579,7 @@ public class Tokenizer implements Locator {
*/ */
clearStrBufBeforeUse(); clearStrBufBeforeUse();
appendStrBuf((char) (c + 0x20)); appendStrBuf((char) (c + 0x20));
containsHyphen = false;
/* then switch to the tag name state. */ /* then switch to the tag name state. */
state = transition(state, Tokenizer.TAG_NAME, reconsume, pos); state = transition(state, Tokenizer.TAG_NAME, reconsume, pos);
/* /*
@@ -1578,6 +1600,7 @@ public class Tokenizer implements Locator {
*/ */
clearStrBufBeforeUse(); clearStrBufBeforeUse();
appendStrBuf(c); appendStrBuf(c);
containsHyphen = false;
/* then switch to the tag name state. */ /* then switch to the tag name state. */
state = transition(state, Tokenizer.TAG_NAME, reconsume, pos); state = transition(state, Tokenizer.TAG_NAME, reconsume, pos);
/* /*
@@ -1721,6 +1744,8 @@ public class Tokenizer implements Locator {
* tag name. * tag name.
*/ */
c += 0x20; c += 0x20;
} else if (c == '-') {
containsHyphen = true;
} }
/* /*
* Anything else Append the current input * Anything else Append the current input
@@ -3622,6 +3647,7 @@ public class Tokenizer implements Locator {
*/ */
clearStrBufBeforeUse(); clearStrBufBeforeUse();
appendStrBuf(c); appendStrBuf(c);
containsHyphen = false;
/* /*
* then switch to the tag name state. (Don't * then switch to the tag name state. (Don't
* emit the token yet; further details will be * emit the token yet; further details will be
@@ -6734,6 +6760,7 @@ public class Tokenizer implements Locator {
endTag = false; endTag = false;
shouldSuspend = false; shouldSuspend = false;
initDoctypeFields(); initDoctypeFields();
containsHyphen = false;
if (tagName != null) { if (tagName != null) {
tagName = null; tagName = null;
} }
@@ -6800,6 +6827,7 @@ public class Tokenizer implements Locator {
publicIdentifier = Portability.newStringFromString(other.publicIdentifier); publicIdentifier = Portability.newStringFromString(other.publicIdentifier);
} }
containsHyphen = other.containsHyphen;
if (other.tagName == null) { if (other.tagName == null) {
tagName = null; tagName = null;
} else if (other.tagName.isInterned()) { } else if (other.tagName.isInterned()) {

View File

@@ -115,6 +115,7 @@ nsHtml5ElementName::setNameForNonInterned(nsIAtom* name)
(NS_HTML5TREE_BUILDER_OTHER | NS_HTML5ELEMENT_NAME_NOT_INTERNED)); (NS_HTML5TREE_BUILDER_OTHER | NS_HTML5ELEMENT_NAME_NOT_INTERNED));
} }
nsHtml5ElementName* nsHtml5ElementName::ELT_ANNOTATION_XML = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_BIG = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_BIG = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_BDO = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_BDO = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_COL = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_COL = nullptr;
@@ -224,7 +225,6 @@ nsHtml5ElementName* nsHtml5ElementName::ELT_MALIGNMARK = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_MASK = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_MASK = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_TRACK = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_TRACK = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_DL = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_DL = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_ANNOTATION_XML = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_HTML = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_HTML = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_OL = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_OL = nullptr;
nsHtml5ElementName* nsHtml5ElementName::ELT_LABEL = nullptr; nsHtml5ElementName* nsHtml5ElementName::ELT_LABEL = nullptr;
@@ -340,28 +340,32 @@ static int32_t const ELEMENT_HASHES_DATA[] = {
1786534215, 1790207270, 1797585096, 1798686984, 1803876550, 1803929812, 1786534215, 1790207270, 1797585096, 1798686984, 1803876550, 1803929812,
1803929861, 1805502724, 1805647874, 1806806678, 1807599880, 1818230786, 1803929861, 1805502724, 1805647874, 1806806678, 1807599880, 1818230786,
1818755074, 1853642948, 1854228692, 1854228698, 1854245076, 1857653029, 1818755074, 1853642948, 1854228692, 1854228698, 1854245076, 1857653029,
1864368130, 1864643294, 1868312196, 1870135298, 1870268949, 1873281026, 1864368130, 1868312196, 1870135298, 1870268949, 1873281026, 1874053333,
1874053333, 1874102998, 1881288348, 1881498736, 1881613047, 1881669634, 1874102998, 1881288348, 1881498736, 1881613047, 1881669634, 1884120164,
1884120164, 1887579800, 1889085973, 1898223949, 1898753862, 1899272519, 1887579800, 1889085973, 1898223949, 1898753862, 1899272519, 1900845386,
1900845386, 1902641154, 1903302038, 1904412884, 1905563974, 1906087319, 1902641154, 1903302038, 1904412884, 1905563974, 1906087319, 1906135367,
1906135367, 1907435316, 1907661127, 1907959605, 1914900309, 1919418370, 1907435316, 1907661127, 1907959605, 1914900309, 1919418370, 1925844629,
1925844629, 1932928296, 1934172497, 1935549734, 1938817026, 1939219752, 1932928296, 1934172497, 1935549734, 1938817026, 1939219752, 1941178676,
1941178676, 1941221172, 1963982850, 1965115924, 1965334268, 1966223078, 1941221172, 1963982850, 1965115924, 1965334268, 1966223078, 1967128578,
1967128578, 1967760215, 1967788867, 1967795910, 1967795958, 1968053806, 1967760215, 1967788867, 1967795910, 1967795958, 1968053806, 1968836118,
1968836118, 1971461414, 1971465813, 1971938532, 1973420034, 1982173479, 1971461414, 1971465813, 1971938532, 1973420034, 1982173479, 1982935782,
1982935782, 1983533124, 1983633431, 1986527234, 1988763672, 1990037800, 1983533124, 1983633431, 1986527234, 1988763672, 1990037800, 1998585858,
1998585858, 1998724870, 1999397992, 2001309869, 2001349704, 2001349720, 1998724870, 1999397992, 2001309869, 2001349704, 2001349720, 2001349736,
2001349736, 2001392795, 2001392796, 2001392798, 2001495140, 2003183333, 2001392795, 2001392796, 2001392798, 2001495140, 2003183333, 2004635806,
2004635806, 2005324101, 2005719336, 2005925890, 2006028454, 2006329158, 2005324101, 2005719336, 2005925890, 2006028454, 2006329158, 2006896969,
2006896969, 2006974466, 2007601444, 2007781534, 2008125638, 2008340774, 2006974466, 2007601444, 2007781534, 2008125638, 2008340774, 2008851557,
2008851557, 2008994116, 2021937364, 2051837468, 2060065124, 2068523853, 2008994116, 2021937364, 2051837468, 2060065124, 2068523853, 2068523856,
2068523856, 2070023911, 2083120164, 2085266636, 2091479332, 2092255447, 2070023911, 2083120164, 2085266636, 2091479332, 2092255447, 2092557349
2092557349
}; };
staticJArray<int32_t,int32_t> nsHtml5ElementName::ELEMENT_HASHES = { ELEMENT_HASHES_DATA, MOZ_ARRAY_LENGTH(ELEMENT_HASHES_DATA) }; staticJArray<int32_t,int32_t> nsHtml5ElementName::ELEMENT_HASHES = { ELEMENT_HASHES_DATA, MOZ_ARRAY_LENGTH(ELEMENT_HASHES_DATA) };
void void
nsHtml5ElementName::initializeStatics() nsHtml5ElementName::initializeStatics()
{ {
ELT_ANNOTATION_XML =
new nsHtml5ElementName(nsHtml5Atoms::annotation_xml,
nsHtml5Atoms::annotation_xml,
NS_HTML5TREE_BUILDER_ANNOTATION_XML |
NS_HTML5ELEMENT_NAME_SCOPING_AS_MATHML);
ELT_BIG = new nsHtml5ElementName(nsHtml5Atoms::big, nsHtml5Atoms::big, NS_HTML5TREE_BUILDER_B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U); ELT_BIG = new nsHtml5ElementName(nsHtml5Atoms::big, nsHtml5Atoms::big, NS_HTML5TREE_BUILDER_B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
ELT_BDO = new nsHtml5ElementName(nsHtml5Atoms::bdo, nsHtml5Atoms::bdo, NS_HTML5TREE_BUILDER_OTHER); ELT_BDO = new nsHtml5ElementName(nsHtml5Atoms::bdo, nsHtml5Atoms::bdo, NS_HTML5TREE_BUILDER_OTHER);
ELT_COL = new nsHtml5ElementName(nsHtml5Atoms::col, nsHtml5Atoms::col, NS_HTML5TREE_BUILDER_COL | NS_HTML5ELEMENT_NAME_SPECIAL); ELT_COL = new nsHtml5ElementName(nsHtml5Atoms::col, nsHtml5Atoms::col, NS_HTML5TREE_BUILDER_COL | NS_HTML5ELEMENT_NAME_SPECIAL);
@@ -657,11 +661,6 @@ nsHtml5ElementName::initializeStatics()
nsHtml5Atoms::dl, nsHtml5Atoms::dl,
NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL | NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL |
NS_HTML5ELEMENT_NAME_SPECIAL); NS_HTML5ELEMENT_NAME_SPECIAL);
ELT_ANNOTATION_XML =
new nsHtml5ElementName(nsHtml5Atoms::annotation_xml,
nsHtml5Atoms::annotation_xml,
NS_HTML5TREE_BUILDER_ANNOTATION_XML |
NS_HTML5ELEMENT_NAME_SCOPING_AS_MATHML);
ELT_HTML = new nsHtml5ElementName( ELT_HTML = new nsHtml5ElementName(
nsHtml5Atoms::html, nsHtml5Atoms::html,
nsHtml5Atoms::html, nsHtml5Atoms::html,
@@ -967,7 +966,7 @@ nsHtml5ElementName::initializeStatics()
NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT | NS_HTML5TREE_BUILDER_TBODY_OR_THEAD_OR_TFOOT |
NS_HTML5ELEMENT_NAME_SPECIAL | NS_HTML5ELEMENT_NAME_FOSTER_PARENTING | NS_HTML5ELEMENT_NAME_SPECIAL | NS_HTML5ELEMENT_NAME_FOSTER_PARENTING |
NS_HTML5ELEMENT_NAME_OPTIONAL_END_TAG); NS_HTML5ELEMENT_NAME_OPTIONAL_END_TAG);
ELEMENT_NAMES = new nsHtml5ElementName*[205]; ELEMENT_NAMES = new nsHtml5ElementName*[204];
ELEMENT_NAMES[0] = ELT_BIG; ELEMENT_NAMES[0] = ELT_BIG;
ELEMENT_NAMES[1] = ELT_BDO; ELEMENT_NAMES[1] = ELT_BDO;
ELEMENT_NAMES[2] = ELT_COL; ELEMENT_NAMES[2] = ELT_COL;
@@ -1077,107 +1076,107 @@ nsHtml5ElementName::initializeStatics()
ELEMENT_NAMES[106] = ELT_MASK; ELEMENT_NAMES[106] = ELT_MASK;
ELEMENT_NAMES[107] = ELT_TRACK; ELEMENT_NAMES[107] = ELT_TRACK;
ELEMENT_NAMES[108] = ELT_DL; ELEMENT_NAMES[108] = ELT_DL;
ELEMENT_NAMES[109] = ELT_ANNOTATION_XML; ELEMENT_NAMES[109] = ELT_HTML;
ELEMENT_NAMES[110] = ELT_HTML; ELEMENT_NAMES[110] = ELT_OL;
ELEMENT_NAMES[111] = ELT_OL; ELEMENT_NAMES[111] = ELT_LABEL;
ELEMENT_NAMES[112] = ELT_LABEL; ELEMENT_NAMES[112] = ELT_UL;
ELEMENT_NAMES[113] = ELT_UL; ELEMENT_NAMES[113] = ELT_SMALL;
ELEMENT_NAMES[114] = ELT_SMALL; ELEMENT_NAMES[114] = ELT_SYMBOL;
ELEMENT_NAMES[115] = ELT_SYMBOL; ELEMENT_NAMES[115] = ELT_ALTGLYPHITEM;
ELEMENT_NAMES[116] = ELT_ALTGLYPHITEM; ELEMENT_NAMES[116] = ELT_ANIMATETRANSFORM;
ELEMENT_NAMES[117] = ELT_ANIMATETRANSFORM; ELEMENT_NAMES[117] = ELT_ACRONYM;
ELEMENT_NAMES[118] = ELT_ACRONYM; ELEMENT_NAMES[118] = ELT_EM;
ELEMENT_NAMES[119] = ELT_EM; ELEMENT_NAMES[119] = ELT_FORM;
ELEMENT_NAMES[120] = ELT_FORM; ELEMENT_NAMES[120] = ELT_MENUITEM;
ELEMENT_NAMES[121] = ELT_MENUITEM; ELEMENT_NAMES[121] = ELT_PARAM;
ELEMENT_NAMES[122] = ELT_PARAM; ELEMENT_NAMES[122] = ELT_ANIMATEMOTION;
ELEMENT_NAMES[123] = ELT_ANIMATEMOTION; ELEMENT_NAMES[123] = ELT_BUTTON;
ELEMENT_NAMES[124] = ELT_BUTTON; ELEMENT_NAMES[124] = ELT_CAPTION;
ELEMENT_NAMES[125] = ELT_CAPTION; ELEMENT_NAMES[125] = ELT_FIGCAPTION;
ELEMENT_NAMES[126] = ELT_FIGCAPTION; ELEMENT_NAMES[126] = ELT_MN;
ELEMENT_NAMES[127] = ELT_MN; ELEMENT_NAMES[127] = ELT_KEYGEN;
ELEMENT_NAMES[128] = ELT_KEYGEN; ELEMENT_NAMES[128] = ELT_MAIN;
ELEMENT_NAMES[129] = ELT_MAIN; ELEMENT_NAMES[129] = ELT_OPTION;
ELEMENT_NAMES[130] = ELT_OPTION; ELEMENT_NAMES[130] = ELT_POLYGON;
ELEMENT_NAMES[131] = ELT_POLYGON; ELEMENT_NAMES[131] = ELT_PATTERN;
ELEMENT_NAMES[132] = ELT_PATTERN; ELEMENT_NAMES[132] = ELT_SPAN;
ELEMENT_NAMES[133] = ELT_SPAN; ELEMENT_NAMES[133] = ELT_SECTION;
ELEMENT_NAMES[134] = ELT_SECTION; ELEMENT_NAMES[134] = ELT_TSPAN;
ELEMENT_NAMES[135] = ELT_TSPAN; ELEMENT_NAMES[135] = ELT_AUDIO;
ELEMENT_NAMES[136] = ELT_AUDIO; ELEMENT_NAMES[136] = ELT_MO;
ELEMENT_NAMES[137] = ELT_MO; ELEMENT_NAMES[137] = ELT_VIDEO;
ELEMENT_NAMES[138] = ELT_VIDEO; ELEMENT_NAMES[138] = ELT_COLGROUP;
ELEMENT_NAMES[139] = ELT_COLGROUP; ELEMENT_NAMES[139] = ELT_FEDISPLACEMENTMAP;
ELEMENT_NAMES[140] = ELT_FEDISPLACEMENTMAP; ELEMENT_NAMES[140] = ELT_HGROUP;
ELEMENT_NAMES[141] = ELT_HGROUP; ELEMENT_NAMES[141] = ELT_RP;
ELEMENT_NAMES[142] = ELT_RP; ELEMENT_NAMES[142] = ELT_OPTGROUP;
ELEMENT_NAMES[143] = ELT_OPTGROUP; ELEMENT_NAMES[143] = ELT_SAMP;
ELEMENT_NAMES[144] = ELT_SAMP; ELEMENT_NAMES[144] = ELT_STOP;
ELEMENT_NAMES[145] = ELT_STOP; ELEMENT_NAMES[145] = ELT_BR;
ELEMENT_NAMES[146] = ELT_BR; ELEMENT_NAMES[146] = ELT_ABBR;
ELEMENT_NAMES[147] = ELT_ABBR; ELEMENT_NAMES[147] = ELT_ANIMATECOLOR;
ELEMENT_NAMES[148] = ELT_ANIMATECOLOR; ELEMENT_NAMES[148] = ELT_CENTER;
ELEMENT_NAMES[149] = ELT_CENTER; ELEMENT_NAMES[149] = ELT_HR;
ELEMENT_NAMES[150] = ELT_HR; ELEMENT_NAMES[150] = ELT_FEFUNCR;
ELEMENT_NAMES[151] = ELT_FEFUNCR; ELEMENT_NAMES[151] = ELT_FECOMPONENTTRANSFER;
ELEMENT_NAMES[152] = ELT_FECOMPONENTTRANSFER; ELEMENT_NAMES[152] = ELT_FILTER;
ELEMENT_NAMES[153] = ELT_FILTER; ELEMENT_NAMES[153] = ELT_FOOTER;
ELEMENT_NAMES[154] = ELT_FOOTER; ELEMENT_NAMES[154] = ELT_FEGAUSSIANBLUR;
ELEMENT_NAMES[155] = ELT_FEGAUSSIANBLUR; ELEMENT_NAMES[155] = ELT_HEADER;
ELEMENT_NAMES[156] = ELT_HEADER; ELEMENT_NAMES[156] = ELT_MARKER;
ELEMENT_NAMES[157] = ELT_MARKER; ELEMENT_NAMES[157] = ELT_METER;
ELEMENT_NAMES[158] = ELT_METER; ELEMENT_NAMES[158] = ELT_NOBR;
ELEMENT_NAMES[159] = ELT_NOBR; ELEMENT_NAMES[159] = ELT_TR;
ELEMENT_NAMES[160] = ELT_TR; ELEMENT_NAMES[160] = ELT_ADDRESS;
ELEMENT_NAMES[161] = ELT_ADDRESS; ELEMENT_NAMES[161] = ELT_CANVAS;
ELEMENT_NAMES[162] = ELT_CANVAS; ELEMENT_NAMES[162] = ELT_DEFS;
ELEMENT_NAMES[163] = ELT_DEFS; ELEMENT_NAMES[163] = ELT_DETAILS;
ELEMENT_NAMES[164] = ELT_DETAILS; ELEMENT_NAMES[164] = ELT_MS;
ELEMENT_NAMES[165] = ELT_MS; ELEMENT_NAMES[165] = ELT_NOFRAMES;
ELEMENT_NAMES[166] = ELT_NOFRAMES; ELEMENT_NAMES[166] = ELT_PROGRESS;
ELEMENT_NAMES[167] = ELT_PROGRESS; ELEMENT_NAMES[167] = ELT_DT;
ELEMENT_NAMES[168] = ELT_DT; ELEMENT_NAMES[168] = ELT_APPLET;
ELEMENT_NAMES[169] = ELT_APPLET; ELEMENT_NAMES[169] = ELT_BASEFONT;
ELEMENT_NAMES[170] = ELT_BASEFONT; ELEMENT_NAMES[170] = ELT_FOREIGNOBJECT;
ELEMENT_NAMES[171] = ELT_FOREIGNOBJECT; ELEMENT_NAMES[171] = ELT_FIELDSET;
ELEMENT_NAMES[172] = ELT_FIELDSET; ELEMENT_NAMES[172] = ELT_FRAMESET;
ELEMENT_NAMES[173] = ELT_FRAMESET; ELEMENT_NAMES[173] = ELT_FEOFFSET;
ELEMENT_NAMES[174] = ELT_FEOFFSET; ELEMENT_NAMES[174] = ELT_FESPOTLIGHT;
ELEMENT_NAMES[175] = ELT_FESPOTLIGHT; ELEMENT_NAMES[175] = ELT_FEPOINTLIGHT;
ELEMENT_NAMES[176] = ELT_FEPOINTLIGHT; ELEMENT_NAMES[176] = ELT_FEDISTANTLIGHT;
ELEMENT_NAMES[177] = ELT_FEDISTANTLIGHT; ELEMENT_NAMES[177] = ELT_FONT;
ELEMENT_NAMES[178] = ELT_FONT; ELEMENT_NAMES[178] = ELT_INPUT;
ELEMENT_NAMES[179] = ELT_INPUT; ELEMENT_NAMES[179] = ELT_LINEARGRADIENT;
ELEMENT_NAMES[180] = ELT_LINEARGRADIENT; ELEMENT_NAMES[180] = ELT_MTEXT;
ELEMENT_NAMES[181] = ELT_MTEXT; ELEMENT_NAMES[181] = ELT_NOSCRIPT;
ELEMENT_NAMES[182] = ELT_NOSCRIPT; ELEMENT_NAMES[182] = ELT_RT;
ELEMENT_NAMES[183] = ELT_RT; ELEMENT_NAMES[183] = ELT_OBJECT;
ELEMENT_NAMES[184] = ELT_OBJECT; ELEMENT_NAMES[184] = ELT_OUTPUT;
ELEMENT_NAMES[185] = ELT_OUTPUT; ELEMENT_NAMES[185] = ELT_PLAINTEXT;
ELEMENT_NAMES[186] = ELT_PLAINTEXT; ELEMENT_NAMES[186] = ELT_TT;
ELEMENT_NAMES[187] = ELT_TT; ELEMENT_NAMES[187] = ELT_RECT;
ELEMENT_NAMES[188] = ELT_RECT; ELEMENT_NAMES[188] = ELT_RADIALGRADIENT;
ELEMENT_NAMES[189] = ELT_RADIALGRADIENT; ELEMENT_NAMES[189] = ELT_SELECT;
ELEMENT_NAMES[190] = ELT_SELECT; ELEMENT_NAMES[190] = ELT_SCRIPT;
ELEMENT_NAMES[191] = ELT_SCRIPT; ELEMENT_NAMES[191] = ELT_TFOOT;
ELEMENT_NAMES[192] = ELT_TFOOT; ELEMENT_NAMES[192] = ELT_TEXT;
ELEMENT_NAMES[193] = ELT_TEXT; ELEMENT_NAMES[193] = ELT_MENU;
ELEMENT_NAMES[194] = ELT_MENU; ELEMENT_NAMES[194] = ELT_FEDROPSHADOW;
ELEMENT_NAMES[195] = ELT_FEDROPSHADOW; ELEMENT_NAMES[195] = ELT_VIEW;
ELEMENT_NAMES[196] = ELT_VIEW; ELEMENT_NAMES[196] = ELT_FECOLORMATRIX;
ELEMENT_NAMES[197] = ELT_FECOLORMATRIX; ELEMENT_NAMES[197] = ELT_FECONVOLVEMATRIX;
ELEMENT_NAMES[198] = ELT_FECONVOLVEMATRIX; ELEMENT_NAMES[198] = ELT_ISINDEX;
ELEMENT_NAMES[199] = ELT_ISINDEX; ELEMENT_NAMES[199] = ELT_BODY;
ELEMENT_NAMES[200] = ELT_BODY; ELEMENT_NAMES[200] = ELT_FEMORPHOLOGY;
ELEMENT_NAMES[201] = ELT_FEMORPHOLOGY; ELEMENT_NAMES[201] = ELT_RUBY;
ELEMENT_NAMES[202] = ELT_RUBY; ELEMENT_NAMES[202] = ELT_SUMMARY;
ELEMENT_NAMES[203] = ELT_SUMMARY; ELEMENT_NAMES[203] = ELT_TBODY;
ELEMENT_NAMES[204] = ELT_TBODY;
} }
void void
nsHtml5ElementName::releaseStatics() nsHtml5ElementName::releaseStatics()
{ {
delete ELT_ANNOTATION_XML;
delete ELT_BIG; delete ELT_BIG;
delete ELT_BDO; delete ELT_BDO;
delete ELT_COL; delete ELT_COL;
@@ -1287,7 +1286,6 @@ nsHtml5ElementName::releaseStatics()
delete ELT_MASK; delete ELT_MASK;
delete ELT_TRACK; delete ELT_TRACK;
delete ELT_DL; delete ELT_DL;
delete ELT_ANNOTATION_XML;
delete ELT_HTML; delete ELT_HTML;
delete ELT_OL; delete ELT_OL;
delete ELT_LABEL; delete ELT_LABEL;

View File

@@ -112,6 +112,7 @@ private:
nsHtml5ElementName(); nsHtml5ElementName();
~nsHtml5ElementName(); ~nsHtml5ElementName();
void setNameForNonInterned(nsIAtom* name); void setNameForNonInterned(nsIAtom* name);
static nsHtml5ElementName* ELT_ANNOTATION_XML;
static nsHtml5ElementName* ELT_BIG; static nsHtml5ElementName* ELT_BIG;
static nsHtml5ElementName* ELT_BDO; static nsHtml5ElementName* ELT_BDO;
static nsHtml5ElementName* ELT_COL; static nsHtml5ElementName* ELT_COL;
@@ -221,7 +222,6 @@ private:
static nsHtml5ElementName* ELT_MASK; static nsHtml5ElementName* ELT_MASK;
static nsHtml5ElementName* ELT_TRACK; static nsHtml5ElementName* ELT_TRACK;
static nsHtml5ElementName* ELT_DL; static nsHtml5ElementName* ELT_DL;
static nsHtml5ElementName* ELT_ANNOTATION_XML;
static nsHtml5ElementName* ELT_HTML; static nsHtml5ElementName* ELT_HTML;
static nsHtml5ElementName* ELT_OL; static nsHtml5ElementName* ELT_OL;
static nsHtml5ElementName* ELT_LABEL; static nsHtml5ElementName* ELT_LABEL;

View File

@@ -95,6 +95,7 @@ nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder* tokenHandler,
, charRefBuf(jArray<char16_t, int32_t>::newJArray(32)) , charRefBuf(jArray<char16_t, int32_t>::newJArray(32))
, bmpChar(jArray<char16_t, int32_t>::newJArray(1)) , bmpChar(jArray<char16_t, int32_t>::newJArray(1))
, astralChar(jArray<char16_t, int32_t>::newJArray(2)) , astralChar(jArray<char16_t, int32_t>::newJArray(2))
, containsHyphen(false)
, tagName(nullptr) , tagName(nullptr)
, nonInternedTagName(new nsHtml5ElementName()) , nonInternedTagName(new nsHtml5ElementName())
, attributeName(nullptr) , attributeName(nullptr)
@@ -286,13 +287,28 @@ nsHtml5Tokenizer::flushChars(char16_t* buf, int32_t pos)
void void
nsHtml5Tokenizer::strBufToElementNameString() nsHtml5Tokenizer::strBufToElementNameString()
{ {
tagName = nsHtml5ElementName::elementNameByBuffer(strBuf, 0, strBufLen, interner); if (containsHyphen) {
if (!tagName) { nsIAtom* annotationName = nsHtml5ElementName::ELT_ANNOTATION_XML->getName();
nonInternedTagName->setNameForNonInterned( if (nsHtml5Portability::localEqualsBuffer(
nsHtml5Portability::newLocalNameFromBuffer( annotationName, strBuf, 0, strBufLen)) {
strBuf, 0, strBufLen, interner)); tagName = nsHtml5ElementName::ELT_ANNOTATION_XML;
tagName = nonInternedTagName; } else {
nonInternedTagName->setNameForNonInterned(
nsHtml5Portability::newLocalNameFromBuffer(
strBuf, 0, strBufLen, interner));
tagName = nonInternedTagName;
}
} else {
tagName =
nsHtml5ElementName::elementNameByBuffer(strBuf, 0, strBufLen, interner);
if (!tagName) {
nonInternedTagName->setNameForNonInterned(
nsHtml5Portability::newLocalNameFromBuffer(
strBuf, 0, strBufLen, interner));
tagName = nonInternedTagName;
}
} }
containsHyphen = false;
clearStrBufAfterUse(); clearStrBufAfterUse();
} }
@@ -490,12 +506,14 @@ nsHtml5Tokenizer::stateLoop(int32_t state, char16_t c, int32_t pos, char16_t* bu
endTag = false; endTag = false;
clearStrBufBeforeUse(); clearStrBufBeforeUse();
appendStrBuf((char16_t) (c + 0x20)); appendStrBuf((char16_t) (c + 0x20));
containsHyphen = false;
state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos); state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos);
NS_HTML5_BREAK(tagopenloop); NS_HTML5_BREAK(tagopenloop);
} else if (c >= 'a' && c <= 'z') { } else if (c >= 'a' && c <= 'z') {
endTag = false; endTag = false;
clearStrBufBeforeUse(); clearStrBufBeforeUse();
appendStrBuf(c); appendStrBuf(c);
containsHyphen = false;
state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos); state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos);
NS_HTML5_BREAK(tagopenloop); NS_HTML5_BREAK(tagopenloop);
} }
@@ -586,6 +604,8 @@ nsHtml5Tokenizer::stateLoop(int32_t state, char16_t c, int32_t pos, char16_t* bu
default: { default: {
if (c >= 'A' && c <= 'Z') { if (c >= 'A' && c <= 'Z') {
c += 0x20; c += 0x20;
} else if (c == '-') {
containsHyphen = true;
} }
appendStrBuf(c); appendStrBuf(c);
continue; continue;
@@ -1926,6 +1946,7 @@ nsHtml5Tokenizer::stateLoop(int32_t state, char16_t c, int32_t pos, char16_t* bu
endTag = true; endTag = true;
clearStrBufBeforeUse(); clearStrBufBeforeUse();
appendStrBuf(c); appendStrBuf(c);
containsHyphen = false;
state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos); state = P::transition(mViewSource, NS_HTML5TOKENIZER_TAG_NAME, reconsume, pos);
NS_HTML5_CONTINUE(stateloop); NS_HTML5_CONTINUE(stateloop);
} else { } else {
@@ -4001,6 +4022,7 @@ nsHtml5Tokenizer::resetToDataState()
endTag = false; endTag = false;
shouldSuspend = false; shouldSuspend = false;
initDoctypeFields(); initDoctypeFields();
containsHyphen = false;
if (tagName) { if (tagName) {
tagName = nullptr; tagName = nullptr;
} }
@@ -4061,6 +4083,7 @@ nsHtml5Tokenizer::loadState(nsHtml5Tokenizer* other)
} else { } else {
publicIdentifier = nsHtml5Portability::newStringFromString(other->publicIdentifier); publicIdentifier = nsHtml5Portability::newStringFromString(other->publicIdentifier);
} }
containsHyphen = other->containsHyphen;
if (!other->tagName) { if (!other->tagName) {
tagName = nullptr; tagName = nullptr;
} else if (other->tagName->isInterned()) { } else if (other->tagName->isInterned()) {

View File

@@ -121,9 +121,9 @@ class nsHtml5Tokenizer
protected: protected:
bool endTag; bool endTag;
private: private:
bool containsHyphen;
nsHtml5ElementName* tagName; nsHtml5ElementName* tagName;
nsHtml5ElementName* nonInternedTagName; nsHtml5ElementName* nonInternedTagName;
protected: protected:
nsHtml5AttributeName* attributeName; nsHtml5AttributeName* attributeName;
private: private: