PDA

View Full Version : UserData behavior state provider


paultyng
10-26-2006, 03:23 PM
I wrote a provider for IE only that uses UserData to store my client state so that it had much larger size for data available to it (64/128k per page). Still a work in progress but thought I woudl share it if anyone was interested, it works as is, I left my TODO's in. Its mostly a copy and paste of the existing cookie one with some minor changes.


YAHOO.ext.state.UserDataProvider = function(config){
YAHOO.ext.state.UserDataProvider.superclass.constructor.call(this);
this.path = 'UserDataProvider';
//TODO: expiration...
//this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
YAHOO.ext.util.Config.apply(this, config);
};

YAHOO.extendX(YAHOO.ext.state.UserDataProvider, YAHOO.ext.state.Provider, {
set : function(name, value){
this.createElement();

if(typeof value == 'undefined' || value === null){
this.clearUserData(name);
}
else {
this.setUserData(name, value);
}
this.fireEvent('statechange', this, name, null);
},

clear : function(name){
this.createElement();

this.clearUserData(name);
this.fireEvent('statechange', this, name, null);
},

get : function(name){
this.createElement();

window.UserDataElement.load(this.path);
return window.UserDataElement.getAttribute(this.escapeName(name));
},

createElement : function(){
if(!window.UserDataElement) {
this.addNamespace();
var e = document.createElement('userdata:state');
e.style.behavior = 'url(#default#userData)';
document.body.appendChild(e);
window.UserDataElement = e;
}
},

addNamespace: function(){
//TODO: check if namespace exists first?

document.namespaces.add('userdata', 'http://yui-ext/state/userdataprovider');
},

setUserData : function(name, value){
//TODO: expiration...
//window.UserDataElement.expires = this.expires;
window.UserDataElement.setAttribute(this.escapeName(name), value);
window.UserDataElement.save(this.path);
},

clearUserData : function(name){
window.UserDataElement.removeAttribute(this.escapeName(name));
window.UserDataElement.save(this.path);
},

escapeName : function(name){
//TODO: better escaping method...
return name.replace(/[\/|]/g, '__');
}
});

jack.slocum
10-26-2006, 06:14 PM
That's great. In the coming release I moved the encoding methods from the CookieProvider to the default Provider so you also encode objects and arrays and such in a single call. I will pull this out and play with it a bit and see if I can get it into the next version.

Thanks!