mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-25 11:15:34 +00:00
e930b89c34
*** 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
164 lines
4.6 KiB
JavaScript
164 lines
4.6 KiB
JavaScript
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* vim: set sts=2 sw=2 et tw=80: */
|
|
/* 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/. */
|
|
"use strict";
|
|
|
|
/* eslint-disable mozilla/balanced-listeners */
|
|
|
|
var EXPORTED_SYMBOLS = ["SubprocessImpl"];
|
|
|
|
const {AppConstants} = ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
|
|
const {ctypes} = ChromeUtils.import("resource://gre/modules/ctypes.jsm");
|
|
const {OS} = ChromeUtils.import("resource://gre/modules/osfile.jsm");
|
|
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
const {BaseProcess, PromiseWorker} = ChromeUtils.import("resource://gre/modules/subprocess/subprocess_common.jsm");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "env", "@mozilla.org/process/environment;1", "nsIEnvironment");
|
|
|
|
/* import-globals-from subprocess_shared.js */
|
|
/* import-globals-from subprocess_shared_win.js */
|
|
Services.scriptloader.loadSubScript("resource://gre/modules/subprocess/subprocess_shared.js", this);
|
|
Services.scriptloader.loadSubScript("resource://gre/modules/subprocess/subprocess_shared_win.js", this);
|
|
|
|
class WinPromiseWorker extends PromiseWorker {
|
|
constructor(...args) {
|
|
super(...args);
|
|
|
|
this.signalEvent = libc.CreateSemaphoreW(null, 0, 32, null);
|
|
|
|
this.call("init", [{
|
|
breakAwayFromJob: !AppConstants.isPlatformAndVersionAtLeast("win", "6.2"),
|
|
comspec: env.get("COMSPEC"),
|
|
signalEvent: String(ctypes.cast(this.signalEvent, ctypes.uintptr_t).value),
|
|
}]);
|
|
}
|
|
|
|
signalWorker() {
|
|
libc.ReleaseSemaphore(this.signalEvent, 1, null);
|
|
}
|
|
|
|
postMessage(...args) {
|
|
this.signalWorker();
|
|
return super.postMessage(...args);
|
|
}
|
|
}
|
|
|
|
class Process extends BaseProcess {
|
|
static get WORKER_URL() {
|
|
return "resource://gre/modules/subprocess/subprocess_worker_win.js";
|
|
}
|
|
|
|
static get WorkerClass() {
|
|
return WinPromiseWorker;
|
|
}
|
|
}
|
|
|
|
var SubprocessWin = {
|
|
Process,
|
|
|
|
call(options) {
|
|
return Process.create(options);
|
|
},
|
|
|
|
* getEnvironment() {
|
|
let env = libc.GetEnvironmentStringsW();
|
|
try {
|
|
for (let p = env, q = env; ; p = p.increment()) {
|
|
if (p.contents == "\0") {
|
|
if (String(p) == String(q)) {
|
|
break;
|
|
}
|
|
|
|
let str = q.readString();
|
|
q = p.increment();
|
|
|
|
let idx = str.indexOf("=");
|
|
if (idx == 0) {
|
|
idx = str.indexOf("=", 1);
|
|
}
|
|
|
|
if (idx >= 0) {
|
|
yield [str.slice(0, idx), str.slice(idx + 1)];
|
|
}
|
|
}
|
|
}
|
|
} finally {
|
|
libc.FreeEnvironmentStringsW(env);
|
|
}
|
|
},
|
|
|
|
async isExecutableFile(path) {
|
|
if (!OS.Path.split(path).absolute) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
let info = await OS.File.stat(path);
|
|
return !(info.isDir || info.isSymlink);
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Searches for the given executable file in the system executable
|
|
* file paths as specified by the PATH environment variable.
|
|
*
|
|
* On Windows, if the unadorned filename cannot be found, the
|
|
* extensions in the semicolon-separated list in the PATHEXT
|
|
* environment variable are successively appended to the original
|
|
* name and searched for in turn.
|
|
*
|
|
* @param {string} bin
|
|
* The name of the executable to find.
|
|
* @param {object} environment
|
|
* An object containing a key for each environment variable to be used
|
|
* in the search.
|
|
* @returns {Promise<string>}
|
|
*/
|
|
async pathSearch(bin, environment) {
|
|
let split = OS.Path.split(bin);
|
|
if (split.absolute) {
|
|
if (await this.isExecutableFile(bin)) {
|
|
return bin;
|
|
}
|
|
let error = new Error(`File at path "${bin}" does not exist, or is not a normal file`);
|
|
error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE;
|
|
throw error;
|
|
}
|
|
|
|
let dirs = [];
|
|
let exts = [];
|
|
if (environment.PATH) {
|
|
dirs = environment.PATH.split(";");
|
|
}
|
|
if (environment.PATHEXT) {
|
|
exts = environment.PATHEXT.split(";");
|
|
}
|
|
|
|
for (let dir of dirs) {
|
|
let path = OS.Path.join(dir, bin);
|
|
|
|
if (await this.isExecutableFile(path)) {
|
|
return path;
|
|
}
|
|
|
|
for (let ext of exts) {
|
|
let file = path + ext;
|
|
|
|
if (await this.isExecutableFile(file)) {
|
|
return file;
|
|
}
|
|
}
|
|
}
|
|
let error = new Error(`Executable not found: ${bin}`);
|
|
error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE;
|
|
throw error;
|
|
},
|
|
};
|
|
|
|
var SubprocessImpl = SubprocessWin;
|