| 
									
										
										
										
											2016-06-23 09:47:54 -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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-30 18:07:40 -07:00
										 |  |  | import {Location, LocationStrategy} from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {EventEmitter, Injectable} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * A spy for {@link Location} that allows tests to fire simulated location events. | 
					
						
							| 
									
										
										
										
											2016-06-27 12:27:23 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @experimental | 
					
						
							| 
									
										
										
										
											2015-12-03 15:49:09 -08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-12-03 09:06:42 -08:00
										 |  |  | @Injectable() | 
					
						
							| 
									
										
										
										
											2015-08-26 11:41:41 -07:00
										 |  |  | export class SpyLocation implements Location { | 
					
						
							| 
									
										
										
										
											2015-08-28 11:29:19 -07:00
										 |  |  |   urlChanges: string[] = []; | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  |   private _history: LocationState[] = [new LocationState('', '')]; | 
					
						
							|  |  |  |   private _historyIndex: number = 0; | 
					
						
							| 
									
										
										
										
											2015-09-23 00:10:26 -07:00
										 |  |  |   /** @internal */ | 
					
						
							| 
									
										
										
										
											2015-10-24 18:48:43 -07:00
										 |  |  |   _subject: EventEmitter<any> = new EventEmitter(); | 
					
						
							| 
									
										
										
										
											2015-10-09 17:21:25 -07:00
										 |  |  |   /** @internal */ | 
					
						
							| 
									
										
										
										
											2015-08-26 11:41:41 -07:00
										 |  |  |   _baseHref: string = ''; | 
					
						
							| 
									
										
										
										
											2016-05-27 11:29:23 -07:00
										 |  |  |   /** @internal */ | 
					
						
							|  |  |  |   _platformStrategy: LocationStrategy = null; | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  |   setInitialPath(url: string) { this._history[this._historyIndex].path = url; } | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-29 14:58:41 -07:00
										 |  |  |   setBaseHref(url: string) { this._baseHref = url; } | 
					
						
							| 
									
										
										
										
											2015-05-12 16:18:58 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  |   path(): string { return this._history[this._historyIndex].path; } | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-08 01:02:07 +01:00
										 |  |  |   isCurrentPathEqualTo(path: string, query: string = ''): boolean { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     const givenPath = path.endsWith('/') ? path.substring(0, path.length - 1) : path; | 
					
						
							|  |  |  |     const currPath = | 
					
						
							| 
									
										
										
										
											2016-04-08 01:02:07 +01:00
										 |  |  |         this.path().endsWith('/') ? this.path().substring(0, this.path().length - 1) : this.path(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return currPath == givenPath + (query.length > 0 ? ('?' + query) : ''); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |   simulateUrlPop(pathname: string) { this._subject.emit({'url': pathname, 'pop': true}); } | 
					
						
							| 
									
										
										
										
											2015-12-07 16:05:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   simulateHashChange(pathname: string) { | 
					
						
							|  |  |  |     // Because we don't prevent the native event, the browser will independently update the path
 | 
					
						
							|  |  |  |     this.setInitialPath(pathname); | 
					
						
							|  |  |  |     this.urlChanges.push('hash: ' + pathname); | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |     this._subject.emit({'url': pathname, 'pop': true, 'type': 'hashchange'}); | 
					
						
							| 
									
										
										
										
											2015-12-07 16:05:57 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 13:57:41 +00:00
										 |  |  |   prepareExternalUrl(url: string): string { | 
					
						
							|  |  |  |     if (url.length > 0 && !url.startsWith('/')) { | 
					
						
							|  |  |  |       url = '/' + url; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return this._baseHref + url; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-05-12 16:18:58 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-23 00:10:26 -07:00
										 |  |  |   go(path: string, query: string = '') { | 
					
						
							| 
									
										
										
										
											2015-10-26 13:57:41 +00:00
										 |  |  |     path = this.prepareExternalUrl(path); | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (this._historyIndex > 0) { | 
					
						
							|  |  |  |       this._history.splice(this._historyIndex + 1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     this._history.push(new LocationState(path, query)); | 
					
						
							|  |  |  |     this._historyIndex = this._history.length - 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     const locationState = this._history[this._historyIndex - 1]; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     if (locationState.path == path && locationState.query == query) { | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-09-23 00:10:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     const url = path + (query.length > 0 ? ('?' + query) : ''); | 
					
						
							| 
									
										
										
										
											2015-06-17 11:17:21 -07:00
										 |  |  |     this.urlChanges.push(url); | 
					
						
							| 
									
										
										
										
											2016-08-12 14:30:51 -07:00
										 |  |  |     this._subject.emit({'url': url, 'pop': false}); | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-07 16:05:57 -08:00
										 |  |  |   replaceState(path: string, query: string = '') { | 
					
						
							|  |  |  |     path = this.prepareExternalUrl(path); | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     const history = this._history[this._historyIndex]; | 
					
						
							| 
									
										
										
										
											2016-04-08 01:02:07 +01:00
										 |  |  |     if (history.path == path && history.query == query) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     history.path = path; | 
					
						
							|  |  |  |     history.query = query; | 
					
						
							| 
									
										
										
										
											2015-12-07 16:05:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     const url = path + (query.length > 0 ? ('?' + query) : ''); | 
					
						
							| 
									
										
										
										
											2015-12-07 16:05:57 -08:00
										 |  |  |     this.urlChanges.push('replace: ' + url); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  |   forward() { | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  |     if (this._historyIndex < (this._history.length - 1)) { | 
					
						
							|  |  |  |       this._historyIndex++; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       this._subject.emit({'url': this.path(), 'pop': true}); | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   back() { | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  |     if (this._historyIndex > 0) { | 
					
						
							|  |  |  |       this._historyIndex--; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       this._subject.emit({'url': this.path(), 'pop': true}); | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   subscribe( | 
					
						
							|  |  |  |       onNext: (value: any) => void, onThrow: (error: any) => void = null, | 
					
						
							|  |  |  |       onReturn: () => void = null): Object { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |     return this._subject.subscribe({next: onNext, error: onThrow, complete: onReturn}); | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-26 11:41:41 -07:00
										 |  |  |   normalize(url: string): string { return null; } | 
					
						
							| 
									
										
										
										
											2015-04-21 11:23:23 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-08 04:24:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | class LocationState { | 
					
						
							|  |  |  |   path: string; | 
					
						
							|  |  |  |   query: string; | 
					
						
							|  |  |  |   constructor(path: string, query: string) { | 
					
						
							|  |  |  |     this.path = path; | 
					
						
							|  |  |  |     this.query = query; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |