Skip to content

Commit

Permalink
Within db.js and tests, get Firefox to avoid errors (preventDefault, …
Browse files Browse the repository at this point in the history
…move error execution from onupgradeneeded to onsuccess, lengthen test timeouts, wrap `delete` onblocked event's `newVersion` with Proxy but avoid using using Proxy if not present for sake of PhantomJS or older browsers);

fix/improve comment wrapper for `oldVersion` and avoid testing (can't be wrapped (at least not readily) and not our API anyways), but do test `err.type` is `blocked`
improve test grouping/naming
  • Loading branch information
brettz9 committed Mar 26, 2016
1 parent e13e73f commit 429a282
Show file tree
Hide file tree
Showing 19 changed files with 133 additions and 80 deletions.
39 changes: 25 additions & 14 deletions dist/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,6 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
try {
result = modifyRecord(result);
} catch (err) {
transaction.abort();
reject(err);
return {
v: void 0
Expand All @@ -175,7 +174,6 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
try {
results.push(mapper(result));
} catch (err) {
transaction.abort();
reject(err);
return {
v: void 0
Expand Down Expand Up @@ -538,7 +536,6 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
try {
key = mongoifyKey(key);
} catch (e) {
transaction.abort();
reject(e);
return;
}
Expand Down Expand Up @@ -572,7 +569,6 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
try {
key = mongoifyKey(key);
} catch (e) {
transaction.abort();
reject(e);
return;
}
Expand Down Expand Up @@ -632,7 +628,7 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
return err;
};

var createSchema = function createSchema(e, schema, db, reject, server, version) {
var createSchema = function createSchema(e, schema, db, server, version) {
if (!schema || schema.length === 0) {
return;
}
Expand All @@ -651,6 +647,7 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
}
}

var ret = void 0;
Object.keys(schema).some(function (tableName) {
var table = schema[tableName];
var store = void 0;
Expand All @@ -672,9 +669,9 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
try {
store = db.createObjectStore(tableName, table.key);
} catch (err) {
db.close();
delete dbCache[server][version];
reject(err);
// db.close();
// delete dbCache[server][version];
ret = err;
return true;
}
}
Expand All @@ -699,14 +696,15 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
try {
store.createIndex(indexKey, index.keyPath || index.key || indexKey, index);
} catch (err2) {
db.close();
delete dbCache[server][version];
reject(err2);
// db.close();
// delete dbCache[server][version];
ret = err2;
return true;
}
}
});
});
return ret;
};

