diff options
Diffstat (limited to 'src/service/cookies.js')
| -rw-r--r-- | src/service/cookies.js | 89 | 
1 files changed, 89 insertions, 0 deletions
| diff --git a/src/service/cookies.js b/src/service/cookies.js new file mode 100644 index 00000000..082b73ab --- /dev/null +++ b/src/service/cookies.js @@ -0,0 +1,89 @@ +/** + * @workInProgress + * @ngdoc service + * @name angular.service.$cookies + * @requires $browser + * + * @description + * Provides read/write access to browser's cookies. + * + * Only a simple Object is exposed and by adding or removing properties to/from + * this object, new cookies are created/deleted at the end of current $eval. + * + * @example + */ +angularServiceInject('$cookies', function($browser) { +  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 (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 +  //TODO: this should happen before the "delayed" watches fire, because if some cookies are not +  //      strings or browser refuses to store some cookies, we update the model in the push fn. +  this.$onEval(PRIORITY_LAST, push); + +  return cookies; + + +  /** +   * Pushes all the cookies from the service to the browser and verifies if all cookies were stored. +   */ +  function push(){ +    var name, +        value, +        browserCookies, +        updated; + +    //delete any cookies deleted in $cookies +    for (name in lastCookies) { +      if (isUndefined(cookies[name])) { +        $browser.cookies(name, _undefined); +      } +    } + +    //update all cookies updated in $cookies +    for(name in cookies) { +      value = cookies[name]; +      if (!isString(value)) { +        if (isDefined(lastCookies[name])) { +          cookies[name] = lastCookies[name]; +        } else { +          delete cookies[name]; +        } +      } else if (value !== lastCookies[name]) { +        $browser.cookies(name, value); +        updated = true; +      } +    } + +    //verify what was actually stored +    if (updated){ +      updated = false; +      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']); | 
