diff options
Diffstat (limited to 'src/ng/cookies.js')
| -rw-r--r-- | src/ng/cookies.js | 94 | 
1 files changed, 94 insertions, 0 deletions
| diff --git a/src/ng/cookies.js b/src/ng/cookies.js new file mode 100644 index 00000000..cd953eb1 --- /dev/null +++ b/src/ng/cookies.js @@ -0,0 +1,94 @@ +'use strict'; + +/** + * @ngdoc object + * @name angular.module.ng.$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 + */ +function $CookiesProvider() { +  this.$get = ['$rootScope', '$browser', function ($rootScope, $browser) { +    var cookies = {}, +        lastCookies = {}, +        lastBrowserCookies, +        runEval = false; + +    //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); +        if (runEval) $rootScope.$apply(); +      } +    })(); + +    runEval = true; + +    //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. +    $rootScope.$watch(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; +          } +        } +      } +    } +  }]; +} | 
