From 66aa76e5014a1415f8e69a7bfcbebfdaf7bc2868 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Thu, 4 Jan 2018 16:26:41 -0800 Subject: [PATCH] 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 --- js/backup.js | 137 +++++++++++++++++++++----------------------- test/backup_test.js | 31 ++++++++++ 2 files changed, 95 insertions(+), 73 deletions(-) diff --git a/js/backup.js b/js/backup.js index e9e3deb86..98e760d8e 100644 --- a/js/backup.js +++ b/js/backup.js @@ -102,12 +102,11 @@ _.each(storeNames, function(storeName) { var transaction = idb_db.transaction(storeNames, 'readwrite'); transaction.onerror = function(e) { - var error = e.target.error; - console.log( - 'exportToJsonFile: transaction error', - error && error.stack ? error.stack : error + handleDOMException( + 'exportToJsonFile transaction error (store: ' + storeName + ')', + transaction.error, + reject ); - reject(error); }; transaction.oncomplete = function() { console.log('transaction complete'); @@ -117,13 +116,11 @@ var request = store.openCursor(); var count = 0; request.onerror = function(e) { - var error = e.target.error; - console.log( - 'Error attempting to export store', - storeName, - error && error.stack ? error.stack : error + handleDOMException( + 'exportToJsonFile request error (store: ' + storeNames + ')', + request.error, + reject ); - reject(error); }; request.onsuccess = function(event) { 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 * from the database, so keys could clash @@ -195,12 +202,11 @@ var transaction = idb_db.transaction(storeNames, 'readwrite'); transaction.onerror = function(e) { - var error = e.target.error; - console.log( - 'importFromJsonString error:', - error && error.stack ? error.stack : error + handleDOMException( + 'importFromJsonString transaction error', + transaction.error, + reject ); - reject(error || new Error('importFromJsonString: transaction.onerror')); }; transaction.oncomplete = finish.bind(null, 'transaction complete'); @@ -230,15 +236,11 @@ } }; request.onerror = function(e) { - var error = e.target.error; - console.log( - 'Error adding object to store', - storeName, - ':', - toAdd, - error && error.stack ? error.stack : error + handleDOMException( + 'importFromJsonString request error (store: ' + storeName + ')', + request.error, + reject ); - reject(error || new Error('importFromJsonString: request.onerror')); }; }); }); @@ -399,14 +401,11 @@ return new Promise(function(resolve, reject) { var transaction = idb_db.transaction('messages', 'readwrite'); transaction.onerror = function(e) { - var error = e.target.error; - console.log( - 'exportConversation transaction error for conversation', - name, - ':', - error && error.stack ? error.stack : error + handleDOMException( + 'exportConversation transaction error (conversation: ' + name + ')', + transaction.error, + reject ); - return reject(error || new Error('exportConversation: transaction.onerror')); }; transaction.oncomplete = function() { // this doesn't really mean anything - we may have attachment processing to do @@ -424,14 +423,11 @@ stream.write('{"messages":['); request.onerror = function(e) { - var error = e.target.error; - console.log( - 'exportConversation: error pulling messages for conversation', - name, - ':', - error && error.stack ? error.stack : error + handleDOMException( + 'exportConversation request error (conversation: ' + name + ')', + request.error, + reject ); - return reject(error || new Error('exportConversation: request.onerror')); }; request.onsuccess = function(event) { var cursor = event.target.result; @@ -515,12 +511,11 @@ return new Promise(function(resolve, reject) { var transaction = idb_db.transaction('conversations', 'readwrite'); transaction.onerror = function(e) { - var error = e.target.error; - console.log( - 'exportConversations: transaction error:', - error && error.stack ? error.stack : error + handleDOMException( + 'exportConversations transaction error', + transaction.error, + reject ); - return reject(error || new Error('exportConversations: transaction.onerror')); }; transaction.oncomplete = function() { // not really very useful - fires at unexpected times @@ -530,12 +525,11 @@ var store = transaction.objectStore('conversations'); var request = store.openCursor(); request.onerror = function(e) { - var error = e.target.error; - console.log( - 'exportConversations: error pulling conversations:', - error && error.stack ? error.stack : error + handleDOMException( + 'exportConversations request error', + request.error, + reject ); - return reject(error || new Error('exportConversations: request.onerror')); }; request.onsuccess = function(event) { var cursor = event.target.result; @@ -621,12 +615,11 @@ var transaction = idb_db.transaction('messages', 'readwrite'); transaction.onerror = function(e) { - var error = e.target.error; - console.log( - 'saveAllMessages transaction error:', - error && error.stack ? error.stack : error + handleDOMException( + 'saveAllMessages transaction error', + transaction.error, + reject ); - return reject(error || new Error('saveAllMessages: transaction.onerror')); }; transaction.oncomplete = finish.bind(null, 'transaction complete'); @@ -650,12 +643,11 @@ } }; request.onerror = function(e) { - var error = e.target.error; - console.log( - 'Error adding object to store:', - error && error.stack ? error.stack : error + handleDOMException( + 'saveAllMessages request error', + request.error, + reject ); - reject(error || new Error('saveAllMessages: request.onerror')); }; }); }); @@ -748,12 +740,11 @@ transaction.oncomplete = finish.bind(null, 'transaction complete'); transaction.onerror = function(e) { - var error = e.target.error; - console.log( - 'saveAllMessages transaction error:', - error && error.stack ? error.stack : error + handleDOMException( + 'clearAllStores transaction error', + transaction.error, + reject ); - return reject(error); }; var count = 0; @@ -772,12 +763,11 @@ }; request.onerror = function(e) { - var error = e.target.error; - console.log( - 'clearAllStores transaction error:', - error && error.stack ? error.stack : error + handleDOMException( + 'clearAllStores request error', + request.error, + reject ); - return reject(error || new Error('clearAllStores: request.onerror')); }; }); }); @@ -854,11 +844,12 @@ }); }, // for testing - sanitizeFileName: sanitizeFileName, - trimFileName: trimFileName, - getAttachmentFileName: getAttachmentFileName, - getConversationDirName: getConversationDirName, - getConversationLoggingName: getConversationLoggingName + handleDOMException, + sanitizeFileName, + trimFileName, + getAttachmentFileName, + getConversationDirName, + getConversationLoggingName, }; }()); diff --git a/test/backup_test.js b/test/backup_test.js index fadae90bd..89054583a 100644 --- a/test/backup_test.js +++ b/test/backup_test.js @@ -1,6 +1,37 @@ 'use strict'; 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() { it('leaves a basic string alone', function() { var initial = 'Hello, how are you #5 (\'fine\' + great).jpg';