gecko-dev/toolkit/components/extensions/test/xpcshell/head_native_messaging.js
Kris Maglione e930b89c34 Bug 1514594: Part 3 - Change ChromeUtils.import API.
***
Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8

This changes the behavior of ChromeUtils.import() to return an exports object,
rather than a module global, in all cases except when `null` is passed as a
second argument, and changes the default behavior not to pollute the global
scope with the module's exports. Thus, the following code written for the old
model:

  ChromeUtils.import("resource://gre/modules/Services.jsm");

is approximately the same as the following, in the new model:

  var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");

Since the two behaviors are mutually incompatible, this patch will land with a
scripted rewrite to update all existing callers to use the new model rather
than the old.
***
Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs

This was done using the followng script:

https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm
***
Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8

Differential Revision: https://phabricator.services.mozilla.com/D16747
***
Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16748
***
Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16749
***
Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs
***
Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16750

--HG--
extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895
extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
2019-01-17 10:18:31 -08:00

133 lines
4.3 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
/* globals AppConstants, FileUtils */
/* exported getSubprocessCount, setupHosts, waitForSubprocessExit */
ChromeUtils.defineModuleGetter(this, "MockRegistry",
"resource://testing-common/MockRegistry.jsm");
ChromeUtils.defineModuleGetter(this, "OS",
"resource://gre/modules/osfile.jsm");
let {Subprocess, SubprocessImpl} = ChromeUtils.import("resource://gre/modules/Subprocess.jsm", null);
// It's important that we use a space in this directory name to make sure we
// correctly handle executing batch files with spaces in their path.
let tmpDir = FileUtils.getDir("TmpD", ["Native Messaging"]);
tmpDir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
const TYPE_SLUG = AppConstants.platform === "linux" ? "native-messaging-hosts" : "NativeMessagingHosts";
OS.File.makeDir(OS.Path.join(tmpDir.path, TYPE_SLUG));
registerCleanupFunction(() => {
tmpDir.remove(true);
});
function getPath(filename) {
return OS.Path.join(tmpDir.path, TYPE_SLUG, filename);
}
const ID = "native@tests.mozilla.org";
async function setupHosts(scripts) {
const PERMS = {unixMode: 0o755};
const env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
const pythonPath = await Subprocess.pathSearch(env.get("PYTHON"));
async function writeManifest(script, scriptPath, path) {
let body = `#!${pythonPath} -u\n${script.script}`;
await OS.File.writeAtomic(scriptPath, body);
await OS.File.setPermissions(scriptPath, PERMS);
let manifest = {
name: script.name,
description: script.description,
path,
type: "stdio",
allowed_extensions: [ID],
};
let manifestPath = getPath(`${script.name}.json`);
await OS.File.writeAtomic(manifestPath, JSON.stringify(manifest));
return manifestPath;
}
switch (AppConstants.platform) {
case "macosx":
case "linux":
let dirProvider = {
getFile(property) {
if (property == "XREUserNativeManifests") {
return tmpDir.clone();
} else if (property == "XRESysNativeManifests") {
return tmpDir.clone();
}
return null;
},
};
Services.dirsvc.registerProvider(dirProvider);
registerCleanupFunction(() => {
Services.dirsvc.unregisterProvider(dirProvider);
});
for (let script of scripts) {
let path = getPath(`${script.name}.py`);
await writeManifest(script, path, path);
}
break;
case "win":
const REGKEY = String.raw`Software\Mozilla\NativeMessagingHosts`;
let registry = new MockRegistry();
registerCleanupFunction(() => {
registry.shutdown();
});
for (let script of scripts) {
let {scriptExtension = "bat"} = script;
// It's important that we use a space in this filename. See directory
// name comment above.
let batPath = getPath(`batch ${script.name}.${scriptExtension}`);
let scriptPath = getPath(`${script.name}.py`);
let batBody = `@ECHO OFF\n${pythonPath} -u "${scriptPath}" %*\n`;
await OS.File.writeAtomic(batPath, batBody);
// Create absolute and relative path versions of the entry.
for (let [name, path] of [[script.name, batPath],
[`relative.${script.name}`, OS.Path.basename(batPath)]]) {
script.name = name;
let manifestPath = await writeManifest(script, scriptPath, path);
registry.setValue(Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
`${REGKEY}\\${script.name}`, "", manifestPath);
}
}
break;
default:
ok(false, `Native messaging is not supported on ${AppConstants.platform}`);
}
}
function getSubprocessCount() {
return SubprocessImpl.Process.getWorker().call("getProcesses", [])
.then(result => result.size);
}
function waitForSubprocessExit() {
return SubprocessImpl.Process.getWorker().call("waitForNoProcesses", []).then(() => {
// Return to the main event loop to give IO handlers enough time to consume
// their remaining buffered input.
return new Promise(resolve => setTimeout(resolve, 0));
});
}