From fa5c0b073214191e6996ba0b5bc8e61560ff822c Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Wed, 27 Sep 2023 00:53:30 -0400 Subject: Update the JShelter extension to 0.15.2. --- .../jsr@javascriptrestrictor/wrappingS-H-C.js | 47 +++++++++++++++++----- 1 file changed, 37 insertions(+), 10 deletions(-) (limited to 'data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js') 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", -- cgit v1.2.3