/** * @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 */ /* * Usage: * * function supportsOnClick() { * const div = document.createElement('div'); * const clickPropDesc = Object.getOwnPropertyDescriptor(div, 'onclick'); * return !(EventTarget && * div instanceof EventTarget && * clickPropDesc && clickPropDesc.value === null); * } * (supportsOnClick).message = 'Supports Element#onclick patching'; * * * ifEnvSupports(supportsOnClick, function() { ... }); */ import {isNode, zoneSymbol} from '../lib/common/utils'; // Re-export for convenience. export {zoneSymbol}; declare const global: any; export function ifEnvSupports(test: any, block: Function): () => void { return _ifEnvSupports(test, block); } export function ifEnvSupportsWithDone(test: any, block: Function): (done: Function) => void { return _ifEnvSupports(test, block, true); } function _ifEnvSupports(test: any, block: Function, withDone = false) { if (withDone) { return function(done?: Function) { _runTest(test, block, done); }; } else { return function() { _runTest(test, block, undefined); }; } } function _runTest(test: any, block: Function, done?: Function) { const message = (test.message || test.name || test); if (typeof test === 'string' ? !!global[test] : test()) { if (done) { block(done); } else { block(); } } else { console.log('WARNING: skipping ' + message + ' tests (missing this API)'); done && done(); } } export function supportPatchXHROnProperty() { let desc = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, 'onload'); if (!desc && (window as any)['XMLHttpRequestEventTarget']) { desc = Object.getOwnPropertyDescriptor(global['XMLHttpRequestEventTarget'].prototype, 'onload'); } if (!desc || !desc.configurable) { return false; } return true; } let supportSetErrorStack = true; export function isSupportSetErrorStack() { try { throw new Error('test'); } catch (err) { try { err.stack = 'new stack'; supportSetErrorStack = err.stack === 'new stack'; } catch (error) { supportSetErrorStack = false; } } return supportSetErrorStack; } (isSupportSetErrorStack as any).message = 'supportSetErrorStack'; export function asyncTest(testFn: Function, zone: Zone = Zone.current) { const AsyncTestZoneSpec = (Zone as any)['AsyncTestZoneSpec']; return (done: Function) => { let asyncTestZone: Zone = zone.fork(new AsyncTestZoneSpec(() => {}, (error: Error) => { fail(error); }, 'asyncTest')); asyncTestZone.run(testFn, this, [done]); }; } export function getIEVersion() { const userAgent = navigator.userAgent.toLowerCase(); if (userAgent.indexOf('msie') != -1) { return parseInt(userAgent.split('msie')[1]); } return null; } export function isFirefox() { const userAgent = navigator.userAgent.toLowerCase(); if (userAgent.indexOf('firefox') != -1) { return true; } return false; } export function isSafari() { const userAgent = navigator.userAgent.toLowerCase(); if (userAgent.indexOf('safari') != -1) { return true; } return false; } export function isEdge() { const userAgent = navigator.userAgent.toLowerCase(); return userAgent.indexOf('edge') !== -1; } export function getEdgeVersion() { const ua = navigator.userAgent.toLowerCase(); const edge = ua.indexOf('edge/'); if (edge === -1) { return -1; } return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); } export function isPhantomJS() { if (isNode) { return false; } const ua = navigator.userAgent.toLowerCase(); return ua.indexOf('phantomjs') !== -1; }