| <html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| <script src="resources/serialized-script-value.js"></script> |
| </head> |
| <body> |
| <script> |
| |
| const currentVersion = 0x0a; |
| |
| // Here's a little Q&D helper for future adventurers needing to rebaseline this. |
| |
| function dec2hex(n) { |
| var s = n.toString(16); |
| if (s.length < 2) |
| return "0x0" + s; |
| return "0x" + s; |
| } |
| |
| function dumpSerialization(obj) |
| { |
| var serialized = internals.serializeObject(obj); |
| var bufferView = new Uint8Array(serialized); |
| |
| var numbers = new Array(); |
| for (var i = 0; i < bufferView.length; ++i) { |
| numbers.push(dec2hex(bufferView[i])); |
| } |
| var str = ""; |
| for (var i = 0; i < numbers.length; ++i) { |
| if (i % 8 == 0) |
| str += "\n "; |
| else |
| str += " "; |
| str += numbers[i]; |
| if (i != numbers.length - 1) |
| str += ","; |
| } |
| debug(str); |
| } |
| |
| function testSerialization(obj, values, oldFormat, serializeExceptionValue) { |
| _testSerialization(1, obj, values, oldFormat, serializeExceptionValue); |
| } |
| |
| testSerialization({foo: 'zoo', bar: {baz: 'myNewKey'}}, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x80, 0x66, 0x6f, 0x6f, 0x10, 0x03, 0x00, 0x00, |
| 0x80, 0x7a, 0x6f, 0x6f, 0x03, 0x00, 0x00, 0x80, |
| 0x62, 0x61, 0x72, 0x02, 0x03, 0x00, 0x00, 0x80, |
| 0x62, 0x61, 0x7a, 0x10, 0x08, 0x00, 0x00, 0x80, |
| 0x6d, 0x79, 0x4e, 0x65, 0x77, 0x4b, 0x65, 0x79, |
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x10, |
| 0x03, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x6f, 0x00, |
| 0x6f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x00, |
| 0x61, 0x00, 0x72, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x00, 0x62, 0x00, 0x61, 0x00, 0x7a, 0x00, 0x10, |
| 0x08, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x79, 0x00, |
| 0x4e, 0x00, 0x65, 0x00, 0x77, 0x00, 0x4b, 0x00, |
| 0x65, 0x00, 0x79, 0x00, 0xff, 0xff, 0xff, 0xff, |
| 0xff, 0xff, 0xff, 0xff |
| ]); |
| |
| testSerialization({foo: 'zoo', bar: 'myNewKey'}, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x80, 0x66, 0x6f, 0x6f, 0x10, 0x03, 0x00, 0x00, |
| 0x80, 0x7a, 0x6f, 0x6f, 0x03, 0x00, 0x00, 0x80, |
| 0x62, 0x61, 0x72, 0x10, 0x08, 0x00, 0x00, 0x80, |
| 0x6d, 0x79, 0x4e, 0x65, 0x77, 0x4b, 0x65, 0x79, |
| 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x10, |
| 0x03, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x6f, 0x00, |
| 0x6f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x00, |
| 0x61, 0x00, 0x72, 0x00, 0x10, 0x08, 0x00, 0x00, |
| 0x00, 0x6d, 0x00, 0x79, 0x00, 0x4e, 0x00, 0x65, |
| 0x00, 0x77, 0x00, 0x4b, 0x00, 0x65, 0x00, 0x79, |
| 0x00, 0xff, 0xff, 0xff, 0xff |
| ]); |
| |
| testSerialization([], |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
| 0x00, 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
| 0x00, 0xff, 0xff, 0xff, 0xff |
| ]); |
| testSerialization({foo: "zoo"}, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x80, 0x66, 0x6f, 0x6f, 0x10, 0x03, 0x00, 0x00, |
| 0x80, 0x7a, 0x6f, 0x6f, 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x10, |
| 0x03, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x6f, 0x00, |
| 0x6f, 0x00, 0xff, 0xff, 0xff, 0xff |
| ]); |
| testSerialization({foo: null}, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x80, 0x66, 0x6f, 0x6f, 0x04, 0xff, 0xff, 0xff, |
| 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, |
| 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x04, |
| 0xff, 0xff, 0xff, 0xff |
| ]); |
| |
| testSerialization({}, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, |
| 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, |
| 0xff |
| ]); |
| |
| testSerialization(undefined, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x03 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x03 |
| ]); |
| testSerialization(true, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x09 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x09 |
| ]); |
| testSerialization(false, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x08 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x08 |
| ]); |
| testSerialization(new Array(100), |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x01, 0x64, 0x00, 0x00, |
| 0x00, 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x01, 0x64, 0x00, 0x00, |
| 0x00, 0xff, 0xff, 0xff, 0xff |
| ]); |
| testSerialization(10, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, |
| 0x00 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, |
| 0x00 |
| ]); |
| testSerialization(-10, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x05, 0xf6, 0xff, 0xff, |
| 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x05, 0xf6, 0xff, 0xff, |
| 0xff |
| ]); |
| testSerialization(Math.pow(2,30), |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, |
| 0x40 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, |
| 0x40 |
| ]); |
| testSerialization(Math.pow(2,55), |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x60, 0x43, |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x60, 0x43, |
| ]); |
| testSerialization(1.23, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x0a, 0xae, 0x47, 0xe1, |
| 0x7a, 0x14, 0xae, 0xf3, 0x3f |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x0a, 0xae, 0x47, 0xe1, |
| 0x7a, 0x14, 0xae, 0xf3, 0x3f |
| ]); |
| testSerialization("", |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x11 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x11 |
| ]); |
| testSerialization("abc", |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, |
| 0x80, 0x61, 0x62, 0x63 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, |
| 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00 |
| ]); |
| testSerialization({integer: 123}, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, |
| 0x80, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, |
| 0x05, 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, |
| 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, |
| 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, |
| 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x05, |
| 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff |
| ]); |
| testSerialization({string: "str"}, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, |
| 0x80, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, |
| 0x03, 0x00, 0x00, 0x80, 0x73, 0x74, 0x72, 0xff, |
| 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, |
| 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, |
| 0x00, 0x6e, 0x00, 0x67, 0x00, 0x10, 0x03, 0x00, |
| 0x00, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, |
| 0xff, 0xff, 0xff, 0xff |
| ]); |
| testSerialization({list: [1,2,3]}, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, |
| 0x80, 0x6c, 0x69, 0x73, 0x74, 0x01, 0x03, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, |
| 0x00, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, |
| 0x02, 0x00, 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, |
| 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
| 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, |
| 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, |
| 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x05, |
| 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, |
| 0x05, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, |
| 0xff, 0xff, 0xff, 0xff, 0xff |
| ]); |
| testSerialization(null, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x04 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x04 |
| ]); |
| testSerialization(/abc/, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x00, |
| 0x80, 0x61, 0x62, 0x63, 0x00, 0x00, 0x00, 0x80 |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x00, |
| 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x00, |
| 0x00, 0x00, 0x00 |
| ]); |
| |
| var innerObject = {hello: "there"}; |
| var outerObject = {inner: innerObject}; |
| outerObject['outer'] = innerObject; |
| testSerialization(outerObject, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, |
| 0x80, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x02, 0x05, |
| 0x00, 0x00, 0x80, 0x68, 0x65, 0x6c, 0x6c, 0x6f, |
| 0x10, 0x05, 0x00, 0x00, 0x80, 0x74, 0x68, 0x65, |
| 0x72, 0x65, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, |
| 0x00, 0x80, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x13, |
| 0x01, 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, |
| 0x00, 0x69, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x65, |
| 0x00, 0x72, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, |
| 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, |
| 0x6f, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, 0x74, |
| 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, |
| 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x00, |
| 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, |
| 0x00, 0x72, 0x00, 0x13, 0x01, 0xff, 0xff, 0xff, |
| 0xff |
| ]); |
| testSerialization(innerObject, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, |
| 0x80, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x10, 0x05, |
| 0x00, 0x00, 0x80, 0x74, 0x68, 0x65, 0x72, 0x65, |
| 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, |
| 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, |
| 0x00, 0x6f, 0x00, 0x10, 0x05, 0x00, 0x00, 0x00, |
| 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, |
| 0x65, 0x00, 0xff, 0xff, 0xff, 0xff |
| ]); |
| |
| var unicodeObject = {a: 'a', u: String.fromCharCode(0x03B1,0x03B2), d: 42}; |
| testSerialization(unicodeObject, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, |
| 0x80, 0x61, 0x10, 0xfe, 0xff, 0xff, 0xff, 0x00, |
| 0x01, 0x00, 0x00, 0x80, 0x75, 0x10, 0x02, 0x00, |
| 0x00, 0x00, 0xb1, 0x03, 0xb2, 0x03, 0x01, 0x00, |
| 0x00, 0x80, 0x64, 0x05, 0x2a, 0x00, 0x00, 0x00, |
| 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, |
| 0x00, 0x61, 0x00, 0x10, 0xfe, 0xff, 0xff, 0xff, |
| 0x00, 0x01, 0x00, 0x00, 0x00, 0x75, 0x00, 0x10, |
| 0x02, 0x00, 0x00, 0x00, 0xb1, 0x03, 0xb2, 0x03, |
| 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x05, 0x2a, |
| 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff |
| ]); |
| unicodeObject.a = 'ab'; |
| testSerialization(unicodeObject, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, |
| 0x80, 0x61, 0x10, 0x02, 0x00, 0x00, 0x80, 0x61, |
| 0x62, 0x01, 0x00, 0x00, 0x80, 0x75, 0x10, 0x02, |
| 0x00, 0x00, 0x00, 0xb1, 0x03, 0xb2, 0x03, 0x01, |
| 0x00, 0x00, 0x80, 0x64, 0x05, 0x2a, 0x00, 0x00, |
| 0x00, 0xff, 0xff, 0xff, 0xff |
| ], |
| [ |
| 0x03, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, |
| 0x00, 0x61, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, |
| 0x61, 0x00, 0x62, 0x00, 0x01, 0x00, 0x00, 0x00, |
| 0x75, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0xb1, |
| 0x03, 0xb2, 0x03, 0x01, 0x00, 0x00, 0x00, 0x64, |
| 0x00, 0x05, 0x2a, 0x00, 0x00, 0x00, 0xff, 0xff, |
| 0xff, 0xff |
| ]); |
| |
| var arrayObject = []; |
| arrayObject['a'] = true; |
| arrayObject['b'] = false; |
| arrayObject['foo'] = 123; |
| arrayObject['bar'] = 456; |
| arrayObject[''] = null; |
| testSerialization(arrayObject, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, |
| 0x00, 0xfd, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, |
| 0x80, 0x61, 0x09, 0x01, 0x00, 0x00, 0x80, 0x62, |
| 0x08, 0x03, 0x00, 0x00, 0x80, 0x66, 0x6f, 0x6f, |
| 0x05, 0x7b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, |
| 0x80, 0x62, 0x61, 0x72, 0x05, 0xc8, 0x01, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0xff, 0xff, |
| 0xff, 0xff |
| ]); |
| |
| arrayObject[0] = 'foo'; |
| arrayObject[1] = 'bar'; |
| testSerialization(arrayObject, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, |
| 0x00, 0x80, 0x66, 0x6f, 0x6f, 0x01, 0x00, 0x00, |
| 0x00, 0x10, 0x03, 0x00, 0x00, 0x80, 0x62, 0x61, |
| 0x72, 0xfd, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, |
| 0x80, 0x61, 0x09, 0x01, 0x00, 0x00, 0x80, 0x62, |
| 0x08, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x05, 0x7b, |
| 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x01, |
| 0x05, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x80, 0x04, 0xff, 0xff, 0xff, 0xff |
| ]); |
| |
| var mapObject = new Map; |
| mapObject.set(1,2) |
| mapObject.set(1.5, {}) |
| mapObject.set(mapObject, "foo") |
| mapObject.set("bar", new String("bar")) |
| mapObject.expando = {}; |
| |
| testSerialization(mapObject, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x05, 0x02, |
| 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0xf8, 0x3f, 0x02, 0xff, 0xff, 0xff, |
| 0xff, 0x13, 0x00, 0x10, 0x03, 0x00, 0x00, 0x80, |
| 0x66, 0x6f, 0x6f, 0x10, 0x03, 0x00, 0x00, 0x80, |
| 0x62, 0x61, 0x72, 0x1a, 0xfe, 0xff, 0xff, 0xff, |
| 0x01, 0x1f, 0x07, 0x00, 0x00, 0x80, 0x65, 0x78, |
| 0x70, 0x61, 0x6e, 0x64, 0x6f, 0x02, 0xff, 0xff, |
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff |
| ]); |
| |
| var setObject = new Set; |
| setObject.add(1) |
| setObject.add(1.5) |
| setObject.add(setObject) |
| setObject.add("bar") |
| setObject.add(new String("bar")) |
| setObject.expando = {}; |
| |
| testSerialization(setObject, |
| [ |
| currentVersion, 0x00, 0x00, 0x00, 0x1d, 0x07, 0x0a, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x13, |
| 0x00, 0x10, 0x03, 0x00, 0x00, 0x80, 0x62, 0x61, |
| 0x72, 0x1a, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x20, |
| 0x07, 0x00, 0x00, 0x80, 0x65, 0x78, 0x70, 0x61, |
| 0x6e, 0x64, 0x6f, 0x02, 0xff, 0xff, 0xff, 0xff, |
| 0xff, 0xff, 0xff, 0xff |
| ]); |
| |
| testSerialization(function(){}, [], null, DOMException.DATA_CLONE_ERR); |
| |
| successfullyParsed = true; |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |