- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
- : 96 %
Source code
Revision control
Copy as Markdown
Other Tools
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
/**
* Content-process half of the content-analysis WebAssembly runner. This actor
* runs the module in a null-principal sandbox so that compiling it is permitted.
*/
const SANDBOX_SCRIPT =
"resource://gre/modules/content-analysis-wasm-sandbox.js";
/**
* Compiles and runs the DLP module in a null-principal sandbox.
*/
export class ContentAnalysisWasmChild extends JSProcessActorChild {
// The null-principal sandbox that hosts the compiled module, created lazily
// and reused across requests.
#sandbox = null;
// Version of the module currently compiled in the sandbox, so we only recompile
// when the parent switches to a different version.
#loadedVersion = null;
#ensureSandbox() {
if (!this.#sandbox) {
const principal = Services.scriptSecurityManager.createNullPrincipal({});
const sandbox = Cu.Sandbox(principal, {
wantGlobalProperties: ["TextEncoder"],
sandboxName: "content-analysis-wasm",
});
Services.scriptloader.loadSubScript(SANDBOX_SCRIPT, sandbox);
this.#sandbox = sandbox;
}
return this.#sandbox;
}
async receiveMessage(message) {
if (message.name !== "Analyze") {
return undefined;
}
const { version, moduleBytes, requestBytes, contentBytes, rules } =
message.data;
const sandbox = this.#ensureSandbox();
// Recompile only when the module changed since the last request.
if (this.#loadedVersion !== version) {
sandbox.loadModule(Cu.cloneInto(moduleBytes, sandbox));
this.#loadedVersion = version;
}
const responseBytes = sandbox.runAnalyze(
Cu.cloneInto({ requestBytes, contentBytes, rules }, sandbox)
);
// Bulk-copy out of the sandbox compartment into a Uint8Array of our own,
// which IPC structured-clones and C++ reads directly.
return new Uint8Array(responseBytes);
}
}