<!
DOCTYPE HTML>
<
html>
<
head>
<
title>Test for setParameter/getParameter</
title>
<
script src=
"/tests/SimpleTest/SimpleTest.js"></
script>
<
link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css"/>
</
head>
<
body>
<p id=
"display"></p>
<
div id=
"content" style=
"display: none"><p id=
"number">123</p><p id=
"string">abc</p></
div>
<
pre id=
"test">
<
script>
let processor = new XSLTProcessor();
processor.setParameter(null,
"test",
"hello");
is(processor.getParameter(null,
"test"),
"hello",
"null namespace works");
processor.setParameter(
"foo",
"bar",
"foobar");
is(processor.getParameter(
"foo",
"bar"),
"foobar",
"non-null namespace works");
processor.setParameter(null,
"test", 123);
is(processor.getParameter(null,
"test"), 123,
"number value works");
processor.removeParameter(null,
"test");
is(processor.getParameter(null,
"test"), null,
"removeParameter works");
is(processor.getParameter(null,
"not-here"), null,
"nonexistant parameter");
let parser = new DOMParser();
const
style =
`<xsl:stylesheet xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform" version=
"1.0"
xmlns:exslt=
"http://exslt.org/common">
<xsl:
output method=
"html" />
<xsl:
param name=
"test" />
<xsl:template match=
"/">
<p id=
"result"><xsl:value-of
select=
"exslt:object-type($test)" /></p>
</xsl:template>
</xsl:stylesheet>`;
const styleDoc = parser.parseFromString(
style,
"text/xml");
const xml = `<root />`;
const sourceDoc = parser.parseFromString(xml,
"text/xml");
function checkParameter(value, parameter) {
let valueType = typeof value;
switch (valueType) {
case
"number":
case
"boolean":
case
"string":
is(typeof parameter, valueType,
"Parameter has right type");
is(parameter, value,
"Parameter has right value");
return;
case
"object":
if (value instanceof Array || value instanceof NodeList) {
ok(parameter instanceof Array,
"Parameter has right type");
ok(parameter.length == value.length &&
parameter.every((p, i) => value[i] === p),
"Parameter has right value");
return;
}
if (value instanceof Node) {
is(parameter, value,
"Parameter has right value");
return;
}
if (value instanceof XPathResult) {
ok(parameter instanceof XPathResult,
"Parameter has right type");
is(parameter.resultType, value.resultType,
"Parameter has right inner type");
let valueProperty;
switch (value.resultType) {
case XPathResult.NUMBER_TYPE:
valueProperty =
"numberValue";
break;
case XPathResult.BOOLEAN_TYPE:
valueProperty =
"booleanValue";
break;
case XPathResult.STRING_TYPE:
valueProperty =
"stringValue";
break;
case XPathResult.FIRST_ORDERED_NODE_TYPE:
valueProperty =
"singleNodeValue";
break;
default:
ok(false,
"Unexpected inner type");
return;
}
is(parameter[valueProperty], value[valueProperty],
"Parameter has right value");
return;
}
}
ok(false,
"Unexpected value");
}
function getXSLTType(value) {
let valueType = typeof value;
switch (valueType) {
case
"number":
case
"boolean":
case
"string":
return valueType;
case
"object":
if (value instanceof Array || value instanceof Node || value instanceof NodeList) {
return
"node-set";
}
if (value instanceof XPathResult) {
switch (value.resultType) {
case XPathResult.NUMBER_TYPE:
return
"number";
case XPathResult.BOOLEAN_TYPE:
return
"boolean";
case XPathResult.STRING_TYPE:
return
"string";
case XPathResult.FIRST_ORDERED_NODE_TYPE:
return
"node-set";
}
}
}
ok(false,
"Unexpected value");
throw new Error(
"Unexpected value");
}
function testParameter(value) {
let testProcessor = new XSLTProcessor();
testProcessor.setParameter(null,
"test", value);
let parameter = testProcessor.getParameter(null,
"test");
checkParameter(value, parameter);
testProcessor.importStylesheet(styleDoc);
let fragment = testProcessor.transformToFragment(sourceDoc, document);
is(
fragment.getElementById(
"result").textContent,
getXSLTType(value),
"Global parameter has right type in XSLT."
);
}
testParameter(123);
testParameter(true);
testParameter(
"abcd");
testParameter([document]);
testParameter(document.documentElement.childNodes);
testParameter(document);
testParameter(document.evaluate(
"id('number')", document, null, XPathResult.NUMBER_
TYPE));
testParameter(document.evaluate("/", document, null, XPathResult.BOOLEAN_TYPE));
testParameter(document.evaluate("id('string')", document, null, XPathResult.STRING_TYPE));
testParameter(
document.evaluate("/", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE)
);
</script>
</pre>
</body>
</html>