| /** |
| * @license |
| * Copyright Google Inc. All Rights Reserved. |
| * |
| * Use of this source code is governed by an MIT-style license that can be |
| * found in the LICENSE file at https://angular.io/license |
| */ |
| import {zoneSymbol} from './utils'; |
| |
| // override Function.prototype.toString to make zone.js patched function |
| // look like native function |
| Zone.__load_patch('toString', (global: any) => { |
| // patch Func.prototype.toString to let them look like native |
| const originalFunctionToString = Function.prototype.toString; |
| |
| const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate'); |
| const PROMISE_SYMBOL = zoneSymbol('Promise'); |
| const ERROR_SYMBOL = zoneSymbol('Error'); |
| const newFunctionToString = function toString() { |
| if (typeof this === 'function') { |
| const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL]; |
| if (originalDelegate) { |
| if (typeof originalDelegate === 'function') { |
| return originalFunctionToString.call(originalDelegate); |
| } else { |
| return Object.prototype.toString.call(originalDelegate); |
| } |
| } |
| if (this === Promise) { |
| const nativePromise = global[PROMISE_SYMBOL]; |
| if (nativePromise) { |
| return originalFunctionToString.call(nativePromise); |
| } |
| } |
| if (this === Error) { |
| const nativeError = global[ERROR_SYMBOL]; |
| if (nativeError) { |
| return originalFunctionToString.call(nativeError); |
| } |
| } |
| } |
| return originalFunctionToString.call(this); |
| }; |
| (newFunctionToString as any)[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString; |
| Function.prototype.toString = newFunctionToString; |
| |
| |
| // patch Object.prototype.toString to let them look like native |
| const originalObjectToString = Object.prototype.toString; |
| const PROMISE_OBJECT_TO_STRING = '[object Promise]'; |
| Object.prototype.toString = function() { |
| if (this instanceof Promise) { |
| return PROMISE_OBJECT_TO_STRING; |
| } |
| return originalObjectToString.call(this); |
| }; |
| }); |