Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/Node-properties.html |
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/Node-properties.html b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/Node-properties.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..98ea929223651d20ed2e310f6efe1da3d206aed1 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/Node-properties.html |
@@ -0,0 +1,688 @@ |
+<!doctype html> |
+<title>Node assorted property tests</title> |
+<link rel=author title="Aryeh Gregor" href=ayg@aryeh.name> |
+<meta charset=utf-8> |
+<div id=log></div> |
+<script src=../../../../resources/testharness.js></script> |
+<script src=../../../../resources/testharnessreport.js></script> |
+<script src=../common.js></script> |
+<script> |
+"use strict"; |
+/** |
+ * First we define a data structure to tell us what tests to run. The keys |
+ * will be eval()ed, and are mostly global variables defined in common.js. The |
+ * values are objects, which maps properties to expected values. So |
+ * |
+ * foo: { |
+ * bar: "baz", |
+ * quz: 7, |
+ * }, |
+ * |
+ * will test that eval("foo.bar") === "baz" and eval("foo.quz") === 7. "foo" |
+ * and "bar" could thus be expressions, like "document.documentElement" and |
+ * "childNodes[4]" respectively. |
+ * |
+ * To avoid repetition, some values are automatically added based on others. |
+ * For instance, if we specify nodeType: Node.TEXT_NODE, we'll automatically |
+ * also test nodeName: "#text". This is handled by code after this variable is |
+ * defined. |
+ */ |
+var expected = { |
+ testDiv: { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: document.body, |
+ parentElement: document.body, |
+ "childNodes.length": 6, |
+ "childNodes[0]": paras[0], |
+ "childNodes[1]": paras[1], |
+ "childNodes[2]": paras[2], |
+ "childNodes[3]": paras[3], |
+ "childNodes[4]": paras[4], |
+ "childNodes[5]": comment, |
+ previousSibling: null, |
+ nextSibling: document.getElementById("log"), |
+ textContent: "A\u0308b\u0308c\u0308d\u0308e\u0308f\u0308g\u0308h\u0308\nIjklmnop\nQrstuvwxYzabcdefGhijklmn", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "div", |
+ tagName: "DIV", |
+ id: "test", |
+ "children[0]": paras[0], |
+ "children[1]": paras[1], |
+ "children[2]": paras[2], |
+ "children[3]": paras[3], |
+ "children[4]": paras[4], |
+ previousElementSibling: null, |
+ // nextSibling isn't explicitly set |
+ //nextElementSibling: , |
+ childElementCount: 5, |
+ }, |
+ detachedDiv: { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: null, |
+ parentElement: null, |
+ "childNodes.length": 2, |
+ "childNodes[0]": detachedPara1, |
+ "childNodes[1]": detachedPara2, |
+ previousSibling: null, |
+ nextSibling: null, |
+ textContent: "OpqrstuvWxyzabcd", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "div", |
+ tagName: "DIV", |
+ "children[0]": detachedPara1, |
+ "children[1]": detachedPara2, |
+ previousElementSibling: null, |
+ nextElementSibling: null, |
+ childElementCount: 2, |
+ }, |
+ detachedPara1: { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: detachedDiv, |
+ parentElement: detachedDiv, |
+ "childNodes.length": 1, |
+ previousSibling: null, |
+ nextSibling: detachedPara2, |
+ textContent: "Opqrstuv", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ previousElementSibling: null, |
+ nextElementSibling: detachedPara2, |
+ childElementCount: 0, |
+ }, |
+ detachedPara2: { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: detachedDiv, |
+ parentElement: detachedDiv, |
+ "childNodes.length": 1, |
+ previousSibling: detachedPara1, |
+ nextSibling: null, |
+ textContent: "Wxyzabcd", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ previousElementSibling: detachedPara1, |
+ nextElementSibling: null, |
+ childElementCount: 0, |
+ }, |
+ document: { |
+ // Node |
+ nodeType: Node.DOCUMENT_NODE, |
+ "childNodes.length": 2, |
+ "childNodes[0]": document.doctype, |
+ "childNodes[1]": document.documentElement, |
+ |
+ // Document |
+ URL: String(location), |
+ compatMode: "CSS1Compat", |
+ characterSet: "UTF-8", |
+ contentType: "text/html", |
+ doctype: doctype, |
+ //documentElement: , |
+ }, |
+ foreignDoc: { |
+ // Node |
+ nodeType: Node.DOCUMENT_NODE, |
+ "childNodes.length": 3, |
+ "childNodes[0]": foreignDoc.doctype, |
+ "childNodes[1]": foreignDoc.documentElement, |
+ "childNodes[2]": foreignComment, |
+ |
+ // Document |
+ URL: "about:blank", |
+ compatMode: "CSS1Compat", |
+ characterSet: "UTF-8", |
+ contentType: "text/html", |
+ //doctype: , |
+ //documentElement: , |
+ }, |
+ foreignPara1: { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: foreignDoc, |
+ parentNode: foreignDoc.body, |
+ parentElement: foreignDoc.body, |
+ "childNodes.length": 1, |
+ previousSibling: null, |
+ nextSibling: foreignPara2, |
+ textContent: "Efghijkl", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ previousElementSibling: null, |
+ nextElementSibling: foreignPara2, |
+ childElementCount: 0, |
+ }, |
+ foreignPara2: { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: foreignDoc, |
+ parentNode: foreignDoc.body, |
+ parentElement: foreignDoc.body, |
+ "childNodes.length": 1, |
+ previousSibling: foreignPara1, |
+ nextSibling: foreignTextNode, |
+ textContent: "Mnopqrst", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ previousElementSibling: foreignPara1, |
+ nextElementSibling: null, |
+ childElementCount: 0, |
+ }, |
+ xmlDoc: { |
+ // Node |
+ nodeType: Node.DOCUMENT_NODE, |
+ "childNodes.length": 4, |
+ "childNodes[0]": xmlDoctype, |
+ "childNodes[1]": xmlElement, |
+ "childNodes[2]": processingInstruction, |
+ "childNodes[3]": xmlComment, |
+ |
+ // Document |
+ URL: "about:blank", |
+ compatMode: "CSS1Compat", |
+ characterSet: "UTF-8", |
+ contentType: "application/xml", |
+ //doctype: , |
+ //documentElement: , |
+ }, |
+ xmlElement: { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: xmlDoc, |
+ parentElement: null, |
+ "childNodes.length": 1, |
+ "childNodes[0]": xmlTextNode, |
+ previousSibling: xmlDoctype, |
+ nextSibling: processingInstruction, |
+ textContent: "do re mi fa so la ti", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "igiveuponcreativenames", |
+ tagName: "igiveuponcreativenames", |
+ previousElementSibling: null, |
+ nextElementSibling: null, |
+ childElementCount: 0, |
+ }, |
+ detachedXmlElement: { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: null, |
+ parentElement: null, |
+ "childNodes.length": 0, |
+ previousSibling: null, |
+ nextSibling: null, |
+ textContent: "", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "everyone-hates-hyphenated-element-names", |
+ tagName: "everyone-hates-hyphenated-element-names", |
+ previousElementSibling: null, |
+ nextElementSibling: null, |
+ childElementCount: 0, |
+ }, |
+ detachedTextNode: { |
+ // Node |
+ nodeType: Node.TEXT_NODE, |
+ ownerDocument: document, |
+ parentNode: null, |
+ parentElement: null, |
+ previousSibling: null, |
+ nextSibling: null, |
+ nodeValue: "Uvwxyzab", |
+ |
+ // Text |
+ wholeText: "Uvwxyzab", |
+ }, |
+ foreignTextNode: { |
+ // Node |
+ nodeType: Node.TEXT_NODE, |
+ ownerDocument: foreignDoc, |
+ parentNode: foreignDoc.body, |
+ parentElement: foreignDoc.body, |
+ previousSibling: foreignPara2, |
+ nextSibling: null, |
+ nodeValue: "I admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now.", |
+ |
+ // Text |
+ wholeText: "I admit that I harbor doubts about whether we really need so many things to test, but it's too late to stop now.", |
+ }, |
+ detachedForeignTextNode: { |
+ // Node |
+ nodeType: Node.TEXT_NODE, |
+ ownerDocument: foreignDoc, |
+ parentNode: null, |
+ parentElement: null, |
+ previousSibling: null, |
+ nextSibling: null, |
+ nodeValue: "Cdefghij", |
+ |
+ // Text |
+ wholeText: "Cdefghij", |
+ }, |
+ xmlTextNode: { |
+ // Node |
+ nodeType: Node.TEXT_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: xmlElement, |
+ parentElement: xmlElement, |
+ previousSibling: null, |
+ nextSibling: null, |
+ nodeValue: "do re mi fa so la ti", |
+ |
+ // Text |
+ wholeText: "do re mi fa so la ti", |
+ }, |
+ detachedXmlTextNode: { |
+ // Node |
+ nodeType: Node.TEXT_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: null, |
+ parentElement: null, |
+ previousSibling: null, |
+ nextSibling: null, |
+ nodeValue: "Klmnopqr", |
+ |
+ // Text |
+ wholeText: "Klmnopqr", |
+ }, |
+ processingInstruction: { |
+ // Node |
+ nodeType: Node.PROCESSING_INSTRUCTION_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: xmlDoc, |
+ parentElement: null, |
+ previousSibling: xmlElement, |
+ nextSibling: xmlComment, |
+ nodeValue: 'Did you know that ":syn sync fromstart" is very useful when using vim to edit large amounts of JavaScript embedded in HTML?', |
+ |
+ // ProcessingInstruction |
+ target: "somePI", |
+ }, |
+ detachedProcessingInstruction: { |
+ // Node |
+ nodeType: Node.PROCESSING_INSTRUCTION_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: null, |
+ parentElement: null, |
+ previousSibling: null, |
+ nextSibling: null, |
+ nodeValue: "chirp chirp chirp", |
+ |
+ // ProcessingInstruction |
+ target: "whippoorwill", |
+ }, |
+ comment: { |
+ // Node |
+ nodeType: Node.COMMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: testDiv, |
+ parentElement: testDiv, |
+ previousSibling: paras[4], |
+ nextSibling: null, |
+ nodeValue: "Alphabet soup?", |
+ }, |
+ detachedComment: { |
+ // Node |
+ nodeType: Node.COMMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: null, |
+ parentElement: null, |
+ previousSibling: null, |
+ nextSibling: null, |
+ nodeValue: "Stuvwxyz", |
+ }, |
+ foreignComment: { |
+ // Node |
+ nodeType: Node.COMMENT_NODE, |
+ ownerDocument: foreignDoc, |
+ parentNode: foreignDoc, |
+ parentElement: null, |
+ previousSibling: foreignDoc.documentElement, |
+ nextSibling: null, |
+ nodeValue: '"Commenter" and "commentator" mean different things. I\'ve seen non-native speakers trip up on this.', |
+ }, |
+ detachedForeignComment: { |
+ // Node |
+ nodeType: Node.COMMENT_NODE, |
+ ownerDocument: foreignDoc, |
+ parentNode: null, |
+ parentElement: null, |
+ previousSibling: null, |
+ nextSibling: null, |
+ nodeValue: "אריה יהודה", |
+ }, |
+ xmlComment: { |
+ // Node |
+ nodeType: Node.COMMENT_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: xmlDoc, |
+ parentElement: null, |
+ previousSibling: processingInstruction, |
+ nextSibling: null, |
+ nodeValue: "I maliciously created a comment that will break incautious XML serializers, but Firefox threw an exception, so all I got was this lousy T-shirt", |
+ }, |
+ detachedXmlComment: { |
+ // Node |
+ nodeType: Node.COMMENT_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: null, |
+ parentElement: null, |
+ previousSibling: null, |
+ nextSibling: null, |
+ nodeValue: "בן חיים אליעזר", |
+ }, |
+ docfrag: { |
+ // Node |
+ nodeType: Node.DOCUMENT_FRAGMENT_NODE, |
+ ownerDocument: document, |
+ "childNodes.length": 0, |
+ textContent: "", |
+ }, |
+ foreignDocfrag: { |
+ // Node |
+ nodeType: Node.DOCUMENT_FRAGMENT_NODE, |
+ ownerDocument: foreignDoc, |
+ "childNodes.length": 0, |
+ textContent: "", |
+ }, |
+ xmlDocfrag: { |
+ // Node |
+ nodeType: Node.DOCUMENT_FRAGMENT_NODE, |
+ ownerDocument: xmlDoc, |
+ "childNodes.length": 0, |
+ textContent: "", |
+ }, |
+ doctype: { |
+ // Node |
+ nodeType: Node.DOCUMENT_TYPE_NODE, |
+ ownerDocument: document, |
+ parentNode: document, |
+ previousSibling: null, |
+ nextSibling: document.documentElement, |
+ |
+ // DocumentType |
+ name: "html", |
+ publicId: "", |
+ systemId: "", |
+ }, |
+ foreignDoctype: { |
+ // Node |
+ nodeType: Node.DOCUMENT_TYPE_NODE, |
+ ownerDocument: foreignDoc, |
+ parentNode: foreignDoc, |
+ previousSibling: null, |
+ nextSibling: foreignDoc.documentElement, |
+ |
+ // DocumentType |
+ name: "html", |
+ publicId: "", |
+ systemId: "", |
+ }, |
+ xmlDoctype: { |
+ // Node |
+ nodeType: Node.DOCUMENT_TYPE_NODE, |
+ ownerDocument: xmlDoc, |
+ parentNode: xmlDoc, |
+ previousSibling: null, |
+ nextSibling: xmlElement, |
+ |
+ // DocumentType |
+ name: "qorflesnorf", |
+ publicId: "abcde", |
+ systemId: "x\"'y", |
+ }, |
+ "paras[0]": { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: testDiv, |
+ parentElement: testDiv, |
+ "childNodes.length": 1, |
+ previousSibling: null, |
+ nextSibling: paras[1], |
+ textContent: "A\u0308b\u0308c\u0308d\u0308e\u0308f\u0308g\u0308h\u0308\n", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ id: "a", |
+ previousElementSibling: null, |
+ nextElementSibling: paras[1], |
+ childElementCount: 0, |
+ }, |
+ "paras[1]": { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: testDiv, |
+ parentElement: testDiv, |
+ "childNodes.length": 1, |
+ previousSibling: paras[0], |
+ nextSibling: paras[2], |
+ textContent: "Ijklmnop\n", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ id: "b", |
+ previousElementSibling: paras[0], |
+ nextElementSibling: paras[2], |
+ childElementCount: 0, |
+ }, |
+ "paras[2]": { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: testDiv, |
+ parentElement: testDiv, |
+ "childNodes.length": 1, |
+ previousSibling: paras[1], |
+ nextSibling: paras[3], |
+ textContent: "Qrstuvwx", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ id: "c", |
+ previousElementSibling: paras[1], |
+ nextElementSibling: paras[3], |
+ childElementCount: 0, |
+ }, |
+ "paras[3]": { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: testDiv, |
+ parentElement: testDiv, |
+ "childNodes.length": 1, |
+ previousSibling: paras[2], |
+ nextSibling: paras[4], |
+ textContent: "Yzabcdef", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ id: "d", |
+ previousElementSibling: paras[2], |
+ nextElementSibling: paras[4], |
+ childElementCount: 0, |
+ }, |
+ "paras[4]": { |
+ // Node |
+ nodeType: Node.ELEMENT_NODE, |
+ ownerDocument: document, |
+ parentNode: testDiv, |
+ parentElement: testDiv, |
+ "childNodes.length": 1, |
+ previousSibling: paras[3], |
+ nextSibling: comment, |
+ textContent: "Ghijklmn", |
+ |
+ // Element |
+ namespaceURI: "http://www.w3.org/1999/xhtml", |
+ prefix: null, |
+ localName: "p", |
+ tagName: "P", |
+ id: "e", |
+ previousElementSibling: paras[3], |
+ nextElementSibling: null, |
+ childElementCount: 0, |
+ }, |
+}; |
+ |
+for (var node in expected) { |
+ // Now we set various default values by node type. |
+ switch (expected[node].nodeType) { |
+ case Node.ELEMENT_NODE: |
+ expected[node].nodeName = expected[node].tagName; |
+ expected[node].nodeValue = null; |
+ expected[node]["children.length"] = expected[node].childElementCount; |
+ |
+ if (expected[node].id === undefined) { |
+ expected[node].id = ""; |
+ } |
+ if (expected[node].className === undefined) { |
+ expected[node].className = ""; |
+ } |
+ |
+ var len = expected[node].childElementCount; |
+ if (len === 0) { |
+ expected[node].firstElementChild = |
+ expected[node].lastElementChild = null; |
+ } else { |
+ // If we have expectations for the first/last child in children, |
+ // use those. Otherwise, at least check that .firstElementChild == |
+ // .children[0] and .lastElementChild == .children[len - 1], even |
+ // if we aren't sure what they should be. |
+ expected[node].firstElementChild = expected[node]["children[0]"] |
+ ? expected[node]["children[0]"] |
+ : eval(node).children[0]; |
+ expected[node].lastElementChild = |
+ expected[node]["children[" + (len - 1) + "]"] |
+ ? expected[node]["children[" + (len - 1) + "]"] |
+ : eval(node).children[len - 1]; |
+ } |
+ break; |
+ |
+ case Node.TEXT_NODE: |
+ expected[node].nodeName = "#text"; |
+ expected[node]["childNodes.length"] = 0; |
+ expected[node].textContent = expected[node].data = |
+ expected[node].nodeValue; |
+ expected[node].length = expected[node].nodeValue.length; |
+ break; |
+ |
+ case Node.PROCESSING_INSTRUCTION_NODE: |
+ expected[node].nodeName = expected[node].target; |
+ expected[node]["childNodes.length"] = 0; |
+ expected[node].textContent = expected[node].data = |
+ expected[node].nodeValue; |
+ expected[node].length = expected[node].nodeValue.length; |
+ break; |
+ |
+ case Node.COMMENT_NODE: |
+ expected[node].nodeName = "#comment"; |
+ expected[node]["childNodes.length"] = 0; |
+ expected[node].textContent = expected[node].data = |
+ expected[node].nodeValue; |
+ expected[node].length = expected[node].nodeValue.length; |
+ break; |
+ |
+ case Node.DOCUMENT_NODE: |
+ expected[node].nodeName = "#document"; |
+ expected[node].ownerDocument = expected[node].parentNode = |
+ expected[node].parentElement = expected[node].previousSibling = |
+ expected[node].nextSibling = expected[node].nodeValue = |
+ expected[node].textContent = null; |
+ expected[node].documentURI = expected[node].URL; |
+ expected[node].charset = expected[node].inputEncoding = |
+ expected[node].characterSet; |
+ break; |
+ |
+ case Node.DOCUMENT_TYPE_NODE: |
+ expected[node].nodeName = expected[node].name; |
+ expected[node]["childNodes.length"] = 0; |
+ expected[node].parentElement = expected[node].nodeValue = |
+ expected[node].textContent = null; |
+ break; |
+ |
+ case Node.DOCUMENT_FRAGMENT_NODE: |
+ expected[node].nodeName = "#document-fragment"; |
+ expected[node].parentNode = expected[node].parentElement = |
+ expected[node].previousSibling = expected[node].nextSibling = |
+ expected[node].nodeValue = null; |
+ break; |
+ } |
+ |
+ // Now we set some further default values that are independent of node |
+ // type. |
+ var len = expected[node]["childNodes.length"]; |
+ if (len === 0) { |
+ expected[node].firstChild = expected[node].lastChild = null; |
+ } else { |
+ // If we have expectations for the first/last child in childNodes, use |
+ // those. Otherwise, at least check that .firstChild == .childNodes[0] |
+ // and .lastChild == .childNodes[len - 1], even if we aren't sure what |
+ // they should be. |
+ expected[node].firstChild = expected[node]["childNodes[0]"] |
+ ? expected[node]["childNodes[0]"] |
+ : eval(node).childNodes[0]; |
+ expected[node].lastChild = |
+ expected[node]["childNodes[" + (len - 1) + "]"] |
+ ? expected[node]["childNodes[" + (len - 1) + "]"] |
+ : eval(node).childNodes[len - 1]; |
+ } |
+ expected[node]["hasChildNodes()"] = !!expected[node]["childNodes.length"]; |
+ |
+ // Finally, we test! |
+ for (var prop in expected[node]) { |
+ test(function() { |
+ assert_equals(eval(node + "." + prop), expected[node][prop]); |
+ }, node + "." + prop); |
+ } |
+} |
+ |
+testDiv.parentNode.removeChild(testDiv); |
+</script> |