Bug 1484496: Part 5e - Convert remaining nsISimpleEnumerator users to use JS iteration. r=mccr8

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

--HG--
extra : rebase_source : c0fac176d7b3d840c4dbb14f8d95ccfc7f83a5a8
extra : histedit_source : a92c40117d0808a3ad68c972f622a7a42c9ae8ba
This commit is contained in:
Kris Maglione 2018-08-18 18:13:14 -07:00
parent 9a8a840c9d
commit 3a5c05e76f
74 changed files with 144 additions and 384 deletions

View file

@ -67,9 +67,8 @@ var AccessFu = {
Services.obs.addObserver(this, "inprocess-browser-shown");
Services.ww.registerNotification(this);
let windows = Services.wm.getEnumerator(null);
while (windows.hasMoreElements()) {
this._attachWindow(windows.getNext());
for (let win of Services.wm.getEnumerator(null)) {
this._attachWindow(win);
}
Logger.info("AccessFu:Enabled");
@ -89,9 +88,8 @@ var AccessFu = {
Services.obs.removeObserver(this, "inprocess-browser-shown");
Services.ww.unregisterNotification(this);
let windows = Services.wm.getEnumerator(null);
while (windows.hasMoreElements()) {
this._detachWindow(windows.getNext());
for (let win of Services.wm.getEnumerator(null)) {
this._detachWindow(win);
}
delete this._notifyOutputPref;

View file

@ -160,13 +160,9 @@ var Utils = { // jshint ignore:line
let attributes = {};
if (aAccessible && aAccessible.attributes) {
let attributesEnum = aAccessible.attributes.enumerate();
// Populate |attributes| object with |aAccessible|'s attribute key-value
// pairs.
while (attributesEnum.hasMoreElements()) {
let attribute = attributesEnum.getNext().QueryInterface(
Ci.nsIPropertyElement);
for (let attribute of aAccessible.attributes.enumerate()) {
attributes[attribute.key] = attribute.value;
}
}
@ -757,9 +753,8 @@ PivotContext.prototype = {
}
};
let getHeaders = function* getHeaders(aHeaderCells) {
let enumerator = aHeaderCells.enumerate();
while (enumerator.hasMoreElements()) {
yield enumerator.getNext().QueryInterface(Ci.nsIAccessible).name;
for (let {name} of aHeaderCells.enumerate(Ci.nsIAccessible)) {
yield name;
}
};

View file

@ -246,11 +246,8 @@ function addAccessibleTask(doc, task) {
}
registerCleanupFunction(() => {
let observers = Services.obs.enumerateObservers("accessible-event");
while (observers.hasMoreElements()) {
Services.obs.removeObserver(
observers.getNext().QueryInterface(Ci.nsIObserver),
"accessible-event");
for (let observer of Services.obs.enumerateObservers("accessible-event")) {
Services.obs.removeObserver(observer, "accessible-event");
}
});

View file

@ -319,10 +319,7 @@ function testAttrsInternal(aAccOrElmOrID, aAttrs, aSkipUnexpectedAttrs,
function compareAttrs(aErrorMsg, aAttrs, aExpectedAttrs, aSkipUnexpectedAttrs,
aAbsentAttrs) {
// Check if all obtained attributes are expected and have expected value.
var enumerate = aAttrs.enumerate();
while (enumerate.hasMoreElements()) {
let prop = enumerate.getNext().QueryInterface(nsIPropertyElement);
for (let prop of aAttrs.enumerate()) {
if (!(prop.key in aExpectedAttrs)) {
if (!aSkipUnexpectedAttrs)
ok(false, "Unexpected attribute '" + prop.key + "' having '" +
@ -355,9 +352,7 @@ function compareAttrs(aErrorMsg, aAttrs, aExpectedAttrs, aSkipUnexpectedAttrs,
for (var name in aAbsentAttrs) {
var wasFound = false;
enumerate = aAttrs.enumerate();
while (enumerate.hasMoreElements()) {
let prop = enumerate.getNext().QueryInterface(nsIPropertyElement);
for (let prop of aAttrs.enumerate()) {
if (prop.key == name)
wasFound = true;
}

View file

@ -76,9 +76,7 @@ function testRelation(aIdentifier, aRelType, aRelatedIdentifiers) {
// Check if all given related accessibles are targets of obtained relation.
for (let idx = 0; idx < targets.length; idx++) {
var isFound = false;
let enumerate = actualTargets.enumerate();
while (enumerate.hasMoreElements()) {
let relatedAcc = enumerate.getNext().QueryInterface(nsIAccessible);
for (let relatedAcc of actualTargets.enumerate(Ci.nsIAccessible)) {
if (targets[idx] == relatedAcc) {
isFound = true;
break;
@ -89,9 +87,7 @@ function testRelation(aIdentifier, aRelType, aRelatedIdentifiers) {
}
// Check if all obtained targets are given related accessibles.
let enumerate = actualTargets.enumerate();
while (enumerate.hasMoreElements()) {
let relatedAcc = enumerate.getNext().QueryInterface(nsIAccessible);
for (let relatedAcc of actualTargets.enumerate(Ci.nsIAccessible)) {
let idx;
for (idx = 0; idx < targets.length && relatedAcc != targets[idx]; idx++);
@ -140,9 +136,7 @@ function testAbsentRelation(aIdentifier, aRelType, aUnrelatedIdentifiers) {
// Any found targets that match given accessibles should be called out.
for (let idx = 0; idx < targets.length; idx++) {
var notFound = true;
var enumerate = actualTargets.enumerate();
while (enumerate.hasMoreElements()) {
var relatedAcc = enumerate.getNext().QueryInterface(nsIAccessible);
for (let relatedAcc of actualTargets.enumerate(Ci.nsIAccessible)) {
if (targets[idx] == relatedAcc) {
notFound = false;
break;

View file

@ -31,10 +31,5 @@ function getChildDocShells() {
Ci.nsIDocShell.ENUMERATE_FORWARDS
);
let docShells = [];
while (docShellsEnum.hasMoreElements()) {
let ds = docShellsEnum.getNext();
docShells.push(ds);
}
return docShells;
return Array.from(docShellsEnum);
}

View file

@ -102,12 +102,10 @@ function xpcEnumerateContentWindows(callback) {
var Ci = SpecialPowers.Ci;
var ww = SpecialPowers.Cc["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Ci.nsIWindowWatcher);
var enumerator = ww.getWindowEnumerator();
var contentWindows = [];
while (enumerator.hasMoreElements()) {
var win = enumerator.getNext();
for (let win of ww.getWindowEnumerator()) {
if (win.isChromeWindow) {
var docshellTreeNode = win.docShell;
var childCount = docshellTreeNode.childCount;

View file

@ -3,9 +3,7 @@ addMessageListener("getCookieFromManager", ({ host, path }) => {
.getService(Ci.nsICookieManager);
let values = [];
path = path.substring(0, path.lastIndexOf("/") + 1);
let e = cm.enumerator;
while (e.hasMoreElements()) {
let cookie = e.getNext().QueryInterface(Ci.nsICookie);
for (let cookie of cm.enumerator) {
if (!cookie) {
break;
}

View file

@ -28,20 +28,16 @@ var setPaymentNums = 0;
addMessageListener("payment-num-set", function() {
setPaymentNums = 0;
const paymentEnum = paymentSrv.enumerate();
while (paymentEnum.hasMoreElements()) {
for (let payment of paymentSrv.enumerate()) {
setPaymentNums = setPaymentNums + 1;
paymentEnum.getNext();
}
sendAsyncMessage("payment-num-set-complete");
});
addMessageListener("payment-num-check", function(expectedNumPayments) {
const paymentEnum = paymentSrv.enumerate();
let numPayments = 0;
while (paymentEnum.hasMoreElements()) {
for (let payment of paymentSrv.enumerate()) {
numPayments = numPayments + 1;
paymentEnum.getNext();
}
if (numPayments !== expectedNumPayments + setPaymentNums) {
emitTestFail("Expected '" + expectedNumPayments +

View file

@ -353,8 +353,7 @@ function checkSimplestRequestHandler() {
if (!paymentEnum.hasMoreElements()) {
emitTestFail("PaymentRequestService should have at least one payment request.");
}
while (paymentEnum.hasMoreElements()) {
let payRequest = paymentEnum.getNext().QueryInterface(Ci.nsIPaymentRequest);
for (let payRequest of paymentEnum) {
if (!payRequest) {
emitTestFail("Fail to get existing payment request.");
break;
@ -370,8 +369,7 @@ function checkComplexRequestHandler() {
if (!paymentEnum.hasMoreElements()) {
emitTestFail("PaymentRequestService should have at least one payment request.");
}
while (paymentEnum.hasMoreElements()) {
let payRequest = paymentEnum.getNext().QueryInterface(Ci.nsIPaymentRequest);
for (let payRequest of paymentEnum) {
if (!payRequest) {
emitTestFail("Fail to get existing payment request.");
break;
@ -387,8 +385,7 @@ function checkNonBasicCardRequestHandler() {
if (!paymentEnum.hasMoreElements()) {
emitTestFail("PaymentRequestService should have at least one payment request.");
}
while (paymentEnum.hasMoreElements()) {
let payRequest = paymentEnum.getNext().QueryInterface(Ci.nsIPaymentRequest);
for (let payRequest of paymentEnum) {
if (!payRequest) {
emitTestFail("Fail to get existing payment request.");
break;
@ -404,8 +401,7 @@ function checkMultipleRequestsHandler () {
if (!paymentEnum.hasMoreElements()) {
emitTestFail("PaymentRequestService should have at least one payment request.");
}
while (paymentEnum.hasMoreElements()) {
let payRequest = paymentEnum.getNext().QueryInterface(Ci.nsIPaymentRequest);
for (let payRequest of paymentEnum) {
if (!payRequest) {
emitTestFail("Fail to get existing payment request.");
break;
@ -425,8 +421,7 @@ function checkCrossOriginTopLevelPrincipalHandler() {
if (!paymentEnum.hasMoreElements()) {
emitTestFail("PaymentRequestService should have at least one payment request.");
}
while (paymentEnum.hasMoreElements()) {
let payRequest = paymentEnum.getNext().QueryInterface(Ci.nsIPaymentRequest);
for (let payRequest of paymentEnum) {
if (!payRequest) {
emitTestFail("Fail to get existing payment request.");
break;

View file

@ -36,10 +36,7 @@ function checkLowerCaseCurrency() {
"PaymentRequestService should have at least one payment request.";
sendAsyncMessage("test-fail", msg);
}
while (paymentEnum.hasMoreElements()) {
const payRequest = paymentEnum
.getNext()
.QueryInterface(Ci.nsIPaymentRequest);
for (let payRequest of paymentEnum) {
if (!payRequest) {
sendAsyncMessage("test-fail", "Fail to get existing payment request.");
break;

View file

@ -17,15 +17,13 @@ add_task(async () => {
const paymentSrv = Cc[
"@mozilla.org/dom/payments/payment-request-service;1"
].getService(Ci.nsIPaymentRequestService);
ok(paymentSrv, "Fail to get PaymentRequestService.");
const paymentEnum = paymentSrv.enumerate();
ok(
paymentEnum.hasMoreElements(),
"PaymentRequestService should have at least one payment request."
);
const payments = new Set();
while (paymentEnum.hasMoreElements()) {
const payment = paymentEnum.getNext().QueryInterface(Ci.nsIPaymentRequest);
for (let payment of paymentEnum) {
ok(payment, "Fail to get existing payment request.");
checkSimplePayment(payment);
payments.add(payment);

View file

@ -16,9 +16,7 @@ function allow_all_plugins() {
// Finds the test plugin library
function get_test_plugin(secondplugin=false) {
var pluginEnum = gDirSvc.get("APluginsDL", Ci.nsISimpleEnumerator);
while (pluginEnum.hasMoreElements()) {
let dir = pluginEnum.getNext().QueryInterface(Ci.nsIFile);
for (let dir of gDirSvc.get("APluginsDL", Ci.nsISimpleEnumerator)) {
let name = get_platform_specific_plugin_name(secondplugin);
let plugin = dir.clone();
plugin.append(name);
@ -100,9 +98,7 @@ function get_platform_specific_plugin_suffix() {
function get_test_plugin_no_symlink() {
let dirSvc = Cc["@mozilla.org/file/directory_service;1"]
.getService(Ci.nsIProperties);
let pluginEnum = dirSvc.get("APluginsDL", Ci.nsISimpleEnumerator);
while (pluginEnum.hasMoreElements()) {
let dir = pluginEnum.getNext().QueryInterface(Ci.nsIFile);
for (let dir of dirSvc.get("APluginsDL", Ci.nsISimpleEnumerator)) {
let plugin = dir.clone();
plugin.append(get_platform_specific_plugin_name());
if (plugin.exists()) {

View file

@ -182,9 +182,7 @@ PushRecord.prototype = {
},
isTabOpen() {
let windows = Services.wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let window = windows.getNext();
for (let window of Services.wm.getEnumerator("navigator:browser")) {
if (window.closed || PrivateBrowsingUtils.isWindowPrivate(window)) {
continue;
}

View file

@ -38,12 +38,8 @@ function assertThrows(fun, message) {
ok(throws, message);
}
function* generateDebuggers() {
let e = wdm.getWorkerDebuggerEnumerator();
while (e.hasMoreElements()) {
let dbg = e.getNext().QueryInterface(Ci.nsIWorkerDebugger);
yield dbg;
}
function generateDebuggers() {
return wdm.getWorkerDebuggerEnumerator();
}
function findDebugger(url) {

View file

@ -3,7 +3,7 @@ let cs = Cc["@mozilla.org/cookiemanager;1"]
addMessageListener("getCookieCountAndClear", () => {
let count = 0;
for (let list = cs.enumerator; list.hasMoreElements(); list.getNext())
for (let cookie of cs.enumerator)
++count;
cs.removeAll();

View file

@ -62,9 +62,7 @@ obs.prototype = {
function getCookieCount(cs) {
let count = 0;
let list = cs.enumerator;
while (list.hasMoreElements()) {
let cookie = list.getNext().QueryInterface(Ci.nsICookie);
for (let cookie of cs.enumerator) {
info("cookie: " + cookie);
info("cookie host " + cookie.host + " path " + cookie.path + " name " + cookie.name +
" value " + cookie.value + " isSecure " + cookie.isSecure + " expires " + cookie.expires);

View file

@ -123,8 +123,8 @@ function do_set_cookies(uri, channel, session, expected) {
function do_count_enumerator(enumerator) {
let i = 0;
while (enumerator.hasMoreElements()) {
enumerator.getNext();
for (let cookie of enumerator) {
void cookie;
++i;
}
return i;

View file

@ -185,10 +185,7 @@ function run_test() {
function getCookieCount() {
var count = 0;
var cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
var enumerator = cm.enumerator;
while (enumerator.hasMoreElements()) {
if (!(enumerator.getNext() instanceof Ci.nsICookie2))
throw new Error("not a cookie");
for (let cookie of cm.enumerator) {
++count;
}
return count;

View file

@ -56,10 +56,7 @@ function* do_run_test()
setCookies("tasty.horse.radish", 50, futureExpiry);
Assert.equal(countCookies("horse.radish", "horse.radish"), 50);
let enumerator = Services.cookiemgr.enumerator;
while (enumerator.hasMoreElements()) {
let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
for (let cookie of Services.cookiemgr.enumerator) {
if (cookie.host == "horse.radish")
do_throw("cookies not evicted by lastAccessed order");
}
@ -77,9 +74,7 @@ function* do_run_test()
false, false, false, futureExpiry, {});
Assert.equal(countCookies("captchart.com", "captchart.com"), 50);
enumerator = Services.cookiemgr.getCookiesFromHost("captchart.com", {});
while (enumerator.hasMoreElements()) {
let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
for (let cookie of Services.cookiemgr.getCookiesFromHost("captchart.com", {})) {
Assert.ok(cookie.expiry == futureExpiry);
}
@ -104,14 +99,10 @@ setCookies(aHost, aNumber, aExpiry)
function
countCookies(aBaseDomain, aHost)
{
let enumerator = Services.cookiemgr.enumerator;
// count how many cookies are within domain 'aBaseDomain' using the cookie
// enumerator.
let cookies = [];
while (enumerator.hasMoreElements()) {
let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
for (let cookie of Services.cookiemgr.enumerator) {
if (cookie.host.length >= aBaseDomain.length &&
cookie.host.slice(cookie.host.length - aBaseDomain.length) == aBaseDomain)
cookies.push(cookie);
@ -123,10 +114,7 @@ countCookies(aBaseDomain, aHost)
cookies.length);
Assert.equal(Services.cookiemgr.countCookiesFromHost(aHost), cookies.length);
enumerator = Services.cookiemgr.getCookiesFromHost(aHost, {});
while (enumerator.hasMoreElements()) {
let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
for (let cookie of Services.cookiemgr.getCookiesFromHost(aHost, {})) {
if (cookie.host.length >= aBaseDomain.length &&
cookie.host.slice(cookie.host.length - aBaseDomain.length) == aBaseDomain) {
let found = false;

View file

@ -231,11 +231,8 @@ function get_creationTime(i)
// time, if both the limit on total cookies (maxNumber + 10%) and the purge age
// + 10% are exceeded.
function check_remaining_cookies(aNumberTotal, aNumberOld, aNumberToExpect) {
var enumerator = Services.cookiemgr.enumerator;
let i = 0;
while (enumerator.hasMoreElements()) {
var cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
for (let cookie of Services.cookiemgr.enumerator) {
++i;
if (aNumberTotal != aNumberToExpect) {

View file

@ -215,9 +215,7 @@ add_task(async function do_test() {
// be found.
function findCapabilityViaEnum(origin = TEST_ORIGIN, type = TEST_PERMISSION) {
let result = undefined;
let e = Services.perms.enumerator;
while (e.hasMoreElements()) {
let perm = e.getNext().QueryInterface(Ci.nsIPermission);
for (let perm of Services.perms.enumerator) {
if (perm.matchesURI(origin, true) &&
perm.type == type) {
if (result !== undefined) {

View file

@ -159,9 +159,7 @@ add_task(async function test() {
await PlacesTestUtils.addVisits(Services.io.newURI("ftp://some.subdomain.of.foo.com:8000/some/subdirectory"));
// Force initialization of the nsPermissionManager
let enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
let permission = enumerator.getNext().QueryInterface(Ci.nsIPermission);
for (let permission of Services.perms.enumerator) {
let isExpected = false;
expected.forEach((it, i) => {

View file

@ -176,9 +176,7 @@ add_task(function test() {
let found = expected.map((it) => 0);
// Force initialization of the nsPermissionManager
let enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
let permission = enumerator.getNext().QueryInterface(Ci.nsIPermission);
for (let permission of Services.perms.enumerator) {
let isExpected = false;
expected.forEach((it, i) => {

View file

@ -218,9 +218,7 @@ add_task(async function test() {
await PlacesTestUtils.addVisits(Services.io.newURI("ftp://some.subdomain.of.foo.com:8000/some/subdirectory"));
// Force initialization of the nsPermissionManager
let enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
let permission = enumerator.getNext().QueryInterface(Ci.nsIPermission);
for (let permission of Services.perms.enumerator) {
let isExpected = false;
expected.forEach((it, i) => {

View file

@ -100,9 +100,7 @@ add_task(function test() {
let found = expected.map((it) => 0);
// Force initialization of the nsPermissionManager
let enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
let permission = enumerator.getNext().QueryInterface(Ci.nsIPermission);
for (let permission of Services.perms.enumerator) {
let isExpected = false;
expected.forEach((it, i) => {

View file

@ -218,9 +218,7 @@ add_task(async function test() {
await PlacesTestUtils.addVisits(Services.io.newURI("ftp://some.subdomain.of.foo.com:8000/some/subdirectory"));
// Force initialization of the nsPermissionManager
let enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
let permission = enumerator.getNext().QueryInterface(Ci.nsIPermission);
for (let permission of Services.perms.enumerator) {
let isExpected = false;
expected.forEach((it, i) => {

View file

@ -94,9 +94,7 @@ add_task(function test() {
let found = expected.map((it) => 0);
// Force initialization of the nsPermissionManager
let enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
let permission = enumerator.getNext().QueryInterface(Ci.nsIPermission);
for (let permission of Services.perms.enumerator) {
let isExpected = false;
expected.forEach((it, i) => {

View file

@ -198,9 +198,7 @@ add_task(async function test() {
await PlacesTestUtils.addVisits(Services.io.newURI("https://localhost:8080"));
// Force initialization of the nsPermissionManager
let enumerator = Services.perms.enumerator;
while (enumerator.hasMoreElements()) {
let permission = enumerator.getNext().QueryInterface(Ci.nsIPermission);
for (let permission of Services.perms.enumerator) {
let isExpected = false;
expected.forEach((it, i) => {

View file

@ -413,10 +413,9 @@ var XPCOMUtils = {
* @param e The nsISimpleEnumerator to iterate over.
* @param i The expected interface for each element.
*/
IterSimpleEnumerator: function* XPCU_IterSimpleEnumerator(e, i)
IterSimpleEnumerator: function XPCU_IterSimpleEnumerator(e, i)
{
while (e.hasMoreElements())
yield e.getNext().QueryInterface(i);
return e.entries(i);
},
/**
@ -437,7 +436,7 @@ var XPCOMUtils = {
enumerateCategoryEntries: function* XPCOMUtils_enumerateCategoryEntries(aCategory)
{
let category = this.categoryManager.enumerateCategory(aCategory);
for (let entry of this.IterSimpleEnumerator(category, Ci.nsISupportsCString)) {
for (let entry of category) {
yield [entry.data, this.categoryManager.getCategoryEntry(aCategory, entry.data)];
}
},

View file

@ -24,9 +24,7 @@ var WindowListener = {
let win = xulWin.docShell.domWindow;
win.addEventListener("load", function listener() {
// Load into any existing windows.
let windows = Services.wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
win = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
for (win of Services.wm.getEnumerator("navigator:browser")) {
break;
}

View file

@ -84,8 +84,7 @@ async function checkCookies(expectedValues, time) {
function getCookiesFromManager(userContextId) {
let cookies = {};
let enumerator = cm.getCookiesWithOriginAttributes(JSON.stringify({userContextId}));
while (enumerator.hasMoreElements()) {
let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie);
for (let cookie of enumerator) {
cookies[cookie.name] = cookie.value;
}
return cookies;

View file

@ -55,12 +55,10 @@ function checkCookie(cookie, cookieObj) {
function countCookies(enumerator) {
let cnt = 0;
while (enumerator.hasMoreElements()) {
for (let cookie of enumerator) {
void cookie;
cnt++;
enumerator.getNext();
}
return cnt;
}

View file

@ -223,10 +223,8 @@ async function test_basic_eviction(base_host, subdomain_host, other_subdomain_ho
// Verify that the given cookie names exist, and are ordered from least to most recently accessed
function verifyCookies(names, uri) {
Assert.equal(cm.countCookiesFromHost(uri.host), names.length);
let cookies = cm.getCookiesFromHost(uri.host, {});
let actual_cookies = [];
while (cookies.hasMoreElements()) {
let cookie = cookies.getNext().QueryInterface(Ci.nsICookie2);
for (let cookie of cm.getCookiesFromHost(uri.host, {})) {
actual_cookies.push(cookie);
}
if (names.length != actual_cookies.length) {

View file

@ -146,9 +146,7 @@ function parsePropertyBag2(bag) {
}
let attributes = [];
let enumerator = bag.enumerator;
while (enumerator.hasMoreElements()) {
let name = enumerator.getNext().QueryInterface(Ci.nsIProperty).name;
for (let {name} of bag.enumerator) {
let value = bag.getPropertyAsACString(name);
attributes.push({
"name": name,

View file

@ -838,9 +838,7 @@ function _propertyBagToObject(propBag) {
let result = {};
if (propBag.QueryInterface) {
propBag.QueryInterface(Ci.nsIPropertyBag2);
let propEnum = propBag.enumerator;
while (propEnum.hasMoreElements()) {
let prop = propEnum.getNext().QueryInterface(Ci.nsIProperty);
for (let prop of propBag.enumerator) {
result[prop.name] = prop.value.toString();
}
} else {

View file

@ -8,9 +8,8 @@ function run_test() {
cm.add("example.com", "/", "C", "V", false, true, false, time, {});
const now = Math.floor((new Date()).getTime() / 1000);
var enumerator = cm.enumerator, found = false;
while (enumerator.hasMoreElements()) {
var cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
var found = false;
for (let cookie of cm.enumerator) {
if (cookie.host == "example.com" &&
cookie.path == "/" &&
cookie.name == "C") {

View file

@ -44,10 +44,7 @@ function run_test() {
// setting up an observer
let networkActivity = function(subject, topic, value) {
subject.QueryInterface(Ci.nsIMutableArray);
let enumerator = subject.enumerate();
while (enumerator.hasMoreElements()) {
let data = enumerator.getNext();
data.QueryInterface(Ci.nsINetworkActivityData);
for (let data of subject.enumerate()) {
results.push(data);
}
};

View file

@ -61,13 +61,7 @@ function run_test() {
}
// test the enumerator ...
var j = 0;
var perms = new Array();
var enumerator = pm.enumerator;
while (enumerator.hasMoreElements()) {
perms[j] = enumerator.getNext().QueryInterface(Ci.nsIPermission);
++j;
}
var perms = Array.from(pm.enumerator);
Assert.equal(perms.length, hosts.length);
// ... remove all the hosts ...

View file

@ -40,9 +40,7 @@ function doConfirm(msg) {
}
function RefreshDeviceList() {
let modules = secmoddb.listModules();
for (let module of XPCOMUtils.IterSimpleEnumerator(modules,
Ci.nsIPKCS11Module)) {
for (let module of secmoddb.listModules()) {
let slots = module.listSlots();
AddModule(module, slots);
}
@ -81,7 +79,7 @@ function AddModule(module, slots) {
row.appendChild(cell);
item.appendChild(row);
var parent = document.createElement("treechildren");
for (let slot of XPCOMUtils.IterSimpleEnumerator(slots, Ci.nsIPKCS11Slot)) {
for (let slot of slots) {
var child_item = document.createElement("treeitem");
var child_row = document.createElement("treerow");
var child_cell = document.createElement("treecell");

View file

@ -288,13 +288,7 @@ function getChainForUsage(results, usage) {
for (let result of results) {
if (certificateUsages[result.usageString] == usage &&
result.errorCode == PRErrorCodeSuccess) {
let array = [];
let enumerator = result.chain.getEnumerator();
while (enumerator.hasMoreElements()) {
let cert = enumerator.getNext().QueryInterface(Ci.nsIX509Cert);
array.push(cert);
}
return array;
return Array.from(result.chain.getEnumerator());
}
}
return null;

View file

@ -90,9 +90,7 @@ function checkDialogContents(win, notBefore, notAfter) {
}
function findCertByCommonName(commonName) {
let certEnumerator = certDB.getCerts().getEnumerator();
while (certEnumerator.hasMoreElements()) {
let cert = certEnumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of certDB.getCerts().getEnumerator()) {
if (cert.commonName == commonName) {
return cert;
}

View file

@ -17,9 +17,7 @@ const TEST_CERT_PASSWORD = "黒い";
const TEST_OUTPUT_PASSWORD = "other password";
function findCertByCommonName(commonName) {
let certEnumerator = gCertDB.getCerts().getEnumerator();
while (certEnumerator.hasMoreElements()) {
let cert = certEnumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of gCertDB.getCerts().getEnumerator()) {
if (cert.commonName == commonName) {
return cert;
}

View file

@ -45,9 +45,7 @@ const gPromptFactory = {
};
function findCertByCommonName(commonName) {
let certEnumerator = gCertDB.getCerts().getEnumerator();
while (certEnumerator.hasMoreElements()) {
let cert = certEnumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of gCertDB.getCerts().getEnumerator()) {
if (cert.commonName == commonName) {
return cert;
}

View file

@ -65,9 +65,7 @@ function getCertAsByteArray(certPath) {
}
function commonFindCertBy(propertyName, value) {
let certEnumerator = gCertDB.getCerts().getEnumerator();
while (certEnumerator.hasMoreElements()) {
let cert = certEnumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of gCertDB.getCerts().getEnumerator()) {
if (cert[propertyName] == value) {
return cert;
}

View file

@ -74,9 +74,7 @@ let gTestcases = [
function doesCertExist(commonName) {
let allCerts = gCertDB.getCerts();
let enumerator = allCerts.getEnumerator();
while (enumerator.hasMoreElements()) {
let cert = enumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of allCerts.getEnumerator()) {
if (cert.isBuiltInRoot) {
continue;
}

View file

@ -82,9 +82,7 @@ function getCertAsByteArray(certPath) {
}
function findCertByCommonName(commonName) {
let certEnumerator = gCertDB.getCerts().getEnumerator();
while (certEnumerator.hasMoreElements()) {
let cert = certEnumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of gCertDB.getCerts().getEnumerator()) {
if (cert.commonName == commonName) {
return cert;
}

View file

@ -31,11 +31,9 @@ function check_no_enterprise_roots_imported(certDB, dbKey = undefined) {
function check_some_enterprise_roots_imported(certDB) {
let enterpriseRoots = certDB.getEnterpriseRoots();
notEqual(enterpriseRoots, null, "should have imported some enterprise roots");
let enumerator = enterpriseRoots.getEnumerator();
let foundNonBuiltIn = false;
let savedDBKey = null;
while (enumerator.hasMoreElements()) {
let cert = enumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of enterpriseRoots.getEnumerator()) {
if (!cert.isBuiltInRoot && !savedDBKey) {
foundNonBuiltIn = true;
savedDBKey = cert.dbKey;

View file

@ -16,8 +16,7 @@ function checkTestModuleNotPresent() {
let modules = gModuleDB.listModules();
ok(modules.hasMoreElements(),
"One or more modules should be present with test module not present");
while (modules.hasMoreElements()) {
let module = modules.getNext().QueryInterface(Ci.nsIPKCS11Module);
for (let module of modules) {
notEqual(module.name, "PKCS11 Test Module",
"Non-test module name shouldn't equal 'PKCS11 Test Module'");
ok(!(module.libName && module.libName.includes("pkcs11testmodule")),
@ -37,8 +36,7 @@ function checkTestModuleExists() {
ok(modules.hasMoreElements(),
"One or more modules should be present with test module present");
let testModule = null;
while (modules.hasMoreElements()) {
let module = modules.getNext().QueryInterface(Ci.nsIPKCS11Module);
for (let module of modules) {
if (module.name == "PKCS11 Test Module") {
testModule = module;
break;
@ -90,12 +88,8 @@ function run_test() {
let testModule = checkTestModuleExists();
// Check that listing the slots for the test module works.
let slots = testModule.listSlots();
let testModuleSlotNames = [];
while (slots.hasMoreElements()) {
let slot = slots.getNext().QueryInterface(Ci.nsIPKCS11Slot);
testModuleSlotNames.push(slot.name);
}
let testModuleSlotNames = Array.from(testModule.listSlots(),
slot => slot.name);
testModuleSlotNames.sort();
const expectedSlotNames = ["Empty PKCS11 Slot", "Test PKCS11 Slot", "Test PKCS11 Slot 二"];
deepEqual(testModuleSlotNames, expectedSlotNames,

View file

@ -30,8 +30,7 @@ function run_test() {
Services.strings.createBundle("chrome://pipnss/locale/pipnss.properties");
let rootsModuleName = bundle.GetStringFromName("RootCertModuleName");
let foundRootsModule = false;
for (let module of XPCOMUtils.IterSimpleEnumerator(moduleDB.listModules(),
Ci.nsIPKCS11Module)) {
for (let module of moduleDB.listModules()) {
if (module.name == rootsModuleName) {
foundRootsModule = true;
break;

View file

@ -9,8 +9,7 @@
do_get_profile();
function find_slot_by_name(module, name) {
for (let slot of XPCOMUtils.IterSimpleEnumerator(module.listSlots(),
Ci.nsIPKCS11Slot)) {
for (let slot of module.listSlots()) {
if (slot.name == name) {
return slot;
}
@ -19,8 +18,7 @@ function find_slot_by_name(module, name) {
}
function find_module_by_name(moduleDB, name) {
for (let slot of XPCOMUtils.IterSimpleEnumerator(moduleDB.listModules(),
Ci.nsIPKCS11Module)) {
for (let slot of moduleDB.listModules()) {
if (slot.name == name) {
return slot;
}

View file

@ -64,13 +64,7 @@ function insertEntries() {
}
function getEntries(type) {
let entryEnumerator = sss.enumerate(type);
let entries = [];
while (entryEnumerator.hasMoreElements()) {
let entry = entryEnumerator.getNext();
entries.push(entry.QueryInterface(Ci.nsISiteSecurityState));
}
return entries;
return Array.from(sss.enumerate(type));
}
function checkSiteSecurityStateAttrs(entries) {
@ -92,11 +86,9 @@ function checkSiteSecurityStateAttrs(entries) {
function checkSha256Keys(hpkpEntries) {
for (let hpkpEntry of hpkpEntries) {
let enumerator = hpkpEntry.QueryInterface(Ci.nsISiteHPKPState).sha256Keys;
let keys = [];
while (enumerator.hasMoreElements()) {
keys.push(enumerator.getNext().QueryInterface(Ci.nsIVariant));
}
let keys = Array.from(hpkpEntry.QueryInterface(Ci.nsISiteHPKPState).sha256Keys,
key => key.QueryInterface(Ci.nsIVariant));
equal(keys.length, KEY_HASHES.length, "Should get correct number of keys");
keys.sort();
for (let i = 0; i < KEY_HASHES.length; i++) {

View file

@ -375,11 +375,9 @@ function downloadAndParseChromePins(filename,
// nicknames and digests of the SPKInfo for the mozilla trust store
function loadNSSCertinfo(extraCertificates) {
let allCerts = gCertDB.getCerts();
let enumerator = allCerts.getEnumerator();
let certNameToSKD = {};
let certSKDToName = {};
while (enumerator.hasMoreElements()) {
let cert = enumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of allCerts.getEnumerator()) {
if (!cert.isBuiltInRoot) {
continue;
}

View file

@ -172,10 +172,7 @@ function insertTrustAnchorsFromDatabase() {
const TRUST_TYPE = Ci.nsIX509CertDB.TRUSTED_SSL;
// Iterate through the whole Cert DB
let enumerator = CertDb.getCerts().getEnumerator();
while (enumerator.hasMoreElements()) {
let cert = enumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of CertDb.getCerts().getEnumerator()) {
// Find the certificate in our existing list. Do it here because we need to check if
// it's untrusted too.

View file

@ -227,10 +227,9 @@ add_task(async function test_logFileError() {
function countLogFiles() {
let logsdir = FileUtils.getDir("ProfD", ["weave", "logs"], true);
let count = 0;
let entries = logsdir.directoryEntries;
while (entries.hasMoreElements()) {
for (let entry of logsdir.directoryEntries) {
void entry;
count += 1;
entries.getNext();
}
return count;
}

View file

@ -135,9 +135,7 @@ TabStore.prototype = {
let allTabs = [];
let winEnum = this.getWindowEnumerator();
while (winEnum.hasMoreElements()) {
let win = winEnum.getNext();
for (let win of this.getWindowEnumerator()) {
if (this.shouldSkipWindow(win)) {
continue;
}
@ -235,9 +233,8 @@ TabStore.prototype = {
// first syncs.
let ids = {};
let allWindowsArePrivate = false;
let wins = Services.wm.getEnumerator("navigator:browser");
while (wins.hasMoreElements()) {
if (PrivateBrowsingUtils.isWindowPrivate(wins.getNext())) {
for (let win of Services.wm.getEnumerator("navigator:browser")) {
if (PrivateBrowsingUtils.isWindowPrivate(win)) {
// Ensure that at least there is a private window.
allWindowsArePrivate = true;
} else {
@ -320,17 +317,15 @@ TabTracker.prototype = {
onStart() {
Svc.Obs.add("domwindowopened", this.asyncObserver);
let wins = Services.wm.getEnumerator("navigator:browser");
while (wins.hasMoreElements()) {
this._registerListenersForWindow(wins.getNext());
for (let win of Services.wm.getEnumerator("navigator:browser")) {
this._registerListenersForWindow(win);
}
},
onStop() {
Svc.Obs.remove("domwindowopened", this.asyncObserver);
let wins = Services.wm.getEnumerator("navigator:browser");
while (wins.hasMoreElements()) {
this._unregisterListenersForWindow(wins.getNext());
for (let win of Services.wm.getEnumerator("navigator:browser")) {
this._unregisterListenersForWindow(win);
}
},

View file

@ -241,14 +241,7 @@ function mockGetWindowEnumerator(url, numWindows, numTabs, indexes, moreURLs) {
},
});
return {
hasMoreElements() {
return elements.length;
},
getNext() {
return elements.shift();
},
};
return elements.values();
}
// Helper function to get the sync telemetry and add the typically used test

View file

@ -16,34 +16,31 @@ function fakeSvcWinMediator() {
// actions on windows are captured in logs
let logs = [];
delete Services.wm;
function getNext() {
let elt = {addTopics: [], remTopics: [], numAPL: 0, numRPL: 0};
logs.push(elt);
return {
addEventListener(topic) {
elt.addTopics.push(topic);
},
removeEventListener(topic) {
elt.remTopics.push(topic);
},
gBrowser: {
addProgressListener() {
elt.numAPL++;
},
removeProgressListener() {
elt.numRPL++;
},
},
};
}
Services.wm = {
getEnumerator() {
return {
cnt: 2,
hasMoreElements() {
return this.cnt-- > 0;
},
getNext() {
let elt = {addTopics: [], remTopics: [], numAPL: 0, numRPL: 0};
logs.push(elt);
return {
addEventListener(topic) {
elt.addTopics.push(topic);
},
removeEventListener(topic) {
elt.remTopics.push(topic);
},
gBrowser: {
addProgressListener() {
elt.numAPL++;
},
removeProgressListener() {
elt.numRPL++;
},
},
};
}
};
return [getNext(), getNext()];
}
};
return logs;

View file

@ -23,9 +23,7 @@ function load_test_vacuum_component() {
let catMan = Cc["@mozilla.org/categorymanager;1"].
getService(Ci.nsICategoryManager);
let found = false;
let entries = catMan.enumerateCategory(CATEGORY_NAME);
while (entries.hasMoreElements()) {
let entry = entries.getNext().QueryInterface(Ci.nsISupportsCString).data;
for (let {data: entry} of catMan.enumerateCategory(CATEGORY_NAME)) {
print("Check if the found category entry (" + entry + ") is expected.");
if (EXPECTED_ENTRIES.includes(entry)) {
print("Check that only one test entry exists.");

View file

@ -370,11 +370,9 @@ function downloadAndParseChromePins(filename,
// nicknames and digests of the SPKInfo for the mozilla trust store
function loadNSSCertinfo(extraCertificates) {
let allCerts = gCertDB.getCerts();
let enumerator = allCerts.getEnumerator();
let certNameToSKD = {};
let certSKDToName = {};
while (enumerator.hasMoreElements()) {
let cert = enumerator.getNext().QueryInterface(Ci.nsIX509Cert);
for (let cert of allCerts.getEnumerator()) {
if (!cert.isBuiltInRoot) {
continue;
}

View file

@ -383,9 +383,7 @@ class MarionetteParentProcess {
// When Firefox starts on Windows, an additional GFX sanity test
// window may appear off-screen. Marionette should wait for it
// to close.
let winEn = Services.wm.getEnumerator(null);
while (winEn.hasMoreElements()) {
let win = winEn.getNext();
for (let win of Services.wm.getEnumerator(null)) {
if (win.document.documentURI == "chrome://gfxsanity/content/sanityparent.html") {
this.gfxWindow = win;
break;

View file

@ -209,9 +209,8 @@ cookie.iter = function* (host, currentPath = "/") {
const isForCurrentPath = path => currentPath.includes(path);
let en = cookie.manager.getCookiesFromHost(host, {});
while (en.hasMoreElements()) {
let cookie = en.getNext().QueryInterface(Ci.nsICookie2);
let cookies = cookie.manager.getCookiesFromHost(host, {});
for (let cookie of cookies) {
// take the hostname and progressively shorten
let hostname = host;
do {

View file

@ -92,24 +92,6 @@ const globalMessageManager = Services.mm;
* @namespace driver
*/
/**
* Helper function for converting a {@link nsISimpleEnumerator} to a
* JavaScript iterator.
*
* @memberof driver
*
* @param {nsISimpleEnumerator} enumerator
* Enumerator to turn into iterator.
*
* @return {Iterable}
* Iterator.
*/
function* enumeratorIterator(enumerator) {
while (enumerator.hasMoreElements()) {
yield enumerator.getNext();
}
}
/**
* Implements (parts of) the W3C WebDriver protocol. GeckoDriver lives
* in chrome space and mediates calls to the message listener of the current
@ -243,7 +225,7 @@ Object.defineProperty(GeckoDriver.prototype, "timeouts", {
Object.defineProperty(GeckoDriver.prototype, "windows", {
get() {
return enumeratorIterator(Services.wm.getEnumerator(null));
return Services.wm.getEnumerator(null);
},
});

View file

@ -62,10 +62,7 @@ modal.addHandler = function(handler) {
modal.findModalDialogs = function(context) {
// First check if there is a modal dialog already present for the
// current browser window.
let winEn = Services.wm.getEnumerator(null);
while (winEn.hasMoreElements()) {
let win = winEn.getNext();
for (let win of Services.wm.getEnumerator(null)) {
// Modal dialogs which do not have an opener set, we cannot detect
// as long as GetZOrderDOMWindowEnumerator doesn't work on Linux
// (Bug 156333).

View file

@ -42,21 +42,8 @@ cookie.manager = {
getCookiesFromHost(host) {
let hostCookies = this.cookies.filter(c => c.host === host ||
c.host === "." + host);
let nextIndex = 0;
return {
hasMoreElements() {
return nextIndex < hostCookies.length;
},
getNext() {
return {
QueryInterface() {
return hostCookies[nextIndex++];
},
};
},
};
return hostCookies;
},
};

View file

@ -129,9 +129,7 @@ this.mochikit = class extends ExtensionAPI {
onShutdown() {
if (AppConstants.platform != "android") {
let windows = Services.wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let win = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
for (let win of Services.wm.getEnumerator("navigator:browser")) {
WindowListener.tearDownWindow(win);
}

View file

@ -537,9 +537,7 @@ Tester.prototype = {
},
waitForGraphicsTestWindowToBeGone(aCallback) {
let windowsEnum = Services.wm.getEnumerator(null);
while (windowsEnum.hasMoreElements()) {
let win = windowsEnum.getNext();
for (let win of Services.wm.getEnumerator(null)) {
if (win != window && !win.closed &&
win.document.documentURI == "chrome://gfxsanity/content/sanityparent.html") {
this.BrowserTestUtils.domWindowClosed(win).then(aCallback);
@ -586,9 +584,7 @@ Tester.prototype = {
// Remove stale windows
this.structuredLogger.info("checking window state");
let windowsEnum = Services.wm.getEnumerator(null);
while (windowsEnum.hasMoreElements()) {
let win = windowsEnum.getNext();
for (let win of Services.wm.getEnumerator(null)) {
if (win != window && !win.closed &&
win.document.documentElement.getAttribute("id") != "browserTestHarness") {
let type = win.document.documentElement.getAttribute("windowtype");

View file

@ -262,13 +262,10 @@ SpecialPowersObserverAPI.prototype = {
// First create observers from the category manager.
let cm =
Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
let enumerator = cm.enumerateCategory(topic);
let observers = [];
while (enumerator.hasMoreElements()) {
let entry =
enumerator.getNext().QueryInterface(Ci.nsISupportsCString).data;
for (let {data: entry} of cm.enumerateCategory(topic)) {
let contractID = cm.getCategoryEntry(topic, entry);
let factoryFunction;
@ -289,14 +286,11 @@ SpecialPowersObserverAPI.prototype = {
}
// Next enumerate the registered observers.
enumerator = Services.obs.enumerateObservers(topic);
while (enumerator.hasMoreElements()) {
try {
let observer = enumerator.getNext().QueryInterface(Ci.nsIObserver);
if (!observers.includes(observer)) {
observers.push(observer);
}
} catch (e) { }
for (let observer of Services.obs.enumerateObservers(topic)) {
if (observer instanceof Ci.nsIObserver &&
!observers.includes(observer)) {
observers.push(observer);
}
}
observers.forEach(function(observer) {

View file

@ -245,9 +245,7 @@ TalosPowersService.prototype = {
});
}
let enumerator = Services.wm.getEnumerator(null);
while (enumerator.hasMoreElements()) {
let domWindow = enumerator.getNext();
for (let domWindow of Services.wm.getEnumerator(null)) {
domWindow.close();
}

View file

@ -252,9 +252,7 @@ HandlerService.prototype = {
if (handlerInfo.preferredApplicationHandler) {
handlers.push(handlerInfo.preferredApplicationHandler);
}
let enumerator = handlerInfo.possibleApplicationHandlers.enumerate();
while (enumerator.hasMoreElements()) {
let handler = enumerator.getNext().QueryInterface(Ci.nsIHandlerApp);
for (let handler of handlerInfo.possibleApplicationHandlers.enumerate(Ci.nsIHandlerApp)) {
// If the caller stored duplicate handlers, we save them only once.
if (!handlers.some(h => h.equals(handler))) {
handlers.push(handler);

View file

@ -35,14 +35,9 @@ var HandlerServiceTestUtils = {
* alphabetically regardless of category.
*/
getAllHandlerInfoTypes() {
let handlerInfoTypes = [];
let handlerInfoEnumerator = gHandlerService.enumerate();
while (handlerInfoEnumerator.hasMoreElements()) {
let handlerInfo = handlerInfoEnumerator.getNext()
.QueryInterface(Ci.nsIHandlerInfo);
handlerInfoTypes.push(handlerInfo.type);
}
return handlerInfoTypes.sort();
return Array.from(gHandlerService.enumerate(),
info => info.type)
.sort();
},
/**

View file

@ -29,9 +29,7 @@ add_task(async function() {
// check the extension.
var mimeType = gHandlerSvc.getTypeFromExtension("abc");
is(mimeType, launcher.MIMEInfo.type, "Got correct mime type.");
var handlerInfos = gHandlerSvc.enumerate();
while (handlerInfos.hasMoreElements()) {
let handlerInfo = handlerInfos.getNext().QueryInterface(Ci.nsIHandlerInfo);
for (let handlerInfo of gHandlerSvc.enumerate()) {
if (handlerInfo.type == launcher.MIMEInfo.type) {
// check the alwaysAskBeforeHandling
ok(!handlerInfo.alwaysAskBeforeHandling,

View file

@ -240,9 +240,7 @@ function run_test() {
handlerTypes.push("irc");
handlerTypes.push("ircs");
}
var handlers = handlerSvc.enumerate();
while (handlers.hasMoreElements()) {
var handler = handlers.getNext().QueryInterface(Ci.nsIHandlerInfo);
for (let handler of handlerSvc.enumerate()) {
Assert.notEqual(handlerTypes.indexOf(handler.type), -1);
handlerTypes.splice(handlerTypes.indexOf(handler.type), 1);
}

View file

@ -84,10 +84,8 @@ function test_clear() {
function test_enumerate() {
var arr = create_n_element_array(5);
Assert.equal(5, arr.length);
var en = arr.enumerate();
var i = 0;
while (en.hasMoreElements()) {
let str = en.getNext();
for (let str of arr.enumerate()) {
Assert.ok(str instanceof Ci.nsISupportsString);
Assert.equal(str.data, "element " + i);
i++;