129 lines
2.9 KiB
JavaScript
129 lines
2.9 KiB
JavaScript
"use strict";
|
|
|
|
/* exported Schemas, LocalAPIImplementation, SchemaAPIInterface, getContextWrapper */
|
|
|
|
const { Schemas } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/Schemas.sys.mjs"
|
|
);
|
|
|
|
const { ExtensionCommon } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/ExtensionCommon.sys.mjs"
|
|
);
|
|
|
|
let { LocalAPIImplementation, SchemaAPIInterface } = ExtensionCommon;
|
|
|
|
const contextCloneScope = this;
|
|
|
|
class TallyingAPIImplementation extends SchemaAPIInterface {
|
|
constructor(context, namespace, name) {
|
|
super();
|
|
this.namespace = namespace;
|
|
this.name = name;
|
|
this.context = context;
|
|
}
|
|
|
|
callFunction(args) {
|
|
this.context.tally("call", this.namespace, this.name, args);
|
|
if (this.name === "sub_foo") {
|
|
return 13;
|
|
}
|
|
}
|
|
|
|
callFunctionNoReturn(args) {
|
|
this.context.tally("call", this.namespace, this.name, args);
|
|
}
|
|
|
|
getProperty() {
|
|
this.context.tally("get", this.namespace, this.name);
|
|
}
|
|
|
|
setProperty(value) {
|
|
this.context.tally("set", this.namespace, this.name, value);
|
|
}
|
|
|
|
addListener(listener, args) {
|
|
this.context.tally("addListener", this.namespace, this.name, [
|
|
listener,
|
|
args,
|
|
]);
|
|
}
|
|
|
|
removeListener(listener) {
|
|
this.context.tally("removeListener", this.namespace, this.name, [listener]);
|
|
}
|
|
|
|
hasListener(listener) {
|
|
this.context.tally("hasListener", this.namespace, this.name, [listener]);
|
|
}
|
|
}
|
|
|
|
function getContextWrapper(manifestVersion = 2) {
|
|
return {
|
|
url: "moz-extension://b66e3509-cdb3-44f6-8eb8-c8b39b3a1d27/",
|
|
|
|
cloneScope: contextCloneScope,
|
|
|
|
manifestVersion,
|
|
|
|
permissions: new Set(),
|
|
tallied: null,
|
|
talliedErrors: [],
|
|
|
|
tally(kind, ns, name, args) {
|
|
this.tallied = [kind, ns, name, args];
|
|
},
|
|
|
|
verify(...args) {
|
|
Assert.equal(JSON.stringify(this.tallied), JSON.stringify(args));
|
|
this.tallied = null;
|
|
},
|
|
|
|
checkErrors(errors) {
|
|
let { talliedErrors } = this;
|
|
Assert.equal(
|
|
talliedErrors.length,
|
|
errors.length,
|
|
"Got expected number of errors"
|
|
);
|
|
for (let [i, error] of errors.entries()) {
|
|
Assert.ok(
|
|
i in talliedErrors && String(talliedErrors[i]).includes(error),
|
|
`${JSON.stringify(error)} is a substring of error ${JSON.stringify(
|
|
talliedErrors[i]
|
|
)}`
|
|
);
|
|
}
|
|
|
|
talliedErrors.length = 0;
|
|
},
|
|
|
|
checkLoadURL(url) {
|
|
return !url.startsWith("chrome:");
|
|
},
|
|
|
|
preprocessors: {
|
|
localize(value) {
|
|
return value.replace(
|
|
/__MSG_(.*?)__/g,
|
|
(m0, m1) => `${m1.toUpperCase()}`
|
|
);
|
|
},
|
|
},
|
|
|
|
logError(message) {
|
|
this.talliedErrors.push(message);
|
|
},
|
|
|
|
hasPermission(permission) {
|
|
return this.permissions.has(permission);
|
|
},
|
|
|
|
shouldInject(ns, name) {
|
|
return name != "do-not-inject";
|
|
},
|
|
|
|
getImplementation(namespace, name) {
|
|
return new TallyingAPIImplementation(this, namespace, name);
|
|
},
|
|
};
|
|
}
|