diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 3cbf48cb0..7ffd6b5da 100755 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -286,6 +286,7 @@ module.exports = (grunt) -> GM_info: true GM_xmlhttpRequest: true cloneInto: true + unsafeWindow: true chrome: true script: 'tmp-<%= pkg.type %>/*.js' diff --git a/src/General/lib/$.coffee b/src/General/lib/$.coffee index 921da3ea0..c4cb67e39 100755 --- a/src/General/lib/$.coffee +++ b/src/General/lib/$.coffee @@ -219,6 +219,27 @@ $.event = (event, detail, root=d) -> <% } %> root.dispatchEvent new CustomEvent event, {bubbles: true, detail} +<% if (type === 'userscript') { %> +# XXX Make $.event work in Pale Moon with GM 3.x (no cloneInto function). +unless typeof cloneInto is 'function' or /^[01]\./.test(GM_info.version) or GM_info.scriptHandler # not FF30+, GM1-, or Tampermonkey + do -> + try + new CustomEvent 'x', detail: {} + catch err + unsafeConstructors = + Object: unsafeWindow.Object + Array: unsafeWindow.Array + clone = (obj) -> + if obj? and typeof obj is 'object' and (constructor = unsafeConstructors[obj.constructor.name]) + obj2 = new constructor() + obj2[key] = clone val for key, val of obj + obj2 + else + obj + $.event = (event, detail, root=d) -> + root.dispatchEvent new CustomEvent event, {bubbles: true, detail: clone detail} +<% } %> + $.open = <% if (type === 'userscript') { %> GM_openInTab