/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- * 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 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { Subprocess } from "resource://gre/modules/Subprocess.sys.mjs"; export async function runBackgroundTask(commandLine) { let sentinel = commandLine.getArgument(0); let count = commandLine.length > 1 ? Number.parseInt(commandLine.getArgument(1), 10) : 1; let main = await ChromeUtils.requestProcInfo(); let info = [main.pid, Services.dirsvc.get("ProfD", Ci.nsIFile).path]; // `dump` prints to the console without formatting. dump(`${count}: ${sentinel}${JSON.stringify(info)}${sentinel}\n`); // Maybe launch a child. if (count <= 1) { return 0; } let command = Services.dirsvc.get("XREExeF", Ci.nsIFile).path; let args = [ "--backgroundtask", "unique_profile", sentinel, (count - 1).toString(), ]; // We must assemble all of the string fragments from stdout. let stdoutChunks = []; let proc = await Subprocess.call({ command, arguments: args, stderr: "stdout", // Don't inherit this task's profile path. environmentAppend: true, environment: { XRE_PROFILE_PATH: null }, }).then(p => { p.stdin.close(); const dumpPipe = async pipe => { let data = await pipe.readString(); while (data) { data = await pipe.readString(); stdoutChunks.push(data); } }; dumpPipe(p.stdout); return p; }); let { exitCode } = await proc.wait(); let stdout = stdoutChunks.join(""); for (let line of stdout.split(/\r\n|\r|\n/).slice(0, -1)) { dump(`${count}> ${line}\n`); } return exitCode; }