Trust Greasemonkey's value instead of the value from the storage event.

Also fix $.set and $.delete breaking check on whether sync is needed.
This commit is contained in:
ccd0 2014-10-18 18:30:41 -07:00
parent 2700afe9d7
commit 5e971532b4

View File

@ -409,37 +409,41 @@ do ->
<% } else { %> <% } else { %>
# http://wiki.greasespot.net/Main_Page # http://wiki.greasespot.net/Main_Page
$.oldValue = {}
$.sync = (key, cb) ->
key = g.NAMESPACE + key
$.syncing[key] = cb
$.oldValue[key] = GM_getValue key
do -> do ->
oldValue = {} onChange = (key) ->
onChange = ({key, newValue}) -> return unless cb = $.syncing[key]
if cb = $.syncing[key] newValue = GM_getValue key
if newValue? return if newValue is $.oldValue[key]
oldValue[key] = newValue if newValue?
cb JSON.parse(newValue), key $.oldValue[key] = newValue
else cb JSON.parse(newValue), key
delete oldValue[key] else
cb undefined, key delete $.oldValue[key]
$.on window, 'storage', onChange cb undefined, key
$.sync = (key, cb) -> $.on window, 'storage', ({key}) -> onChange key
key = g.NAMESPACE + key
$.syncing[key] = cb
oldValue[key] = GM_getValue key
$.forceSync = (key) -> $.forceSync = (key) ->
# Storage events don't work across origins # Storage events don't work across origins
# e.g. http://boards.4chan.org and https://boards.4chan.org # e.g. http://boards.4chan.org and https://boards.4chan.org
# so force a check for changes to avoid lost data. # so force a check for changes to avoid lost data.
key = g.NAMESPACE + key onChange g.NAMESPACE + key
newValue = GM_getValue key
if newValue isnt oldValue[key]
onChange {key, newValue}
$.delete = (keys) -> $.delete = (keys) ->
unless keys instanceof Array unless keys instanceof Array
keys = [keys] keys = [keys]
for key in keys for key in keys
key = g.NAMESPACE + key key = g.NAMESPACE + key
localStorage.removeItem key
GM_deleteValue key GM_deleteValue key
if key of $.syncing
delete $.oldValue[key]
# for `storage` events
localStorage.removeItem key
return return
$.get = (key, val, cb) -> $.get = (key, val, cb) ->
@ -458,10 +462,11 @@ $.set = do ->
set = (key, val) -> set = (key, val) ->
key = g.NAMESPACE + key key = g.NAMESPACE + key
val = JSON.stringify val val = JSON.stringify val
GM_setValue key, val
if key of $.syncing if key of $.syncing
$.oldValue[key] = val
# for `storage` events # for `storage` events
localStorage.setItem key, val localStorage.setItem key, val
GM_setValue key, val
(keys, val) -> (keys, val) ->
if typeof keys is 'string' if typeof keys is 'string'
set keys, val set keys, val