var _open = function _open(e, server, noServerMethods, version) {
Expand Down Expand Up @@ -753,10 +751,19 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
return _open(e, server, noServerMethods, version).then(resolve, reject);
};
request.onupgradeneeded = function (e) {
return createSchema(e, schema, e.target.result, reject, server, version);
var err = createSchema(e, schema, e.target.result, server, version);
if (err) {
// Firefox throws `AbortError` errors when doing such operations as `close`
// within `upgradeneeded`, so we have known errors execute instead in `onsuccess`;
// see http://stackoverflow.com/questions/36225779/aborterror-within-indexeddb-upgradeneeded-event
request.onsuccess = function (e) {
reject(err);
};
}
};
request.onerror = function (e) {
return reject(e);
e.preventDefault(); // For Firefox BadVersion errors; see https://bugzilla.mozilla.org/show_bug.cgi?id=872873
reject(e);
};
request.onblocked = function (e) {
var resume = new Promise(function (res, rej) {
Expand Down Expand Up @@ -793,14 +800,18 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr
return reject(e);
}; // No errors currently
request.onblocked = function (e) {
// The following addresses part of https://bugzilla.mozilla.org/show_bug.cgi?id=1220279
e = e.oldVersion === 1 || typeof Proxy === 'undefined' ? e : new Proxy(e, { get: function get(target, name) {
return name === 'newVersion' ? null : target[name];
} });
var resume = new Promise(function (res, rej) {
// We overwrite handlers rather than make a new
// delete() since the original request is still
// open and its onsuccess will still fire if
// the user unblocks by closing the blocking
// connection
request.onsuccess = function (ev) {
// Attempt to workaround Firefox event version problem: https://bugzilla.mozilla.org/show_bug.cgi?id=1220279
// The following are needed currently by PhantomJS: https://github.com/ariya/phantomjs/issues/14141
if (!('newVersion' in ev)) {
ev.newVersion = e.newVersion;
}
Expand Down
2 changes: 1 addition & 1 deletion dist/db.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/db.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/db.min.js.map

Large diffs are not rendered by default.

45 changes: 30 additions & 15 deletions src/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@
try {
result = modifyRecord(result);
} catch (err) {
transaction.abort();
reject(err);
return;
}
Expand All @@ -143,7 +142,6 @@
try {
results.push(mapper(result));
} catch (err) {
transaction.abort();
reject(err);
return;
}
Expand Down Expand Up @@ -449,7 +447,6 @@
try {
key = mongoifyKey(key);
} catch (e) {
transaction.abort();
reject(e);
return;
}
Expand Down Expand Up @@ -477,7 +474,6 @@
try {
key = mongoifyKey(key);
} catch (e) {
transaction.abort();
reject(e);
return;
}
Expand Down Expand Up @@ -528,7 +524,7 @@
return err;
};

const createSchema = function (e, schema, db, reject, server, version) {
const createSchema = function (e, schema, db, server, version) {
if (!schema || schema.length === 0) {
return;
}
Expand All @@ -547,6 +543,7 @@
}
}

let ret;
Object.keys(schema).some(function (tableName) {
const table = schema[tableName];
let store;
Expand All @@ -568,9 +565,9 @@
try {
store = db.createObjectStore(tableName, table.key);
} catch (err) {
db.close();
delete dbCache[server][version];
reject(err);
// db.close();
// delete dbCache[server][version];
ret = err;
return true;
}
}
Expand All @@ -595,14 +592,15 @@
try {
store.createIndex(indexKey, index.keyPath || index.key || indexKey, index);
} catch (err2) {
db.close();
delete dbCache[server][version];
reject(err2);
// db.close();
// delete dbCache[server][version];
ret = err2;
return true;
}
}
});
});
return ret;
};

const open = function (e, server, noServerMethods, version) {
Expand Down Expand Up @@ -641,11 +639,24 @@
return;
}
}
let request = indexedDB.open(server, version);
const request = indexedDB.open(server, version);

