summaryrefslogtreecommitdiff
path: root/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.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-H-C.js
parentd167f676a167b1392a4e29f14ddf25613468680b (diff)
Update the JShelter extension to 0.15.2.
Diffstat (limited to 'data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js')
-rw-r--r--data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js47
1 files changed, 37 insertions, 10 deletions
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js b/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js
index 4519c87..f641d4b 100644
--- a/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js
+++ b/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js
@@ -7,6 +7,7 @@
*
* \author Copyright (C) 2019 Libor Polcak
* \author Copyright (C) 2021 Matus Svancar
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
* \license SPDX-License-Identifier: MPL-2.0
@@ -133,7 +134,7 @@
original_name: "CanvasRenderingContext2D.prototype.getImageData",
wrapped_name: "origGetImageData",
}],
- helping_code: helping_code + strToUint + farbleCanvasDataBrave.toString() + `
+ helping_code: helping_code + farbleCanvasDataBrave.toString() + `
var farble = function(context, fake) {
if(approach === 1){
fake.fillStyle = "white";
@@ -143,20 +144,46 @@
else if(approach === 0){
const width = context.canvas.width;
const height = context.canvas.height;
- var imageData = origGetImageData.call(context, 0, 0, width, height);
- const BYTES_PER_ROW = width * 4;
- farbleCanvasDataBrave(function*() {
- let data = imageData.data;
- let offset = 0;
- while (offset < data.length) {
- yield imageData.data.subarray(offset, offset + BYTES_PER_ROW);
- offset += BYTES_PER_ROW;
+ const imageData = origGetImageData.call(context, 0, 0, width, height);
+ const len = imageData.data.length;
+ if (wasm.ready && wasm.grow(len)) {
+ try {
+ farblePixelsWASM();
+ } catch (e) {
+ console.error("WebAssembly optimized farbling failed, falling back to JavaScript implementation", e);
+ farblePixelsJS();
}
- }, width);
+ } else {
+ farblePixelsJS();
+ }
// Do not modify the original canvas, always modify the fake canvas.
// Always farble the whole image so that the farbled data do not depend
// on the page-specified extraction data rectangle.
fake.putImageData(imageData, 0, 0);
+
+ function farblePixelsWASM() {
+ wasm.set(imageData.data);
+ const crc = wasm.crc16(len);
+ const mash = new Mash();
+ mash.addData(' ');
+ mash.addData(domainHash);
+ mash.addData("CanvasFarbling");
+ mash.addData(crc);
+ wasm.farbleBytes(len, mash.n | 0, true);
+ imageData.data.set(wasm.get(len));
+ }
+
+ function farblePixelsJS() {
+ const BYTES_PER_ROW = width * 4;
+ farbleCanvasDataBrave(function*() {
+ let data = imageData.data;
+ let offset = 0;
+ while (offset < len) {
+ yield data.subarray(offset, offset + BYTES_PER_ROW);
+ offset += BYTES_PER_ROW;
+ }
+ }, width);
+ }
}
};`,
wrapping_code_function_name: "wrapping",