diff --git a/src/service/location.js b/src/service/location.js index d1d34e6762be..68e825ea6065 100644 --- a/src/service/location.js +++ b/src/service/location.js @@ -238,8 +238,9 @@ LocationUrl.prototype = LocationHashbangUrl.prototype = { return this.$$url; var match = PATH_MATCH.exec(url); - this.path(decodeURIComponent(match[1] || '')).search(match[3] || '') - .hash(match[5] || '', replace); + if (match[1]) this.path(decodeURIComponent(match[1])); + if (match[2] || match[1]) this.search(match[3] || ''); + this.hash(match[5] || '', replace); return this; }, diff --git a/test/service/locationSpec.js b/test/service/locationSpec.js index 9a7aa94306c9..28864cbef010 100644 --- a/test/service/locationSpec.js +++ b/test/service/locationSpec.js @@ -95,6 +95,33 @@ describe('$location', function() { }); + it('url() should change only hash when no search and path specified', function() { + url.url('#some-hash'); + + expect(url.hash()).toBe('some-hash'); + expect(url.url()).toBe('/path/b?search=a&b=c&d#some-hash'); + expect(url.absUrl()).toBe('http://www.domain.com:9877/path/b?search=a&b=c&d#some-hash'); + }); + + + it('url() should change only search and hash when no path specified', function() { + url.url('?a=b'); + + expect(url.search()).toEqual({a: 'b'}); + expect(url.hash()).toBe(''); + expect(url.path()).toBe('/path/b'); + }); + + + it('url() should reset search and hash even when only path specified', function() { + url.url('/new/path'); + + expect(url.path()).toBe('/new/path'); + expect(url.search()).toEqual({}); + expect(url.hash()).toBe(''); + }); + + it('replace should set $$replace flag and return itself', function() { expect(url.$$replace).toBe(false);