indexeddbblob.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*!
  2. {
  3. "name": "IndexedDB Blob",
  4. "property": "indexeddbblob"
  5. }
  6. !*/
  7. /* DOC
  8. Detects if the browser can save File/Blob objects to IndexedDB
  9. */
  10. define(['Modernizr', 'addTest', 'prefixed', 'test/indexeddb'], function(Modernizr, addTest, prefixed) {
  11. // Vendors had inconsistent prefixing with the experimental Indexed DB:
  12. // - Webkit's implementation is accessible through webkitIndexedDB
  13. // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB
  14. // For speed, we don't test the legacy (and beta-only) indexedDB
  15. Modernizr.addAsyncTest(function() {
  16. var indexeddb;
  17. var dbname = 'detect-blob-support';
  18. var supportsBlob = false;
  19. var openRequest;
  20. var db;
  21. var putRequest;
  22. try {
  23. indexeddb = prefixed('indexedDB', window);
  24. } catch (e) {
  25. }
  26. if (!(Modernizr.indexeddb && Modernizr.indexeddb.deletedatabase)) {
  27. return false;
  28. }
  29. // Calling `deleteDatabase` in a try…catch because some contexts (e.g. data URIs)
  30. // will throw a `SecurityError`
  31. try {
  32. indexeddb.deleteDatabase(dbname).onsuccess = function() {
  33. openRequest = indexeddb.open(dbname, 1);
  34. openRequest.onupgradeneeded = function() {
  35. openRequest.result.createObjectStore('store');
  36. };
  37. openRequest.onsuccess = function() {
  38. db = openRequest.result;
  39. try {
  40. putRequest = db.transaction('store', 'readwrite').objectStore('store').put(new Blob(), 'key');
  41. putRequest.onsuccess = function() {
  42. supportsBlob = true;
  43. };
  44. putRequest.onerror = function() {
  45. supportsBlob = false;
  46. };
  47. }
  48. catch (e) {
  49. supportsBlob = false;
  50. }
  51. finally {
  52. addTest('indexeddbblob', supportsBlob);
  53. db.close();
  54. indexeddb.deleteDatabase(dbname);
  55. }
  56. };
  57. };
  58. }
  59. catch (e) {
  60. addTest('indexeddbblob', false);
  61. }
  62. });
  63. });