Skip to content

Commit

Permalink
Fixes #44: Now catching private browsing and sending and error to the…
Browse files Browse the repository at this point in the history
… error callback. Added a test with localStorage stubbing for this to work.
  • Loading branch information
jeromegn committed Jan 13, 2013
1 parent 5e0d38a commit 93ddfff
Show file tree
Hide file tree
Showing 4 changed files with 4,232 additions and 19 deletions.
55 changes: 36 additions & 19 deletions backbone.localStorage.js
Expand Up @@ -108,29 +108,46 @@ _.extend(Backbone.LocalStorage.prototype, {
Backbone.LocalStorage.sync = window.Store.sync = Backbone.localSync = function(method, model, options) {
var store = model.localStorage || model.collection.localStorage;

var resp, syncDfd = $.Deferred && $.Deferred(); //If $ is having Deferred - use it.

switch (method) {
case "read":
resp = model.id != undefined ? store.find(model) : store.findAll();
break;
case "create":
resp = store.create(model);
break;
case "update":
resp = store.update(model);
break;
case "delete":
resp = store.destroy(model);
break;
var resp, errorMessage, syncDfd = $.Deferred && $.Deferred(); //If $ is having Deferred - use it.

try {

switch (method) {
case "read":
resp = model.id != undefined ? store.find(model) : store.findAll();
break;
case "create":
resp = store.create(model);
break;
case "update":
resp = store.update(model);
break;
case "delete":
resp = store.destroy(model);
break;
}

} catch(error) {
if (error.code === DOMException.QUOTA_EXCEEDED_ERR && window.localStorage.length === 0)
errorMessage = "Private browsing is unsupported";
else
errorMessage = error.message;
}

if (resp) {
if (options && options.success) options.success(resp);
if (syncDfd) syncDfd.resolve();
if (options && options.success)
options.success(resp);
if (syncDfd)
syncDfd.resolve(resp);

} else {
if (options && options.error) options.error("Record not found");
if (syncDfd) syncDfd.reject();
errorMessage = errorMessage ? errorMessage
: "Record Not Found";

if (options && options.error)
options.error(errorMessage);
if (syncDfd)
syncDfd.reject(errorMessage);
}

// add compatibility with $.ajax
Expand Down
41 changes: 41 additions & 0 deletions spec/localStorage_spec.js
Expand Up @@ -237,6 +237,47 @@ describe("Backbone.localStorage", function(){

});

describe("Error handling", function(){

var Model = Backbone.Model.extend({
defaults: attributes,
localStorage: new Backbone.LocalStorage("modelStore")
});

before(function(){
window.localStorage.clear();
});

describe("private browsing", function(){

var model = new Model();

before(function(){
sinon.stub(window.localStorage, "setItem", function(){
var error = new Error();
error.code = DOMException.QUOTA_EXCEEDED_ERR;
throw error;
});
});

var error;

before(function(){
model.save(attributes, {
error: function(err){
error = err;
}
})
});

it("should return the error in the error callback", function(){
assert.equal(error, "Private browsing is unsupported");
});

});

});


});

Expand Down
2 changes: 2 additions & 0 deletions spec/runner.html
Expand Up @@ -8,6 +8,8 @@
<body>
<div id="mocha"></div>
<script src="support/jquery.js"></script>
<script src="support/sinon.js"></script>

<script src="support/mocha.js"></script>
<script>mocha.setup("bdd")</script>

Expand Down

0 comments on commit 93ddfff

Please sign in to comment.