diff --git a/src/ng/browser.js b/src/ng/browser.js index 5e52b82807a9..d956837dcc7e 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -278,12 +278,13 @@ function Browser(window, document, $log, $sniffer) { * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify * it * - cookies(name, value) -> set name to value, if value is undefined delete the cookie + * - cookies(name, value, expires) -> set name to value, and the expire date to expires * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that * way) * * @returns {Object} Hash of all cookies (if called without any parameter) */ - self.cookies = function(name, value) { + self.cookies = function(name, value, expires ) { /* global escape: false, unescape: false */ var cookieLength, cookieArray, cookie, i, index; @@ -293,8 +294,14 @@ function Browser(window, document, $log, $sniffer) { ";expires=Thu, 01 Jan 1970 00:00:00 GMT"; } else { if (isString(value)) { - cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) + - ';path=' + cookiePath).length + 1; + var rawCookie = escape(name) + '=' + escape(value) + + ';path=' + cookiePath; + + if (expires !== undefined) { + rawCookie = rawCookie + ";expires=" + expires; + } + + cookieLength = (rawDocument.cookie = rawCookie).length + 1; // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: // - 300 cookies diff --git a/src/ngCookies/cookies.js b/src/ngCookies/cookies.js index 94964bf8f1d4..2f9dceeb047c 100644 --- a/src/ngCookies/cookies.js +++ b/src/ngCookies/cookies.js @@ -82,6 +82,7 @@ angular.module('ngCookies', ['ng']). function push() { var name, value, + expires, browserCookies, updated; @@ -95,6 +96,9 @@ angular.module('ngCookies', ['ng']). //update all cookies updated in $cookies for(name in cookies) { value = cookies[name]; + if(value !== null && value !== undefined){ + expires = value.expires; + } if (!angular.isString(value)) { if (angular.isDefined(lastCookies[name])) { cookies[name] = lastCookies[name]; @@ -102,7 +106,7 @@ angular.module('ngCookies', ['ng']). delete cookies[name]; } } else if (value !== lastCookies[name]) { - $browser.cookies(name, value); + $browser.cookies(name, value, expires); updated = true; } } diff --git a/test/ng/browserSpecs.js b/test/ng/browserSpecs.js index 6c6ac30e2195..cfa9f4f60ed4 100755 --- a/test/ng/browserSpecs.js +++ b/test/ng/browserSpecs.js @@ -279,6 +279,24 @@ describe('browser', function() { }); }); + describe('put via cookies(cookieName, string, expires)', function() { + + it('when expire is set to tomorrow the cookie is valid', function() { + var expireDate = Date.now() + 1; + browser.cookies('foo', 'bar', expireDate); + expect(document.cookie).toMatch(/foo=bar;? ?/); + expect(browser.cookies()).toEqual({'foo':'bar'}); + }); + + it('when expire is set to 1st jan 1970 the cookie is deleted ', function() { + document.cookie = 'foo=bar;path=/'; + browser.cookies('foo', 'bar', "Thu, 01 Jan 1970 00:00:00 GMT"); + expect(document.cookie).toEqual(''); + expect(browser.cookies()).toEqual({}); + }); + + }); + describe('put via cookies(cookieName, string), if no ', function () { beforeEach(function () { fakeDocument.basePath = undefined;