PageRenderTime 54ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/scripts/viewer/closure-library/closure/goog/db/error.js

https://bitbucket.org/nrg/cnda_xnat_prod_webapp
JavaScript | 364 lines | 217 code | 31 blank | 116 comment | 14 complexity | f7b68f0c166076a27215cf186aa766ca MD5 | raw file
Possible License(s): Apache-2.0, GPL-2.0
  1. // Copyright 2011 The Closure Library Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS-IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. /**
  15. * @fileoverview Error classes for the IndexedDB wrapper.
  16. *
  17. */
  18. goog.provide('goog.db.Error');
  19. goog.provide('goog.db.Error.ErrorCode');
  20. goog.provide('goog.db.Error.ErrorName');
  21. goog.provide('goog.db.Error.VersionChangeBlockedError');
  22. goog.require('goog.debug.Error');
  23. /**
  24. * A database error. Since the stack trace can be unhelpful in an asynchronous
  25. * context, the error provides a message about where it was produced.
  26. *
  27. * @param {number|!DOMError} error The DOMError instance returned by the
  28. * browser for Chrome22+, or an error code for previous versions.
  29. * @param {string} context A description of where the error occured.
  30. * @param {string=} opt_message Additional message.
  31. * @constructor
  32. * @extends {goog.debug.Error}
  33. * @final
  34. */
  35. goog.db.Error = function(error, context, opt_message) {
  36. var errorCode = null;
  37. var internalError = null;
  38. if (goog.isNumber(error)) {
  39. errorCode = error;
  40. internalError = {name: goog.db.Error.getName(errorCode)};
  41. } else {
  42. internalError = error;
  43. errorCode = goog.db.Error.getCode(error.name);
  44. }
  45. /**
  46. * The code for this error.
  47. *
  48. * @type {number}
  49. */
  50. this.code = errorCode;
  51. /**
  52. * The DOMException as returned by the browser.
  53. *
  54. * @type {!DOMError}
  55. * @private
  56. */
  57. this.error_ = /** @type {!DOMError} */ (internalError);
  58. var msg = 'Error ' + context + ': ' + this.getName();
  59. if (opt_message) {
  60. msg += ', ' + opt_message;
  61. }
  62. goog.db.Error.base(this, 'constructor', msg);
  63. };
  64. goog.inherits(goog.db.Error, goog.debug.Error);
  65. /**
  66. * @return {string} The name of the error.
  67. */
  68. goog.db.Error.prototype.getName = function() {
  69. return this.error_.name;
  70. };
  71. /**
  72. * A specific kind of database error. If a Version Change is unable to proceed
  73. * due to other open database connections, it will block and this error will be
  74. * thrown.
  75. *
  76. * @constructor
  77. * @extends {goog.debug.Error}
  78. * @final
  79. */
  80. goog.db.Error.VersionChangeBlockedError = function() {
  81. goog.db.Error.VersionChangeBlockedError.base(
  82. this, 'constructor', 'Version change blocked');
  83. };
  84. goog.inherits(goog.db.Error.VersionChangeBlockedError, goog.debug.Error);
  85. /**
  86. * Synthetic error codes for database errors, for use when IndexedDB
  87. * support is not available. This numbering differs in practice
  88. * from the browser implementations, but it is not meant to be reliable:
  89. * this object merely ensures that goog.db.Error is loadable on platforms
  90. * that do not support IndexedDB.
  91. *
  92. * @enum {number}
  93. * @private
  94. */
  95. goog.db.Error.DatabaseErrorCode_ = {
  96. UNKNOWN_ERR: 1,
  97. NON_TRANSIENT_ERR: 2,
  98. NOT_FOUND_ERR: 3,
  99. CONSTRAINT_ERR: 4,
  100. DATA_ERR: 5,
  101. NOT_ALLOWED_ERR: 6,
  102. TRANSACTION_INACTIVE_ERR: 7,
  103. ABORT_ERR: 8,
  104. READ_ONLY_ERR: 9,
  105. TRANSIENT_ERR: 11,
  106. TIMEOUT_ERR: 10,
  107. QUOTA_ERR: 11,
  108. INVALID_ACCESS_ERR: 12,
  109. INVALID_STATE_ERR: 13
  110. };
  111. /**
  112. * Error codes for database errors.
  113. * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBDatabaseException
  114. *
  115. * @enum {number}
  116. */
  117. goog.db.Error.ErrorCode = {
  118. UNKNOWN_ERR: (goog.global.IDBDatabaseException ||
  119. goog.global.webkitIDBDatabaseException ||
  120. goog.db.Error.DatabaseErrorCode_).UNKNOWN_ERR,
  121. NON_TRANSIENT_ERR: (goog.global.IDBDatabaseException ||
  122. goog.global.webkitIDBDatabaseException ||
  123. goog.db.Error.DatabaseErrorCode_).NON_TRANSIENT_ERR,
  124. NOT_FOUND_ERR: (goog.global.IDBDatabaseException ||
  125. goog.global.webkitIDBDatabaseException ||
  126. goog.db.Error.DatabaseErrorCode_).NOT_FOUND_ERR,
  127. CONSTRAINT_ERR: (goog.global.IDBDatabaseException ||
  128. goog.global.webkitIDBDatabaseException ||
  129. goog.db.Error.DatabaseErrorCode_).CONSTRAINT_ERR,
  130. DATA_ERR: (goog.global.IDBDatabaseException ||
  131. goog.global.webkitIDBDatabaseException ||
  132. goog.db.Error.DatabaseErrorCode_).DATA_ERR,
  133. NOT_ALLOWED_ERR: (goog.global.IDBDatabaseException ||
  134. goog.global.webkitIDBDatabaseException ||
  135. goog.db.Error.DatabaseErrorCode_).NOT_ALLOWED_ERR,
  136. TRANSACTION_INACTIVE_ERR: (goog.global.IDBDatabaseException ||
  137. goog.global.webkitIDBDatabaseException ||
  138. goog.db.Error.DatabaseErrorCode_).TRANSACTION_INACTIVE_ERR,
  139. ABORT_ERR: (goog.global.IDBDatabaseException ||
  140. goog.global.webkitIDBDatabaseException ||
  141. goog.db.Error.DatabaseErrorCode_).ABORT_ERR,
  142. READ_ONLY_ERR: (goog.global.IDBDatabaseException ||
  143. goog.global.webkitIDBDatabaseException ||
  144. goog.db.Error.DatabaseErrorCode_).READ_ONLY_ERR,
  145. TIMEOUT_ERR: (goog.global.IDBDatabaseException ||
  146. goog.global.webkitIDBDatabaseException ||
  147. goog.db.Error.DatabaseErrorCode_).TIMEOUT_ERR,
  148. QUOTA_ERR: (goog.global.IDBDatabaseException ||
  149. goog.global.webkitIDBDatabaseException ||
  150. goog.db.Error.DatabaseErrorCode_).QUOTA_ERR,
  151. INVALID_ACCESS_ERR: (goog.global.DOMException ||
  152. goog.db.Error.DatabaseErrorCode_).INVALID_ACCESS_ERR,
  153. INVALID_STATE_ERR: (goog.global.DOMException ||
  154. goog.db.Error.DatabaseErrorCode_).INVALID_STATE_ERR
  155. };
  156. /**
  157. * Translates an error code into a more useful message.
  158. *
  159. * @param {number} code Error code.
  160. * @return {string} A debug message.
  161. */
  162. goog.db.Error.getMessage = function(code) {
  163. switch (code) {
  164. case goog.db.Error.ErrorCode.UNKNOWN_ERR:
  165. return 'Unknown error';
  166. case goog.db.Error.ErrorCode.NON_TRANSIENT_ERR:
  167. return 'Invalid operation';
  168. case goog.db.Error.ErrorCode.NOT_FOUND_ERR:
  169. return 'Required database object not found';
  170. case goog.db.Error.ErrorCode.CONSTRAINT_ERR:
  171. return 'Constraint unsatisfied';
  172. case goog.db.Error.ErrorCode.DATA_ERR:
  173. return 'Invalid data';
  174. case goog.db.Error.ErrorCode.NOT_ALLOWED_ERR:
  175. return 'Operation disallowed';
  176. case goog.db.Error.ErrorCode.TRANSACTION_INACTIVE_ERR:
  177. return 'Transaction not active';
  178. case goog.db.Error.ErrorCode.ABORT_ERR:
  179. return 'Request aborted';
  180. case goog.db.Error.ErrorCode.READ_ONLY_ERR:
  181. return 'Modifying operation not allowed in a read-only transaction';
  182. case goog.db.Error.ErrorCode.TIMEOUT_ERR:
  183. return 'Transaction timed out';
  184. case goog.db.Error.ErrorCode.QUOTA_ERR:
  185. return 'Database storage space quota exceeded';
  186. case goog.db.Error.ErrorCode.INVALID_ACCESS_ERR:
  187. return 'Invalid operation';
  188. case goog.db.Error.ErrorCode.INVALID_STATE_ERR:
  189. return 'Invalid state';
  190. default:
  191. return 'Unrecognized exception with code ' + code;
  192. }
  193. };
  194. /**
  195. * Names of all possible errors as returned from the browser.
  196. * @see http://www.w3.org/TR/IndexedDB/#exceptions
  197. * @enum {string}
  198. */
  199. goog.db.Error.ErrorName = {
  200. ABORT_ERR: 'AbortError',
  201. CONSTRAINT_ERR: 'ConstraintError',
  202. DATA_CLONE_ERR: 'DataCloneError',
  203. DATA_ERR: 'DataError',
  204. INVALID_ACCESS_ERR: 'InvalidAccessError',
  205. INVALID_STATE_ERR: 'InvalidStateError',
  206. NOT_FOUND_ERR: 'NotFoundError',
  207. QUOTA_EXCEEDED_ERR: 'QuotaExceededError',
  208. READ_ONLY_ERR: 'ReadOnlyError',
  209. SYNTAX_ERROR: 'SyntaxError',
  210. TIMEOUT_ERR: 'TimeoutError',
  211. TRANSACTION_INACTIVE_ERR: 'TransactionInactiveError',
  212. UNKNOWN_ERR: 'UnknownError',
  213. VERSION_ERR: 'VersionError'
  214. };
  215. /**
  216. * Translates an error name to an error code. This is purely kept for backwards
  217. * compatibility with Chrome21.
  218. *
  219. * @param {string} name The name of the erorr.
  220. * @return {number} The error code corresponding to the error.
  221. */
  222. goog.db.Error.getCode = function(name) {
  223. switch (name) {
  224. case goog.db.Error.ErrorName.UNKNOWN_ERR:
  225. return goog.db.Error.ErrorCode.UNKNOWN_ERR;
  226. case goog.db.Error.ErrorName.NOT_FOUND_ERR:
  227. return goog.db.Error.ErrorCode.NOT_FOUND_ERR;
  228. case goog.db.Error.ErrorName.CONSTRAINT_ERR:
  229. return goog.db.Error.ErrorCode.CONSTRAINT_ERR;
  230. case goog.db.Error.ErrorName.DATA_ERR:
  231. return goog.db.Error.ErrorCode.DATA_ERR;
  232. case goog.db.Error.ErrorName.TRANSACTION_INACTIVE_ERR:
  233. return goog.db.Error.ErrorCode.TRANSACTION_INACTIVE_ERR;
  234. case goog.db.Error.ErrorName.ABORT_ERR:
  235. return goog.db.Error.ErrorCode.ABORT_ERR;
  236. case goog.db.Error.ErrorName.READ_ONLY_ERR:
  237. return goog.db.Error.ErrorCode.READ_ONLY_ERR;
  238. case goog.db.Error.ErrorName.TIMEOUT_ERR:
  239. return goog.db.Error.ErrorCode.TIMEOUT_ERR;
  240. case goog.db.Error.ErrorName.QUOTA_EXCEEDED_ERR:
  241. return goog.db.Error.ErrorCode.QUOTA_ERR;
  242. case goog.db.Error.ErrorName.INVALID_ACCESS_ERR:
  243. return goog.db.Error.ErrorCode.INVALID_ACCESS_ERR;
  244. case goog.db.Error.ErrorName.INVALID_STATE_ERR:
  245. return goog.db.Error.ErrorCode.INVALID_STATE_ERR;
  246. default:
  247. return goog.db.Error.ErrorCode.UNKNOWN_ERR;
  248. }
  249. };
  250. /**
  251. * Converts an error code used by the old spec, to an error name used by the
  252. * latest spec.
  253. * @see http://www.w3.org/TR/IndexedDB/#exceptions
  254. *
  255. * @param {!goog.db.Error.ErrorCode|number} code The error code to convert.
  256. * @return {!goog.db.Error.ErrorName} The corresponding name of the error.
  257. */
  258. goog.db.Error.getName = function(code) {
  259. switch (code) {
  260. case goog.db.Error.ErrorCode.UNKNOWN_ERR:
  261. return goog.db.Error.ErrorName.UNKNOWN_ERR;
  262. case goog.db.Error.ErrorCode.NOT_FOUND_ERR:
  263. return goog.db.Error.ErrorName.NOT_FOUND_ERR;
  264. case goog.db.Error.ErrorCode.CONSTRAINT_ERR:
  265. return goog.db.Error.ErrorName.CONSTRAINT_ERR;
  266. case goog.db.Error.ErrorCode.DATA_ERR:
  267. return goog.db.Error.ErrorName.DATA_ERR;
  268. case goog.db.Error.ErrorCode.TRANSACTION_INACTIVE_ERR:
  269. return goog.db.Error.ErrorName.TRANSACTION_INACTIVE_ERR;
  270. case goog.db.Error.ErrorCode.ABORT_ERR:
  271. return goog.db.Error.ErrorName.ABORT_ERR;
  272. case goog.db.Error.ErrorCode.READ_ONLY_ERR:
  273. return goog.db.Error.ErrorName.READ_ONLY_ERR;
  274. case goog.db.Error.ErrorCode.TIMEOUT_ERR:
  275. return goog.db.Error.ErrorName.TIMEOUT_ERR;
  276. case goog.db.Error.ErrorCode.QUOTA_ERR:
  277. return goog.db.Error.ErrorName.QUOTA_EXCEEDED_ERR;
  278. case goog.db.Error.ErrorCode.INVALID_ACCESS_ERR:
  279. return goog.db.Error.ErrorName.INVALID_ACCESS_ERR;
  280. case goog.db.Error.ErrorCode.INVALID_STATE_ERR:
  281. return goog.db.Error.ErrorName.INVALID_STATE_ERR;
  282. default:
  283. return goog.db.Error.ErrorName.UNKNOWN_ERR;
  284. }
  285. };
  286. /**
  287. * Constructs an goog.db.Error instance from an IDBRequest. This abstraction is
  288. * necessary to provide backwards compatibility with Chrome21.
  289. *
  290. * @param {!IDBRequest} request The request that failed.
  291. * @param {string} message The error message to add to err if it's wrapped.
  292. * @return {!goog.db.Error} The error that caused the failure.
  293. */
  294. goog.db.Error.fromRequest = function(request, message) {
  295. if ('error' in request) {
  296. // Chrome 21 and before.
  297. return new goog.db.Error(request.error, message);
  298. } else if ('name' in request) {
  299. // Chrome 22+.
  300. var errorName = goog.db.Error.getName(request.errorCode);
  301. return new goog.db.Error(
  302. /**@type {!DOMError} */ ({name: errorName}), message);
  303. } else {
  304. return new goog.db.Error(/** @type {!DOMError} */ (
  305. {name: goog.db.Error.ErrorName.UNKNOWN_ERR}), message);
  306. }
  307. };
  308. /**
  309. * Constructs an goog.db.Error instance from an DOMException. This abstraction
  310. * is necessary to provide backwards compatibility with Chrome21.
  311. *
  312. * @param {!IDBDatabaseException} ex The exception that was thrown.
  313. * @param {string} message The error message to add to err if it's wrapped.
  314. * @return {!goog.db.Error} The error that caused the failure.
  315. * @suppress {invalidCasts} The cast from IDBDatabaseException to DOMError
  316. * is invalid and will not compile.
  317. */
  318. goog.db.Error.fromException = function(ex, message) {
  319. if ('name' in ex) {
  320. // Chrome 22+.
  321. var errorMessage = message + ': ' + ex.message;
  322. return new goog.db.Error(/** @type {!DOMError} */ (ex), errorMessage);
  323. } else if ('code' in ex) {
  324. // Chrome 21 and before.
  325. var errorName = goog.db.Error.getName(ex.code);
  326. var errorMessage = message + ': ' + ex.message;
  327. return new goog.db.Error(
  328. /** @type {!DOMError} */ ({name: errorName}), errorMessage);
  329. } else {
  330. return new goog.db.Error(/** @type {!DOMError} */ (
  331. {name: goog.db.Error.ErrorName.UNKNOWN_ERR}), message);
  332. }
  333. };