| <!doctype html> |
| <meta charset=utf-8> |
| <title>XMLHttpRequest: passing objects to send()</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <link rel="help" href="https://xhr.spec.whatwg.org/#the-send()-method" data-tested-assertations="following::ol/li[4]" /> |
| <link rel="help" href="https://heycam.github.io/webidl/#es-union" data-tested-assertations="following::ol/li[16]" /> |
| |
| <div id="log"></div> |
| |
| <script> |
| function do_test(obj, expected, name) { |
| var test = async_test(name) |
| test.step(function() { |
| var client = new XMLHttpRequest() |
| client.onload = test.step_func(function () { |
| assert_equals(client.responseText, expected) |
| test.done() |
| }); |
| client.open('POST', 'resources/content.py') |
| if (expected.exception) { |
| assert_throws(expected.exception, function(){client.send(obj)}) |
| test.done() |
| } else { |
| client.send(obj) |
| } |
| }); |
| } |
| |
| do_test({}, '[object Object]', 'sending a plain empty object') |
| do_test(Math, '[object Math]', 'sending the ES Math object') |
| do_test(new XMLHttpRequest, '[object XMLHttpRequest]', 'sending a new XHR instance') |
| do_test({toString:function(){}}, 'undefined', 'sending object that stringifies to undefined') |
| do_test({toString:function(){return null}}, 'null', 'sending object that stringifies to null') |
| var ancestor = {toString: function(){ |
| var ar=[] |
| for (var prop in this) { |
| if (this.hasOwnProperty(prop)) { |
| ar.push(prop+'='+this[prop]) |
| } |
| }; |
| return ar.join('&') |
| }}; |
| |
| var myObj = Object.create(ancestor, {foo:{value:1, enumerable: true}, bar:{value:'foo', enumerable:true}}) |
| do_test(myObj, 'foo=1&bar=foo', 'object that stringifies to query string') |
| |
| var myFakeJSON = {a:'a', b:'b', toString:function(){ return JSON.stringify(this, function(key, val){ return key ==='toString'?undefined:val; }) }} |
| do_test(myFakeJSON, '{"a":"a","b":"b"}', 'object that stringifies to JSON string') |
| |
| var myFakeDoc1 = {valueOf:function(){return document}} |
| do_test(myFakeDoc1, '[object Object]', 'object whose valueOf() returns a document - ignore valueOf(), stringify') |
| |
| var myFakeDoc2 = {toString:function(){return document}} |
| do_test(myFakeDoc2, {exception:new TypeError()}, 'object whose toString() returns a document, expected to throw') |
| |
| var myThrower = {toString:function(){throw {name:'FooError', message:'bar'}}} |
| do_test(myThrower, {exception:{name:'FooError'}}, 'object whose toString() throws, expected to throw') |
| |
| |
| </script> |