1eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockdescription("createDocument tests modeled after createElementNS tests from mozilla which were attached to webkit bug 16833"); 2eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 3eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block// document.implementation.createDocument() should throw the same set of errors 4eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block// as document.createElementNS() 5eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block// http://www.w3.org/TR/DOM-Level-3-Core/core.html#Level-2-Core-DOM-createDocument 6eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block// Thus we copied these test cases from: 7eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block// LayoutTests/fast/dom/Document/resources/createDocument-namespace-err.js 8eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 9eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction assert(c, m) 10eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{ 11eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block if (!c) 12eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block testFailed(m); 13eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block else 14eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block testPassed(m); 15eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block} 16eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 17eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction stringForExceptionCode(c) 18eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{ 19eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block var exceptionName; 20eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block switch(c) { 21eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block case DOMException.INVALID_CHARACTER_ERR: 22eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block exceptionName = "INVALID_CHARACTER_ERR"; 23eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block break; 24eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block case DOMException.NAMESPACE_ERR: 25eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block exceptionName = "NAMESPACE_ERR"; 26eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block } 27eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block if (exceptionName) 28eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block return exceptionName; // + "(" + c + ")"; 29eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block return c; 30eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block} 31eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 32eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction assertEquals(actual, expect, m) 33eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{ 34eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block if (actual !== expect) { 35eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block m += "; expected " + stringForExceptionCode(expect) + ", threw " + stringForExceptionCode(actual); 36eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block testFailed(m); 37eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block } else { 38eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block m += "; threw " + stringForExceptionCode(actual);; 39eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block testPassed(m); 40eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block } 41eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block} 42eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 43eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockvar allNSTests = [ 44eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [undefined, undefined] }, 45eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, undefined] }, 46eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [undefined, null], code: 5 }, 47eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, null], code: 5 }, 48eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, ""], code: 5 }, 49eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["", null], code: 5 }, 50eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["", ""], code: 5 }, 51eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "<div>"], code: 5 }, 52eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "0div"], code: 5 }, 53eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "di v"], code: 5 }, 54eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "di<v"], code: 5 }, 55eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "-div"], code: 5 }, 56eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, ".div"], code: 5 }, 57eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "<div>"], code: 5 }, 58eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "0div"], code: 5 }, 59eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "di<v"], code: 5 }, 60eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "-div"], code: 5 }, 61eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", ".div"], code: 5 }, 62eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, ":div"], code: 14 }, 63eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "div:"], code: 14 }, 64eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", ":div"], code: 14 }, 65eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "div:"], code: 14 }, 66eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "d:iv"], code: 14 }, 67eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "a:b:c"], code: 14, message: "valid XML name, invalid QName" }, 68eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "a:b:c"], code: 14, message: "valid XML name, invalid QName" }, 69eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: [null, "a::c"], code: 14, message: "valid XML name, invalid QName" }, 70eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "a::c"], code: 14, message: "valid XML name, invalid QName" }, 71eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "a:0"], code: 5, message: "valid XML name, not a valid QName" }, 72eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "0:a"], code: 5, message: "0 at start makes it not a valid XML name" }, 73eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "a:_"] }, 74eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "a:\u0BC6"], code: 14, 75eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block message: "non-ASCII character after colon is CombiningChar, which is " + 76eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block "NCNameChar but not (Letter | \"_\") so invalid at start of " + 77eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block "NCName (but still a valid XML name, hence not INVALID_CHARACTER_ERR)" }, 78eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "\u0BC6:a"], code: 5, 79eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block message: "non-ASCII character after colon is CombiningChar, which is " + 80eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block "NCNameChar but not (Letter | \"_\") so invalid at start of " + 81eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block "NCName (Gecko chooses to throw NAMESPACE_ERR here, but either is valid " + 82eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block "as this is both an invalid XML name and an invalid QName)" }, 83eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "a:a\u0BC6"] }, 84eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "a\u0BC6:a"] }, 85eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "xml:test"], code: 14, message: "binding xml prefix wrong" }, 86eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://example.com/", "xmlns:test"], code: 14, message: "binding xmlns prefix wrong" }, 87eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://www.w3.org/2000/xmlns/", "x:test"], code: 14, message: "binding namespace namespace to wrong prefix" }, 88eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://www.w3.org/2000/xmlns/", "xmlns:test"] }, 89eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://www.w3.org/XML/1998/namespace", "xml:test"] }, 90eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block { args: ["http://www.w3.org/XML/1998/namespace", "x:test"] }, 91eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block]; 92eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 93eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction sourceify(v) 94eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{ 95eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block switch (typeof v) { 96eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block case "undefined": 97eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block return v; 98eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block case "string": 99eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block return '"' + v.replace('"', '\\"') + '"'; 100eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block default: 101eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block return String(v); 102eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block } 103eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block} 104eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 105eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction sourceifyArgs(args) 106eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{ 107eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block var copy = new Array(args.length); 108eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block for (var i = 0, sz = args.length; i < sz; i++) 109eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block copy[i] = sourceify(args[i]); 110eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 111eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block return copy.join(", "); 112eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block} 113eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 114eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction runNSTests(tests, doc, createFunctionName) 115eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{ 116eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block for (var i = 0, sz = tests.length; i < sz; i++) { 117eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block var test = tests[i]; 118eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 119eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block // Gecko throws "undefined" if createDocument isn't 120eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block // called with 3 arguments. Instead of modifying all 121eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block // of the values in the arrays above (which were taken from createElementNS tests) 122eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block // we will instead just hack the args list here. 123eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block var argsWithExtraLastNull = test.args.slice(); // copy the args arary 124eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block argsWithExtraLastNull.push(null); 125eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 126eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block var code = -1; 127eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block var argStr = sourceifyArgs(argsWithExtraLastNull); 128eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block var msg = createFunctionName + "(" + argStr + ")"; 129eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block if ("message" in test) 130eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block msg += "; " + test.message; 131eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block try { 132eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block doc[createFunctionName].apply(doc, argsWithExtraLastNull); 133eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block assert(!("code" in test), msg); 134eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block } catch (e) { 135eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block assertEquals(e.code, test.code || "expected no exception", msg); 136eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block } 137eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block } 138eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block} 139eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 140eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block// Moz throws a "Not enough arguments" exception in these, we don't: 141eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve BlockshouldBeEqualToString("document.implementation.createDocument().toString()", "[object Document]"); 142eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve BlockshouldBeEqualToString("document.implementation.createDocument(\"http://www.example.com\").toString()", "[object Document]"); 143eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 144eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve BlockrunNSTests(allNSTests, document.implementation, "createDocument"); 145eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block 146eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockvar successfullyParsed = true; 147