diff options
| author | Igor Minar | 2010-09-26 23:45:05 -0700 |
|---|---|---|
| committer | Igor Minar | 2010-09-27 15:10:05 -0700 |
| commit | 984acdc6270df1dee5796ed44efebfb9ff6706c7 (patch) | |
| tree | 770d3f78e3db85740b0c5cf59edf32356060d505 /src/services.js | |
| parent | 3eec8c1a517f8b93a5afd15b7f83b33c5df7e54b (diff) | |
| download | angular.js-984acdc6270df1dee5796ed44efebfb9ff6706c7.tar.bz2 | |
Reworked the cookie synchronization between cookie service, $browser and document.cookie.
Now we finally correctly handle situations when browser refuses to set a cookie, due to
storage quota or other (file:// protocol) limitations.
Diffstat (limited to 'src/services.js')
| -rw-r--r-- | src/services.js | 65 |
1 files changed, 42 insertions, 23 deletions
diff --git a/src/services.js b/src/services.js index 56637573..9bf3d1ed 100644 --- a/src/services.js +++ b/src/services.js @@ -405,52 +405,71 @@ angularService('$resource', function($xhr){ * cookies are created or deleted from the browser at the end of the current eval. */ angularService('$cookies', function($browser) { - var cookies = {}, - rootScope = this, - lastCookies; + var rootScope = this, + cookies = {}, + lastCookies = {}, + lastBrowserCookies; //creates a poller fn that copies all cookies from the $browser to service & inits the service $browser.addPollFn(function() { var currentCookies = $browser.cookies(); - if (lastCookies != currentCookies) { - lastCookies = currentCookies; + if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl + lastBrowserCookies = currentCookies; + copy(currentCookies, lastCookies); copy(currentCookies, cookies); rootScope.$eval(); } })(); //at the end of each eval, push cookies - this.$onEval(PRIORITY_LAST, update); + this.$onEval(PRIORITY_LAST, push); return cookies; - function update(){ + + /** + * Pushes all the cookies from the service to the browser and verifies if all cookies were stored. + */ + function push(){ var name, - browserCookies = $browser.cookies(); + browserCookies, + updated; + + //delete any cookies deleted in $cookies + for (name in lastCookies) { + if (isUndefined(cookies[name])) { + $browser.cookies(name, _undefined); + } + } - //$cookies -> $browser + //update all cookies updated in $cookies for(name in cookies) { - if (cookies[name] !== browserCookies[name]) { + if (cookies[name] !== lastCookies[name]) { $browser.cookies(name, cookies[name]); + updated = true; } } - //get what was actually stored in the browser - browserCookies = $browser.cookies(); + //verify what was actually stored + if (updated){ + updated = !updated; + browserCookies = $browser.cookies(); + + for (name in cookies) { + if (cookies[name] !== browserCookies[name]) { + //delete or reset all cookies that the browser dropped from $cookies + if (isUndefined(browserCookies[name])) { + delete cookies[name]; + } else { + cookies[name] = browserCookies[name]; + } + updated = true; + } - //$browser -> $cookies - for(name in browserCookies) { - if (isUndefined(cookies[name])) { - $browser.cookies(name, _undefined); - } else { - cookies[name] = browserCookies[name]; } - } - //drop cookies in $cookies for cookies that $browser or real browser dropped - for (name in cookies) { - if (isUndefined(browserCookies[name])) { - delete cookies[name]; + if (updated) { + rootScope.$eval(); } } } |
