Because it makes attempts to open the database in other tabs hang until that tab is close / the database is closed.
Unified · Split
| @@ -3,44 +3,47 @@ class app.DB · 2 unmodified lines | ||
| 3 | 3 | |
| 4 | 4 | constructor: -> |
| 5 | 5 | @useIndexedDB = @useIndexedDB() |
| 6 | + @callbacks = [] | |
| 6 | 7 | |
| 7 | 8 | db: (fn) -> |
| 8 | − return fn @_db unless @useIndexedDB and @_db is undefined | |
| 9 | − | |
| 10 | − if @callback isnt undefined | |
| 11 | − _callback = @callback | |
| 12 | − @callback = => | |
| 13 | − _callback() | |
| 14 | − fn @_db | |
| 15 | − return | |
| 16 | − return | |
| 17 | − | |
| 18 | − @callback = => | |
| 19 | − @_db ?= false | |
| 20 | − delete @callback | |
| 21 | − fn @_db | |
| 22 | − return | |
| 9 | + return fn() unless @useIndexedDB | |
| 10 | + @callbacks.push(fn) | |
| 11 | + return if @open | |
| 23 | 12 | |
| 24 | 13 | try |
| 14 | + @open = true | |
| 25 | 15 | req = indexedDB.open(NAME, @indexedDBVersion()) |
| 26 | − req.onerror = @callback | |
| 27 | 16 | req.onsuccess = @onOpenSuccess |
| 17 | + req.onerror = @onOpenError | |
| 28 | 18 | req.onupgradeneeded = @onUpgradeNeeded |
| 29 | 19 | catch |
| 30 | − @callback() | |
| 20 | + @onOpenError() | |
| 31 | 21 | return |
| 32 | 22 | |
| 33 | 23 | onOpenSuccess: (event) => |
| 34 | 24 | try |
| 35 | − @_db = event.target.result | |
| 36 | − @_db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937 | |
| 25 | + db = event.target.result | |
| 26 | + db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937 | |
| 37 | 27 | catch |
| 38 | − @_db = false | |
| 28 | + try db.close() | |
| 29 | + @onOpenError() | |
| 30 | + return | |
| 31 | + | |
| 32 | + @runCallbacks(db) | |
| 33 | + @open = false | |
| 34 | + db.close() | |
| 35 | + return | |
| 36 | + | |
| 37 | + onOpenError: => | |
| 38 | + @useIndexedDB = @open = false | |
| 39 | + @runCallbacks() | |
| 40 | + return | |
| 39 | 41 | |
| 40 | − @callback() | |
| 42 | + runCallbacks: (db) -> | |
| 43 | + fn(db) while fn = @callbacks.shift() | |
| 41 | 44 | return |
| 42 | 45 | |
| 43 | − onUpgradeNeeded: (event) => | |
| 46 | + onUpgradeNeeded: (event) -> | |
| 44 | 47 | db = event.target.result |
| 45 | 48 | |
| 46 | 49 | unless db.objectStoreNames.contains('docs') |
| @@ -126,7 +129,7 @@ class app.DB · 79 unmodified lines | ||
| 126 | 129 | return |
| 127 | 130 | |
| 128 | 131 | load: (entry, onSuccess, onError) -> |
| 129 | − if @useIndexedDB and @_db isnt false | |
| 132 | + if @useIndexedDB | |
| 130 | 133 | onError = @loadWithXHR.bind(@, entry, onSuccess, onError) |
| 131 | 134 | @loadWithIDB entry, onSuccess, onError |
| 132 | 135 | else |