Log out information from DOMException when import fails (#1923)

This should give us the information we're looking for when imports fail
mysteriously!

https://developer.mozilla.org/en-US/docs/Web/API/DOMException
This commit is contained in:
Scott Nonnenberg 2018-01-04 16:26:41 -08:00 committed by GitHub
parent 8fd0adc486
commit 66aa76e501
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 95 additions and 73 deletions

View file

@ -102,12 +102,11 @@
_.each(storeNames, function(storeName) { _.each(storeNames, function(storeName) {
var transaction = idb_db.transaction(storeNames, 'readwrite'); var transaction = idb_db.transaction(storeNames, 'readwrite');
transaction.onerror = function(e) { transaction.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'exportToJsonFile transaction error (store: ' + storeName + ')',
'exportToJsonFile: transaction error', transaction.error,
error && error.stack ? error.stack : error reject
); );
reject(error);
}; };
transaction.oncomplete = function() { transaction.oncomplete = function() {
console.log('transaction complete'); console.log('transaction complete');
@ -117,13 +116,11 @@
var request = store.openCursor(); var request = store.openCursor();
var count = 0; var count = 0;
request.onerror = function(e) { request.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'exportToJsonFile request error (store: ' + storeNames + ')',
'Error attempting to export store', request.error,
storeName, reject
error && error.stack ? error.stack : error
); );
reject(error);
}; };
request.onsuccess = function(event) { request.onsuccess = function(event) {
if (count === 0) { if (count === 0) {
@ -169,6 +166,16 @@
}); });
} }
function handleDOMException(prefix, error, reject) {
console.log(
prefix + ':',
error && error.name,
error && error.message,
error && error.code
);
reject(error || new Error(prefix));
}
/** /**
* Import data from JSON into an IndexedDB database. This does not delete any existing data * Import data from JSON into an IndexedDB database. This does not delete any existing data
* from the database, so keys could clash * from the database, so keys could clash
@ -195,12 +202,11 @@
var transaction = idb_db.transaction(storeNames, 'readwrite'); var transaction = idb_db.transaction(storeNames, 'readwrite');
transaction.onerror = function(e) { transaction.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'importFromJsonString transaction error',
'importFromJsonString error:', transaction.error,
error && error.stack ? error.stack : error reject
); );
reject(error || new Error('importFromJsonString: transaction.onerror'));
}; };
transaction.oncomplete = finish.bind(null, 'transaction complete'); transaction.oncomplete = finish.bind(null, 'transaction complete');
@ -230,15 +236,11 @@
} }
}; };
request.onerror = function(e) { request.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'importFromJsonString request error (store: ' + storeName + ')',
'Error adding object to store', request.error,
storeName, reject
':',
toAdd,
error && error.stack ? error.stack : error
); );
reject(error || new Error('importFromJsonString: request.onerror'));
}; };
}); });
}); });
@ -399,14 +401,11 @@
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var transaction = idb_db.transaction('messages', 'readwrite'); var transaction = idb_db.transaction('messages', 'readwrite');
transaction.onerror = function(e) { transaction.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'exportConversation transaction error (conversation: ' + name + ')',
'exportConversation transaction error for conversation', transaction.error,
name, reject
':',
error && error.stack ? error.stack : error
); );
return reject(error || new Error('exportConversation: transaction.onerror'));
}; };
transaction.oncomplete = function() { transaction.oncomplete = function() {
// this doesn't really mean anything - we may have attachment processing to do // this doesn't really mean anything - we may have attachment processing to do
@ -424,14 +423,11 @@
stream.write('{"messages":['); stream.write('{"messages":[');
request.onerror = function(e) { request.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'exportConversation request error (conversation: ' + name + ')',
'exportConversation: error pulling messages for conversation', request.error,
name, reject
':',
error && error.stack ? error.stack : error
); );
return reject(error || new Error('exportConversation: request.onerror'));
}; };
request.onsuccess = function(event) { request.onsuccess = function(event) {
var cursor = event.target.result; var cursor = event.target.result;
@ -515,12 +511,11 @@
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var transaction = idb_db.transaction('conversations', 'readwrite'); var transaction = idb_db.transaction('conversations', 'readwrite');
transaction.onerror = function(e) { transaction.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'exportConversations transaction error',
'exportConversations: transaction error:', transaction.error,
error && error.stack ? error.stack : error reject
); );
return reject(error || new Error('exportConversations: transaction.onerror'));
}; };
transaction.oncomplete = function() { transaction.oncomplete = function() {
// not really very useful - fires at unexpected times // not really very useful - fires at unexpected times
@ -530,12 +525,11 @@
var store = transaction.objectStore('conversations'); var store = transaction.objectStore('conversations');
var request = store.openCursor(); var request = store.openCursor();
request.onerror = function(e) { request.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'exportConversations request error',
'exportConversations: error pulling conversations:', request.error,
error && error.stack ? error.stack : error reject
); );
return reject(error || new Error('exportConversations: request.onerror'));
}; };
request.onsuccess = function(event) { request.onsuccess = function(event) {
var cursor = event.target.result; var cursor = event.target.result;
@ -621,12 +615,11 @@
var transaction = idb_db.transaction('messages', 'readwrite'); var transaction = idb_db.transaction('messages', 'readwrite');
transaction.onerror = function(e) { transaction.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'saveAllMessages transaction error',
'saveAllMessages transaction error:', transaction.error,
error && error.stack ? error.stack : error reject
); );
return reject(error || new Error('saveAllMessages: transaction.onerror'));
}; };
transaction.oncomplete = finish.bind(null, 'transaction complete'); transaction.oncomplete = finish.bind(null, 'transaction complete');
@ -650,12 +643,11 @@
} }
}; };
request.onerror = function(e) { request.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'saveAllMessages request error',
'Error adding object to store:', request.error,
error && error.stack ? error.stack : error reject
); );
reject(error || new Error('saveAllMessages: request.onerror'));
}; };
}); });
}); });
@ -748,12 +740,11 @@
transaction.oncomplete = finish.bind(null, 'transaction complete'); transaction.oncomplete = finish.bind(null, 'transaction complete');
transaction.onerror = function(e) { transaction.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'clearAllStores transaction error',
'saveAllMessages transaction error:', transaction.error,
error && error.stack ? error.stack : error reject
); );
return reject(error);
}; };
var count = 0; var count = 0;
@ -772,12 +763,11 @@
}; };
request.onerror = function(e) { request.onerror = function(e) {
var error = e.target.error; handleDOMException(
console.log( 'clearAllStores request error',
'clearAllStores transaction error:', request.error,
error && error.stack ? error.stack : error reject
); );
return reject(error || new Error('clearAllStores: request.onerror'));
}; };
}); });
}); });
@ -854,11 +844,12 @@
}); });
}, },
// for testing // for testing
sanitizeFileName: sanitizeFileName, handleDOMException,
trimFileName: trimFileName, sanitizeFileName,
getAttachmentFileName: getAttachmentFileName, trimFileName,
getConversationDirName: getConversationDirName, getAttachmentFileName,
getConversationLoggingName: getConversationLoggingName getConversationDirName,
getConversationLoggingName,
}; };
}()); }());

View file

@ -1,6 +1,37 @@
'use strict'; 'use strict';
describe('Backup', function() { describe('Backup', function() {
describe('handleDOMException', function() {
it('handles null, still calls reject', function() {
var called = 0;
var reject = function() {
called += 1;
};
var error = null;
var prefix = 'something';
Whisper.Backup.handleDOMException(prefix, error, reject);
assert.strictEqual(called, 1);
});
it('handles object code and message', function() {
var called = 0;
var reject = function() {
called += 1;
};
var error = {
code: 4,
message: 'some cryptic error',
};
var prefix = 'something';
Whisper.Backup.handleDOMException(prefix, error, reject);
assert.strictEqual(called, 1);
});
});
describe('sanitizeFileName', function() { describe('sanitizeFileName', function() {
it('leaves a basic string alone', function() { it('leaves a basic string alone', function() {
var initial = 'Hello, how are you #5 (\'fine\' + great).jpg'; var initial = 'Hello, how are you #5 (\'fine\' + great).jpg';