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:
parent
8fd0adc486
commit
66aa76e501
2 changed files with 95 additions and 73 deletions
137
js/backup.js
137
js/backup.js
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
|
|
@ -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';
|
||||||
|
|
Loading…
Add table
Reference in a new issue