From e4626b0a3f097d649a05982fdb99fd6ef3bbef1a Mon Sep 17 00:00:00 2001 From: Enrico Rubboli Date: Wed, 20 Nov 2013 18:16:40 +0100 Subject: [PATCH 1/6] add expire to the cookies() method --- src/ng/browser.js | 15 ++++++++++++--- src/ngCookies/cookies.js | 6 +++++- test/ng/browserSpecs.js | 19 +++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/ng/browser.js b/src/ng/browser.js index 5e52b82807a9..55219e031330 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -278,12 +278,14 @@ 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, if value is undefined delete the cookie, + * the cookie will expire in the days specified in 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 +295,15 @@ 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 + if (expires == undefined) { + rawCookie = escape(name) + '=' + escape(value) + + ';path=' + cookiePath; + }else{ + rawCookie = escape(name) + '=' + escape(value) + + ';path=' + cookiePath + ";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..2f4a90679b12 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 != 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..8affe3639647 100755 --- a/test/ng/browserSpecs.js +++ b/test/ng/browserSpecs.js @@ -279,6 +279,25 @@ 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() { + var expireDate = "Thu, 01 Jan 1970 00:00:00 GMT"; + document.cookie = 'foo=bar;path=/'; + browser.cookies('foo', 'bar', expireDate); + expect(document.cookie).toEqual(''); + expect(browser.cookies()).toEqual({}); + }); + + }); + describe('put via cookies(cookieName, string), if no ', function () { beforeEach(function () { fakeDocument.basePath = undefined; From 8e02eca761e123a8d425df834cb01259bd27fa5a Mon Sep 17 00:00:00 2001 From: Enrico Rubboli Date: Wed, 20 Nov 2013 18:21:03 +0100 Subject: [PATCH 2/6] correct cookies() method comment --- src/ng/browser.js | 3 +-- test/ng/browserSpecs.js | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ng/browser.js b/src/ng/browser.js index 55219e031330..624dda9490ed 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -278,8 +278,7 @@ 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, if value is undefined delete the cookie, - * the cookie will expire in the days specified in expires + * - 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) * diff --git a/test/ng/browserSpecs.js b/test/ng/browserSpecs.js index 8affe3639647..cfa9f4f60ed4 100755 --- a/test/ng/browserSpecs.js +++ b/test/ng/browserSpecs.js @@ -289,9 +289,8 @@ describe('browser', function() { }); it('when expire is set to 1st jan 1970 the cookie is deleted ', function() { - var expireDate = "Thu, 01 Jan 1970 00:00:00 GMT"; document.cookie = 'foo=bar;path=/'; - browser.cookies('foo', 'bar', expireDate); + browser.cookies('foo', 'bar', "Thu, 01 Jan 1970 00:00:00 GMT"); expect(document.cookie).toEqual(''); expect(browser.cookies()).toEqual({}); }); From d4dd78f5b3d1890dead07e67eae3d7315fbb1b40 Mon Sep 17 00:00:00 2001 From: Enrico Rubboli Date: Wed, 20 Nov 2013 18:30:35 +0100 Subject: [PATCH 3/6] refactor cookies() method --- src/ng/browser.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ng/browser.js b/src/ng/browser.js index 624dda9490ed..e8395a757197 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -294,14 +294,13 @@ function Browser(window, document, $log, $sniffer) { ";expires=Thu, 01 Jan 1970 00:00:00 GMT"; } else { if (isString(value)) { - var rawCookie - if (expires == undefined) { - rawCookie = escape(name) + '=' + escape(value) + + var rawCookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath; - }else{ - rawCookie = escape(name) + '=' + escape(value) + - ';path=' + cookiePath + ";expires=" + expires; + + 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: From 19e8f812f1a8fae4ac8bc0f5edaf959962f54b05 Mon Sep 17 00:00:00 2001 From: Enrico Rubboli Date: Wed, 20 Nov 2013 18:39:54 +0100 Subject: [PATCH 4/6] use !== to compare undefined --- src/ng/browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/browser.js b/src/ng/browser.js index e8395a757197..f2b4c2abc0d4 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -297,7 +297,7 @@ function Browser(window, document, $log, $sniffer) { var rawCookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath; - if (expires != undefined) { + if (expires !== undefined) { rawCookie = rawCookie + ";expires=" + expires; } From 130a8e354ede1752758807cc21a714afdb652a13 Mon Sep 17 00:00:00 2001 From: Enrico Rubboli Date: Wed, 20 Nov 2013 18:44:36 +0100 Subject: [PATCH 5/6] ensure value is not null or undefined --- src/ngCookies/cookies.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ngCookies/cookies.js b/src/ngCookies/cookies.js index 2f4a90679b12..2f9dceeb047c 100644 --- a/src/ngCookies/cookies.js +++ b/src/ngCookies/cookies.js @@ -96,7 +96,7 @@ angular.module('ngCookies', ['ng']). //update all cookies updated in $cookies for(name in cookies) { value = cookies[name]; - if(value != undefined){ + if(value !== null && value !== undefined){ expires = value.expires; } if (!angular.isString(value)) { From 99685b90f0814f9ae31ca7015a9cf337ee09e5b3 Mon Sep 17 00:00:00 2001 From: Enrico Rubboli Date: Wed, 20 Nov 2013 18:53:19 +0100 Subject: [PATCH 6/6] remove trailing whitespace --- src/ng/browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ng/browser.js b/src/ng/browser.js index f2b4c2abc0d4..d956837dcc7e 100644 --- a/src/ng/browser.js +++ b/src/ng/browser.js @@ -297,7 +297,7 @@ function Browser(window, document, $log, $sniffer) { var rawCookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath; - if (expires !== undefined) { + if (expires !== undefined) { rawCookie = rawCookie + ";expires=" + expires; }