From dc80a282baf961fce8720ab87529630568da3496 Mon Sep 17 00:00:00 2001 From: Bjarki Date: Thu, 1 Jul 2021 20:21:44 +0000 Subject: [PATCH 1/4] Make j$.isError_ compatible with Trusted Types The isError_ check uses a heuristic that calls the Function constructor to determine if the given value is an Error object. This results in a runtime violation in test suites that enforce Trusted Types. Since Trusted Types are only supported in modern browsers (currently, Chromium-based browsers), we can use a more straightforward heuristic in environments where Trusted Types are supported. Fixes #1910. See that thread for more details. --- lib/jasmine-core/jasmine.js | 10 ++++++++++ src/core/base.js | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 1ad0935a..406c6b67 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -270,6 +270,16 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) { if (value instanceof Error) { return true; } + if ( + typeof window !== 'undefined' && + typeof window.trustedTypes !== 'undefined' + ) { + return ( + value && + typeof value.stack === 'string' && + typeof value.message === 'string' + ); + } if (value && value.constructor && value.constructor.constructor) { var valueGlobal = value.constructor.constructor('return this'); if (j$.isFunction_(valueGlobal)) { diff --git a/src/core/base.js b/src/core/base.js index c40c6559..1d31d89d 100644 --- a/src/core/base.js +++ b/src/core/base.js @@ -102,6 +102,16 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) { if (value instanceof Error) { return true; } + if ( + typeof window !== 'undefined' && + typeof window.trustedTypes !== 'undefined' + ) { + return ( + value && + typeof value.stack === 'string' && + typeof value.message === 'string' + ); + } if (value && value.constructor && value.constructor.constructor) { var valueGlobal = value.constructor.constructor('return this'); if (j$.isFunction_(valueGlobal)) { From 88b90ec25803c126fe185ac4866ad417aede511d Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Mon, 19 Jul 2021 10:31:53 -0700 Subject: [PATCH 2/4] Backfilled unit tests for j$.isError_ --- spec/core/baseSpec.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/spec/core/baseSpec.js b/spec/core/baseSpec.js index 51b90063..dd5dd225 100644 --- a/spec/core/baseSpec.js +++ b/spec/core/baseSpec.js @@ -29,6 +29,43 @@ describe('base helpers', function() { } }, 100); }); + + it('returns true for an Error subclass', function() { + function MyError() {} + MyError.prototype = new Error(); + expect(jasmineUnderTest.isError_(new MyError())).toBe(true); + }); + + it('returns true for an un-thrown Error with no message in this environment', function() { + expect(jasmineUnderTest.isError_(new Error())).toBe(true); + }); + + it('returns true for an Error that originated from another frame', function() { + var iframe, error; + + if (typeof window === 'undefined') { + pending('This test only runs in browsers.'); + } + + iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + document.body.appendChild(iframe); + + try { + error = iframe.contentWindow.eval('new Error()'); + expect(jasmineUnderTest.isError_(error)).toBe(true); + } finally { + document.body.removeChild(iframe); + } + }); + + it('returns false for a falsy value', function() { + expect(jasmineUnderTest.isError_(undefined)).toBe(false); + }); + + it('returns false for a non-Error object', function() { + expect(jasmineUnderTest.isError_({})).toBe(false); + }); }); describe('isAsymmetricEqualityTester_', function() { From 3513249d732348c9faa26552e7636790d711900e Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Mon, 19 Jul 2021 12:08:18 -0700 Subject: [PATCH 3/4] Built distribution --- lib/jasmine-core/jasmine.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 661968a1..06c35e71 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -1585,6 +1585,7 @@ getJasmineRequireObj().Env = function(j$) { * @name Env#hideDisabled * @since 3.2.0 * @function + * @deprecated Use the `hideDisabled` option with {@link Env#configure} */ this.hideDisabled = function(value) { this.deprecated( From c1d1d69be2416f3854b32017a792249715428cd8 Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Mon, 19 Jul 2021 12:02:42 -0700 Subject: [PATCH 4/4] Fixed test failures in Chrome and Edge --- lib/jasmine-core/jasmine.js | 8 +++++--- src/core/base.js | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 06c35e71..8700ca69 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -267,6 +267,10 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) { }; j$.isError_ = function(value) { + if (!value) { + return false; + } + if (value instanceof Error) { return true; } @@ -275,9 +279,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) { typeof window.trustedTypes !== 'undefined' ) { return ( - value && - typeof value.stack === 'string' && - typeof value.message === 'string' + typeof value.stack === 'string' && typeof value.message === 'string' ); } if (value && value.constructor && value.constructor.constructor) { diff --git a/src/core/base.js b/src/core/base.js index 1d31d89d..89cd2b6e 100644 --- a/src/core/base.js +++ b/src/core/base.js @@ -99,6 +99,10 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) { }; j$.isError_ = function(value) { + if (!value) { + return false; + } + if (value instanceof Error) { return true; } @@ -107,9 +111,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) { typeof window.trustedTypes !== 'undefined' ) { return ( - value && - typeof value.stack === 'string' && - typeof value.message === 'string' + typeof value.stack === 'string' && typeof value.message === 'string' ); } if (value && value.constructor && value.constructor.constructor) {