aboutsummaryrefslogtreecommitdiffstats
path: root/src/services.js
diff options
context:
space:
mode:
authorIgor Minar2010-09-26 23:45:05 -0700
committerIgor Minar2010-09-27 15:10:05 -0700
commit984acdc6270df1dee5796ed44efebfb9ff6706c7 (patch)
tree770d3f78e3db85740b0c5cf59edf32356060d505 /src/services.js
parent3eec8c1a517f8b93a5afd15b7f83b33c5df7e54b (diff)
downloadangular.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.js65
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();
}
}
}