diff options
author | Mark H Weaver <mhw@netris.org> | 2023-09-27 00:53:30 -0400 |
---|---|---|
committer | Mark H Weaver <mhw@netris.org> | 2023-09-27 14:34:35 -0400 |
commit | fa5c0b073214191e6996ba0b5bc8e61560ff822c (patch) | |
tree | 38e7133195616f4a4da6c8fe46ab2c77c5a6e9e2 /data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js | |
parent | d167f676a167b1392a4e29f14ddf25613468680b (diff) |
Update the JShelter extension to 0.15.2.
Diffstat (limited to 'data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js')
-rw-r--r-- | data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js | 197 |
1 files changed, 18 insertions, 179 deletions
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js b/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js index 97dbc05..52920c9 100644 --- a/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js +++ b/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js @@ -1,7 +1,7 @@ /** \file * \brief Wrappers for Workers * - * \author Copyright (C) 2019 Libor Polcak + * \author Copyright (C) 2019-2022 Libor Polcak * \author Copyright (C) 2020 Peter Hornak * \author Copyright (C) 2021 Matus Svancar * @@ -49,183 +49,13 @@ ISBN 978-3-319-66398-2. * Create private namespace */ (function() { - var polyfillBody = ` - /// This polyfill was adopted from https://github.com/nolanlawson/pseudo-worker under Apache License 2.0 and modified. - function doEval(self, __pseudoworker_script) { - /* jshint unused:false */ - (function () { - /* jshint evil:true */ - eval(__pseudoworker_script); - }).call(window); - } - - var messageListeners = []; - var errorListeners = []; - var workerMessageListeners = []; - var workerErrorListeners = []; - var postMessageListeners = []; - var terminated = false; - var script; - var workerSelf; - - var api = this; - - // custom each loop is for IE8 support - function executeEach(arr, fun) { - var i = -1; - while (++i < arr.length) { - if (arr[i]) { - fun(arr[i]); - } - } - } - - function callErrorListener(err) { - return function (listener) { - listener({ - type: 'error', - error: err, - message: err.message - }); - }; - } - - function addEventListener(type, fun) { - /* istanbul ignore else */ - if (type === 'message') { - messageListeners.push(fun); - } else if (type === 'error') { - errorListeners.push(fun); - } - } - - function removeEventListener(type, fun) { - var listeners; - /* istanbul ignore else */ - if (type === 'message') { - listeners = messageListeners; - } else if (type === 'error') { - listeners = errorListeners; - } else { - return; - } - var i = -1; - while (++i < listeners.length) { - var listener = listeners[i]; - if (listener === fun) { - delete listeners[i]; - break; - } - } - } - - function postError(err) { - var callFun = callErrorListener(err); - if (typeof api.onerror === 'function') { - callFun(api.onerror); - } - if (workerSelf && typeof workerSelf.onerror === 'function') { - callFun(workerSelf.onerror); - } - executeEach(errorListeners, callFun); - executeEach(workerErrorListeners, callFun); - } - - function runPostMessage(msg, transfer) { - function callFun(listener) { - try { - listener({data: msg, ports: transfer}); - } catch (err) { - postError(err); - } - } - - if (workerSelf && typeof workerSelf.onmessage === 'function') { - callFun(workerSelf.onmessage); - } - executeEach(workerMessageListeners, callFun); - } - - function postMessage(msg, transfer) { - if (typeof msg === 'undefined') { - throw new Error('postMessage() requires an argument'); - } - if (terminated) { - return; - } - if (!script) { - postMessageListeners.push({msg: msg, transfer: (transfer ? transfer : undefined)}); - return; - } - runPostMessage(msg, transfer); - } - - function terminate() { - terminated = true; - } - - function workerPostMessage(msg) { - if (terminated) { - return; - } - - function callFun(listener) { - listener({ - data: msg - }); - } - - if (typeof api.onmessage === 'function') { - callFun(api.onmessage); - } - executeEach(messageListeners, callFun); - } - - function workerAddEventListener(type, fun) { - /* istanbul ignore else */ - if (type === 'message') { - workerMessageListeners.push(fun); - } else if (type === 'error') { - workerErrorListeners.push(fun); - } - } - - var xhr = new XMLHttpRequest(); - - xhr.open('GET', path); - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - if (xhr.status >= 200 && xhr.status < 400) { - script = xhr.responseText; - workerSelf = { - postMessage: workerPostMessage, - addEventListener: workerAddEventListener, - close: terminate - }; - doEval(workerSelf, script); - var currentListeners = postMessageListeners; - postMessageListeners = []; - for (var i = 0; i < currentListeners.length; i++) { - runPostMessage(currentListeners[i].msg, currentListeners[i].transfer); - } - } else { - postError(new Error('cannot find script ' + path)); - } - } - }; - - xhr.send(); - - api.postMessage = postMessage; - api.addEventListener = addEventListener; - api.removeEventListener = removeEventListener; - api.terminate = terminate; - - return api; + var strictWorkerWrapperBody = ` + // We create a Worker to limit fingerprinting but we intentionally use a non-existing URL. + return new originalF("https://[ff00::]/worker.js"); `; var slowBody = ` - let _data = new originalF(path); + let _data = new originalF(path, ...args); let _old = _data.postMessage; _data.postMessage = function(message) { let delay = Math.floor(Math.random() * 10**9) @@ -287,16 +117,25 @@ ISBN 978-3-319-66398-2. original_function: "window.Worker", wrapped_objects: [], helping_code: ` - let doPolyfill = args[0]; + let strictWrappers = args[0]; + let removeWorkers = args[1]; `, - wrapping_function_args: `path`, + wrapping_function_args: `path, ...args`, wrapping_function_body: ` - if (doPolyfill) { - ${polyfillBody} + if (!removeWorkers && strictWrappers) { + ${strictWorkerWrapperBody} } else { ${slowBody} } `, + post_wrapping_code: [ + { + code_type: "delete_properties", + parent_object: "window", + apply_if: "removeWorkers", + delete_properties: ["Worker"], + } + ], } ] add_wrappers(wrappers); |