Harden the Chrome storage API lib.

Clear/delete should clear/delete data that's about to get set.
This commit is contained in:
Mayhem 2014-02-04 15:15:02 +01:00 committed by ccd0
parent c606cc05a0
commit 7f0e719d19

View File

@ -293,42 +293,49 @@ $.localKeys = [
'usercss'
]
# https://developer.chrome.com/extensions/storage.html
$.delete = (keys) ->
chrome.storage.sync.remove keys
$.get = (key, val, cb) ->
if typeof cb is 'function'
items = $.item key, val
else
items = key
cb = val
localItems = null
syncItems = null
for key, val of items
if key in $.localKeys
(localItems or= {})[key] = val
else
(syncItems or= {})[key] = val
count = 0
done = (item) ->
if chrome.runtime.lastError
c.error chrome.runtime.lastError.message
$.extend items, item
cb items unless --count
if localItems
count++
chrome.storage.local.get localItems, done
if syncItems
count++
chrome.storage.sync.get syncItems, done
$.set = do ->
do ->
items =
sync: {}
local: {}
timeout = {}
sync: {}
$.delete = (keys) ->
if typeof keys is 'string'
keys = [keys]
for key in keys
delete items.local[key]
delete items.sync[key]
chrome.storage.sync.remove keys
$.get = (key, val, cb) ->
if typeof cb is 'function'
data = $.item key, val
else
data = key
cb = val
localItems = null
syncItems = null
for key, val of data
if key in $.localKeys
(localItems or= {})[key] = val
else
(syncItems or= {})[key] = val
count = 0
done = (result) ->
if chrome.runtime.lastError
c.error chrome.runtime.lastError.message
$.extend data, result
cb data unless --count
if localItems
count++
chrome.storage.local.get localItems, done
if syncItems
count++
chrome.storage.sync.get syncItems, done
timeout = {}
setArea = (area) ->
data = items[area]
return if !Object.keys(data).length or timeout[area]
@ -342,11 +349,11 @@ $.set = do ->
delete timeout[area]
items[area] = {}
setAll = $.debounce 5 * $.SECOND, ->
setAll = $.debounce $.SECOND, ->
setArea 'local'
setArea 'sync'
(key, val) ->
$.set = (key, val) ->
if typeof key is 'string'
items.sync[key] = val
else
@ -355,15 +362,18 @@ $.set = do ->
items.local[key] = items.sync[key]
delete items.sync[key]
setAll()
$.clear = (cb) ->
count = 2
done = ->
if chrome.runtime.lastError
c.error chrome.runtime.lastError.message
return
cb?() unless --count
chrome.storage.local.clear done
chrome.storage.sync.clear done
$.clear = (cb) ->
items.local = {}
items.sync = {}
count = 2
done = ->
if chrome.runtime.lastError
c.error chrome.runtime.lastError.message
return
cb?() unless --count
chrome.storage.local.clear done
chrome.storage.sync.clear done
<% } else { %>
# http://wiki.greasespot.net/Main_Page