| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 // Check that message and name are not enumerable on Error objects. | 30 // Check that message and name are not enumerable on Error objects. |
| 31 var desc = Object.getOwnPropertyDescriptor(Error.prototype, 'name'); | 31 var desc = Object.getOwnPropertyDescriptor(Error.prototype, 'name'); |
| 32 assertFalse(desc['enumerable']); | 32 assertFalse(desc['enumerable']); |
| 33 desc = Object.getOwnPropertyDescriptor(Error.prototype, 'message'); | 33 desc = Object.getOwnPropertyDescriptor(Error.prototype, 'message'); |
| 34 assertFalse(desc['enumerable']); | 34 assertFalse(desc['enumerable']); |
| 35 | 35 |
| 36 var e = new Error("foobar"); | 36 var e = new Error("foobar"); |
| 37 desc = Object.getOwnPropertyDescriptor(e, 'message'); | 37 desc = Object.getOwnPropertyDescriptor(e, 'message'); |
| 38 assertFalse(desc['enumerable']); | 38 assertFalse(desc['enumerable']); |
| 39 desc = Object.getOwnPropertyDescriptor(e, 'arguments'); | |
| 40 assertFalse(desc['enumerable']); | |
| 41 desc = Object.getOwnPropertyDescriptor(e, 'type'); | |
| 42 assertFalse(desc['enumerable']); | |
| 43 desc = Object.getOwnPropertyDescriptor(e, 'stack'); | 39 desc = Object.getOwnPropertyDescriptor(e, 'stack'); |
| 44 assertFalse(desc['enumerable']); | 40 assertFalse(desc['enumerable']); |
| 45 | 41 |
| 46 var e = new Error(); | 42 var e = new Error(); |
| 47 assertFalse(e.hasOwnProperty('message')); | 43 assertFalse(e.hasOwnProperty('message')); |
| 48 | 44 |
| 49 // name is not tested above, but in addition we should have no enumerable | 45 // name is not tested above, but in addition we should have no enumerable |
| 50 // properties, so we simply assert that. | 46 // properties, so we simply assert that. |
| 51 for (var v in e) { | 47 for (var v in e) { |
| 52 assertUnreachable(); | 48 assertUnreachable(); |
| 53 } | 49 } |
| 54 | 50 |
| 55 // Check that error construction does not call setters for the | 51 // Check that error construction does not call setters for the |
| 56 // properties on error objects in prototypes. | 52 // properties on error objects in prototypes. |
| 57 function fail() { assertUnreachable(); }; | 53 function fail() { assertUnreachable(); }; |
| 58 ReferenceError.prototype.__defineSetter__('name', fail); | 54 ReferenceError.prototype.__defineSetter__('name', fail); |
| 59 ReferenceError.prototype.__defineSetter__('message', fail); | 55 ReferenceError.prototype.__defineSetter__('message', fail); |
| 60 ReferenceError.prototype.__defineSetter__('type', fail); | |
| 61 ReferenceError.prototype.__defineSetter__('arguments', fail); | |
| 62 ReferenceError.prototype.__defineSetter__('stack', fail); | 56 ReferenceError.prototype.__defineSetter__('stack', fail); |
| 63 | 57 |
| 64 var e = new ReferenceError(); | 58 var e = new ReferenceError(); |
| 65 assertTrue(e.hasOwnProperty('stack')); | 59 assertTrue(e.hasOwnProperty('stack')); |
| 66 assertTrue(e.hasOwnProperty('type')); | |
| 67 assertTrue(e.hasOwnProperty('arguments')); | |
| 68 | 60 |
| 69 var e = new ReferenceError('123'); | 61 var e = new ReferenceError('123'); |
| 70 assertTrue(e.hasOwnProperty('message')); | 62 assertTrue(e.hasOwnProperty('message')); |
| 71 assertTrue(e.hasOwnProperty('stack')); | 63 assertTrue(e.hasOwnProperty('stack')); |
| 72 assertTrue(e.hasOwnProperty('type')); | |
| 73 assertTrue(e.hasOwnProperty('arguments')); | |
| 74 | 64 |
| 75 var e = %MakeReferenceError("my_test_error", [0, 1]); | 65 var e = %MakeReferenceError("my_test_error", [0, 1]); |
| 76 assertTrue(e.hasOwnProperty('stack')); | 66 assertTrue(e.hasOwnProperty('stack')); |
| 77 assertTrue(e.hasOwnProperty('type')); | |
| 78 assertTrue(e.hasOwnProperty('arguments')); | |
| 79 assertEquals("my_test_error", e.type) | |
| 80 | 67 |
| 81 // Check that intercepting property access from toString is prevented for | 68 // Check that intercepting property access from toString is prevented for |
| 82 // compiler errors. This is not specified, but allowing interception | 69 // compiler errors. This is not specified, but allowing interception |
| 83 // through a getter can leak error objects from different | 70 // through a getter can leak error objects from different |
| 84 // script tags in the same context in a browser setting. | 71 // script tags in the same context in a browser setting. |
| 85 var errors = [SyntaxError, ReferenceError, TypeError]; | 72 var errors = [SyntaxError, ReferenceError, TypeError]; |
| 86 for (var i in errors) { | 73 for (var i in errors) { |
| 87 var name = errors[i].prototype.toString(); | 74 var name = errors[i].prototype.toString(); |
| 88 // Monkey-patch prototype. | 75 // Monkey-patch prototype. |
| 89 var props = ["name", "message", "type", "arguments", "stack"]; | 76 var props = ["name", "message", "stack"]; |
| 90 for (var j in props) { | 77 for (var j in props) { |
| 91 errors[i].prototype.__defineGetter__(props[j], fail); | 78 errors[i].prototype.__defineGetter__(props[j], fail); |
| 92 } | 79 } |
| 93 // String conversion should not invoke monkey-patched getters on prototype. | 80 // String conversion should not invoke monkey-patched getters on prototype. |
| 94 var e = new errors[i]; | 81 var e = new errors[i]; |
| 95 assertEquals(name, e.toString()); | 82 assertEquals(name, e.toString()); |
| 96 // Custom getters in actual objects are welcome. | 83 // Custom getters in actual objects are welcome. |
| 97 e.__defineGetter__("name", function() { return "mine"; }); | 84 e.__defineGetter__("name", function() { return "mine"; }); |
| 98 assertEquals("mine", e.toString()); | 85 assertEquals("mine", e.toString()); |
| 99 } | 86 } |
| 100 | 87 |
| 101 // Monkey-patching non-static errors should still be observable. | 88 // Monkey-patching non-static errors should still be observable. |
| 102 function MyError() {} | 89 function MyError() {} |
| 103 MyError.prototype = new Error; | 90 MyError.prototype = new Error; |
| 104 var errors = [Error, RangeError, EvalError, URIError, MyError]; | 91 var errors = [Error, RangeError, EvalError, URIError, MyError]; |
| 105 for (var i in errors) { | 92 for (var i in errors) { |
| 106 errors[i].prototype.__defineGetter__("name", function() { return "my"; }); | 93 errors[i].prototype.__defineGetter__("name", function() { return "my"; }); |
| 107 errors[i].prototype.__defineGetter__("message", function() { return "moo"; }); | 94 errors[i].prototype.__defineGetter__("message", function() { return "moo"; }); |
| 108 var e = new errors[i]; | 95 var e = new errors[i]; |
| 109 assertEquals("my: moo", e.toString()); | 96 assertEquals("my: moo", e.toString()); |
| 110 } | 97 } |
| 111 | 98 |
| 112 | 99 |
| 113 Error.prototype.toString = Object.prototype.toString; | 100 Error.prototype.toString = Object.prototype.toString; |
| 114 assertEquals("[object Error]", Error.prototype.toString()); | 101 assertEquals("[object Error]", Error.prototype.toString()); |
| 115 assertEquals(Object.prototype, Error.prototype.__proto__); | 102 assertEquals(Object.prototype, Error.prototype.__proto__); |
| 116 var e = new Error("foo"); | 103 var e = new Error("foo"); |
| 117 assertEquals("[object Error]", e.toString()); | 104 assertEquals("[object Error]", e.toString()); |
| OLD | NEW |