As of bug 1514594, the behavior ChromeUtils.import() API has changed in order to avoid touching the caller's global scope, or returning the imported module's global scope. In short, where you previously wrote:

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

You should now write something like:

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

We've made this change for a lot of reasons. The obvious ones include making it obvious to readers exactly what symbols are imported, and making it easier for tooling to analyze such imports.

The less obvious, and arguably more important reason, though, is that we would like to start loading JSMs as ES6 modules. The major stumbling block to that effort is that our JSM import and export APIs rely on modules being loaded into global-like objects that we can return, and our caller APIs likewise rely on callers being loaded into objects where we can define properties. Neither of these assumptions are compatible with ES6 module scripts, which have lexical scopes, but no global or pseudo-global objects of their own.

Changing the ChromeUtils.import() API to stop relying on these assumptions is the first step down this road. In the near future, we're going to need to make similar changes to our lazy getter and lazy import APIs to stop defining properties on the `this` object (which will be going away), and to a large number of unit tests which rely on mangling module globals.

Once all of this is done, we'll change our JSM loading infrastructure to use the `export` keyword rather than the `EXPORTED_SYMBOLS` array, and rewrite our existing code to comply with the new behavior. Whatever else this whole process accomplishes, it will have the major side-effect of making our system JS code much more JIT-friendly, and in many cases, some orders of magnitude faster.

-Kris
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to