entry : svgMap.entrySet()) {
-// System.err.println("Missing SVG element: " + entry.getKey());
+// String n = entry.getKey();
+// if (!isHardcodedSvgElement(n)) {
+// System.err.println("Missing SVG element: " + entry.getKey());
+// }
// }
// }
@@ -681,14 +817,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLSharedElement,
// CPPONLY: NS_NewSVGUnknownElement,
TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SEARCH_OR_SECTION_OR_SUMMARY | SPECIAL);
-public static final ElementName DIV = new ElementName("div", "div",
-// CPPONLY: NS_NewHTMLDivElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-public static final ElementName IMG = new ElementName("img", "img",
-// CPPONLY: NS_NewHTMLImageElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.IMG | SPECIAL);
public static final ElementName INS = new ElementName("ins", "ins",
// CPPONLY: NS_NewHTMLModElement,
// CPPONLY: NS_NewSVGUnknownElement,
@@ -709,10 +837,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLPreElement,
// CPPONLY: NS_NewSVGUnknownElement,
TreeBuilder.PRE_OR_LISTING | SPECIAL);
-public static final ElementName A = new ElementName("a", "a",
-// CPPONLY: NS_NewHTMLAnchorElement,
-// CPPONLY: NS_NewSVGAElement,
-TreeBuilder.A);
public static final ElementName B = new ElementName("b", "b",
// CPPONLY: NS_NewHTMLElement,
// CPPONLY: NS_NewSVGUnknownElement,
@@ -761,10 +885,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLElement,
// CPPONLY: NS_NewSVGUnknownElement,
TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-public static final ElementName P = new ElementName("p", "p",
-// CPPONLY: NS_NewHTMLParagraphElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.P | SPECIAL | OPTIONAL_END_TAG);
public static final ElementName Q = new ElementName("q", "q",
// CPPONLY: NS_NewHTMLSharedElement,
// CPPONLY: NS_NewSVGUnknownElement,
@@ -1025,10 +1145,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLPreElement,
// CPPONLY: NS_NewSVGUnknownElement,
TreeBuilder.PRE_OR_LISTING | SPECIAL);
-public static final ElementName STRONG = new ElementName("strong", "strong",
-// CPPONLY: NS_NewHTMLElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
public static final ElementName ALTGLYPH = new ElementName("altglyph", "altGlyph",
// CPPONLY: NS_NewHTMLUnknownElement,
// CPPONLY: NS_NewSVGUnknownElement,
@@ -1069,10 +1185,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLUnknownElement,
// CPPONLY: NS_NewSVGTextPathElement,
TreeBuilder.OTHER);
-public static final ElementName LI = new ElementName("li", "li",
-// CPPONLY: NS_NewHTMLLIElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.LI | SPECIAL | OPTIONAL_END_TAG);
public static final ElementName MI = new ElementName("mi", "mi",
// CPPONLY: NS_NewHTMLUnknownElement,
// CPPONLY: NS_NewSVGUnknownElement,
@@ -1109,14 +1221,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLSharedListElement,
// CPPONLY: NS_NewSVGUnknownElement,
TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
-public static final ElementName LABEL = new ElementName("label", "label",
-// CPPONLY: NS_NewHTMLLabelElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.OTHER);
-public static final ElementName UL = new ElementName("ul", "ul",
-// CPPONLY: NS_NewHTMLSharedListElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
public static final ElementName SMALL = new ElementName("small", "small",
// CPPONLY: NS_NewHTMLElement,
// CPPONLY: NS_NewSVGUnknownElement,
@@ -1153,10 +1257,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLUnknownElement,
// CPPONLY: NS_NewSVGAnimateMotionElement,
TreeBuilder.OTHER);
-public static final ElementName BUTTON = new ElementName("button", "button",
-// CPPONLY: NS_NewHTMLButtonElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.BUTTON | SPECIAL);
public static final ElementName CAPTION = new ElementName("caption", "caption",
// CPPONLY: NS_NewHTMLTableCaptionElement,
// CPPONLY: NS_NewSVGUnknownElement,
@@ -1189,10 +1289,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLUnknownElement,
// CPPONLY: NS_NewSVGPatternElement,
TreeBuilder.OTHER);
-public static final ElementName SPAN = new ElementName("span", "span",
-// CPPONLY: NS_NewHTMLSpanElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
public static final ElementName SECTION = new ElementName("section", "section",
// CPPONLY: NS_NewHTMLElement,
// CPPONLY: NS_NewSVGUnknownElement,
@@ -1377,10 +1473,6 @@ public void destructor() {
// CPPONLY: NS_NewHTMLFontElement,
// CPPONLY: NS_NewSVGUnknownElement,
TreeBuilder.FONT);
-public static final ElementName INPUT = new ElementName("input", "input",
-// CPPONLY: NS_NewHTMLInputElement,
-// CPPONLY: NS_NewSVGUnknownElement,
-TreeBuilder.INPUT | SPECIAL);
public static final ElementName LINEARGRADIENT = new ElementName("lineargradient", "linearGradient",
// CPPONLY: NS_NewHTMLUnknownElement,
// CPPONLY: NS_NewSVGLinearGradientElement,
@@ -1486,62 +1578,62 @@ public void destructor() {
// CPPONLY: NS_NewSVGUnknownElement,
TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
private final static @NoLength ElementName[] ELEMENT_NAMES = {
-FIGCAPTION,
-CITE,
-FEOFFSET,
-H1,
-CLIPPATH,
+AUDIO,
+FEIMAGE,
+FRAMESET,
+H5,
+TH,
METER,
SELECT,
-B,
-BGSOUND,
-SOURCE,
-DL,
-RP,
-PROGRESS,
-NOSCRIPT,
-VIEW,
-DIV,
-G,
-FEFUNCA,
-THEAD,
-FIGURE,
-GLYPHREF,
-TEXTPATH,
+SVG,
+HEAD,
+TITLE,
ANIMATETRANSFORM,
-SECTION,
HR,
-DEFS,
-DATALIST,
-FONT,
-PLAINTEXT,
-TFOOT,
-FEMORPHOLOGY,
-COL,
-MAP,
-SUP,
-P,
-H5,
+NOFRAMES,
+NOSCRIPT,
+VIEW,
+INS,
+I,
FEFUNCB,
-HEAD,
BASE,
-FEIMAGE,
LINE,
-TITLE,
FESPECULARLIGHTING,
-PATH,
-MARK,
-UL,
-PARAM,
-OPTION,
-VIDEO,
-BR,
+MASK,
+MN,
+SAMP,
FOOTER,
-ADDRESS,
-MS,
-APPLET,
-FIELDSET,
-FEPOINTLIGHT,
+CANVAS,
+BASEFONT,
+FEDISTANTLIGHT,
+PLAINTEXT,
+TFOOT,
+FEMORPHOLOGY,
+COL,
+PRE,
+VAR,
+H1,
+FEFUNCA,
+BGSOUND,
+THEAD,
+CITE,
+FIGURE,
+SOURCE,
+GLYPHREF,
+MGLYPH,
+MI,
+OL,
+PARAM,
+POLYGON,
+FEDISPLACEMENTMAP,
+ANIMATECOLOR,
+FECOMPONENTTRANSFER,
+HEADER,
+TR,
+DETAILS,
+DT,
+FOREIGNOBJECT,
+FESPOTLIGHT,
LINEARGRADIENT,
OBJECT,
RECT,
@@ -1551,11 +1643,10 @@ public void destructor() {
SUMMARY,
BDI,
DFN,
-INS,
-PRE,
-SUB,
-USE,
-XMP,
+MAP,
+RTC,
+SET,
+WBR,
S,
H3,
AREA,
@@ -1572,34 +1663,35 @@ public void destructor() {
STYLE,
TEMPLATE,
FEFUNCG,
-STRONG,
-MATH,
-SEARCH,
-MI,
-MASK,
-OL,
+ALTGLYPH,
+MPATH,
+SWITCH,
+MARK,
+DL,
SYMBOL,
EM,
-BUTTON,
-KEYGEN,
-PATTERN,
-AUDIO,
-FEDISPLACEMENTMAP,
-SAMP,
-ANIMATECOLOR,
-FECOMPONENTTRANSFER,
-HEADER,
-TR,
-CANVAS,
-DETAILS,
-NOFRAMES,
-DT,
-BASEFONT,
-FOREIGNOBJECT,
-FRAMESET,
-FESPOTLIGHT,
-FEDISTANTLIGHT,
-INPUT,
+CAPTION,
+MAIN,
+SECTION,
+VIDEO,
+RP,
+BR,
+CENTER,
+FEFUNCR,
+FILTER,
+FEGAUSSIANBLUR,
+MARKER,
+NOBR,
+ADDRESS,
+DEFS,
+MS,
+PROGRESS,
+APPLET,
+DATALIST,
+FIELDSET,
+FEOFFSET,
+FEPOINTLIGHT,
+FONT,
MTEXT,
RT,
OUTPUT,
@@ -1617,16 +1709,14 @@ public void destructor() {
BDO,
DEL,
DIR,
-IMG,
KBD,
NAV,
-A,
-RTC,
-SVG,
-SET,
-VAR,
-WBR,
-I,
+B,
+SUB,
+SUP,
+USE,
+G,
+XMP,
Q,
U,
H2,
@@ -1660,27 +1750,24 @@ public void destructor() {
DIALOG,
FEDIFFUSELIGHTING,
LISTING,
-ALTGLYPH,
-MGLYPH,
-MPATH,
-TH,
-SWITCH,
-LI,
+CLIPPATH,
+MATH,
+PATH,
+SEARCH,
+TEXTPATH,
LINK,
MALIGNMARK,
TRACK,
HTML,
-LABEL,
SMALL,
ALTGLYPHITEM,
ACRONYM,
FORM,
ANIMATEMOTION,
-CAPTION,
-MN,
-MAIN,
-POLYGON,
-SPAN,
+FIGCAPTION,
+KEYGEN,
+OPTION,
+PATTERN,
TSPAN,
MO,
COLGROUP,
@@ -1688,70 +1775,64 @@ public void destructor() {
OPTGROUP,
STOP,
ABBR,
-CENTER,
-FEFUNCR,
-FILTER,
-FEGAUSSIANBLUR,
-MARKER,
-NOBR,
};
private final static int[] ELEMENT_HASHES = {
-1900845386,
-1748359220,
-2001349736,
-876609538,
-1798686984,
+1914900309,
+1749715159,
+2001349720,
+943718402,
+1805647874,
1971465813,
2008125638,
-59768833,
-1730965751,
-1756474198,
-1864368130,
-1938817026,
-1990037800,
-2005719336,
-2060065124,
-52490899,
-62390273,
-1682547543,
-1740181637,
-1749905526,
-1766992520,
-1807599880,
+60347747,
+1733890180,
+1757146773,
1881498736,
-1907661127,
1967128578,
-1983533124,
-2000525512,
-2001495140,
-2006896969,
-2008851557,
-2085266636,
-51961587,
-57206291,
-60352339,
-67108865,
-943718402,
+1988763672,
+2005719336,
+2060065124,
+55110883,
+63438849,
1699324759,
-1733890180,
1747814436,
-1749715159,
1752979652,
-1757146773,
1783388498,
-1805502724,
-1854228692,
-1873281026,
-1889085973,
-1905563974,
-1925844629,
-1963982850,
+1854245076,
+1902641154,
+1941178676,
1967795958,
-1982173479,
-1986527234,
-1998724870,
-2001349704,
-2001392796,
+1982935782,
+1999397992,
+2001392798,
+2006896969,
+2008851557,
+2085266636,
+51961587,
+58773795,
+61925907,
+876609538,
+1682547543,
+1730965751,
+1740181637,
+1748359220,
+1749905526,
+1756474198,
+1766992520,
+1803876550,
+1818755074,
+1870135298,
+1889085973,
+1906087319,
+1934172497,
+1965334268,
+1967788867,
+1968836118,
+1973420034,
+1983633431,
+1998585858,
+2001309869,
+2001392795,
2004635806,
2006028454,
2007601444,
@@ -1761,11 +1842,10 @@ public void destructor() {
2092255447,
51435587,
52486755,
-55110883,
-58773795,
-60345171,
-61395251,
-62973651,
+57206291,
+59821379,
+60354131,
+62450211,
68681729,
910163970,
1679960596,
@@ -1782,34 +1862,35 @@ public void destructor() {
1756625221,
1757268168,
1783210839,
-1790207270,
-1803929812,
-1806805526,
-1818755074,
-1854245076,
-1870135298,
+1797585096,
+1803929861,
+1806806678,
+1854228692,
+1864368130,
1874102998,
1881669634,
-1898753862,
-1903302038,
-1906135367,
-1914900309,
-1934172497,
-1941178676,
-1965334268,
-1967788867,
-1968836118,
-1973420034,
-1982935782,
-1983633431,
-1988763672,
-1998585858,
-1999397992,
-2001309869,
-2001349720,
-2001392795,
-2001392798,
-2003183333,
+1899272519,
+1904412884,
+1907661127,
+1925844629,
+1938817026,
+1963982850,
+1966223078,
+1967760215,
+1967795910,
+1968053806,
+1971461414,
+1971938532,
+1982173479,
+1983533124,
+1986527234,
+1990037800,
+1998724870,
+2000525512,
+2001349704,
+2001349736,
+2001392796,
+2001495140,
2005324101,
2005925890,
2006329158,
@@ -1827,16 +1908,14 @@ public void destructor() {
51438659,
52485715,
52488851,
-55104723,
56151587,
57733651,
-59244545,
-59821379,
-60347747,
-60354131,
-61925907,
-62450211,
-63438849,
+59768833,
+60345171,
+60352339,
+61395251,
+62390273,
+62973651,
67633153,
69730305,
893386754,
@@ -1870,27 +1949,24 @@ public void destructor() {
1782357526,
1783388497,
1786534215,
-1797585096,
-1803876550,
-1803929861,
-1805647874,
-1806806678,
-1818230786,
+1798686984,
+1803929812,
+1805502724,
+1806805526,
+1807599880,
1853642948,
1854228698,
1857653029,
1868312196,
-1870268949,
1874053333,
1881288348,
1881613047,
1884120164,
1898223949,
-1899272519,
-1902641154,
-1904412884,
-1906087319,
-1907435316,
+1900845386,
+1903302038,
+1905563974,
+1906135367,
1907959605,
1919418370,
1932928296,
@@ -1898,11 +1974,5 @@ public void destructor() {
1939219752,
1941221172,
1965115924,
-1966223078,
-1967760215,
-1967795910,
-1968053806,
-1971461414,
-1971938532,
};
}
diff --git a/src/nu/validator/htmlparser/impl/Portability.java b/src/nu/validator/htmlparser/impl/Portability.java
index cde64559..0117e65c 100644
--- a/src/nu/validator/htmlparser/impl/Portability.java
+++ b/src/nu/validator/htmlparser/impl/Portability.java
@@ -55,7 +55,7 @@ public static int checkedAdd(int a, int b) throws SAXException {
}
public static String newStringFromBuffer(@NoLength char[] buf, int offset, int length
- // CPPONLY: , TreeBuilder treeBuilder, boolean maybeAtomize
+ // CPPONLY: , TreeBuilder treeBuilder, Interner interner
) {
return new String(buf, offset, length);
}
@@ -151,6 +151,26 @@ public static boolean stringEqualsString(String one, String other) {
return one.equals(other);
}
+ // [NOCPP[
+ public static boolean bufferStartsWithLiteralAssumeSufficientLength(char[] buf, String literal) {
+ for (int i = 0; i < literal.length(); i++) {
+ if (buf[i] != literal.charAt(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean bufferStartsWithLiteralAtOffsetAssumeSufficientLength(char[] buf, String literal, int offset) {
+ for (int i = 0; i < literal.length(); i++) {
+ if (buf[offset + i] != literal.charAt(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ // ]NOCPP]
+
public static void delete(Object o) {
}
diff --git a/src/nu/validator/htmlparser/impl/Tokenizer.java b/src/nu/validator/htmlparser/impl/Tokenizer.java
index c183b40f..c414ec66 100755
--- a/src/nu/validator/htmlparser/impl/Tokenizer.java
+++ b/src/nu/validator/htmlparser/impl/Tokenizer.java
@@ -989,30 +989,22 @@ private void emitOrAppendCharRefBuf(int returnState) throws SAXException {
strBuf[strBufLen++] = c;
}
- /**
- * The buffer as a String. Currently only used for error reporting.
- *
- *
- * C++ memory note: The return value must be released.
- *
- * @return the buffer as a string
- */
@Inline protected String strBufToString() {
+ String str = Portability.newStringFromBuffer(strBuf, 0, strBufLen
+ // CPPONLY: , tokenHandler, null
+ );
+ clearStrBufAfterUse();
+ return str;
+ }
+
+ @Inline protected String strBufToAttributeValueString() {
// CPPONLY: String digitAtom = TryAtomizeForSingleDigit();
// CPPONLY: if (digitAtom) {
// CPPONLY: return digitAtom;
// CPPONLY: }
// CPPONLY:
- // CPPONLY: boolean maybeAtomize = false;
- // CPPONLY: if (!newAttributesEachTime) {
- // CPPONLY: if (attributeName == AttributeName.CLASS ||
- // CPPONLY: attributeName == AttributeName.TYPE) {
- // CPPONLY: maybeAtomize = true;
- // CPPONLY: }
- // CPPONLY: }
- // CPPONLY:
String str = Portability.newStringFromBuffer(strBuf, 0, strBufLen
- // CPPONLY: , tokenHandler, maybeAtomize
+ // CPPONLY: , tokenHandler, attributeName.isUseAtom() ? interner : null
);
clearStrBufAfterUse();
return str;
@@ -1397,7 +1389,7 @@ private void addAttributeWithValue() throws SAXException {
}
// ]NOCPP]
if (attributeName != null) {
- String val = strBufToString(); // Ownership transferred to
+ String val = strBufToAttributeValueString(); // Ownership transferred to
// HtmlAttributes
// CPPONLY: if (mViewSource) {
// CPPONLY: mViewSource.MaybeLinkifyAttributeValue(attributeName, val);
diff --git a/src/nu/validator/htmlparser/impl/TreeBuilder.java b/src/nu/validator/htmlparser/impl/TreeBuilder.java
index abadfb11..631184e3 100644
--- a/src/nu/validator/htmlparser/impl/TreeBuilder.java
+++ b/src/nu/validator/htmlparser/impl/TreeBuilder.java
@@ -2967,7 +2967,7 @@ private void startTagScriptInHead(ElementName elementName, HtmlAttributes attrib
}
private void startTagTemplateInHead(ElementName elementName, HtmlAttributes attributes) throws SAXException {
- appendToCurrentNodeAndPushElement(elementName, attributes);
+ appendToCurrentNodeAndPushTemplateElement(attributes);
insertMarker();
framesetOk = false;
originalMode = mode;
@@ -2990,26 +2990,6 @@ private boolean isSpecialParentInForeign(StackNode stackNode) {
|| (("http://www.w3.org/1998/Math/MathML" == ns) && (stackNode.getGroup() == MI_MO_MN_MS_MTEXT));
}
- private T getDeclarativeShadowRoot(T currentNode, T templateNode, HtmlAttributes attributes) {
- if (!isAllowDeclarativeShadowRoots()) {
- return null;
- }
-
- String shadowRootMode = attributes.getValue(AttributeName.SHADOWROOTMODE);
- if (shadowRootMode == null) {
- return null;
- }
-
- boolean shadowRootIsClonable = attributes.contains(AttributeName.SHADOWROOTCLONABLE);
- boolean shadowRootIsSerializable = attributes.contains(AttributeName.SHADOWROOTSERIALIZABLE);
- boolean shadowRootDelegatesFocus = attributes.contains(AttributeName.SHADOWROOTDELEGATESFOCUS);
- boolean shadowRootCustomElementRegistry = attributes.contains(AttributeName.SHADOWROOTCUSTOMELEMENTREGISTRY);
- String shadowRootReferenceTarget = attributes.getValue(AttributeName.SHADOWROOTREFERENCETARGET);
- String shadowRootSlotAssignment = attributes.getValue(AttributeName.SHADOWROOTSLOTASSIGNMENT);
-
- return getShadowRootFromHost(currentNode, templateNode, shadowRootMode, shadowRootIsClonable, shadowRootIsSerializable, shadowRootDelegatesFocus, shadowRootCustomElementRegistry, shadowRootSlotAssignment, shadowRootReferenceTarget);
- }
-
/**
*
*
@@ -3177,7 +3157,7 @@ public static String extractCharsetFromContent(String attributeValue
}
return Portability.newStringFromBuffer(buffer, start, end
- start
- // CPPONLY: , tb, false
+ // CPPONLY: , tb, null
);
}
return null;
@@ -5286,19 +5266,59 @@ private void appendToCurrentNodeAndPushElement(ElementName elementName,
T elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, currentNode
// CPPONLY: , htmlCreator(elementName.getHtmlCreator())
);
- if (ElementName.TEMPLATE == elementName) {
- T root = getDeclarativeShadowRoot(currentNode, elt, attributes);
- if (root != null) {
- setDocumentFragmentForTemplate(elt, root);
- elt = root;
- } else {
- appendElement(elt, currentNode);
- elt = getDocumentFragmentForTemplate(elt);
+ appendElement(elt, currentNode);
+ StackNode node = createStackNode(elementName, elt
+ // [NOCPP[
+ , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
+ // ]NOCPP]
+ );
+ push(node);
+ }
+
+ private void appendToCurrentNodeAndPushTemplateElement(HtmlAttributes attributes)
+ throws SAXException {
+ // [NOCPP[
+ checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
+ // ]NOCPP]
+ // This method can't be called for custom elements
+ T currentNode = nodeFromStackWithBlinkCompat(currentPtr);
+ // All accesses to `attributes` must happen before `createElement`.
+ String shadowRootMode = null;
+ boolean shadowRootIsClonable = false;
+ boolean shadowRootIsSerializable = false;
+ boolean shadowRootDelegatesFocus = false;
+ boolean shadowRootCustomElementRegistry = false;
+ String shadowRootReferenceTarget = null;
+ String shadowRootSlotAssignment = null;
+ if (isAllowDeclarativeShadowRoots()) {
+ shadowRootMode = Portability.newStringFromString(attributes.getValue(AttributeName.SHADOWROOTMODE));
+ if (shadowRootMode != null) {
+ shadowRootIsClonable = attributes.contains(AttributeName.SHADOWROOTCLONABLE);
+ shadowRootIsSerializable = attributes.contains(AttributeName.SHADOWROOTSERIALIZABLE);
+ shadowRootDelegatesFocus = attributes.contains(AttributeName.SHADOWROOTDELEGATESFOCUS);
+ shadowRootCustomElementRegistry = attributes.contains(AttributeName.SHADOWROOTCUSTOMELEMENTREGISTRY);
+ shadowRootReferenceTarget = Portability.newStringFromString(attributes.getValue(AttributeName.SHADOWROOTREFERENCETARGET));
+ shadowRootSlotAssignment = Portability.newStringFromString(attributes.getValue(AttributeName.SHADOWROOTSLOTASSIGNMENT));
}
+ }
+ T elt = createElement("http://www.w3.org/1999/xhtml", "template", attributes, currentNode
+ // CPPONLY: , htmlCreator(NS_NewHTMLTemplateElement)
+ );
+ T root = null;
+ if (shadowRootMode != null) {
+ root = getShadowRootFromHost(currentNode, elt, shadowRootMode, shadowRootIsClonable, shadowRootIsSerializable, shadowRootDelegatesFocus, shadowRootCustomElementRegistry, shadowRootSlotAssignment, shadowRootReferenceTarget);
+ Portability.releaseString(shadowRootMode);
+ Portability.releaseString(shadowRootReferenceTarget);
+ Portability.releaseString(shadowRootSlotAssignment);
+ }
+ if (root != null) {
+ setDocumentFragmentForTemplate(elt, root);
+ elt = root;
} else {
appendElement(elt, currentNode);
+ elt = getDocumentFragmentForTemplate(elt);
}
- StackNode node = createStackNode(elementName, elt
+ StackNode node = createStackNode(ElementName.TEMPLATE, elt
// [NOCPP[
, errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
// ]NOCPP]
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java b/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java
index dc6569ba..5d0415a5 100644
--- a/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java
+++ b/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java
@@ -59,6 +59,8 @@ public class CppTypes {
PseudoElementAtom or NonInheritingAnonBoxAtom or InheritingAnonBoxAtom */
private static final Pattern ATOM_DEF = Pattern.compile("^\\s*Atom\\(\"([^,]+)\",\\s*\"([^\"]*)\"\\).*$");
+ private static final Pattern GKATOM = Pattern.compile("^.*nsGkAtoms::([a-zA-Z_]+)[^a-zA-Z_].*$");
+
private static Set reservedWords = new HashSet();
static {
@@ -81,6 +83,8 @@ public class CppTypes {
reservedWords.add("unicode");
}
+ private static Set atomAttributes = new HashSet();
+
private static Map methodRenames = new HashMap();
static {
@@ -128,7 +132,7 @@ public class CppTypes {
private static final String[] FORWARD_DECLARATIONS = { "nsHtml5StreamParser" };
private static final String[] CLASSES_THAT_NEED_SUPPLEMENT = {
- "Tokenizer", "TreeBuilder", "UTF16Buffer", };
+ "Portability", "Tokenizer", "TreeBuilder", "UTF16Buffer" };
private static final String[] STATE_LOOP_POLICIES = {
"nsHtml5ViewSourcePolicy", "nsHtml5LineColPolicy", "nsHtml5FastestPolicy" };
@@ -137,12 +141,13 @@ public class CppTypes {
private final Writer atomWriter;
- public CppTypes(File atomList, File generatedAtomFile) {
+ public CppTypes(File atomList, File generatedAtomFile, File atomAttributeFile) {
if (atomList == null) {
atomWriter = null;
} else {
try {
ingestAtoms(atomList);
+ ingestAtomAttributes(atomAttributeFile);
atomWriter = new OutputStreamWriter(new FileOutputStream(
generatedAtomFile), "utf-8");
this.start();
@@ -186,6 +191,23 @@ private void ingestAtoms(File atomList) throws IOException {
}
}
+ private void ingestAtomAttributes(File atomAttributeFile) throws IOException {
+ // This doesn't need to be efficient, so let's make it easy to write.
+ BufferedReader atomReader = new BufferedReader(
+ new InputStreamReader(new FileInputStream(atomAttributeFile), "utf-8"));
+ try {
+ String line;
+ while ((line = atomReader.readLine()) != null) {
+ Matcher m = GKATOM.matcher(line);
+ if (m.matches()) {
+ atomAttributes.add(m.group(1));
+ }
+ }
+ } finally {
+ atomReader.close();
+ }
+ }
+
public void start() {
try {
@@ -209,6 +231,9 @@ public void finished() {
} catch (IOException e) {
throw new RuntimeException(e);
}
+ for (String atomAttr : atomAttributes) {
+ System.err.println("Missing atom attribute: " + atomAttr);
+ }
}
public String classPrefix() {
@@ -377,6 +402,10 @@ public String stringForLiteral(String literal) {
return '"' + literal + '"';
}
+ public String utf16StringForLiteral(String literal) {
+ return "u\"" + literal + '"';
+ }
+
public String staticArrayTemplate() {
return "staticJArray";
}
@@ -555,4 +584,8 @@ public String releaseAssertionMacro() {
public String crashMacro() {
return "MOZ_CRASH";
}
+
+ public boolean useAtom(String name) {
+ return atomAttributes.remove(atomMap.get(name));
+ }
}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java b/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java
index 6eadb0ad..5623f76a 100755
--- a/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java
+++ b/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java
@@ -1239,6 +1239,8 @@ public void visit(StringLiteralExpr n, LocalSymbolTable arg) {
printer.print(cppTypes.stringForLiteral(val));
} else if ("isQuirky".equals(currentMethod) && "html".equals(val)) {
printer.print(cppTypes.stringForLiteral(val));
+ } else if ("nameByBuffer".equals(currentMethod) || "elementNameByBuffer".equals(currentMethod)) {
+ printer.print(cppTypes.utf16StringForLiteral(val));
} else {
printer.print(cppTypes.localForLiteral(val));
}
@@ -1442,6 +1444,7 @@ public void visit(ObjectCreationExpr n, LocalSymbolTable arg) {
// Remove flags, and htmlLang from AttributeName constructor.
args.remove(6);
args.remove(4);
+ args.add(new BooleanLiteralExpr(cppTypes.useAtom(((StringLiteralExpr)args.get(1)).getValue())));
}
}
diff --git a/translator-src/nu/validator/htmlparser/cpptranslate/Main.java b/translator-src/nu/validator/htmlparser/cpptranslate/Main.java
index 898f87f1..8041b528 100644
--- a/translator-src/nu/validator/htmlparser/cpptranslate/Main.java
+++ b/translator-src/nu/validator/htmlparser/cpptranslate/Main.java
@@ -78,7 +78,7 @@ public class Main {
* @throws IOException
*/
public static void main(String[] args) throws ParseException, IOException {
- CppTypes cppTypes = new CppTypes(new File(args[2]), new File(args[3]));
+ CppTypes cppTypes = new CppTypes(new File(args[2]), new File(args[3]), new File(args[4]));
SymbolTable symbolTable = new SymbolTable();
File javaDirectory = new File(args[0]);