request.onsuccess = e => open(e, server, noServerMethods, version).then(resolve, reject);
request.onupgradeneeded = e => createSchema(e, schema, e.target.result, reject, server, version);
request.onerror = e => reject(e);
request.onupgradeneeded = e => {
let err = createSchema(e, schema, e.target.result, server, version);
if (err) {
// Firefox throws `AbortError` errors when doing such operations as `close`
// within `upgradeneeded`, so we have known errors execute instead in `onsuccess`;
// see http://stackoverflow.com/questions/36225779/aborterror-within-indexeddb-upgradeneeded-event
request.onsuccess = e => {
reject(err);
};
}
};
request.onerror = e => {
e.preventDefault(); // For Firefox BadVersion errors; see https://bugzilla.mozilla.org/show_bug.cgi?id=872873
reject(e);
};
request.onblocked = e => {
const resume = new Promise(function (res, rej) {
// We overwrite handlers rather than make a new
Expand Down Expand Up @@ -673,14 +684,18 @@
request.onsuccess = e => resolve(e);
request.onerror = e => reject(e); // No errors currently
request.onblocked = e => {
// The following addresses part of https://bugzilla.mozilla.org/show_bug.cgi?id=1220279
e = e.oldVersion === 1 || typeof Proxy === 'undefined' ? e : new Proxy(e, {get: function (target, name) {
return name === 'newVersion' ? null : target[name];
}});
const resume = new Promise(function (res, rej) {
// We overwrite handlers rather than make a new
// delete() since the original request is still
// open and its onsuccess will still fire if
// the user unblocks by closing the blocking
// connection
request.onsuccess = ev => {
// Attempt to workaround Firefox event version problem: https://bugzilla.mozilla.org/show_bug.cgi?id=1220279
// The following are needed currently by PhantomJS: https://github.com/ariya/phantomjs/issues/14141
if (!('newVersion' in ev)) {
ev.newVersion = e.newVersion;
}
Expand Down
1 change: 1 addition & 0 deletions tests/specs/_web-workers.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
(function (db, describe, it, expect, beforeEach, afterEach) {
'use strict';
describe('web workers', function () {
this.timeout(5000);
var initialVersion = 1;
var indexedDB = window.indexedDB || window.webkitIndexedDB ||
window.mozIndexedDB || window.oIndexedDB || window.msIndexedDB;
Expand Down
69 changes: 38 additions & 31 deletions tests/specs/bad-args.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
'use strict';
var key1, key2; // eslint-disable-line no-unused-vars
describe('bad args', function () {
this.timeout(5000);
var indexedDB = window.indexedDB || window.webkitIndexedDB ||
window.mozIndexedDB || window.oIndexedDB || window.msIndexedDB;

beforeEach(function (done) {
this.dbName = guid();

var req = indexedDB.open(this.dbName);
req.onsuccess = function () {
req.result.close();
done();
};
req.onupgradeneeded = function () {
var objStore = req.result.createObjectStore('names', {autoIncrement: true});
var person1 = {name: 'Alex'};
Expand All @@ -21,33 +25,24 @@
var addReq2 = objStore.add(person2);
addReq2.onsuccess = function (e2) {
key2 = e2.target.result;
req.result.close();
done();
};
};
};
req.onerror = function (e) {
console.log('error: ' + e);
};
req.onblocked = function (e) {
done(e);
console.log('blocked: ' + e);
};
});

afterEach(function (done) {
afterEach(function () {
if (this.server && !this.server.isClosed()) {
this.server.close();
}
this.server = undefined;

var req = indexedDB.deleteDatabase(this.dbName);

req.onsuccess = function () {
done();
};
req.onerror = function (e) {
console.log('failed to delete db', arguments);
};
req.onblocked = function (e) {
console.log('db blocked', arguments);
};
indexedDB.deleteDatabase(this.dbName);
});

describe('open', function () {
Expand All @@ -62,15 +57,17 @@
it('should catch an attempt to (auto-load) a schema with a conflicting name (when there is no noServerMethods)', function (done) {
var spec = this;
var req = indexedDB.open(this.dbName, 2);
req.onupgradeneeded = function () {
var storeNameConflictingWithMethod = 'count';
req.result.createObjectStore(storeNameConflictingWithMethod);
req.onsuccess = function () {
req.result.close();
db.open({server: spec.dbName, version: 2}).catch(function (err) {
expect(err.message).to.have.string('conflicts with db.js method names');
done();
});
};
req.onupgradeneeded = function () {
var storeNameConflictingWithMethod = 'count';
req.result.createObjectStore(storeNameConflictingWithMethod);
};
});
it('should treat version 0 as 1 being supplied (if db.js did not, it should throw an error)', function (done) {
db.open({server: this.dbName, version: 0}).then(function (s) {
Expand Down Expand Up @@ -163,7 +160,8 @@
expect(err.message).to.equal('Database has been closed');
return s[method]();
});
}, Promise.reject(new Error('Database has been closed'))).then(function (queryResult) {
}, Promise.reject(new Error('Database has been closed')))
.then(function (queryResult) {
queryResult.all().execute().catch(function (err) {
expect(err.message).to.equal('Database has been closed');
done();
Expand Down Expand Up @@ -218,21 +216,30 @@
});
});

it('delete: should catch bad args', function (done) {
var spec = this;
db.open({server: this.dbName}).then(function (s) {
db.delete(spec.dbName).catch(function (err) { // Other arguments (or missing arguments) do not throw
expect(err.type).to.equal('blocked');
s.close();
done();
describe('delete', function () {
it('should catch bad args', function (done) {
var spec = this;
var caught = false;
db.open({server: this.dbName}).then(function (s) {
db.delete(spec.dbName).catch(function (err) { // Other arguments (or missing arguments) do not throw
expect(err.type).to.equal('blocked');
s.close();
caught = true;
return err.resume;
}).then(function () {
expect(caught).to.be.true;
done();
});
});
});
});

it('cmp: should catch bad args', function (done) {
db.cmp(key1, null).catch(function (err) {
expect(err.name).to.equal('DataError');
done();
describe('cmp', function () {
it('cmp: should catch bad args', function (done) {
db.cmp(key1, null).catch(function (err) {
expect(err.name).to.equal('DataError');
done();
});
});
});
});
Expand Down
Loading

0 comments on commit 429a282

Please sign in to comment.