summaryrefslogtreecommitdiff
path: root/data/extensions/jsr@javascriptrestrictor/code_builders.js
diff options
context:
space:
mode:
Diffstat (limited to 'data/extensions/jsr@javascriptrestrictor/code_builders.js')
-rw-r--r--data/extensions/jsr@javascriptrestrictor/code_builders.js65
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})();`;
}
-