forked from indexeddbshim/IndexedDBShim
-
Notifications
You must be signed in to change notification settings - Fork 2
/
DOMException.js
132 lines (121 loc) · 4.19 KB
/
DOMException.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
(function(idbModules) {
'use strict';
/**
* Creates a native DOMException, for browsers that support it
* @returns {DOMException}
*/
function createNativeDOMException(name, message) {
var e = new DOMException.prototype.constructor(0, message);
e.name = name || 'DOMException';
e.message = message;
return e;
}
/**
* Creates a native DOMError, for browsers that support it
* @returns {DOMError}
*/
function createNativeDOMError(name, message) {
name = name || 'DOMError';
var e = new DOMError(name, message);
e.name === name || (e.name = name);
e.message === message || (e.message = message);
return e;
}
/**
* Creates a generic Error object
* @returns {Error}
*/
function createError(name, message) {
var e = new Error(message);
e.name = name || 'DOMException';
e.message = message;
return e;
}
/**
* Logs detailed error information to the console.
* @param {string} name
* @param {string} message
* @param {string|Error|null} error
*/
idbModules.util.logError = function(name, message, error) {
if (idbModules.DEBUG) {
if (error && error.message) {
error = error.message;
}
var method = typeof(console.error) === 'function' ? 'error' : 'log';
console[method](name + ': ' + message + '. ' + (error || ''));
console.trace && console.trace();
}
};
/**
* Finds the error argument. This is useful because some WebSQL callbacks
* pass the error as the first argument, and some pass it as the second argument.
* @param {array} args
* @returns {Error|DOMException|undefined}
*/
idbModules.util.findError = function(args) {
var err;
if (args) {
if (args.length === 1) {
return args[0];
}
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (arg instanceof Error || arg instanceof DOMException) {
return arg;
}
else if (arg && typeof arg.message === "string") {
err = arg;
}
}
}
return err;
};
var test, useNativeDOMException = false, useNativeDOMError = false;
// Test whether we can use the browser's native DOMException class
try {
test = createNativeDOMException('test name', 'test message');
if (test instanceof DOMException && test.name === 'test name' && test.message === 'test message') {
// Native DOMException works as expected
useNativeDOMException = true;
}
}
catch (e) {}
// Test whether we can use the browser's native DOMError class
try {
test = createNativeDOMError('test name', 'test message');
if (test instanceof DOMError && test.name === 'test name' && test.message === 'test message') {
// Native DOMError works as expected
useNativeDOMError = true;
}
}
catch (e) {}
if (useNativeDOMException) {
idbModules.DOMException = DOMException;
idbModules.util.createDOMException = function(name, message, error) {
idbModules.util.logError(name, message, error);
return createNativeDOMException(name, message);
};
}
else {
idbModules.DOMException = Error;
idbModules.util.createDOMException = function(name, message, error) {
idbModules.util.logError(name, message, error);
return createError(name, message);
};
}
if (useNativeDOMError) {
idbModules.DOMError = DOMError;
idbModules.util.createDOMError = function(name, message, error) {
idbModules.util.logError(name, message, error);
return createNativeDOMError(name, message);
};
}
else {
idbModules.DOMError = Error;
idbModules.util.createDOMError = function(name, message, error) {
idbModules.util.logError(name, message, error);
return createError(name, message);
};
}
}(idbModules));