Preliminary support for Greasemonkey 4.

This commit is contained in:
ccd0 2017-09-28 10:51:08 -07:00
parent 75ed8fe248
commit 4226a18a6d
4 changed files with 163 additions and 114 deletions

View File

@ -56,7 +56,12 @@
"GM_listValues", "GM_listValues",
"GM_addValueChangeListener", "GM_addValueChangeListener",
"GM_openInTab", "GM_openInTab",
"GM_xmlhttpRequest" "GM_xmlhttpRequest",
"GM.getValue",
"GM.setValue",
"GM.deleteValue",
"GM.listValues",
"GM.xmlHttpRequest"
], ],
"min": { "min": {
"chrome": "33", "chrome": "33",

View File

@ -16,11 +16,14 @@
"globals": { "globals": {
"MediaError": false, "MediaError": false,
"Set": false, "Set": false,
"Promise": false,
"BroadcastChannel": false,
"GM_info": false, "GM_info": false,
"cloneInto": false, "cloneInto": false,
"unsafeWindow": false, "unsafeWindow": false,
"chrome": false<%= "chrome": false,
meta.grants.map(x => `,\n "${x}": false`).join('') "GM": false<%=
meta.grants.filter(x => !/\./.test(x)).map(x => `,\n "${x}": false`).join('')
%><%= %><%=
read('/tmp/declaration.js').match(/^var (.*);/)[1].split(', ').map(x => `,\n "${x}": true`).join('') read('/tmp/declaration.js').match(/^var (.*);/)[1].split(', ').map(x => `,\n "${x}": true`).join('')
%><%= %><%=

View File

@ -492,38 +492,78 @@ do ->
# http://wiki.greasespot.net/Main_Page # http://wiki.greasespot.net/Main_Page
# https://tampermonkey.net/documentation.php # https://tampermonkey.net/documentation.php
# workaround for Firefox 53 issue if GM?.deleteValue?
$.currentValue = {}
$.GM_getValue = (key) -> $.syncChannel = new BroadcastChannel(g.NAMESPACE + 'sync')
$.on $.syncChannel, 'message', (e) ->
for key, val of e.data when (cb = $.syncing[key])
cb val, key
$.sync = (key, cb) ->
$.syncing[key] = cb
$.forceSync = ->
$.delete = (keys, cb) ->
unless keys instanceof Array
keys = [keys]
Promise.all(GM.deleteValue(g.NAMESPACE + key) for key in keys).then ->
items = {}
items[key] = undefined for key in keys
$.syncChannel.postMessage items
cb?()
$.get = $.oneItemSugar (items, cb) ->
keys = Object.keys items
Promise.all(GM.getValue(g.NAMESPACE + key) for key in keys).then (values) ->
for val, i in values when val
items[keys[i]] = JSON.parse val
cb items
$.set = $.oneItemSugar (items, cb) ->
Promise.all(GM.setValue(g.NAMESPACE + key, JSON.stringify(val)) for key, val of items).then ->
$.syncChannel.postMessage items
cb?()
$.clear = (cb) ->
GM.listValues.then (keys) ->
$.delete keys.map((key) -> key.replace g.NAMESPACE, ''), cb
else
# workaround for Firefox 53 issue
$.currentValue = {}
$.GM_getValue = (key) ->
try try
$.currentValue[key] = GM_getValue key $.currentValue[key] = GM_getValue key
catch err catch err
$.currentValue[key] $.currentValue[key]
$.GM_setValue = (key, val) -> $.GM_setValue = (key, val) ->
$.currentValue[key] = val $.currentValue[key] = val
GM_setValue key, val GM_setValue key, val
$.GM_deleteValue = (key) -> $.GM_deleteValue = (key) ->
delete $.currentValue[key] delete $.currentValue[key]
GM_deleteValue key GM_deleteValue key
unless GM_deleteValue? unless GM_deleteValue?
$.perProtocolSettings = true $.perProtocolSettings = true
if GM_deleteValue? if GM_deleteValue?
$.getValue = $.GM_getValue $.getValue = $.GM_getValue
$.listValues = -> GM_listValues() # error when called if missing $.listValues = -> GM_listValues() # error when called if missing
else if $.hasStorage else if $.hasStorage
$.getValue = (key) -> localStorage[key] $.getValue = (key) -> localStorage[key]
$.listValues = -> $.listValues = ->
key for key of localStorage when key[...g.NAMESPACE.length] is g.NAMESPACE key for key of localStorage when key[...g.NAMESPACE.length] is g.NAMESPACE
else else
$.getValue = -> $.getValue = ->
$.listValues = -> [] $.listValues = -> []
if GM_addValueChangeListener? if GM_addValueChangeListener?
$.setValue = $.GM_setValue $.setValue = $.GM_setValue
$.deleteValue = $.GM_deleteValue $.deleteValue = $.GM_deleteValue
else if GM_deleteValue? else if GM_deleteValue?
$.oldValue = {} $.oldValue = {}
$.setValue = (key, val) -> $.setValue = (key, val) ->
$.GM_setValue key, val $.GM_setValue key, val
@ -536,7 +576,7 @@ else if GM_deleteValue?
delete $.oldValue[key] delete $.oldValue[key]
localStorage.removeItem key if $.hasStorage # for `storage` events localStorage.removeItem key if $.hasStorage # for `storage` events
$.cantSync = true if !$.hasStorage $.cantSync = true if !$.hasStorage
else if $.hasStorage else if $.hasStorage
$.oldValue = {} $.oldValue = {}
$.setValue = (key, val) -> $.setValue = (key, val) ->
$.oldValue[key] = val if key of $.syncing $.oldValue[key] = val if key of $.syncing
@ -544,19 +584,19 @@ else if $.hasStorage
$.deleteValue = (key) -> $.deleteValue = (key) ->
delete $.oldValue[key] if key of $.syncing delete $.oldValue[key] if key of $.syncing
localStorage.removeItem key localStorage.removeItem key
else else
$.setValue = -> $.setValue = ->
$.deleteValue = -> $.deleteValue = ->
$.cantSync = $.cantSet = true $.cantSync = $.cantSet = true
if GM_addValueChangeListener? if GM_addValueChangeListener?
$.sync = (key, cb) -> $.sync = (key, cb) ->
$.syncing[key] = GM_addValueChangeListener g.NAMESPACE + key, (key2, oldValue, newValue, remote) -> $.syncing[key] = GM_addValueChangeListener g.NAMESPACE + key, (key2, oldValue, newValue, remote) ->
if remote if remote
newValue = JSON.parse newValue unless newValue is undefined newValue = JSON.parse newValue unless newValue is undefined
cb newValue, key cb newValue, key
$.forceSync = -> $.forceSync = ->
else if GM_deleteValue? or $.hasStorage else if GM_deleteValue? or $.hasStorage
$.sync = (key, cb) -> $.sync = (key, cb) ->
key = g.NAMESPACE + key key = g.NAMESPACE + key
$.syncing[key] = cb $.syncing[key] = cb
@ -581,31 +621,31 @@ else if GM_deleteValue? or $.hasStorage
# so force a check for changes to avoid lost data. # so force a check for changes to avoid lost data.
key = g.NAMESPACE + key key = g.NAMESPACE + key
onChange {key, newValue: $.getValue key} onChange {key, newValue: $.getValue key}
else else
$.sync = -> $.sync = ->
$.forceSync = -> $.forceSync = ->
$.delete = (keys) -> $.delete = (keys) ->
unless keys instanceof Array unless keys instanceof Array
keys = [keys] keys = [keys]
for key in keys for key in keys
$.deleteValue g.NAMESPACE + key $.deleteValue g.NAMESPACE + key
return return
$.get = $.oneItemSugar (items, cb) -> $.get = $.oneItemSugar (items, cb) ->
$.queueTask $.getSync, items, cb $.queueTask $.getSync, items, cb
$.getSync = (items, cb) -> $.getSync = (items, cb) ->
for key of items when (val2 = $.getValue g.NAMESPACE + key) for key of items when (val2 = $.getValue g.NAMESPACE + key)
items[key] = JSON.parse val2 items[key] = JSON.parse val2
cb items cb items
$.set = $.oneItemSugar (items, cb) -> $.set = $.oneItemSugar (items, cb) ->
for key, value of items for key, value of items
$.setValue(g.NAMESPACE + key, JSON.stringify value) $.setValue(g.NAMESPACE + key, JSON.stringify value)
cb?() cb?()
$.clear = (cb) -> $.clear = (cb) ->
# XXX https://github.com/greasemonkey/greasemonkey/issues/2033 # XXX https://github.com/greasemonkey/greasemonkey/issues/2033
# Also support case where GM_listValues is not defined. # Also support case where GM_listValues is not defined.
$.delete Object.keys(Conf) $.delete Object.keys(Conf)
@ -613,4 +653,5 @@ $.clear = (cb) ->
try try
$.delete $.listValues().map (key) -> key.replace g.NAMESPACE, '' $.delete $.listValues().map (key) -> key.replace g.NAMESPACE, ''
cb?() cb?()
<% } %> <% } %>

View File

@ -63,7 +63,7 @@ CrossOrigin =
options.overrideMimeType = 'text/plain; charset=x-user-defined' options.overrideMimeType = 'text/plain; charset=x-user-defined'
else else
options.responseType = 'arraybuffer' options.responseType = 'arraybuffer'
GM_xmlhttpRequest options (GM?.xmlHttpRequest or GM_xmlhttpRequest) options
<% } %> <% } %>
file: (url, cb) -> file: (url, cb) ->
@ -99,7 +99,7 @@ CrossOrigin =
return return
callbacks[url] = [cb] callbacks[url] = [cb]
<% if (type === 'userscript') { %> <% if (type === 'userscript') { %>
GM_xmlhttpRequest (GM?.xmlHttpRequest or GM_xmlhttpRequest)
method: "GET" method: "GET"
url: url+'' url: url+''
onload: (xhr) -> onload: (xhr) ->