| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-23 09:51:40 -07:00
										 |  |  | // Tun on full stack traces in errors to help debugging
 | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  | Error.stackTraceLimit = Infinity; | 
					
						
							| 
									
										
										
										
											2015-05-23 09:51:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-15 05:14:03 +00:00
										 |  |  | jasmine.DEFAULT_TIMEOUT_INTERVAL = 100; | 
					
						
							| 
									
										
										
										
											2014-10-06 17:35:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Cancel Karma's synchronous start,
 | 
					
						
							|  |  |  | // we will call `__karma__.start()` later, once all the specs are loaded.
 | 
					
						
							|  |  |  | __karma__.loaded = function() {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-17 15:10:54 -08:00
										 |  |  | window.isNode = false; | 
					
						
							|  |  |  | window.isBrowser = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 15:05:56 -07:00
										 |  |  | System.config({ | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |   baseURL: '/base', | 
					
						
							| 
									
										
										
										
											2015-08-14 15:05:56 -07:00
										 |  |  |   defaultJSExtensions: true, | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |   map: { | 
					
						
							| 
									
										
										
										
											2015-08-14 15:05:56 -07:00
										 |  |  |     'benchpress/*': 'dist/js/dev/es5/benchpress/*.js', | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |     '@angular': 'dist/all/@angular', | 
					
						
							| 
									
										
										
										
											2017-08-08 02:17:40 -07:00
										 |  |  |     'domino': 'dist/all/@angular/empty.js', | 
					
						
							| 
									
										
										
										
											2017-03-15 13:40:24 -07:00
										 |  |  |     'url': 'dist/all/@angular/empty.js', | 
					
						
							|  |  |  |     'xhr2': 'dist/all/@angular/empty.js', | 
					
						
							| 
									
										
										
										
											2017-08-08 02:17:40 -07:00
										 |  |  |     '@angular/platform-server/src/domino_adapter': 'dist/all/empty.js', | 
					
						
							| 
									
										
										
										
											2018-02-27 17:06:06 -05:00
										 |  |  |     'rxjs': 'node_modules/rxjs', | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |   }, | 
					
						
							|  |  |  |   packages: { | 
					
						
							| 
									
										
										
										
											2019-04-03 00:21:41 +02:00
										 |  |  |     '@angular/core/src/render3': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     '@angular/core/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/core': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2017-02-28 17:49:37 -08:00
										 |  |  |     '@angular/animations/browser/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/animations/browser': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2017-02-22 15:14:49 -08:00
										 |  |  |     '@angular/animations/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/animations': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     '@angular/compiler/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/compiler': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/common/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2017-03-22 17:13:24 -07:00
										 |  |  |     '@angular/common/http/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/common/http': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     '@angular/common': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/forms': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |     // remove after all tests imports are fixed
 | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     '@angular/facade': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/router/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/router': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/http/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/http': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2019-10-08 14:46:28 +01:00
										 |  |  |     '@angular/localize/src/utils': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2019-08-10 12:51:30 +01:00
										 |  |  |     '@angular/localize/src/localize': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/localize/init': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2019-07-30 18:02:17 +01:00
										 |  |  |     '@angular/localize': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2019-03-22 09:42:52 +00:00
										 |  |  |     '@angular/upgrade/static/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2017-03-07 11:04:30 -08:00
										 |  |  |     '@angular/upgrade/static': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     '@angular/upgrade': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2017-02-22 15:14:49 -08:00
										 |  |  |     '@angular/platform-browser/animations/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/platform-browser/animations': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     '@angular/platform-browser/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/platform-browser': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/platform-browser-dynamic/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/platform-browser-dynamic': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/platform-server/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/platform-server': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/platform-webworker': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     '@angular/platform-webworker-dynamic': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2018-07-27 13:49:22 -07:00
										 |  |  |     '@angular/private/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  |     '@angular/elements': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2018-02-27 17:06:06 -05:00
										 |  |  |     'rxjs/ajax': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     'rxjs/operators': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     'rxjs/testing': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     'rxjs/websocket': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							|  |  |  |     'rxjs': {main: 'index.js', defaultExtension: 'js'}, | 
					
						
							| 
									
										
										
										
											2015-08-14 15:05:56 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2014-10-06 17:35:00 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  | // Load browser-specific CustomElement polyfills, set up the test injector, import all the specs,
 | 
					
						
							|  |  |  | // execute their `main()` method and kick off Karma (Jasmine).
 | 
					
						
							|  |  |  | Promise | 
					
						
							|  |  |  |     .resolve() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Load browser-specific polyfills for custom elements.
 | 
					
						
							| 
									
										
										
										
											2018-03-06 14:02:25 -08:00
										 |  |  |     .then(function() { return loadCustomElementsPolyfills(); }) | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Load necessary testing packages.
 | 
					
						
							|  |  |  |     .then(function() { | 
					
						
							|  |  |  |       return Promise.all([ | 
					
						
							|  |  |  |         System.import('@angular/core/testing'), | 
					
						
							|  |  |  |         System.import('@angular/platform-browser-dynamic/testing'), | 
					
						
							|  |  |  |         System.import('@angular/platform-browser/animations') | 
					
						
							|  |  |  |       ]); | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Set up the test injector.
 | 
					
						
							|  |  |  |     .then(function(mods) { | 
					
						
							|  |  |  |       var coreTesting = mods[0]; | 
					
						
							|  |  |  |       var pbdTesting = mods[1]; | 
					
						
							|  |  |  |       var pbAnimations = mods[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       coreTesting.TestBed.initTestEnvironment( | 
					
						
							|  |  |  |           [pbdTesting.BrowserDynamicTestingModule, pbAnimations.NoopAnimationsModule], | 
					
						
							|  |  |  |           pbdTesting.platformBrowserDynamicTesting()); | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Import all the specs and execute their `main()` method.
 | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     .then(function() { | 
					
						
							|  |  |  |       return Promise.all(Object | 
					
						
							|  |  |  |                              .keys(window.__karma__.files)  // All files served by Karma.
 | 
					
						
							|  |  |  |                              .filter(onlySpecFiles) | 
					
						
							|  |  |  |                              .map(window.file2moduleName)  // Normalize paths to module names.
 | 
					
						
							|  |  |  |                              .map(function(path) { | 
					
						
							|  |  |  |                                return System.import(path).then(function(module) { | 
					
						
							|  |  |  |                                  if (module.hasOwnProperty('main')) { | 
					
						
							| 
									
										
										
										
											2017-12-16 14:42:55 -08:00
										 |  |  |                                    throw new Error('main() in specs are no longer supported'); | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |                                  } | 
					
						
							|  |  |  |                                }); | 
					
						
							|  |  |  |                              })); | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Kick off karma (Jasmine).
 | 
					
						
							| 
									
										
										
										
											2016-12-13 14:57:40 -08:00
										 |  |  |     .then(function() { __karma__.start(); }, function(error) { console.error(error); }); | 
					
						
							| 
									
										
										
										
											2014-10-06 17:35:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  | function loadCustomElementsPolyfills() { | 
					
						
							|  |  |  |   var loadedPromise = Promise.resolve(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // The custom elements polyfill relies on `MutationObserver`.
 | 
					
						
							|  |  |  |   if (!window.MutationObserver) { | 
					
						
							|  |  |  |     loadedPromise = | 
					
						
							|  |  |  |         loadedPromise | 
					
						
							|  |  |  |             .then(function() { return System.import('node_modules/mutation-observer/index.js'); }) | 
					
						
							|  |  |  |             .then(function(MutationObserver) { window.MutationObserver = MutationObserver; }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // The custom elements polyfill relies on `Object.setPrototypeOf()`.
 | 
					
						
							|  |  |  |   if (!Object.setPrototypeOf) { | 
					
						
							|  |  |  |     var getDescriptor = function getDescriptor(obj, prop) { | 
					
						
							|  |  |  |       var descriptor; | 
					
						
							|  |  |  |       while (obj && !descriptor) { | 
					
						
							|  |  |  |         descriptor = Object.getOwnPropertyDescriptor(obj, prop); | 
					
						
							|  |  |  |         obj = Object.getPrototypeOf(obj); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return descriptor || {}; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     var setPrototypeOf = function setPrototypeOf(obj, proto) { | 
					
						
							|  |  |  |       for (var prop in proto) { | 
					
						
							|  |  |  |         if (!obj.hasOwnProperty(prop)) { | 
					
						
							|  |  |  |           Object.defineProperty(obj, prop, getDescriptor(proto, prop)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return obj; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Object.defineProperty(setPrototypeOf, '$$shimmed', {value: true}); | 
					
						
							|  |  |  |     Object.setPrototypeOf = setPrototypeOf; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-06 14:02:25 -08:00
										 |  |  |   // The custom elements polyfill will patch properties and methods on `(HTML)Element` and `Node`
 | 
					
						
							|  |  |  |   // (among others), including `(HTML)Element#innerHTML` and `Node#removeChild()`:
 | 
					
						
							|  |  |  |   // https://github.com/webcomponents/custom-elements/blob/4f7072c0dbda4beb505d16967acfffd33337b325/src/Patch/Element.js#L28-L73
 | 
					
						
							|  |  |  |   // https://github.com/webcomponents/custom-elements/blob/4f7072c0dbda4beb505d16967acfffd33337b325/src/Patch/Node.js#L105-L120
 | 
					
						
							|  |  |  |   // The patched `innerHTML` setter and `removeChild()` method will try to traverse the DOM (via
 | 
					
						
							|  |  |  |   // `nextSibling` and `parentNode` respectively), which leads to infinite loops when testing
 | 
					
						
							|  |  |  |   // `HtmlSanitizer` with cloberred elements on browsers that do not support the `<template>`
 | 
					
						
							|  |  |  |   // element:
 | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  |   // https://github.com/angular/angular/blob/213baa37b0b71e72d00ad7b606ebfc2ade06b934/packages/platform-browser/src/security/html_sanitizer.ts#L29-L38
 | 
					
						
							| 
									
										
										
										
											2018-03-06 14:02:25 -08:00
										 |  |  |   // To avoid that, we "unpatch" these properties/methods and apply the patch only for the relevant
 | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  |   // `@angular/elements` tests.
 | 
					
						
							| 
									
										
										
										
											2018-03-06 14:02:25 -08:00
										 |  |  |   var patchConfig = {'innerHTML': ['Element', 'HTMLElement'], 'removeChild': ['Node']}; | 
					
						
							|  |  |  |   var patchTargets = {}; | 
					
						
							|  |  |  |   var originalDescriptors = {}; | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  |   if (!window.customElements) { | 
					
						
							| 
									
										
										
										
											2018-03-06 14:02:25 -08:00
										 |  |  |     Object.keys(patchConfig).forEach(function(prop) { | 
					
						
							|  |  |  |       patchConfig[prop] | 
					
						
							|  |  |  |           .map(function(name) { return window[name].prototype; }) | 
					
						
							|  |  |  |           .some(function(candidatePatchTarget) { | 
					
						
							|  |  |  |             var candidateOriginalDescriptor = | 
					
						
							|  |  |  |                 Object.getOwnPropertyDescriptor(candidatePatchTarget, prop); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (candidateOriginalDescriptor) { | 
					
						
							|  |  |  |               patchTargets[prop] = candidatePatchTarget; | 
					
						
							|  |  |  |               originalDescriptors[prop] = candidateOriginalDescriptor; | 
					
						
							|  |  |  |               return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var polyfillPath = !window.customElements ? | 
					
						
							|  |  |  |       // Load custom elements polyfill.
 | 
					
						
							|  |  |  |       'node_modules/@webcomponents/custom-elements/custom-elements.min.js' : | 
					
						
							|  |  |  |       // Allow ES5 functions as custom element constructors.
 | 
					
						
							|  |  |  |       'node_modules/@webcomponents/custom-elements/src/native-shim.js'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   loadedPromise = | 
					
						
							|  |  |  |       loadedPromise.then(function() { return System.import(polyfillPath); }).then(function() { | 
					
						
							|  |  |  |         // `packages/compiler/test/schema/schema_extractor.ts` relies on `HTMLElement.name`,
 | 
					
						
							|  |  |  |         // but custom element polyfills will replace `HTMLElement` with an anonymous function.
 | 
					
						
							|  |  |  |         Object.defineProperty(HTMLElement, 'name', {value: 'HTMLElement'}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-06 14:02:25 -08:00
										 |  |  |         // Create helper functions on `window` for patching/restoring properties/methods.
 | 
					
						
							|  |  |  |         Object.keys(patchConfig).forEach(function(prop) { | 
					
						
							|  |  |  |           var patchMethod = '$$patch_' + prop; | 
					
						
							|  |  |  |           var restoreMethod = '$$restore_' + prop; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           if (!patchTargets[prop]) { | 
					
						
							|  |  |  |             // No patching detected. Create no-op functions.
 | 
					
						
							|  |  |  |             window[patchMethod] = window[restoreMethod] = function() {}; | 
					
						
							|  |  |  |           } else { | 
					
						
							|  |  |  |             var patchTarget = patchTargets[prop]; | 
					
						
							|  |  |  |             var originalDescriptor = originalDescriptors[prop]; | 
					
						
							|  |  |  |             var patchedDescriptor = Object.getOwnPropertyDescriptor(patchTarget, prop); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             window[patchMethod] = function() { | 
					
						
							|  |  |  |               Object.defineProperty(patchTarget, prop, patchedDescriptor); | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |             window[restoreMethod] = function() { | 
					
						
							|  |  |  |               Object.defineProperty(patchTarget, prop, originalDescriptor); | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Restore `prop`. The patch will be manually applied only during the
 | 
					
						
							|  |  |  |             // `@angular/elements` tests that need it.
 | 
					
						
							|  |  |  |             window[restoreMethod](); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2018-02-28 09:45:11 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return loadedPromise; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-06 17:35:00 -07:00
										 |  |  | function onlySpecFiles(path) { | 
					
						
							|  |  |  |   return /_spec\.js$/.test(path); | 
					
						
							|  |  |  | } |