diff options
Diffstat (limited to 'data/extensions/jsr@javascriptrestrictor/code_builders.js')
-rw-r--r-- | data/extensions/jsr@javascriptrestrictor/code_builders.js | 65 |
1 files changed, 33 insertions, 32 deletions
diff --git a/data/extensions/jsr@javascriptrestrictor/code_builders.js b/data/extensions/jsr@javascriptrestrictor/code_builders.js index 8378168..1d17849 100644 --- a/data/extensions/jsr@javascriptrestrictor/code_builders.js +++ b/data/extensions/jsr@javascriptrestrictor/code_builders.js @@ -44,13 +44,13 @@ function enclose_wrapping2(code, name, params, call_with_window) { /** * Create code containing call of API counting function. */ -function create_counter_call(wrapper, type, fpdTrackCallers) { +function create_counter_call(wrapper, type) { let {parent_object, parent_object_property} = wrapper; let resource = `${parent_object}.${parent_object_property}`; let args = wrapper.report_args ? "args.map(x => JSON.stringify(x))" : "[]" return `if (fp_enabled && fp_${type}_count < 1000) { var stack = undefined; - if (${fpdTrackCallers}) { + if (fpdTrackCallers) { try { throw new Error("FPDCallerTracker"); } catch (e) { @@ -66,7 +66,7 @@ function create_counter_call(wrapper, type, fpdTrackCallers) { * This function create code (as string) that creates code that can be used to inject (or overwrite) * a function in the page context. */ -function define_page_context_function(fpdTrackCallers, wrapper) { +function define_page_context_function(wrapper) { let {parent_object, parent_object_property, original_function, replace_original_function} = wrapper; if (replace_original_function) { let lastDot = original_function.lastIndexOf("."); @@ -79,7 +79,7 @@ function define_page_context_function(fpdTrackCallers, wrapper) { var fp_call_count = 0; let replacementF = function(${wrapper.wrapping_function_args}) { try { - ${create_counter_call(wrapper, "call", fpdTrackCallers)} + ${create_counter_call(wrapper, "call")} } catch (e) { /* No action: let the wrapper continue uninterupted. TODO: let the user decide? */ }` @@ -142,7 +142,7 @@ function generate_assign_function_code(code_spec_obj) { /** * This function wraps object properties using WrapHelper.defineProperties(). */ -function generate_object_properties(fpdTrackCallers, code_spec_obj, fpd_only) { +function generate_object_properties(code_spec_obj, fpd_only) { var code = ` if (!("${code_spec_obj.parent_object_property}" in ${code_spec_obj.parent_object})) { // Do not wrap an object that is not defined, e.g. because it is experimental feature. @@ -163,7 +163,7 @@ function generate_object_properties(fpdTrackCallers, code_spec_obj, fpd_only) { var counting_wrapper = ` function(...args) { - ${create_counter_call(code_spec_obj, wrap_spec.property_name, fpdTrackCallers)} + ${create_counter_call(code_spec_obj, wrap_spec.property_name)} // checks type of underlying wrapper/definition and returns it (no changes to semantics) if (typeof (${fpd_only ? original_property : wrap_spec.property_value}) === 'function') { @@ -223,11 +223,11 @@ function generate_assignement(code_spec_obj) { /** * This function builds the wrapping code. */ -var build_code = function(fpdTrackCallers, wrapper, ...args) { +var build_code = function(wrapper, ...args) { let post_wrapping_functions = { - function_define: define_page_context_function.bind(null, fpdTrackCallers), + function_define: define_page_context_function, function_export: generate_assign_function_code, - object_properties: generate_object_properties.bind(null, fpdTrackCallers), + object_properties: generate_object_properties, delete_properties: generate_delete_properties, assign: generate_assignement, }; @@ -272,7 +272,7 @@ var build_code = function(fpdTrackCallers, wrapper, ...args) { ${wrapper.helping_code || ''}`; if (wrapper.wrapping_function_body){ - code += `${define_page_context_function(fpdTrackCallers, wrapper)}`; + code += `${define_page_context_function(wrapper)}`; } let build_post_normal = () => { @@ -287,7 +287,7 @@ var build_code = function(fpdTrackCallers, wrapper, ...args) { } // if not wrapped because of apply_if condition in post wrapping object, still needs to be wrapped for FPD if (code_spec.apply_if !== undefined && code_spec.code_type == "object_properties") { - code += "else {" + generate_object_properties(fpdTrackCallers, code_spec, true) + "}"; + code += "else {" + generate_object_properties(code_spec, true) + "}"; } } } @@ -298,7 +298,7 @@ var build_code = function(fpdTrackCallers, wrapper, ...args) { for (code_spec of wrapper["post_wrapping_code"]) { // if not wrapped because of apply_if condition in post wrapping object, still needs to be wrapped for FPD if (code_spec.apply_if !== undefined && code_spec.code_type == "object_properties") { - code += generate_object_properties(fpdTrackCallers,code_spec, true); + code += generate_object_properties(code_spec, true); } } } @@ -336,14 +336,14 @@ var build_code = function(fpdTrackCallers, wrapper, ...args) { /** * Transform wrapping arrays into injectable code. */ -function wrap_code(wrappers, fpdTrackCallers) { +function wrap_code(wrappers) { if (wrappers.length === 0) { return; // Nothing to wrap } let build = (wrapper) => { try { - return build_code(fpdTrackCallers, build_wrapping_code[wrapper[0]], wrapper.slice(1)); + return build_code(build_wrapping_code[wrapper[0]], wrapper.slice(1)); } catch (e) { console.error(e); return ""; @@ -418,6 +418,7 @@ function insert_wasm_code(code) { try { wasm_memory.grow(Math.ceil((needed_bytes - memory_size) / 65536)); } catch (e) { + console.warn("Failed to grow WASM memory, falling back to JS implementation", e); return false; } } @@ -429,6 +430,7 @@ function insert_wasm_code(code) { } Object.freeze(wasm); }).catch(e => { + console.warn("Failed to instantiate WASM farbling module, falling back to JS implementation", e); }); }).toString().replace("/* WASM_URL */", browser.runtime.getURL("farble.wasm")); @@ -443,17 +445,6 @@ function generate_code(wrapped_code) { // cross-wrapper globals let xrayWindow = window; // the "privileged" xray window wrapper in Firefox - { - let {port} = env; - function updateCount(wrapperName, wrapperType, wrapperArgs, stack) { - port.postMessage({ - wrapperName, - wrapperType, - wrapperArgs, - stack - }); - } - } let WrapHelper; // xray boundary helper { const XRAY = (xrayWindow.top !== unwrappedWindow.top && typeof XPCNativeWrapper !== "undefined"); @@ -741,12 +732,23 @@ function generate_code(wrapped_code) { // add flag variable that determines whether messages should be sent let fp_enabled = false; - - try { - // WRAPPERS // - } finally { - // cleanup environment if necessary - } + + (function () { + let {port} = env; + function updateCount(wrapperName, wrapperType, wrapperArgs, stack) { + port.postMessage({ + wrapperName, + wrapperType, + wrapperArgs, + stack + }); + } + try { + // WRAPPERS // + } finally { + // cleanup environment if necessary + } + })(); // after injection code completed, allow messages (calls from wrappers won't be counted) fp_enabled = true; @@ -755,4 +757,3 @@ function generate_code(wrapped_code) { return `(${code})();`; } - |