History

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.

Thibaut committed 11 years ago

Commit 04676ed1 parent ada99491 file · +26 −23Browse files

Unified · Split

assets/javascripts/app/db.coffee+26−23
@@ -3,44 +3,47 @@ class app.DB · 2 unmodified lines
3 3
4 constructor: ->4 constructor: ->
5 @useIndexedDB = @useIndexedDB()5 @useIndexedDB = @useIndexedDB()
6 @callbacks = []
6 7
7 db: (fn) ->8 db: (fn) ->
8 return fn @_db unless @useIndexedDB and @_db is undefined9 return fn() unless @useIndexedDB
9 10 @callbacks.push(fn)
10 if @callback isnt undefined11 return if @open
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
23 12
24 try13 try
14 @open = true
25 req = indexedDB.open(NAME, @indexedDBVersion())15 req = indexedDB.open(NAME, @indexedDBVersion())
26 req.onerror = @callback
27 req.onsuccess = @onOpenSuccess16 req.onsuccess = @onOpenSuccess
17 req.onerror = @onOpenError
28 req.onupgradeneeded = @onUpgradeNeeded18 req.onupgradeneeded = @onUpgradeNeeded
29 catch19 catch
30 @callback()20 @onOpenError()
31 return21 return
32 22
33 onOpenSuccess: (event) =>23 onOpenSuccess: (event) =>
34 try24 try
35 @_db = event.target.result25 db = event.target.result
36 @_db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=13693726 db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937
37 catch27 catch
38 @_db = false28 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 return44 return
42 45
43 onUpgradeNeeded: (event) =>46 onUpgradeNeeded: (event) ->
44 db = event.target.result47 db = event.target.result
45 48
46 unless db.objectStoreNames.contains('docs')49 unless db.objectStoreNames.contains('docs')
@@ -126,7 +129,7 @@ class app.DB · 79 unmodified lines
126 return129 return
127 130
128 load: (entry, onSuccess, onError) ->131 load: (entry, onSuccess, onError) ->
129 if @useIndexedDB and @_db isnt false132 if @useIndexedDB
130 onError = @loadWithXHR.bind(@, entry, onSuccess, onError)133 onError = @loadWithXHR.bind(@, entry, onSuccess, onError)
131 @loadWithIDB entry, onSuccess, onError134 @loadWithIDB entry, onSuccess, onError
132 else135 else