Correctly pretty print objects from other contexts (e.g. iframes) and which do not override toString
Fixes #1087
This commit is contained in:
@@ -187,6 +187,15 @@ describe("jasmineUnderTest.pp", function () {
|
|||||||
};
|
};
|
||||||
|
|
||||||
expect(jasmineUnderTest.pp(obj)).toEqual("my toString");
|
expect(jasmineUnderTest.pp(obj)).toEqual("my toString");
|
||||||
|
|
||||||
|
// Simulate object from another global context (e.g. an iframe or Web Worker) that does not actually have a custom
|
||||||
|
// toString despite obj.toString !== Object.prototype.toString
|
||||||
|
var objFromOtherContext = {
|
||||||
|
foo: 'bar',
|
||||||
|
toString: function () { return Object.prototype.toString.call(this); }
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(jasmineUnderTest.pp(objFromOtherContext)).toEqual("Object({ foo: 'bar', toString: Function })");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should handle objects with null prototype", function() {
|
it("should handle objects with null prototype", function() {
|
||||||
|
|||||||
@@ -5,6 +5,12 @@ getJasmineRequireObj().pp = function(j$) {
|
|||||||
this.seen = [];
|
this.seen = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function hasCustomToString(value) {
|
||||||
|
// value.toString !== Object.prototype.toString if value has no custom toString but is from another context (e.g.
|
||||||
|
// iframe, web worker)
|
||||||
|
return value.toString !== Object.prototype.toString && (value.toString() !== Object.prototype.toString.call(value));
|
||||||
|
}
|
||||||
|
|
||||||
PrettyPrinter.prototype.format = function(value) {
|
PrettyPrinter.prototype.format = function(value) {
|
||||||
this.ppNestLevel_++;
|
this.ppNestLevel_++;
|
||||||
try {
|
try {
|
||||||
@@ -30,7 +36,7 @@ getJasmineRequireObj().pp = function(j$) {
|
|||||||
this.emitScalar('HTMLNode');
|
this.emitScalar('HTMLNode');
|
||||||
} else if (value instanceof Date) {
|
} else if (value instanceof Date) {
|
||||||
this.emitScalar('Date(' + value + ')');
|
this.emitScalar('Date(' + value + ')');
|
||||||
} else if (value.toString && typeof value === 'object' && !(value instanceof Array) && value.toString !== Object.prototype.toString) {
|
} else if (value.toString && typeof value === 'object' && !j$.isArray_(value) && hasCustomToString(value)) {
|
||||||
this.emitScalar(value.toString());
|
this.emitScalar(value.toString());
|
||||||
} else if (j$.util.arrayContains(this.seen, value)) {
|
} else if (j$.util.arrayContains(this.seen, value)) {
|
||||||
this.emitScalar('<circular reference: ' + (j$.isArray_(value) ? 'Array' : 'Object') + '>');
|
this.emitScalar('<circular reference: ' + (j$.isArray_(value) ? 'Array' : 'Object') + '>');
|
||||||
|
|||||||
Reference in New Issue
Block a user