mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-04-06 08:01:04 +00:00
94 lines
2.6 KiB
JavaScript
94 lines
2.6 KiB
JavaScript
'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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}];
|
|
}
|