Don't keep the IndexedDB database open

Because it makes attempts to open the database in other tabs hang until that tab is close / the database is closed.
pull/165/head
Thibaut 10 years ago
parent ada9949ac6
commit 04676edd54

@ -3,44 +3,47 @@ class app.DB
constructor: -> constructor: ->
@useIndexedDB = @useIndexedDB() @useIndexedDB = @useIndexedDB()
@callbacks = []
db: (fn) -> db: (fn) ->
return fn @_db unless @useIndexedDB and @_db is undefined return fn() unless @useIndexedDB
@callbacks.push(fn)
if @callback isnt undefined return if @open
_callback = @callback
@callback = =>
_callback()
fn @_db
return
return
@callback = =>
@_db ?= false
delete @callback
fn @_db
return
try try
@open = true
req = indexedDB.open(NAME, @indexedDBVersion()) req = indexedDB.open(NAME, @indexedDBVersion())
req.onerror = @callback
req.onsuccess = @onOpenSuccess req.onsuccess = @onOpenSuccess
req.onerror = @onOpenError
req.onupgradeneeded = @onUpgradeNeeded req.onupgradeneeded = @onUpgradeNeeded
catch catch
@callback() @onOpenError()
return return
onOpenSuccess: (event) => onOpenSuccess: (event) =>
try try
@_db = event.target.result db = event.target.result
@_db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937 db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937
catch catch
@_db = false try db.close()
@onOpenError()
return
@runCallbacks(db)
@open = false
db.close()
return
onOpenError: =>
@useIndexedDB = @open = false
@runCallbacks()
return
@callback() runCallbacks: (db) ->
fn(db) while fn = @callbacks.shift()
return return
onUpgradeNeeded: (event) => onUpgradeNeeded: (event) ->
db = event.target.result db = event.target.result
unless db.objectStoreNames.contains('docs') unless db.objectStoreNames.contains('docs')
@ -126,7 +129,7 @@ class app.DB
return return
load: (entry, onSuccess, onError) -> load: (entry, onSuccess, onError) ->
if @useIndexedDB and @_db isnt false if @useIndexedDB
onError = @loadWithXHR.bind(@, entry, onSuccess, onError) onError = @loadWithXHR.bind(@, entry, onSuccess, onError)
@loadWithIDB entry, onSuccess, onError @loadWithIDB entry, onSuccess, onError
else else

Loading…
Cancel
Save