summaryrefslogtreecommitdiff
path: root/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2023-09-27 00:53:30 -0400
committerMark H Weaver <mhw@netris.org>2023-09-27 14:34:35 -0400
commitfa5c0b073214191e6996ba0b5bc8e61560ff822c (patch)
tree38e7133195616f4a4da6c8fe46ab2c77c5a6e9e2 /data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js
parentd167f676a167b1392a4e29f14ddf25613468680b (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.js197
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);