Skip to content

Commit

Permalink
cookie adaptor for fallback on older mobile browsers
Browse files Browse the repository at this point in the history
  • Loading branch information
brianleroux committed Dec 3, 2009
1 parent e0cfc4f commit 4944e4a
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 1 deletion.
25 changes: 25 additions & 0 deletions spec/cookie.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>Lawnchair Spec</title>
<link rel="stylesheet" href="shoulda.css" type="text/css" media="screen" title="no title" charset="utf-8">

<script src="qunit.js" type="text/javascript" charset="utf-8"></script>
<script src="shoulda.js" type="text/javascript" charset="utf-8"></script>

<script src="../src/adaptors/Helpers.js" type="text/javascript" charset="utf-8"></script>
<script src="../src/adaptors/CookieAdaptor.js" type="text/javascript" charset="utf-8"></script>
<script src="../src/lawnchair.js" type="text/javascript" charset="utf-8"></script>

<script type="text/javascript" charset="utf-8">
var store = new Lawnchair({adaptor:'cookie'});
</script>
<script src="lawnchair-spec.js" type="text/javascript" charset="utf-8"></script>

</head>
<body>
<h2 id="qunit-banner">Lawnchair Spec</h2>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
</body>
</html>
88 changes: 88 additions & 0 deletions src/adaptors/CookieAdaptor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* CookieAdaptor
* ===================
* Cookie implementation for Lawnchair for older browsers.
*
* Based on ppk's http://www.quirksmode.org/js/cookies.html
*
*/
var CookieAdaptor = function(options) {
for (var i in LawnchairAdaptorHelpers) {
this[i] = LawnchairAdaptorHelpers[i];
}
this.init(options);
};

CookieAdaptor.prototype = {
init:function(){
this.createCookie = function(name, value, days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
};
},
get:function(key, callback){
var readCookie = function(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
var len = ca.length;
for (var i=0; i < len; i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
};
var obj = this.deserialize(readCookie(key));
if (obj) {
obj.key = key;
if (callback)
callback(obj);
}
},
save:function(obj, callback){
var id = obj.key || this.uuid();
delete obj.key;
this.createCookie(id, this.serialize(obj), 365);
if (callback)
callback(obj);
},
all:function(callback){
var cb = this.terseToVerboseCallback(callback);
var ca = document.cookie.split(';');

var len = ca.length;
var yar = [];
var c,k,v,o;
// yo ho yo ho a pirates life for me
for (var i = 0; i < len; i++) {
c = ca[i].split('=');
k = c[0];
v = c[1];
o = this.deserialize(v)
if (o) {
o.key = k;
yar.push(o);
}
}
if (cb)
cb(yar);
},
remove:function(keyOrObj) {
var key = (typeof keyOrObj == 'string') ? keyOrObj : keyOrObj.key;
this.createCookie(key, '', -1);
},
nuke:function() {
var that = this;
this.all(function(r){
var l = r.length;
for (var i = 0; i < l; i++) {
that.remove(r[i].key)
}
});
}
};
3 changes: 2 additions & 1 deletion src/lawnchair.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ Lawnchair.prototype = {
var adaptors = {
'webkit':window.WebkitSQLiteAdaptor,
'gears':window.GearsSQLiteAdaptor,
'dom':window.DOMStorageAdaptor
'dom':window.DOMStorageAdaptor,
'cookie':window.CookieAdaptor
};

this.adaptor = opts.adaptor ? new adaptors[opts.adaptor](opts) : new WebkitSQLiteAdaptor(opts);
Expand Down

0 comments on commit 4944e4a

Please sign in to comment.