paultyng
26 Oct 2006, 11:23 AM
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, '__');
}
});
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, '__');
}
});