diff options
| author | Misko Hevery | 2012-03-26 16:22:06 -0700 | 
|---|---|---|
| committer | Misko Hevery | 2012-03-28 11:16:36 -0700 | 
| commit | 7b22d59b4a16d5c50c2eee054178ba17f8038880 (patch) | |
| tree | 174f4d18d3545ea9c7e2e569a82df17b8ee0d6a9 /src/ngCookies | |
| parent | 798bca62c6f64775b85deda3713e7b6bcc7a4b4d (diff) | |
| download | angular.js-7b22d59b4a16d5c50c2eee054178ba17f8038880.tar.bz2 | |
chore(ngCookies): moved to module
Diffstat (limited to 'src/ngCookies')
| -rw-r--r-- | src/ngCookies/cookies.js | 163 | 
1 files changed, 163 insertions, 0 deletions
| diff --git a/src/ngCookies/cookies.js b/src/ngCookies/cookies.js new file mode 100644 index 00000000..f6446db1 --- /dev/null +++ b/src/ngCookies/cookies.js @@ -0,0 +1,163 @@ +'use strict'; + +/** + * @ngdoc overview + * @name angular.module.ngCookies + */ + + +angular.module('ngCookies', ['ng']). +  /** +   * @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 +   */ +   factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) { +      var cookies = {}, +          lastCookies = {}, +          lastBrowserCookies, +          runEval = false, +          copy = angular.copy, +          isUndefined = angular.isUndefined; + +      //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 (!angular.isString(value)) { +            if (angular.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; +            } +          } +        } +      } +    }]). + + +  /** +   * @ngdoc object +   * @name angular.module.ng.$cookieStore +   * @requires $cookies +   * +   * @description +   * Provides a key-value (string-object) storage, that is backed by session cookies. +   * Objects put or retrieved from this storage are automatically serialized or +   * deserialized by angular's toJson/fromJson. +   * @example +   */ +   factory('$cookieStore', ['$cookies', function($cookies) { + +      return { +        /** +         * @ngdoc method +         * @name angular.module.ng.$cookieStore#get +         * @methodOf angular.module.ng.$cookieStore +         * +         * @description +         * Returns the value of given cookie key +         * +         * @param {string} key Id to use for lookup. +         * @returns {Object} Deserialized cookie value. +         */ +        get: function(key) { +          return angular.fromJson($cookies[key]); +        }, + +        /** +         * @ngdoc method +         * @name angular.module.ng.$cookieStore#put +         * @methodOf angular.module.ng.$cookieStore +         * +         * @description +         * Sets a value for given cookie key +         * +         * @param {string} key Id for the `value`. +         * @param {Object} value Value to be stored. +         */ +        put: function(key, value) { +          $cookies[key] = angular.toJson(value); +        }, + +        /** +         * @ngdoc method +         * @name angular.module.ng.$cookieStore#remove +         * @methodOf angular.module.ng.$cookieStore +         * +         * @description +         * Remove given cookie +         * +         * @param {string} key Id of the key-value pair to delete. +         */ +        remove: function(key) { +          delete $cookies[key]; +        } +      }; + +    }]); | 
