diff options
| author | Igor Minar | 2010-09-23 05:37:17 +0800 |
|---|---|---|
| committer | Misko Hevery | 2010-09-23 17:23:52 +0800 |
| commit | acbcfbaf30f73f25df1c45da41132091e7022240 (patch) | |
| tree | cbf6fea04061974197a5f6c9b9c983ce18b054ff /src/Browser.js | |
| parent | a8931c9021fa15190927b913a66fb34deedf9e20 (diff) | |
| download | angular.js-acbcfbaf30f73f25df1c45da41132091e7022240.tar.bz2 | |
$cookies service refactoring
- remove obsolete code in tests
- add warning logs when maximum cookie limits (as specified via RFC 2965) were reached
- non-string values will now get dropped
- after each update $cookies hash will reflect the actual state of browser cookies
this means that if browser drops some cookies due to cookie overflow, $cookies will reflect that
- $sessionStore got renamed to $cookieStore to avoid name conflicts with html5's sessionStore
Diffstat (limited to 'src/Browser.js')
| -rw-r--r-- | src/Browser.js | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/src/Browser.js b/src/Browser.js index e21e419b..c7e61e97 100644 --- a/src/Browser.js +++ b/src/Browser.js @@ -8,7 +8,7 @@ var XHR = window.XMLHttpRequest || function () { throw new Error("This browser does not support XMLHttpRequest."); }; -function Browser(location, document, head, XHR) { +function Browser(location, document, head, XHR, $log) { var self = this; self.isMock = false; @@ -106,28 +106,50 @@ function Browser(location, document, head, XHR) { var rawDocument = document[0]; var lastCookies = {}; var lastCookieString = ''; + /** - * cookies() -> hash of all cookies - * cookies(name, value) -> set name to value - * if value is undefined delete it - * cookies(name) -> should get value, but deletes (no one calls it right now that way) + * The cookies method provides a 'private' low level access to browser cookies. It is not meant to + * be used directly, use the $cookie service instead. + * + * The return values vary depending on the arguments that the method was called with as follows: + * <ul><li> + * cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify it + * </li><li> + * cookies(name, value) -> set name to value, if value is undefined delete the cookie + * </li><li> + * cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that way) + * </li></ul> */ - self.cookies = function (name, value){ + self.cookies = function (/**string*/name, /**string*/value){ + var cookieLength, cookieArray, i, keyValue; + if (name) { if (value === _undefined) { delete lastCookies[name]; rawDocument.cookie = escape(name) + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; } else { - rawDocument.cookie = escape(name) + '=' + escape(lastCookies[name] = ''+value); + if (isString(value)) { + rawDocument.cookie = escape(name) + '=' + escape(lastCookies[name] = value); + + cookieLength = name.length + value.length + 1; + if (cookieLength > 4096) { + $log.warn("Cookie '"+ name +"' possibly not set or overflowed because it was too large ("+ + cookieLength + " > 4096 bytes)!"); + } + if (lastCookies.length > 20) { + $log.warn("Cookie '"+ name +"' possibly not set or overflowed because too many cookies " + + "were already set (" + lastCookies.length + " > 20 )"); + } + } } } else { if (rawDocument.cookie !== lastCookieString) { lastCookieString = rawDocument.cookie; - var cookieArray = lastCookieString.split("; "); + cookieArray = lastCookieString.split("; "); lastCookies = {}; - for (var i = 0; i < cookieArray.length; i++) { - var keyValue = cookieArray[i].split("="); + for (i = 0; i < cookieArray.length; i++) { + keyValue = cookieArray[i].split("="); if (keyValue.length === 2) { //ignore nameless cookies lastCookies[unescape(keyValue[0])] = unescape(keyValue[1]); } |
