PSA: nsISimpleEnumerator now works as a JS iterator

Kris Maglione kmaglione at mozilla.com
Thu Aug 23 22:19:55 UTC 2018


As of bug 1484496, any C++-implemented nsISimpleEnumertor instance can be used 
as a JS iterator. And, when used this way, the iterators now have intrinsic 
type information, and therefore do not require QIing their elements.

Which is to say, now you can simply do:

  for (let window of Services.wm.getEnumerator("navigator:browser")) {
    ...;
  }

  for (let docShell of docShellEnum) {
    ...;
  }

rather than:

  let winEnum = Services.wm.getEnumerator("navigator:browser");
  while (winEnum.hasMoreElements()) {
    let window = winEnum.getNext();
    ...
  }

  while (docShellEnum.hasMoreElements()) {
    let docShell = winEnum.getNext().QueryInterface(Ci.nsIDocShell);
    ...
  }

If you happen to be using an nsIArray from directly from JavaScript, you 
unfortunately still need to specify the expected types, since nsIArray has no 
idea what types it can contain:

  for (let thing of array.enumerate(Ci.nsIThing)) {
    ...
  }

Aside from being easier to maintain, these forms should also be somewhat 
faster than the old protocol, since they only require one XPConnect call per 
iteration rather than 3(+).

-Kris


More information about the firefox-dev mailing list