aboutsummaryrefslogtreecommitdiffstats
path: root/src/services.js
diff options
context:
space:
mode:
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();
}
}
}