From 3c684d93c8187656b2505b666eb04f386502a496 Mon Sep 17 00:00:00 2001 From: Dmitrii Kanatnikov Date: Wed, 5 Aug 2020 22:42:50 +0300 Subject: [PATCH] fix(zone.js): zone.js toString patch should check typeof Promise is function (#38350) Close #38361 zone.js monkey patch toString, and check the instance is `Promise` or not by using `instanceof Promise`, sometimes when Promise is not available, the `instanceof` operation fails and throw `TypeError: Right-hand side of 'instanceof' is not an object` this PR check `typeof Promise` equals to function or not to prevent the error. PR Close #38350 --- packages/zone.js/lib/common/to-string.ts | 3 ++- packages/zone.js/test/common/toString.spec.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/zone.js/lib/common/to-string.ts b/packages/zone.js/lib/common/to-string.ts index 3ae8d0e99d..7722623c7a 100644 --- a/packages/zone.js/lib/common/to-string.ts +++ b/packages/zone.js/lib/common/to-string.ts @@ -49,9 +49,10 @@ Zone.__load_patch('toString', (global: any) => { const originalObjectToString = Object.prototype.toString; const PROMISE_OBJECT_TO_STRING = '[object Promise]'; Object.prototype.toString = function() { - if (this instanceof Promise) { + if (typeof Promise === 'function' && this instanceof Promise) { return PROMISE_OBJECT_TO_STRING; } + return originalObjectToString.call(this); }; }); diff --git a/packages/zone.js/test/common/toString.spec.ts b/packages/zone.js/test/common/toString.spec.ts index d959df23f1..d1f0320726 100644 --- a/packages/zone.js/test/common/toString.spec.ts +++ b/packages/zone.js/test/common/toString.spec.ts @@ -18,6 +18,18 @@ describe('global function patch', () => { .toEqual(Function.prototype.toString.call(g[zoneSymbol('setTimeout')])); }); + it('should not throw error if Promise is not a function', () => { + const P = g.Promise; + try { + g.Promise = undefined; + expect(() => { + const a = {}.toString(); + }).not.toThrow(); + } finally { + g.Promise = P; + } + }); + it('MutationObserver toString should be the same with native version', ifEnvSupports('MutationObserver', () => { const nativeMutationObserver = g[zoneSymbol('MutationObserver')];