author | Tooru Fujisawa <arai_a@mac.com> |
Mon, 19 Oct 2015 03:52:58 +0900 | |
changeset 271353 | 1de5ecadcceebb00801baeddabbb76f140a85d66 |
parent 271352 | 9aab415d2bd9b8ee29f71e3a7b3bd7616bb006be |
child 271354 | 16d3dd16ef70f798a325b64152aa440c3e1cbd9b |
push id | 67622 |
push user | arai_a@mac.com |
push date | Thu, 05 Nov 2015 15:25:57 +0000 |
treeherder | mozilla-inbound@1de5ecadccee [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | gps |
bugs | 1217077 |
milestone | 45.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/services/cloudsync/CloudSyncBookmarks.jsm +++ b/services/cloudsync/CloudSyncBookmarks.jsm @@ -549,44 +549,44 @@ var RootFolder = function (rootId, rootN } } else if (item.__exists__ && item.deleted) { deletedItems.push(item); } else if (item.__exists__) { updatedItems.push(item); } } - for each (let item in items) { + for (let item of items) { if (!item || 'object' !== typeof(item)) { continue; } let promise = exists(item).then(handleSortedItem, Promise.reject); promises.push(promise); } return Promise.all(promises); } let processNewFolders = function () { let newFolderGuids = Object.keys(newFolders); let newFolderRoots = []; - for each (let guid in newFolderGuids) { + for (let guid of newFolderGuids) { let item = newFolders[guid]; if (item.parent && newFolderGuids.indexOf(item.parent) >= 0) { let parent = newFolders[item.parent]; parent._children.push(item.id); } else { newFolderRoots.push(guid); } }; let promises = []; - for each (let guid in newFolderRoots) { + for (let guid of newFolderRoots) { let root = newFolders[guid]; let promise = Promise.resolve(); promise = promise.then( function () { return _createItem(root); }, Promise.reject ); @@ -606,25 +606,25 @@ var RootFolder = function (rootId, rootN } return Promise.all(promises); } let processItems = function () { let promises = []; - for each (let item in newItems) { + for (let item of newItems) { promises.push(_createItem(item)); } - for each (let item in updatedItems) { + for (let item of updatedItems) { promises.push(_updateItem(item)); } - for each (let item in deletedItems) { + for (let item of deletedItems) { _deleteItem(item); } return Promise.all(promises); } sortItems().then(processNewFolders) .then(processItems)
--- a/services/cloudsync/CloudSyncEventSource.jsm +++ b/services/cloudsync/CloudSyncEventSource.jsm @@ -3,17 +3,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ this.EXPORTED_SYMBOLS = ["EventSource"]; Components.utils.import("resource://services-common/utils.js"); var EventSource = function (types, suspendFunc, resumeFunc) { this.listeners = new Map(); - for each (let type in types) { + for (let type of types) { this.listeners.set(type, new Set()); } this.suspend = suspendFunc || function () {}; this.resume = resumeFunc || function () {}; this.addEventListener = this.addEventListener.bind(this); this.removeEventListener = this.removeEventListener.bind(this);
--- a/services/cloudsync/CloudSyncPlacesWrapper.jsm +++ b/services/cloudsync/CloudSyncPlacesWrapper.jsm @@ -135,17 +135,17 @@ PlacesWrapper.prototype = { query.params.parent_id = folder; query.params.item_type = PlacesUtils.bookmarks.TYPE_FOLDER; this.asyncQuery(query, ["id", "guid"]).then( function (items) { let previousIds = folderCache.getChildren(folder); let currentIds = new Set(); - for each (let item in items) { + for (let item of items) { currentIds.add(item.id); } let newIds = new Set(); let missingIds = new Set(); for (let currentId of currentIds) { if (!previousIds.has(currentId)) { newIds.add(currentId); @@ -183,17 +183,17 @@ PlacesWrapper.prototype = { "WHERE n.name = :anno_name"; let query = this.placesQueries.getQuery(stmt); query.params.anno_name = anno.toString(); this.asyncQuery(query, ["item_id"]) .then(function (items) { let results = []; - for each(let item in items) { + for (let item of items) { results.push(item.item_id); } deferred.resolve(results); }, deferred.reject); return deferred.promise; }, @@ -206,17 +206,17 @@ PlacesWrapper.prototype = { "WHERE b.item_id = :item_id"; let query = this.placesQueries.getQuery(stmt); query.params.item_id = id; this.asyncQuery(query, ["name", "content"]) .then(function (results) { let annos = {}; - for each(let result in results) { + for (let result of results) { annos[result.name] = result.content; } deferred.resolve(annos); }, deferred.reject); return deferred.promise; }, @@ -342,17 +342,17 @@ PlacesWrapper.prototype = { handleResult: function (results) { if (!names) { return; } let row; while ((row = results.getNextRow()) != null) { let item = {}; - for each (let name in names) { + for (let name of names) { item[name] = row.getResultByName(name); } this.results.push(item); } }, handleError: function (error) { deferred.reject(error);
--- a/services/cloudsync/CloudSyncTabs.jsm +++ b/services/cloudsync/CloudSyncTabs.jsm @@ -82,17 +82,17 @@ TabCache.prototype = { } catch (e) { throw new Error("unable to update client: " + e); } } else { cRecord = new ClientRecord(client); this.clients.set(cRecord.id, cRecord); } - for each (let tab in tabs) { + for (let tab of tabs) { if (!tab || 'object' !== typeof(tab)) { continue; } let tRecord; if (this.tabs.has(tab.url)) { tRecord = this.tabs.get(tab.url); try { @@ -153,25 +153,25 @@ this.Tabs = function () { return; } } eventSource.emit("change"); }; let registerListenersForWindow = function (window) { - for each (let topic in topics) { + for (let topic of topics) { window.addEventListener(topic, update, false); } window.addEventListener("unload", unregisterListeners, false); }; let unregisterListenersForWindow = function (window) { window.removeEventListener("unload", unregisterListeners, false); - for each (let topic in topics) { + for (let topic of topics) { window.removeEventListener(topic, update, false); } }; let unregisterListeners = function (event) { unregisterListenersForWindow(event.target); };
--- a/services/common/async.js +++ b/services/common/async.js @@ -172,17 +172,17 @@ this.Async = { return; } if (!this.results) { this.results = []; } let row; while ((row = results.getNextRow()) != null) { let item = {}; - for each (let name in this.names) { + for (let name of this.names) { item[name] = row.getResultByName(name); } this.results.push(item); } }, handleError: function handleError(error) { this.syncCb.throw(error); },
--- a/services/common/modules-testing/storageserver.js +++ b/services/common/modules-testing/storageserver.js @@ -97,17 +97,17 @@ ServerBSO.prototype = { "payload", "ttl", "sortindex", ], toJSON: function toJSON() { let obj = {}; - for each (let key in this.FIELDS) { + for (let key of this.FIELDS) { if (this[key] !== undefined) { obj[key] = this[key]; } } return obj; }, @@ -301,17 +301,17 @@ StorageServerCollection.prototype = { set timestamp(timestamp) { CommonUtils.ensureMillisecondsTimestamp(timestamp); this._timestamp = timestamp; }, get totalPayloadSize() { let size = 0; - for each (let bso in this.bsos()) { + for (let bso of this.bsos()) { size += bso.payload.length; } return size; }, /** * Convenience accessor for our BSO keys. @@ -436,17 +436,18 @@ StorageServerCollection.prototype = { c++; } } return c; }, get: function get(options) { let data = []; - for each (let bso in this._bsos) { + for (let id in this._bsos) { + let bso = this._bsos[id]; if (!bso.modified) { continue; } if (!this._inResultSet(bso, options)) { continue; } @@ -499,17 +500,17 @@ StorageServerCollection.prototype = { post: function post(input, timestamp) { let success = []; let failed = {}; let count = 0; let size = 0; // This will count records where we have an existing ServerBSO // registered with us as successful and all other records as failed. - for each (let record in input) { + for (let record of input) { count += 1; if (count > this.BATCH_MAX_COUNT) { failed[record.id] = "Max record count exceeded."; continue; } if (typeof(record.payload) != "string") { failed[record.id] = "Payload is not a string!"; @@ -597,17 +598,17 @@ StorageServerCollection.prototype = { } } return deleted; }, parseOptions: function parseOptions(request) { let options = {}; - for each (let chunk in request.queryString.split("&")) { + for (let chunk of request.queryString.split("&")) { if (!chunk) { continue; } chunk = chunk.split("="); let key = decodeURIComponent(chunk[0]); if (chunk.length == 1) { options[key] = ""; } else { @@ -651,17 +652,17 @@ StorageServerCollection.prototype = { getHandler: function getHandler(request, response) { let options = this.parseOptions(request); let data = this.get(options); if (request.hasHeader("x-if-modified-since")) { let requestModified = parseInt(request.getHeader("x-if-modified-since"), 10); let newestBSO = 0; - for each (let bso in data) { + for (let bso of data) { if (bso.modified > newestBSO) { newestBSO = bso.modified; } } if (requestModified >= newestBSO) { response.setHeader("X-Last-Modified", "" + newestBSO); response.setStatusLine(request.httpVersion, 304, "Not Modified"); @@ -741,17 +742,17 @@ StorageServerCollection.prototype = { throw HTTP_400; } if (!Array.isArray(input)) { this._log.info("Input JSON type not an array!"); return sendMozSvcError(request, response, "8"); } } else if (inputMediaType == "application/newlines") { - for each (let line in inputBody.split("\n")) { + for (let line of inputBody.split("\n")) { let record; try { record = JSON.parse(line); } catch (ex) { this._log.info("JSON parse error on line!"); return sendMozSvcError(request, response, "8"); } @@ -1073,17 +1074,18 @@ StorageServer.prototype = { * @param username * The name of the affected user. */ deleteCollections: function deleteCollections(username) { if (!(username in this.users)) { throw new Error("Unknown user."); } let userCollections = this.users[username].collections; - for each (let [name, coll] in Iterator(userCollections)) { + for (let name in userCollections) { + let coll = userCollections[name]; this._log.trace("Bulk deleting " + name + " for " + username + "..."); coll.delete({}); } this.users[username].collections = {}; }, getQuota: function getQuota(username) { if (!(username in this.users)) { @@ -1094,17 +1096,18 @@ StorageServer.prototype = { }, /** * Obtain the newest timestamp of all collections for a user. */ newestCollectionTimestamp: function newestCollectionTimestamp(username) { let collections = this.users[username].collections; let newest = 0; - for each (let collection in collections) { + for (let name in collections) { + let collection = collections[name]; if (collection.timestamp > newest) { newest = collection.timestamp; } } return newest; }, @@ -1144,17 +1147,19 @@ StorageServer.prototype = { data[k] = v.totalPayloadSize; } return data; }, infoQuota: function infoQuota(username) { let total = 0; - for each (let value in this.infoUsage(username)) { + let usage = this.infoUsage(username); + for (let key in usage) { + let value = usage[key]; total += value; } return { quota: this.getQuota(username), usage: total }; }, @@ -1186,19 +1191,21 @@ StorageServer.prototype = { modified: modified, quota: quota, }; }, _pruneExpired: function _pruneExpired() { let now = Date.now(); - for each (let user in this.users) { - for each (let collection in user.collections) { - for each (let bso in collection.bsos()) { + for (let username in this.users) { + let user = this.users[username]; + for (let name in user.collections) { + let collection = user.collections[name]; + for (let bso of collection.bsos()) { // ttl === 0 is a special case, so we can't simply !ttl. if (typeof(bso.ttl) != "number") { continue; } let ttlDate = bso.modified + (bso.ttl * 1000); if (ttlDate < now) { this._log.info("Deleting BSO because TTL expired: " + bso.id); @@ -1235,17 +1242,21 @@ StorageServer.prototype = { defaultHeaders: {}, /** * HTTP response utility. */ respond: function respond(req, resp, code, status, body, headers, timestamp) { this._log.info("Response: " + code + " " + status); resp.setStatusLine(req.httpVersion, code, status); - for each (let [header, value] in Iterator(headers || this.defaultHeaders)) { + if (!headers) { + headers = this.defaultHeaders; + } + for (let header in headers) { + let value = headers[header]; resp.setHeader(header, value, false); } if (timestamp) { resp.setHeader("X-Timestamp", "" + timestamp, false); } if (body) {
--- a/services/common/stringbundle.js +++ b/services/common/stringbundle.js @@ -19,17 +19,17 @@ var {classes: Cc, interfaces: Ci, result * To use this module, import it, create a new instance of StringBundle, * and then use the instance's |get| and |getAll| methods to retrieve strings * (you can get both plain and formatted strings with |get|): * * let strings = * new StringBundle("chrome://example/locale/strings.properties"); * let foo = strings.get("foo"); * let barFormatted = strings.get("bar", [arg1, arg2]); - * for each (let string in strings.getAll()) + * for (let string of strings.getAll()) * dump (string.key + " = " + string.value + "\n"); * * @param url {String} * the URL of the string bundle */ this.StringBundle = function StringBundle(url) { this.url = url; }
--- a/services/common/tests/mach_commands.py +++ b/services/common/tests/mach_commands.py @@ -82,17 +82,17 @@ class SyncTestCommands(MachCommandBase): '-m', '-s', '-e', 'const _TESTING_MODULES_DIR = "%s/_tests/modules";' % topobjdir, '-f', '%s/testing/xpcshell/head.js' % topsrcdir, '-e', 'const _SERVER_ADDR = "%s";' % hostname, '-e', 'const SERVER_PORT = "%s";' % port, '-e', 'const INCLUDE_FILES = [%s];' % ', '.join(head_paths), '-e', '_register_protocol_handlers();', - '-e', 'for each (let name in INCLUDE_FILES) load(name);', + '-e', 'for (let name of INCLUDE_FILES) load(name);', '-e', '_fakeIdleService.activate();', '-f', js_file ] profile_dir = mkdtemp() print 'Created profile directory: %s' % profile_dir try:
--- a/services/common/tests/unit/head_global.js +++ b/services/common/tests/unit/head_global.js @@ -37,15 +37,15 @@ registrar.registerFactory(Components.ID( XULAppInfoFactory); function addResourceAlias() { Cu.import("resource://gre/modules/Services.jsm"); const handler = Services.io.getProtocolHandler("resource") .QueryInterface(Ci.nsIResProtocolHandler); let modules = ["common", "crypto"]; - for each (let module in modules) { + for (let module of modules) { let uri = Services.io.newURI("resource://gre/modules/services-" + module + "/", null, null); handler.setSubstitution("services-" + module, uri); } } addResourceAlias();
--- a/services/common/tests/unit/test_load_modules.js +++ b/services/common/tests/unit/test_load_modules.js @@ -29,32 +29,32 @@ const non_android_test_modules = [ "storageserver.js", ]; const non_android_healthreport_test_modules = [ "bagheeraserver.js", ]; function expectImportsToSucceed(mm, base=MODULE_BASE) { - for each (let m in mm) { + for (let m of mm) { let resource = base + m; let succeeded = false; try { Components.utils.import(resource, {}); succeeded = true; } catch (e) {} if (!succeeded) { throw "Importing " + resource + " should have succeeded!"; } } } function expectImportsToFail(mm, base=MODULE_BASE) { - for each (let m in mm) { + for (let m of mm) { let resource = base + m; let succeeded = false; try { Components.utils.import(resource, {}); succeeded = true; } catch (e) {} if (succeeded) {
--- a/services/common/tests/unit/test_tokenserverclient.js +++ b/services/common/tests/unit/test_tokenserverclient.js @@ -55,17 +55,17 @@ add_test(function test_invalid_arguments _("Ensure invalid arguments to APIs are rejected."); let args = [ [null, "assertion", function() {}], ["http://example.com/", null, function() {}], ["http://example.com/", "assertion", null] ]; - for each (let arg in args) { + for (let arg of args) { try { let client = new TokenServerClient(); client.getTokenFromBrowserIDAssertion(arg[0], arg[1], arg[2]); do_throw("Should never get here."); } catch (ex) { do_check_true(ex instanceof TokenServerClientError); } }
--- a/services/common/utils.js +++ b/services/common/utils.js @@ -200,26 +200,25 @@ this.CommonUtils = { str = this._utf8Converter.ConvertToUnicode(str); return str + this._utf8Converter.Finish(); } catch (ex) { return null; } }, byteArrayToString: function byteArrayToString(bytes) { - return [String.fromCharCode(byte) for each (byte in bytes)].join(""); + return bytes.map(byte => String.fromCharCode(byte)).join(""); }, stringToByteArray: function stringToByteArray(bytesString) { - return [String.charCodeAt(byte) for each (byte in bytesString)]; + return Array.prototype.slice.call(bytesString).map(c => c.charCodeAt(0)); }, bytesAsHex: function bytesAsHex(bytes) { - return [("0" + bytes.charCodeAt(byte).toString(16)).slice(-2) - for (byte in bytes)].join(""); + return Array.prototype.slice.call(bytes).map(c => ("0" + c.charCodeAt(0).toString(16)).slice(-2)).join(""); }, stringAsHex: function stringAsHex(str) { return CommonUtils.bytesAsHex(CommonUtils.encodeUTF8(str)); }, stringToBytes: function stringToBytes(str) { return CommonUtils.hexToBytes(CommonUtils.stringAsHex(str)); @@ -251,17 +250,17 @@ this.CommonUtils = { for (let i = leftover; i < 5; i++) bytes += "\0"; } // Chop the string into quanta of 5 bytes (40 bits). Each quantum // is turned into 8 characters from the 32 character base. let ret = ""; for (let i = 0; i < bytes.length; i += 5) { - let c = [byte.charCodeAt() for each (byte in bytes.slice(i, i + 5))]; + let c = Array.prototype.slice.call(bytes.slice(i, i + 5)).map(byte => byte.charCodeAt(0)); ret += key[c[0] >> 3] + key[((c[0] << 2) & 0x1f) | (c[1] >> 6)] + key[(c[1] >> 1) & 0x1f] + key[((c[1] << 4) & 0x1f) | (c[2] >> 4)] + key[((c[2] << 1) & 0x1f) | (c[3] >> 7)] + key[(c[3] >> 2) & 0x1f] + key[((c[3] << 3) & 0x1f) | (c[4] >> 5)] + key[c[4] & 0x1f];
--- a/services/crypto/modules/utils.js +++ b/services/crypto/modules/utils.js @@ -51,17 +51,17 @@ this.CryptoUtils = { /** * Treat the given message as a bytes string and hash it with the given * hasher. Returns a string containing bytes. The hasher is reset if it's * an HMAC hasher. */ digestBytes: function digestBytes(message, hasher) { // No UTF-8 encoding for you, sunshine. - let bytes = [b.charCodeAt() for each (b in message)]; + let bytes = Array.prototype.slice.call(message).map(b => b.charCodeAt(0)); hasher.update(bytes, bytes.length); let result = hasher.finish(false); if (hasher instanceof Ci.nsICryptoHMAC) { hasher.reset(); } return result; },
--- a/services/crypto/tests/unit/test_load_modules.js +++ b/services/crypto/tests/unit/test_load_modules.js @@ -2,15 +2,15 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ const modules = [ "utils.js", "WeaveCrypto.js", ]; function run_test() { - for each (let m in modules) { + for (let m of modules) { let resource = "resource://services-crypto/" + m; _("Attempting to import: " + resource); Components.utils.import(resource, {}); } }
--- a/services/metrics/providermanager.jsm +++ b/services/metrics/providermanager.jsm @@ -277,17 +277,18 @@ this.ProviderManager.prototype = Object. try { yield inFlightPromise; } catch (ex) { this._log.warn("Error when waiting for existing pull-only promise: " + CommonUtils.exceptionStr(ex)); } } - for each (let providerType in this._pullOnlyProviders) { + for (let name in this._pullOnlyProviders) { + let providerType = this._pullOnlyProviders[name]; // Short-circuit if we're no longer registering. if (this._pullOnlyProvidersState != this.PULL_ONLY_REGISTERING) { this._log.debug("Aborting pull-only provider registration."); break; } try { let provider = this._initProviderFromType(providerType);
--- a/services/sync/modules/addonsreconciler.js +++ b/services/sync/modules/addonsreconciler.js @@ -213,21 +213,22 @@ AddonsReconciler.prototype = { if (callback) { callback(null, false); } return; } this._addons = json.addons; - for each (let record in this._addons) { + for (let id in this._addons) { + let record = this._addons[id]; record.modified = new Date(record.modified); } - for each (let [time, change, id] in json.changes) { + for (let [time, change, id] of json.changes) { this._changes.push([new Date(time), change, id]); } if (callback) { callback(null, true); } }); }, @@ -253,17 +254,17 @@ AddonsReconciler.prototype = { state.addons[id][k] = v.getTime(); } else { state.addons[id][k] = v; } } } - for each (let [time, change, id] in this._changes) { + for (let [time, change, id] of this._changes) { state.changes.push([time.getTime(), change, id]); } this._log.info("Saving reconciler state to file: " + file); Utils.jsonSave(file, this, state, callback); }, /** @@ -345,17 +346,17 @@ AddonsReconciler.prototype = { this._log.info("Refreshing global state from AddonManager."); this._ensureStateLoaded(); let installs; AddonManager.getAllAddons(function (addons) { let ids = {}; - for each (let addon in addons) { + for (let addon of addons) { ids[addon.id] = true; this.rectifyStateFromAddon(addon); } // Look for locally-defined add-ons that no longer exist and update their // record. for (let [id, addon] in Iterator(this._addons)) { if (id in ids) { @@ -368,17 +369,17 @@ AddonsReconciler.prototype = { if (!installs) { let cb = Async.makeSyncCallback(); AddonManager.getAllInstalls(cb); installs = Async.waitForSyncCallback(cb); } let installFound = false; - for each (let install in installs) { + for (let install of installs) { if (install.addon && install.addon.id == id && install.state == AddonManager.STATE_INSTALLED) { installFound = true; break; } } @@ -478,17 +479,17 @@ AddonsReconciler.prototype = { * The type of the change. A CHANGE_* constant. * @param state * The new state of the add-on. From this.addons. */ _addChange: function _addChange(date, change, state) { this._log.info("Change recorded for " + state.id); this._changes.push([date, change, state.id]); - for each (let listener in this._listeners) { + for (let listener of this._listeners) { try { listener.changeListener.call(listener, date, change, state); } catch (ex) { this._log.warn("Exception calling change listener: " + Utils.exceptionStr(ex)); } } }, @@ -549,17 +550,18 @@ AddonsReconciler.prototype = { * * If the add-on could not be found, returns null. * * @param guid * Sync GUID of add-on to retrieve. * @return Object on success on null on failure. */ getAddonStateFromSyncGUID: function getAddonStateFromSyncGUID(guid) { - for each (let addon in this.addons) { + for (let id in this.addons) { + let addon = this.addons[id]; if (addon.guid == guid) { return addon; } } return null; },
--- a/services/sync/modules/addonutils.js +++ b/services/sync/modules/addonutils.js @@ -243,17 +243,17 @@ AddonUtilsInternal.prototype = { * Function to be called when all actions are complete. */ installAddons: function installAddons(installs, cb) { if (!cb) { throw new Error("Invalid argument: cb is not defined."); } let ids = []; - for each (let addon in installs) { + for (let addon of installs) { ids.push(addon.id); } AddonRepository.getAddonsByIDs(ids, { searchSucceeded: function searchSucceeded(addons, addonsLength, total) { this._log.info("Found " + addonsLength + "/" + ids.length + " add-ons during repository search."); @@ -293,17 +293,17 @@ AddonUtilsInternal.prototype = { let toInstall = []; // Rewrite the "src" query string parameter of the source URI to note // that the add-on was installed by Sync and not something else so // server-side metrics aren't skewed (bug 708134). The server should // ideally send proper URLs, but this solution was deemed too // complicated at the time the functionality was implemented. - for each (let addon in addons) { + for (let addon of addons) { // sourceURI presence isn't enforced by AddonRepository. So, we skip // add-ons without a sourceURI. if (!addon.sourceURI) { this._log.info("Skipping install of add-on because missing " + "sourceURI: " + addon.id); continue; } @@ -337,19 +337,19 @@ AddonUtilsInternal.prototype = { if (!expectedInstallCount) { cb(null, ourResult); return; } // Start all the installs asynchronously. They will report back to us // as they finish, eventually triggering the global callback. - for each (let addon in toInstall) { + for (let addon of toInstall) { let options = {}; - for each (let install in installs) { + for (let install of installs) { if (install.id == addon.id) { options = install; break; } } this.installAddonFromSearchResult(addon, options, installCallback); }
--- a/services/sync/modules/engines.js +++ b/services/sync/modules/engines.js @@ -294,17 +294,17 @@ Store.prototype = { * applyIncoming(). Store implementations may overwrite this function * if desired. * * @param records Array of records to apply * @return Array of record IDs which did not apply cleanly */ applyIncomingBatch: function (records) { let failed = []; - for each (let record in records) { + for (let record of records) { try { this.applyIncoming(record); } catch (ex if (ex.code == Engine.prototype.eEngineAbortApplyIncoming)) { // This kind of exception should have a 'cause' attribute, which is an // originating exception. // ex.cause will carry its stack with it when rethrown. throw ex.cause; } catch (ex if !Async.isShutdownException(ex)) { @@ -492,17 +492,17 @@ EngineManager.prototype = { */ getEnabled: function () { return this.getAll() .filter((engine) => engine.enabled) .sort((a, b) => a.syncPriority - b.syncPriority); }, get enabledEngineNames() { - return [e.name for each (e in this.getEnabled())]; + return this.getEnabled().map(e => e.name); }, persistDeclined: function () { Svc.Prefs.set("declinedEngines", [...this._declined].join(",")); }, /** * Returns an array. @@ -1459,24 +1459,25 @@ SyncEngine.prototype = { let failed_ids = Object.keys(resp.obj.failed); if (failed_ids.length) this._log.debug("Records that will be uploaded again because " + "the server couldn't store them: " + failed_ids.join(", ")); // Clear successfully uploaded objects. - for each (let id in resp.obj.success) { + for (let key in resp.obj.success) { + let id = resp.obj.success[key]; delete this._modified[id]; } up.clearRecords(); }); - for each (let id in modifiedIDs) { + for (let id of modifiedIDs) { try { let out = this._createRecord(id); if (this._log.level <= Log.Level.Trace) this._log.trace("Outgoing: " + out); out.encrypt(this.service.collectionKeys.keyForCollection(this.name)); up.pushData(out); } catch (ex if !Async.isShutdownException(ex)) {
--- a/services/sync/modules/engines/addons.js +++ b/services/sync/modules/engines/addons.js @@ -155,17 +155,17 @@ AddonsEngine.prototype = { } let lastSyncDate = new Date(this.lastSync * 1000); // The reconciler should have been refreshed at the beginning of a sync and // we assume this function is only called from within a sync. let reconcilerChanges = this._reconciler.getChangesSinceDate(lastSyncDate); let addons = this._reconciler.addons; - for each (let change in reconcilerChanges) { + for (let change of reconcilerChanges) { let changeTime = change[0]; let id = change[2]; if (!(id in addons)) { continue; } // Keep newest modified time. @@ -294,17 +294,17 @@ AddonsStore.prototype = { requireSecureURI: !Svc.Prefs.get("addons.ignoreRepositoryChecking", false), }], cb); // This will throw if there was an error. This will get caught by the sync // engine and the record will try to be applied later. let results = cb.wait(); let addon; - for each (let a in results.addons) { + for (let a of results.addons) { if (a.id == record.addonID) { addon = a; break; } } // This should never happen, but is present as a fail-safe. if (!addon) { @@ -438,17 +438,18 @@ AddonsStore.prototype = { * Obtain the set of all syncable add-on Sync GUIDs. * * This implements a core Store API. */ getAllIDs: function getAllIDs() { let ids = {}; let addons = this.reconciler.addons; - for each (let addon in addons) { + for (let id in addons) { + let addon = addons[id]; if (this.isAddonSyncable(addon)) { ids[addon.guid] = true; } } return ids; },
--- a/services/sync/modules/engines/bookmarks.js +++ b/services/sync/modules/engines/bookmarks.js @@ -174,17 +174,17 @@ var kSpecialIds = { if (guid == "mobile") { return this.findMobileRoot(create); } return this[guid]; }, // Don't bother creating mobile: if it doesn't exist, this ID can't be it! specialGUIDForId: function specialGUIDForId(id) { - for each (let guid in this.guids) + for (let guid of this.guids) if (this.specialIdForGUID(guid, false) == id) return guid; return null; }, get menu() { return PlacesUtils.bookmarksMenuFolderId; }, @@ -502,17 +502,18 @@ BookmarksEngine.prototype = { } }; function BookmarksStore(name, engine) { Store.call(this, name, engine); // Explicitly nullify our references to our cached services so we don't leak Svc.Obs.add("places-shutdown", function() { - for each (let [query, stmt] in Iterator(this._stmts)) { + for (let query in this._stmts) { + let stmt = this._stmts[query]; stmt.finalize(); } this._stmts = {}; }, this); } BookmarksStore.prototype = { __proto__: Store.prototype, @@ -559,17 +560,17 @@ BookmarksStore.prototype = { try { for (let i = 0; i < tags.childCount; i++) { let child = tags.getChild(i); if (child.title == tag) { // Found the tag, so fix up the query to use the right id. this._log.debug("Tag query folder: " + tag + " = " + child.itemId); this._log.trace("Replacing folders in: " + uri); - for each (let q in queriesRef.value) + for (let q of queriesRef.value) q.setFolders([child.itemId], 1); record.bmkUri = PlacesUtils.history.queriesToQueryString( queriesRef.value, queryCountRef.value, optionsRef.value); return; } } } @@ -1356,29 +1357,29 @@ BookmarksStore.prototype = { "unfiled": true, }; // We also want "mobile" but only if a local mobile folder already exists // (otherwise we'll later end up creating it, which we want to avoid until // we actually need it.) if (kSpecialIds.findMobileRoot(false)) { items["mobile"] = true; } - for each (let guid in kSpecialIds.guids) { + for (let guid of kSpecialIds.guids) { if (guid != "places" && guid != "tags") this._getChildren(guid, items); } return items; }, wipe: function BStore_wipe() { let cb = Async.makeSpinningCallback(); Task.spawn(function() { // Save a backup before clearing out all bookmarks. yield PlacesBackups.create(null, true); - for each (let guid in kSpecialIds.guids) + for (let guid of kSpecialIds.guids) if (guid != "places") { let id = kSpecialIds.specialIdForGUID(guid); if (id) PlacesUtils.bookmarks.removeFolderChildren(id); } cb(); }); cb.wait();
--- a/services/sync/modules/engines/clients.js +++ b/services/sync/modules/engines/clients.js @@ -63,17 +63,18 @@ ClientEngine.prototype = { // Aggregate some stats on the composition of clients on this account get stats() { let stats = { hasMobile: this.localType == "mobile", names: [this.localName], numClients: 1, }; - for each (let {name, type} in this._store._remoteClients) { + for (let id in this._store._remoteClients) { + let {name, type} = this._store._remoteClients[id]; stats.hasMobile = stats.hasMobile || type == "mobile"; stats.names.push(name); stats.numClients++; } return stats; }, @@ -82,17 +83,18 @@ ClientEngine.prototype = { * * Returns a Map of device types to integer counts. */ get deviceTypes() { let counts = new Map(); counts.set(this.localType, 1); - for each (let record in this._store._remoteClients) { + for (let id in this._store._remoteClients) { + let record = this._store._remoteClients[id]; let type = record.type; if (!counts.has(type)) { counts.set(type, 0); } counts.set(type, counts.get(type) + 1); } @@ -253,17 +255,21 @@ ClientEngine.prototype = { processIncomingCommands: function processIncomingCommands() { return this._notify("clients:process-commands", "", function() { let commands = this.localCommands; // Immediately clear out the commands as we've got them locally. this.clearCommands(); // Process each command in order. - for each (let {command, args} in commands) { + if (!commands) { + return true; + } + for (let key in commands) { + let {command, args} = commands[key]; this._log.debug("Processing command: " + command + "(" + args + ")"); let engines = [args[0]]; switch (command) { case "resetAll": engines = null; // Fallthrough case "resetEngine":
--- a/services/sync/modules/engines/history.js +++ b/services/sync/modules/engines/history.js @@ -65,17 +65,18 @@ HistoryEngine.prototype = { }, }; function HistoryStore(name, engine) { Store.call(this, name, engine); // Explicitly nullify our references to our cached services so we don't leak Svc.Obs.add("places-shutdown", function() { - for each ([query, stmt] in Iterator(this._stmts)) { + for (let query in this._stmts) { + let stmt = this._stmts; stmt.finalize(); } this._stmts = {}; }, this); } HistoryStore.prototype = { __proto__: Store.prototype,
--- a/services/sync/modules/engines/passwords.js +++ b/services/sync/modules/engines/passwords.js @@ -80,17 +80,17 @@ PasswordEngine.prototype = { return; } let logins = Services.logins.findLogins({}, login.hostname, login.formSubmitURL, login.httpRealm); this._store._sleep(0); // Yield back to main thread after synchronous operation. // Look for existing logins that match the hostname, but ignore the password. - for each (let local in logins) { + for (let local of logins) { if (login.matches(local, true) && local instanceof Ci.nsILoginMetaInfo) { return local.guid; } } }, }; function PasswordStore(name, engine) {
--- a/services/sync/modules/engines/prefs.js +++ b/services/sync/modules/engines/prefs.js @@ -96,17 +96,17 @@ PrefStore.prototype = { _isSynced: function (pref) { return pref.startsWith(PREF_SYNC_PREFS_PREFIX) || this._prefs.get(PREF_SYNC_PREFS_PREFIX + pref, false); }, _getAllPrefs: function () { let values = {}; - for each (let pref in this._getSyncPrefs()) { + for (let pref of this._getSyncPrefs()) { if (this._isSynced(pref)) { // Missing prefs get the null value. values[pref] = this._prefs.get(pref, null); } } return values; },
--- a/services/sync/modules/engines/tabs.js +++ b/services/sync/modules/engines/tabs.js @@ -297,30 +297,30 @@ TabTracker.prototype = { clearChangedIDs: function () { this.modified = false; }, _topics: ["pageshow", "TabOpen", "TabClose", "TabSelect"], _registerListenersForWindow: function (window) { this._log.trace("Registering tab listeners in window"); - for each (let topic in this._topics) { + for (let topic of this._topics) { window.addEventListener(topic, this.onTab, false); } window.addEventListener("unload", this._unregisterListeners, false); }, _unregisterListeners: function (event) { this._unregisterListenersForWindow(event.target); }, _unregisterListenersForWindow: function (window) { this._log.trace("Removing tab listeners in window"); window.removeEventListener("unload", this._unregisterListeners, false); - for each (let topic in this._topics) { + for (let topic of this._topics) { window.removeEventListener(topic, this.onTab, false); } }, startTracking: function () { Svc.Obs.add("domwindowopened", this); let wins = Services.wm.getEnumerator("navigator:browser"); while (wins.hasMoreElements()) {
--- a/services/sync/modules/identity.js +++ b/services/sync/modules/identity.js @@ -190,17 +190,17 @@ IdentityManager.prototype = { get basicPassword() { if (this._basicPasswordAllowLookup) { // We need a username to find the credentials. let username = this.username; if (!username) { return null; } - for each (let login in this._getLogins(PWDMGR_PASSWORD_REALM)) { + for (let login of this._getLogins(PWDMGR_PASSWORD_REALM)) { if (login.username.toLowerCase() == username) { // It should already be UTF-8 encoded, but we don't take any chances. this._basicPassword = Utils.encodeUTF8(login.password); } } this._basicPasswordAllowLookup = false; } @@ -244,17 +244,17 @@ IdentityManager.prototype = { */ get syncKey() { if (this._syncKeyAllowLookup) { let username = this.username; if (!username) { return null; } - for each (let login in this._getLogins(PWDMGR_PASSPHRASE_REALM)) { + for (let login of this._getLogins(PWDMGR_PASSPHRASE_REALM)) { if (login.username.toLowerCase() == username) { this._syncKey = login.password; } } this._syncKeyAllowLookup = false; } @@ -395,29 +395,29 @@ IdentityManager.prototype = { * entered), this could throw an exception. */ persistCredentials: function persistCredentials(force) { if (this._basicPasswordUpdated || force) { if (this._basicPassword) { this._setLogin(PWDMGR_PASSWORD_REALM, this.username, this._basicPassword); } else { - for each (let login in this._getLogins(PWDMGR_PASSWORD_REALM)) { + for (let login of this._getLogins(PWDMGR_PASSWORD_REALM)) { Services.logins.removeLogin(login); } } this._basicPasswordUpdated = false; } if (this._syncKeyUpdated || force) { if (this._syncKey) { this._setLogin(PWDMGR_PASSPHRASE_REALM, this.username, this._syncKey); } else { - for each (let login in this._getLogins(PWDMGR_PASSPHRASE_REALM)) { + for (let login of this._getLogins(PWDMGR_PASSPHRASE_REALM)) { Services.logins.removeLogin(login); } } this._syncKeyUpdated = false; } }, @@ -461,17 +461,17 @@ IdentityManager.prototype = { /** * Set a login in the password manager. * * This has the side-effect of deleting any other logins for the specified * realm. */ _setLogin: function _setLogin(realm, username, password) { let exists = false; - for each (let login in this._getLogins(realm)) { + for (let login of this._getLogins(realm)) { if (login.username == username && login.password == password) { exists = true; } else { this._log.debug("Pruning old login for " + username + " from " + realm); Services.logins.removeLogin(login); } } @@ -497,17 +497,17 @@ IdentityManager.prototype = { }, /** * Deletes Sync credentials from the password manager. */ deleteSyncCredentials: function deleteSyncCredentials() { for (let host of this._getSyncCredentialsHosts()) { let logins = Services.logins.findLogins({}, host, "", ""); - for each (let login in logins) { + for (let login of logins) { Services.logins.removeLogin(login); } } // Wait until after store is updated in case it fails. this._basicPassword = null; this._basicPasswordAllowLookup = true; this._basicPasswordUpdated = false;
--- a/services/sync/modules/jpakeclient.js +++ b/services/sync/modules/jpakeclient.js @@ -276,28 +276,26 @@ JPAKEClient.prototype = { /* * Utilities */ _setClientID: function _setClientID() { let rng = Cc["@mozilla.org/security/random-generator;1"] .createInstance(Ci.nsIRandomGenerator); let bytes = rng.generateRandomBytes(JPAKE_LENGTH_CLIENTID / 2); - this._clientID = [("0" + byte.toString(16)).slice(-2) - for each (byte in bytes)].join(""); + this._clientID = bytes.map(byte => ("0" + byte.toString(16)).slice(-2)).join(""); }, _createSecret: function _createSecret() { // 0-9a-z without 1,l,o,0 const key = "23456789abcdefghijkmnpqrstuvwxyz"; let rng = Cc["@mozilla.org/security/random-generator;1"] .createInstance(Ci.nsIRandomGenerator); let bytes = rng.generateRandomBytes(JPAKE_LENGTH_SECRET); - return [key[Math.floor(byte * key.length / 256)] - for each (byte in bytes)].join(""); + return bytes.map(byte => key[Math.floor(byte * key.length / 256)]).join(""); }, _newRequest: function _newRequest(uri) { let request = new RESTRequest(uri); request.setHeader("X-KeyExchange-Id", this._clientID); request.timeout = REQUEST_TIMEOUT; return request; },
--- a/services/sync/modules/record.js +++ b/services/sync/modules/record.js @@ -307,17 +307,17 @@ CollectionKeyManager.prototype = { // Diffs both ways. process(m1, m2); process(m2, m1); // Return a sorted, unique array. changed.sort(); let last; - changed = [x for each (x in changed) if ((x != last) && (last = x))]; + changed = changed.filter(x => (x != last) && (last = x)); return {same: changed.length == 0, changed: changed}; }, get isClear() { return !this._default; },
--- a/services/sync/modules/service.js +++ b/services/sync/modules/service.js @@ -437,17 +437,17 @@ Sync11Service.prototype = { let oldPrefBranch = "extensions.weave."; let oldPrefNames = Cc["@mozilla.org/preferences-service;1"]. getService(Ci.nsIPrefService). getBranch(oldPrefBranch). getChildList("", {}); // Map each old pref to the current pref branch let oldPref = new Preferences(oldPrefBranch); - for each (let pref in oldPrefNames) + for (let pref of oldPrefNames) Svc.Prefs.set(pref, oldPref.get(pref)); // Remove all the old prefs and remember that we've migrated oldPref.resetBranch(""); Svc.Prefs.set("migrated", true); }, /** @@ -896,17 +896,17 @@ Sync11Service.prototype = { startOver: function startOver() { this._log.trace("Invoking Service.startOver."); Svc.Obs.notify("weave:engine:stop-tracking"); this.status.resetSync(); // Deletion doesn't make sense if we aren't set up yet! if (this.clusterURL != "") { // Clear client-specific data from the server, including disabled engines. - for each (let engine in [this.clientsEngine].concat(this.engineManager.getAll())) { + for (let engine of [this.clientsEngine].concat(this.engineManager.getAll())) { try { engine.removeClientData(); } catch(ex) { this._log.warn("Deleting client data for " + engine.name + " failed:" + Utils.exceptionStr(ex)); } } this._log.debug("Finished deleting client data."); @@ -1506,17 +1506,17 @@ Sync11Service.prototype = { // uploadMetaGlobal throws on failure -- including race conditions. // If we got into a race condition, we'll abort the sync this way, too. // That's fine. We'll just wait till the next sync. The client that we're // racing is probably busy uploading stuff right now anyway. this.uploadMetaGlobal(meta); // Wipe everything we know about except meta because we just uploaded it let engines = [this.clientsEngine].concat(this.engineManager.getAll()); - let collections = [engine.name for each (engine in engines)]; + let collections = engines.map(engine => engine.name); // TODO: there's a bug here. We should be calling resetClient, no? // Generate, upload, and download new keys. Do this last so we don't wipe // them... this.generateNewSymmetricKeys(); }, /** @@ -1588,17 +1588,17 @@ Sync11Service.prototype = { engines = [this.clientsEngine].concat(this.engineManager.getAll()); } // Convert the array of names into engines else { engines = this.engineManager.get(engines); } // Fully wipe each engine if it's able to decrypt data - for each (let engine in engines) { + for (let engine of engines) { if (engine.canDecrypt()) { engine.wipeClient(); } } // Save the password/passphrase just in-case they aren't restored by sync this.persistLogin(); }, @@ -1666,17 +1666,17 @@ Sync11Service.prototype = { engines = [this.clientsEngine].concat(this.engineManager.getAll()); } // Convert the array of names into engines else { engines = this.engineManager.get(engines); } // Have each engine drop any temporary meta data - for each (let engine in engines) { + for (let engine of engines) { engine.resetClient(); } })(); }, /** * Fetch storage info from the server. *
--- a/services/sync/modules/stages/declined.js +++ b/services/sync/modules/stages/declined.js @@ -24,18 +24,18 @@ Cu.import("resource://gre/modules/Prefer this.DeclinedEngines = function (service) { this._log = Log.repository.getLogger("Sync.Declined"); this._log.level = Log.Level[new Preferences(PREFS_BRANCH).get("log.logger.declined")]; this.service = service; } this.DeclinedEngines.prototype = { updateDeclined: function (meta, engineManager=this.service.engineManager) { - let enabled = new Set([e.name for each (e in engineManager.getEnabled())]); - let known = new Set([e.name for each (e in engineManager.getAll())]); + let enabled = new Set(engineManager.getEnabled().map(e => e.name)); + let known = new Set(engineManager.getAll().map(e => e.name)); let remoteDeclined = new Set(meta.payload.declined || []); let localDeclined = new Set(engineManager.getDeclined()); this._log.debug("Handling remote declined: " + JSON.stringify([...remoteDeclined])); this._log.debug("Handling local declined: " + JSON.stringify([...localDeclined])); // Any engines that are locally enabled should be removed from the remote // declined list.
--- a/services/sync/modules/stages/enginesync.js +++ b/services/sync/modules/stages/enginesync.js @@ -284,17 +284,17 @@ EngineSynchronizer.prototype = { // This will be reflected in meta/global in the next stage. this._log.trace("Engine " + engineName + " was disabled locally. Marking as declined."); toDecline.add(engineName); } } } // Any remaining engines were either enabled locally or disabled remotely. - for each (let engineName in enabled) { + for (let engineName of enabled) { let engine = engineManager.get(engineName); if (Svc.Prefs.get("engineStatusChanged." + engine.prefName, false)) { this._log.trace("The " + engineName + " engine was enabled locally."); toUndecline.add(engineName); } else { this._log.trace("The " + engineName + " engine was disabled remotely."); // Don't automatically mark it as declined!
--- a/services/sync/tests/unit/head_appinfo.js +++ b/services/sync/tests/unit/head_appinfo.js @@ -55,15 +55,15 @@ registrar.registerFactory(Components.ID( "XULAppInfo", "@mozilla.org/xre/app-info;1", XULAppInfoFactory); // Register resource aliases. Normally done in SyncComponents.manifest. function addResourceAlias() { const resProt = Services.io.getProtocolHandler("resource") .QueryInterface(Ci.nsIResProtocolHandler); - for each (let s in ["common", "sync", "crypto"]) { + for (let s of ["common", "sync", "crypto"]) { let uri = Services.io.newURI("resource://gre/modules/services-" + s + "/", null, null); resProt.setSubstitution("services-" + s, uri); } } addResourceAlias();
--- a/services/sync/tests/unit/head_http_server.js +++ b/services/sync/tests/unit/head_http_server.js @@ -304,17 +304,18 @@ ServerCollection.prototype = { post: function(input) { input = JSON.parse(input); let success = []; let failed = {}; // This will count records where we have an existing ServerWBO // registered with us as successful and all other records as failed. - for each (let record in input) { + for (let key in input) { + let record = input[key]; let wbo = this.wbo(record.id); if (!wbo && this.acceptNew) { this._log.debug("Creating WBO " + JSON.stringify(record.id) + " on the fly."); wbo = new ServerWBO(record.id); this.insertWBO(wbo); } if (wbo) { @@ -349,17 +350,17 @@ ServerCollection.prototype = { return function(request, response) { var statusCode = 200; var status = "OK"; var body; // Parse queryString let options = {}; - for each (let chunk in request.queryString.split("&")) { + for (let chunk of request.queryString.split("&")) { if (!chunk) { continue; } chunk = chunk.split("="); if (chunk.length == 1) { options[chunk[0]] = ""; } else { options[chunk[0]] = chunk[1]; @@ -699,17 +700,18 @@ SyncServer.prototype = { * * @return a timestamp. */ deleteCollections: function deleteCollections(username) { if (!(username in this.users)) { throw new Error("Unknown user."); } let userCollections = this.users[username].collections; - for each (let [name, coll] in Iterator(userCollections)) { + for (let name in userCollections) { + let coll = userCollections[name]; this._log.trace("Bulk deleting " + name + " for " + username + "..."); coll.delete({}); } this.users[username].collections = {}; return this.timestamp(); }, /** @@ -763,17 +765,20 @@ SyncServer.prototype = { defaultHeaders: {}, /** * HTTP response utility. */ respond: function respond(req, resp, code, status, body, headers) { resp.setStatusLine(req.httpVersion, code, status); - for each (let [header, value] in Iterator(headers || this.defaultHeaders)) { + if (!headers) + headers = this.defaultHeaders; + for (let header in headers) { + let value = headers[header]; resp.setHeader(header, value); } resp.setHeader("X-Weave-Timestamp", "" + this.timestamp(), false); resp.bodyOutputStream.write(body, body.length); }, /** * This is invoked by the HttpServer. `this` is bound to the SyncServer;
--- a/services/sync/tests/unit/test_addons_reconciler.js +++ b/services/sync/tests/unit/test_addons_reconciler.js @@ -66,17 +66,17 @@ add_test(function test_install_detection let after = new Date(); do_check_eq(1, Object.keys(reconciler.addons).length); do_check_true(addon.id in reconciler.addons); let record = reconciler.addons[addon.id]; const KEYS = ["id", "guid", "enabled", "installed", "modified", "type", "scope", "foreignInstall"]; - for each (let key in KEYS) { + for (let key of KEYS) { do_check_true(key in record); do_check_neq(null, record[key]); } do_check_eq(addon.id, record.id); do_check_eq(addon.syncGUID, record.guid); do_check_true(record.enabled); do_check_true(record.installed);
--- a/services/sync/tests/unit/test_addons_store.js +++ b/services/sync/tests/unit/test_addons_store.js @@ -199,17 +199,17 @@ add_test(function test_addon_syncability do_check_false(store.isAddonSyncable(null)); let addon = installAddon("test_bootstrap1_1"); do_check_true(store.isAddonSyncable(addon)); let dummy = {}; const KEYS = ["id", "syncGUID", "type", "scope", "foreignInstall"]; - for each (let k in KEYS) { + for (let k of KEYS) { dummy[k] = addon[k]; } do_check_true(store.isAddonSyncable(dummy)); dummy.type = "UNSUPPORTED"; do_check_false(store.isAddonSyncable(dummy)); dummy.type = addon.type; @@ -238,26 +238,26 @@ add_test(function test_addon_syncability ]; let untrusted = [ "http://addons.mozilla.org/foo", // non-https "ftps://addons.mozilla.org/foo", // non-https "https://untrusted.example.com/foo", // non-trusted hostname` ]; - for each (let uri in trusted) { + for (let uri of trusted) { do_check_true(store.isSourceURITrusted(createURI(uri))); } - for each (let uri in untrusted) { + for (let uri of untrusted) { do_check_false(store.isSourceURITrusted(createURI(uri))); } Svc.Prefs.set("addons.trustedSourceHostnames", ""); - for each (let uri in trusted) { + for (let uri of trusted) { do_check_false(store.isSourceURITrusted(createURI(uri))); } Svc.Prefs.set("addons.trustedSourceHostnames", "addons.mozilla.org"); do_check_true(store.isSourceURITrusted(createURI("https://addons.mozilla.org/foo"))); Svc.Prefs.reset("addons.trustedSourceHostnames"); @@ -273,17 +273,17 @@ add_test(function test_ignore_hotfixes() // extensions.hotfix.id pref. let prefs = new Preferences("extensions."); let addon = installAddon("test_bootstrap1_1"); do_check_true(store.isAddonSyncable(addon)); let dummy = {}; const KEYS = ["id", "syncGUID", "type", "scope", "foreignInstall"]; - for each (let k in KEYS) { + for (let k of KEYS) { dummy[k] = addon[k]; } // Basic sanity check. do_check_true(store.isAddonSyncable(dummy)); prefs.set("hotfix.id", dummy.id); do_check_false(store.isAddonSyncable(dummy));
--- a/services/sync/tests/unit/test_bookmark_store.js +++ b/services/sync/tests/unit/test_bookmark_store.js @@ -75,18 +75,18 @@ add_test(function test_bookmark_create() fxrecord.description); do_check_eq(PlacesUtils.bookmarks.getFolderIdForItem(id), PlacesUtils.bookmarks.toolbarFolder); do_check_eq(PlacesUtils.bookmarks.getKeywordForBookmark(id), fxrecord.keyword); _("Have the store create a new record object. Verify that it has the same data."); let newrecord = store.createRecord(fxrecord.id); do_check_true(newrecord instanceof Bookmark); - for each (let property in ["type", "bmkUri", "description", "title", - "keyword", "parentName", "parentid"]) { + for (let property of ["type", "bmkUri", "description", "title", + "keyword", "parentName", "parentid"]) { do_check_eq(newrecord[property], fxrecord[property]); } do_check_true(Utils.deepEquals(newrecord.tags.sort(), fxrecord.tags.sort())); _("The calculated sort index is based on frecency data."); do_check_true(newrecord.sortindex >= 150); @@ -192,17 +192,17 @@ add_test(function test_folder_create() { PlacesUtils.bookmarks.TYPE_FOLDER); do_check_eq(PlacesUtils.bookmarks.getItemTitle(id), folder.title); do_check_eq(PlacesUtils.bookmarks.getFolderIdForItem(id), PlacesUtils.bookmarks.toolbarFolder); _("Have the store create a new record object. Verify that it has the same data."); let newrecord = store.createRecord(folder.id); do_check_true(newrecord instanceof BookmarkFolder); - for each (let property in ["title", "parentName", "parentid"]) + for (let property of ["title", "parentName", "parentid"]) do_check_eq(newrecord[property], folder[property]); _("Folders have high sort index to ensure they're synced first."); do_check_eq(newrecord.sortindex, 1000000); } finally { _("Clean up."); store.wipe(); run_next_test();
--- a/services/sync/tests/unit/test_clients_engine.js +++ b/services/sync/tests/unit/test_clients_engine.js @@ -323,17 +323,17 @@ add_test(function test_command_validatio ["wipeAll", ["foo"], false], ["wipeEngine", ["tabs"], true ], ["wipeEngine", [], false], ["logout", [], true ], ["logout", ["foo"], false], ["__UNKNOWN__", [], false] ]; - for each (let [action, args, expectedResult] in testCommands) { + for (let [action, args, expectedResult] of testCommands) { let remoteId = Utils.makeGUID(); let rec = new ClientsRec("clients", remoteId); store.create(rec); store.createRecord(remoteId, "clients"); engine.sendCommand(action, args, remoteId);
--- a/services/sync/tests/unit/test_collections_recovery.js +++ b/services/sync/tests/unit/test_collections_recovery.js @@ -28,17 +28,17 @@ add_identity_test(this, function test_mi let handlers = { "/1.1/johndoe/info/collections": maybe_empty(johnHelper.handler), "/1.1/johndoe/storage/crypto/keys": johnU("crypto", new ServerWBO("keys").handler()), "/1.1/johndoe/storage/meta/global": johnU("meta", new ServerWBO("global").handler()) }; let collections = ["clients", "bookmarks", "forms", "history", "passwords", "prefs", "tabs"]; - for each (let coll in collections) { + for (let coll of collections) { handlers["/1.1/johndoe/storage/" + coll] = johnU(coll, new ServerCollection({}, true).handler()); } let server = httpd_setup(handlers); Service.serverURL = server.baseURI; try { let fresh = 0;
--- a/services/sync/tests/unit/test_jpakeclient.js +++ b/services/sync/tests/unit/test_jpakeclient.js @@ -364,17 +364,17 @@ add_test(function test_wrongPIN() { }); let pairingStartCalledOnReceiver = false; let rec = new JPAKEClient({ __proto__: BaseController, displayPIN: function displayPIN(pin) { this.cid = pin.slice(JPAKE_LENGTH_SECRET); let secret = pin.slice(0, JPAKE_LENGTH_SECRET); - secret = [char for each (char in secret)].reverse().join(""); + secret = Array.prototype.slice.call(secret).reverse().join(""); let new_pin = secret + this.cid; _("Received PIN " + pin + ", but I'm entering " + new_pin); Utils.nextTick(function() { snd.pairWithPIN(new_pin, false); }); }, onPairingStart: function onPairingStart() { pairingStartCalledOnReceiver = true; },
--- a/services/sync/tests/unit/test_resource.js +++ b/services/sync/tests/unit/test_resource.js @@ -135,17 +135,17 @@ function server_headers(metadata, respon let header = headers.getNext().toString(); if (ignore_headers.indexOf(header) == -1) { header_names.push(header); } } header_names = header_names.sort(); headers = {}; - for each (let header in header_names) { + for (let header of header_names) { headers[header] = metadata.getHeader(header); } let body = JSON.stringify(headers); response.setStatusLine(metadata.httpVersion, 200, "OK"); response.bodyOutputStream.write(body, body.length); } function run_test() {
--- a/services/sync/tests/unit/test_resource_async.js +++ b/services/sync/tests/unit/test_resource_async.js @@ -135,17 +135,17 @@ function server_headers(metadata, respon let header = headers.getNext().toString(); if (ignore_headers.indexOf(header) == -1) { header_names.push(header); } } header_names = header_names.sort(); headers = {}; - for each (let header in header_names) { + for (let header of header_names) { headers[header] = metadata.getHeader(header); } let body = JSON.stringify(headers); response.setStatusLine(metadata.httpVersion, 200, "OK"); response.bodyOutputStream.write(body, body.length); } var quotaValue;
--- a/services/sync/tests/unit/test_service_startup.js +++ b/services/sync/tests/unit/test_service_startup.js @@ -24,17 +24,17 @@ function run_test() { Cu.import("resource://services-sync/service.js"); _("Service is enabled."); do_check_eq(Service.enabled, true); _("Engines are registered."); let engines = Service.engineManager.getAll(); - do_check_true(Utils.deepEquals([engine.name for each (engine in engines)], + do_check_true(Utils.deepEquals(engines.map(engine => engine.name), ['tabs', 'bookmarks', 'forms', 'history'])); _("Observers are notified of startup"); do_test_pending(); do_check_false(Service.status.ready); do_check_false(xps.ready); Observers.add("weave:service:ready", function (subject, data) {
--- a/services/sync/tests/unit/test_status.js +++ b/services/sync/tests/unit/test_status.js @@ -13,19 +13,19 @@ function run_test() { do_check_eq(Status.login, LOGIN_SUCCEEDED); for (let name in Status.engines) { do_throw('Status.engines should be empty.'); } do_check_eq(Status.partial, false); // Check login status - for each (let code in [LOGIN_FAILED_NO_USERNAME, - LOGIN_FAILED_NO_PASSWORD, - LOGIN_FAILED_NO_PASSPHRASE]) { + for (let code of [LOGIN_FAILED_NO_USERNAME, + LOGIN_FAILED_NO_PASSWORD, + LOGIN_FAILED_NO_PASSPHRASE]) { Status.login = code; do_check_eq(Status.login, code); do_check_eq(Status.service, CLIENT_NOT_CONFIGURED); Status.resetSync(); } Status.login = LOGIN_FAILED; do_check_eq(Status.login, LOGIN_FAILED);
--- a/services/sync/tests/unit/test_tab_tracker.js +++ b/services/sync/tests/unit/test_tab_tracker.js @@ -48,42 +48,42 @@ function run_test() { [clientsEngine.localID])); let logs; _("Test listeners are registered on windows"); logs = fakeSvcWinMediator(); Svc.Obs.notify("weave:engine:start-tracking"); do_check_eq(logs.length, 2); - for each (let log in logs) { + for (let log of logs) { do_check_eq(log.addTopics.length, 5); do_check_true(log.addTopics.indexOf("pageshow") >= 0); do_check_true(log.addTopics.indexOf("TabOpen") >= 0); do_check_true(log.addTopics.indexOf("TabClose") >= 0); do_check_true(log.addTopics.indexOf("TabSelect") >= 0); do_check_true(log.addTopics.indexOf("unload") >= 0); do_check_eq(log.remTopics.length, 0); } _("Test listeners are unregistered on windows"); logs = fakeSvcWinMediator(); Svc.Obs.notify("weave:engine:stop-tracking"); do_check_eq(logs.length, 2); - for each (let log in logs) { + for (let log of logs) { do_check_eq(log.addTopics.length, 0); do_check_eq(log.remTopics.length, 5); do_check_true(log.remTopics.indexOf("pageshow") >= 0); do_check_true(log.remTopics.indexOf("TabOpen") >= 0); do_check_true(log.remTopics.indexOf("TabClose") >= 0); do_check_true(log.remTopics.indexOf("TabSelect") >= 0); do_check_true(log.remTopics.indexOf("unload") >= 0); } _("Test tab listener"); - for each (let evttype in ["TabOpen", "TabClose", "TabSelect"]) { + for (let evttype of ["TabOpen", "TabClose", "TabSelect"]) { // Pretend we just synced. tracker.clearChangedIDs(); do_check_false(tracker.modified); // Send a fake tab event tracker.onTab({type: evttype , originalTarget: evttype}); do_check_true(tracker.modified); do_check_true(Utils.deepEquals(Object.keys(engine.getChangedIDs()),
--- a/services/sync/tps/extensions/mozmill/resource/driver/controller.js +++ b/services/sync/tps/extensions/mozmill/resource/driver/controller.js @@ -39,17 +39,21 @@ waitForEvents.prototype = { if (node.getNode != undefined) node = node.getNode(); this.events = events; this.node = node; node.firedEvents = {}; this.registry = {}; - for each (var e in events) { + if (!events) { + return; + } + for (var key in events) { + var e = events[key]; var listener = function (event) { this.firedEvents[event.type] = true; } this.registry[e] = listener; this.registry[e].result = false; this.node.addEventListener(e, this.registry[e], true); }
--- a/services/sync/tps/extensions/mozmill/resource/driver/elementslib.js +++ b/services/sync/tps/extensions/mozmill/resource/driver/elementslib.js @@ -299,31 +299,31 @@ var _returnResult = function (results) { return results[0]; } else { return results; } } var _forChildren = function (element, name, value) { var results = []; - var nodes = [e for each (e in element.childNodes) if (e)] + var nodes = Array.from(element.childNodes).filter(e => e); for (var i in nodes) { var n = nodes[i]; if (n[name] == value) { results.push(n); } } return results; } var _forAnonChildren = function (_document, element, name, value) { var results = []; - var nodes = [e for each (e in _document.getAnoymousNodes(element)) if (e)]; + var nodes = Array.from(_document.getAnoymousNodes(element)).filter(e => e); for (var i in nodes ) { var n = nodes[i]; if (n[name] == value) { results.push(n); } } @@ -376,17 +376,17 @@ var _byAnonAttrib = function (_document, } var result = _document.getAnonymousElementByAttribute(parent, k, v); if (result) { return result; } } - var nodes = [n for each (n in _document.getAnonymousNodes(parent)) if (n.getAttribute)]; + var nodes = Array.from(_document.getAnonymousNodes(parent)).filter(n => n.getAttribute); function resultsForNodes (nodes) { for (var i in nodes) { var n = nodes[i]; requirementPass = 0; requirementLength = 0; for (var a in attributes) { @@ -399,17 +399,17 @@ var _byAnonAttrib = function (_document, if (requirementPass == requirementLength) { results.push(n); } } } resultsForNodes(nodes); if (results.length == 0) { - resultsForNodes([n for each (n in parent.childNodes) if (n != undefined && n.getAttribute)]) + resultsForNodes(Array.from(parent.childNodes).filter(n => n != undefined && n.getAttribute)); } return _returnResult(results) } var _byIndex = function (_document, parent, i) { if (parent instanceof Array) { return parent[i]; @@ -435,17 +435,17 @@ var _anonByIndex = function (_document, * * Finds an element by Lookup expression */ function Lookup(_document, expression) { if (expression == undefined) { throw new Error('Lookup constructor did not recieve enough arguments.'); } - var expSplit = [e for each (e in smartSplit(expression) ) if (e != '')]; + var expSplit = smartSplit(expression).filter(e => e != ''); expSplit.unshift(_document); var nCases = {'id':_byID, 'name':_byName, 'attrib':_byAttrib, 'index':_byIndex}; var aCases = {'name':_anonByName, 'attrib':_anonByAttrib, 'index':_anonByIndex}; /** * Reduces the lookup expression * @param {Object} parentNode
--- a/services/sync/tps/extensions/mozmill/resource/modules/frame.js +++ b/services/sync/tps/extensions/mozmill/resource/modules/frame.js @@ -251,17 +251,17 @@ events.endModule = function (aModule) { } events.pass = function (obj) { // a low level event, such as a keystroke, succeeds if (events.currentTest) { events.currentTest.__passes__.push(obj); } - for each (var timer in timers) { + for (var timer of timers) { timer.actions.push( {"currentTest": events.currentModule.__file__ + "::" + events.currentTest.__name__, "obj": obj, "result": "pass"} ); } events.fireEvent('pass', obj); @@ -281,17 +281,17 @@ events.fail = function (obj) { }; } // a low level event, such as a keystroke, fails if (events.currentTest) { events.currentTest.__fails__.push(obj); } - for each (var time in timers) { + for (var time of timers) { timer.actions.push( {"currentTest": events.currentModule.__file__ + "::" + events.currentTest.__name__, "obj": obj, "result": "fail"} ); } events.fireEvent('fail', obj); @@ -320,17 +320,17 @@ events.fireEvent = function (name, obj) } if (this.listeners[name]) { for (var i in this.listeners[name]) { this.listeners[name][i](obj); } } - for each(var listener in this.globalListeners) { + for (var listener of this.globalListeners) { listener(name, obj); } } events.addListener = function (name, listener) { if (this.listeners[name]) { this.listeners[name].push(listener); } else if (name == '') {
--- a/services/sync/tps/extensions/mozmill/resource/stdlib/os.js +++ b/services/sync/tps/extensions/mozmill/resource/stdlib/os.js @@ -32,17 +32,17 @@ function getFileForPath(path) { function abspath(rel, file) { var relSplit = rel.split('/'); if (relSplit[0] == '..' && !file.isDirectory()) { file = file.parent; } - for each(var p in relSplit) { + for (var p of relSplit) { if (p == '..') { file = file.parent; } else if (p == '.') { if (!file.isDirectory()) { file = file.parent; } } else { file.append(p);
--- a/services/sync/tps/extensions/mozmill/resource/stdlib/securable-module.js +++ b/services/sync/tps/extensions/mozmill/resource/stdlib/securable-module.js @@ -163,18 +163,17 @@ exports.Loader = function Loader(options) { options = {__proto__: options}; if (options.fs === undefined) { var rootPaths = options.rootPath || options.rootPaths; if (rootPaths) { if (rootPaths.constructor.name != "Array") rootPaths = [rootPaths]; - var fses = [new exports.LocalFileSystem(path) - for each (path in rootPaths)]; + var fses = rootPaths.map(path => new exports.LocalFileSystem(path)); options.fs = new exports.CompositeFileSystem(fses); } else options.fs = new exports.LocalFileSystem(); } if (options.sandboxFactory === undefined) options.sandboxFactory = new exports.SandboxFactory( options.defaultPrincipal );
--- a/services/sync/tps/extensions/mozmill/resource/stdlib/utils.js +++ b/services/sync/tps/extensions/mozmill/resource/stdlib/utils.js @@ -78,27 +78,27 @@ function getWindows(type) { if (type == "") { windows.push(hwindow); } return windows; } function getMethodInWindows(methodName) { - for each (var w in getWindows()) { + for (var w of getWindows()) { if (w[methodName] != undefined) { return w[methodName]; } } throw new Error("Method with name: '" + methodName + "' is not in any open window."); } function getWindowByTitle(title) { - for each (var w in getWindows()) { + for (var w of getWindows()) { if (w.document.title && w.document.title == title) { return w; } } throw new Error("Window with title: '" + title + "' not found."); }
--- a/services/sync/tps/extensions/tps/resource/modules/history.jsm +++ b/services/sync/tps/extensions/tps/resource/modules/history.jsm @@ -28,17 +28,17 @@ var DumpHistory = function TPS_History__ let options = PlacesUtils.history.getNewQueryOptions(); let root = PlacesUtils.history.executeQuery(query, options).root; root.containerOpen = true; Logger.logInfo("\n\ndumping history\n", true); for (var i = 0; i < root.childCount; i++) { let node = root.getChild(i); let uri = node.uri; let curvisits = HistoryEntry._getVisits(uri); - for each (var visit in curvisits) { + for (var visit of curvisits) { Logger.logInfo("URI: " + uri + ", type=" + visit.type + ", date=" + visit.date, true); } } root.containerOpen = false; Logger.logInfo("\nend history dump\n", true); }; /** @@ -105,17 +105,17 @@ var HistoryEntry = { Logger.AssertTrue("visits" in item && "uri" in item, "History entry in test file must have both 'visits' " + "and 'uri' properties"); let uri = Services.io.newURI(item.uri, null, null); let place = { uri: uri, visits: [] }; - for each (visit in item.visits) { + for (let visit of item.visits) { place.visits.push({ visitDate: usSinceEpoch + (visit.date * 60 * 60 * 1000 * 1000), transitionType: visit.type }); } if ("title" in item) { place.title = item.title; } @@ -145,28 +145,28 @@ var HistoryEntry = { * the time the current Crossweave run was started * @return true if all the visits for the uri are found, otherwise false */ Find: function(item, usSinceEpoch) { Logger.AssertTrue("visits" in item && "uri" in item, "History entry in test file must have both 'visits' " + "and 'uri' properties"); let curvisits = this._getVisits(item.uri); - for each (visit in curvisits) { - for each (itemvisit in item.visits) { + for (let visit of curvisits) { + for (let itemvisit of item.visits) { let expectedDate = itemvisit.date * 60 * 60 * 1000 * 1000 + usSinceEpoch; if (visit.type == itemvisit.type && visit.date == expectedDate) { itemvisit.found = true; } } } let all_items_found = true; - for each (itemvisit in item.visits) { + for (let itemvisit in item.visits) { all_items_found = all_items_found && "found" in itemvisit; Logger.logInfo("History entry for " + item.uri + ", type:" + itemvisit.type + ", date:" + itemvisit.date + ("found" in itemvisit ? " is present" : " is not present")); } return all_items_found; },
--- a/services/sync/tps/extensions/tps/resource/modules/tabs.jsm +++ b/services/sync/tps/extensions/tps/resource/modules/tabs.jsm @@ -45,17 +45,21 @@ var BrowserTabs = { * @param title The page title of the tab to find * @param profile The profile to search for tabs * @return true if the specified tab could be found, otherwise false */ Find: function(uri, title, profile) { // Find the uri in Weave's list of tabs for the given profile. let engine = Weave.Service.engineManager.get("tabs"); for (let [guid, client] in Iterator(engine.getAllClients())) { - for each (tab in client.tabs) { + if (!client.tabs) { + continue; + } + for (let key in client.tabs) { + let tab = client.tabs[key]; let weaveTabUrl = tab.urlHistory[0]; if (uri == weaveTabUrl && profile == client.clientName) if (title == undefined || title == tab.title) return true; } } return false; },
--- a/services/sync/tps/extensions/tps/resource/tps.jsm +++ b/services/sync/tps/extensions/tps/resource/tps.jsm @@ -280,17 +280,17 @@ var TPS = { break; } Logger.logPass("executing action " + action.toUpperCase() + " on windows"); }, HandleTabs: function (tabs, action) { this._tabsAdded = tabs.length; this._tabsFinished = 0; - for each (let tab in tabs) { + for (let tab of tabs) { Logger.logInfo("executing action " + action.toUpperCase() + " on tab " + JSON.stringify(tab)); switch(action) { case ACTION_ADD: // When adding tabs, we keep track of how many tabs we're adding, // and wait until we've received that many onload events from our // new tabs before continuing let that = this; @@ -325,17 +325,17 @@ var TPS = { default: Logger.AssertTrue(false, "invalid action: " + action); } } Logger.logPass("executing action " + action.toUpperCase() + " on tabs"); }, HandlePrefs: function (prefs, action) { - for each (pref in prefs) { + for (let pref of prefs) { Logger.logInfo("executing action " + action.toUpperCase() + " on pref " + JSON.stringify(pref)); let preference = new Preference(pref); switch(action) { case ACTION_MODIFY: preference.Modify(); break; case ACTION_VERIFY: @@ -344,17 +344,17 @@ var TPS = { default: Logger.AssertTrue(false, "invalid action: " + action); } } Logger.logPass("executing action " + action.toUpperCase() + " on pref"); }, HandleForms: function (data, action) { - for each (datum in data) { + for (let datum of data) { Logger.logInfo("executing action " + action.toUpperCase() + " on form entry " + JSON.stringify(datum)); let formdata = new FormData(datum, this._usSinceEpoch); switch(action) { case ACTION_ADD: formdata.Create(); break; case ACTION_DELETE: @@ -372,17 +372,17 @@ var TPS = { } } Logger.logPass("executing action " + action.toUpperCase() + " on formdata"); }, HandleHistory: function (entries, action) { try { - for each (entry in entries) { + for (let entry of entries) { Logger.logInfo("executing action " + action.toUpperCase() + " on history entry " + JSON.stringify(entry)); switch(action) { case ACTION_ADD: HistoryEntry.Add(entry, this._usSinceEpoch); break; case ACTION_DELETE: HistoryEntry.Delete(entry, this._usSinceEpoch); @@ -405,17 +405,17 @@ var TPS = { catch(e) { DumpHistory(); throw(e); } }, HandlePasswords: function (passwords, action) { try { - for each (password in passwords) { + for (let password of passwords) { let password_id = -1; Logger.logInfo("executing action " + action.toUpperCase() + " on password " + JSON.stringify(password)); var password = new Password(password); switch (action) { case ACTION_ADD: Logger.AssertTrue(password.Create() > -1, "error adding password"); break; @@ -445,17 +445,17 @@ var TPS = { } catch(e) { DumpPasswords(); throw(e); } }, HandleAddons: function (addons, action, state) { - for each (let entry in addons) { + for (let entry of addons) { Logger.logInfo("executing action " + action.toUpperCase() + " on addon " + JSON.stringify(entry)); let addon = new Addon(this, entry); switch(action) { case ACTION_ADD: addon.install(); break; case ACTION_DELETE: @@ -476,19 +476,19 @@ var TPS = { } Logger.logPass("executing action " + action.toUpperCase() + " on addons"); }, HandleBookmarks: function (bookmarks, action) { try { let items = []; - for (folder in bookmarks) { + for (let folder in bookmarks) { let last_item_pos = -1; - for each (bookmark in bookmarks[folder]) { + for (let bookmark of bookmarks[folder]) { Logger.clearPotentialError(); let placesItem; bookmark['location'] = folder; if (last_item_pos != -1) bookmark['last_item_pos'] = last_item_pos; let item_id = -1; @@ -520,17 +520,17 @@ var TPS = { } last_item_pos = placesItem.GetItemIndex(); items.push(placesItem); } } if (action == ACTION_DELETE || action == ACTION_MODIFY) { - for each (item in items) { + for (let item of items) { Logger.logInfo("executing action " + action.toUpperCase() + " on bookmark " + JSON.stringify(item)); switch(action) { case ACTION_DELETE: item.Remove(); break; case ACTION_MODIFY: if (item.updateProps != null) @@ -684,17 +684,17 @@ var TPS = { this.DumpError("no profile defined for phase " + this._currentPhase); return; } // If we have restricted the active engines, unregister engines we don't // care about. if (settings.ignoreUnusedEngines && Array.isArray(this._enabledEngines)) { let names = {}; - for each (let name in this._enabledEngines) { + for (let name of this._enabledEngines) { names[name] = true; } for (let engine of Weave.Service.engineManager.getEnabled()) { if (!(engine.name in names)) { Logger.logInfo("Unregistering unused engine: " + engine.name); Weave.Service.engineManager.unregister(engine); }