indexeddb.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*!
  2. {
  3. "name": "IndexedDB",
  4. "property": "indexeddb",
  5. "caniuse": "indexeddb",
  6. "tags": ["storage"],
  7. "polyfills": ["indexeddb"],
  8. "async": true
  9. }
  10. !*/
  11. /* DOC
  12. Detects support for the IndexedDB client-side storage API (final spec).
  13. */
  14. define(['Modernizr', 'prefixed', 'addTest'], function(Modernizr, prefixed, addTest) {
  15. // Vendors had inconsistent prefixing with the experimental Indexed DB:
  16. // - Webkit's implementation is accessible through webkitIndexedDB
  17. // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB
  18. // For speed, we don't test the legacy (and beta-only) indexedDB
  19. Modernizr.addAsyncTest(function() {
  20. var indexeddb;
  21. try {
  22. // Firefox throws a Security Error when cookies are disabled
  23. indexeddb = prefixed('indexedDB', window);
  24. } catch (e) {
  25. }
  26. if (indexeddb) {
  27. var testDBName = 'modernizr-' + Math.random();
  28. var req;
  29. try {
  30. req = indexeddb.open(testDBName);
  31. } catch (e) {
  32. addTest('indexeddb', false);
  33. return;
  34. }
  35. req.onerror = function(event) {
  36. if (req.error && (req.error.name === 'InvalidStateError' || req.error.name === 'UnknownError')) {
  37. addTest('indexeddb', false);
  38. event.preventDefault();
  39. } else {
  40. addTest('indexeddb', true);
  41. detectDeleteDatabase(indexeddb, testDBName);
  42. }
  43. };
  44. req.onsuccess = function() {
  45. addTest('indexeddb', true);
  46. detectDeleteDatabase(indexeddb, testDBName);
  47. };
  48. } else {
  49. addTest('indexeddb', false);
  50. }
  51. });
  52. function detectDeleteDatabase(indexeddb, testDBName) {
  53. var deleteReq = indexeddb.deleteDatabase(testDBName);
  54. deleteReq.onsuccess = function() {
  55. addTest('indexeddb.deletedatabase', true);
  56. };
  57. deleteReq.onerror = function() {
  58. addTest('indexeddb.deletedatabase', false);
  59. };
  60. }
  61. });