Bug 1561435 - Fix linting errors for toolkit/, r=standard8
authorVictor Porof <vporof@mozilla.com>
Tue, 25 Jun 2019 23:43:58 +0200
changeset 544284 aaadca9b31255590a2df9c0fa01dd2f25ac0f808
parent 544283 d8d9a53c4c13fe5cb4c6a865590f40633a12a27d
child 544285 970453d65b194690181134c0271dfe675f813f81
push id2131
push userffxbld-merge
push dateMon, 26 Aug 2019 18:30:20 +0000
treeherdermozilla-release@b19ffb3ca153 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersstandard8
bugs1561435
milestone69.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
Bug 1561435 - Fix linting errors for toolkit/, r=standard8 # ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D35955
toolkit/components/aboutcheckerboard/content/aboutCheckerboard.js
toolkit/components/aboutmemory/content/aboutMemory.js
toolkit/components/antitracking/TrackingDBService.jsm
toolkit/components/antitracking/test/browser/browser_storageAccessSandboxed.js
toolkit/components/asyncshutdown/AsyncShutdown.jsm
toolkit/components/backgroundhangmonitor/tests/child_cause_hang.js
toolkit/components/backgroundhangmonitor/tests/test_BHRObserver.js
toolkit/components/downloads/DownloadCore.jsm
toolkit/components/downloads/test/unit/common_test_Download.js
toolkit/components/extensions/Extension.jsm
toolkit/components/extensions/Schemas.jsm
toolkit/components/extensions/child/ext-test.js
toolkit/components/extensions/test/xpcshell/test_ext_userScripts_exports.js
toolkit/components/normandy/test/browser/browser_RecipeRunner.js
toolkit/components/osfile/modules/osfile_async_front.jsm
toolkit/components/passwordmgr/LoginManagerPrompter.jsm
toolkit/components/passwordmgr/LoginRecipes.jsm
toolkit/components/passwordmgr/storage-mozStorage.js
toolkit/components/passwordmgr/test/unit/test_module_LoginImport.js
toolkit/components/passwordmgr/test/unit/test_module_LoginStore.js
toolkit/components/places/BookmarkHTMLUtils.jsm
toolkit/components/places/PlacesSyncUtils.jsm
toolkit/components/places/TaggingService.jsm
toolkit/components/places/tests/favicons/test_replaceFaviconDataFromDataURL.js
toolkit/components/places/tests/queries/test_tags.js
toolkit/components/places/tests/unit/test_keywords.js
toolkit/components/satchel/test/unit/test_autocomplete.js
toolkit/components/satchel/test/unit/test_history_api.js
toolkit/components/url-classifier/tests/browser/classifierHelper.js
toolkit/components/url-classifier/tests/mochitest/classifierHelper.js
toolkit/components/url-classifier/tests/unit/test_dbservice.js
toolkit/components/url-classifier/tests/unit/test_partial.js
toolkit/components/viewsource/content/viewSource-content.js
toolkit/content/widgets/findbar.js
toolkit/modules/CertUtils.jsm
toolkit/modules/UpdateUtils.jsm
toolkit/modules/sessionstore/SessionHistory.jsm
toolkit/modules/tests/browser/browser_Deprecated.js
toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
toolkit/modules/tests/xpcshell/test_Promise.js
toolkit/modules/tests/xpcshell/test_sqlite.js
toolkit/mozapps/extensions/content/aboutaddons.js
toolkit/mozapps/extensions/internal/XPIDatabase.jsm
toolkit/mozapps/extensions/test/browser/browser_html_discover_view.js
toolkit/mozapps/update/UpdateService.jsm
toolkit/mozapps/update/tests/data/shared.js
toolkit/mozapps/update/tests/data/sharedUpdateXML.js
toolkit/mozapps/update/tests/data/xpcshellUtilsAUS.js
toolkit/mozapps/update/tests/unit_aus_update/canCheckForAndCanApplyUpdates.js
toolkit/mozapps/update/tests/unit_aus_update/updateAutoPrefMigrate.js
toolkit/xre/test/test_launch_without_hang.js
--- a/toolkit/components/aboutcheckerboard/content/aboutCheckerboard.js
+++ b/toolkit/components/aboutcheckerboard/content/aboutCheckerboard.js
@@ -106,16 +106,17 @@ function loadData() {
     // skip lines without RENDERTRACE
     if (!/RENDERTRACE/.test(lines[i])) {
       continue;
     }
 
     var tokens = lines[i].split(/\s+/);
     var j = 0;
     // skip tokens until RENDERTRACE
+    // eslint-disable-next-line no-empty
     while (j < tokens.length && tokens[j++] != "RENDERTRACE") {} // empty loop body
     if (j >= tokens.length - 2) {
       log("Error parsing line: " + lines[i]);
       continue;
     }
 
     var timestamp = tokens[j++];
     var destIndex = renderData.length;
--- a/toolkit/components/aboutmemory/content/aboutMemory.js
+++ b/toolkit/components/aboutmemory/content/aboutMemory.js
@@ -335,17 +335,17 @@ window.onload = function() {
       delete this.filename1;
       updateAboutMemoryFromTwoFiles(filename1, file.mozFullPath);
     }
   });
 
   const CuDesc = "Measure current memory reports and show.";
   const LdDesc = "Load memory reports from file and show.";
   const DfDesc =
-    "Load memory report data from two files and show the " + "difference.";
+    "Load memory report data from two files and show the difference.";
 
   const SvDesc = "Save memory reports to file.";
 
   const GCDesc = "Do a global garbage collection.";
   const CCDesc = "Do a cycle collection.";
   const MMDesc =
     'Send three "heap-minimize" notifications in a ' +
     "row.  Each notification triggers a global garbage " +
--- a/toolkit/components/antitracking/TrackingDBService.jsm
+++ b/toolkit/components/antitracking/TrackingDBService.jsm
@@ -34,18 +34,17 @@ const SQL = {
     "count INTEGER NOT NULL, " +
     "timestamp DATE " +
     ");",
 
   addEvent:
     "INSERT INTO events (type, count, timestamp) " +
     "VALUES (:type, 1, date(:date));",
 
-  incrementEvent:
-    "UPDATE events " + "SET count = count + 1 " + "WHERE id = :id;",
+  incrementEvent: "UPDATE events SET count = count + 1 WHERE id = :id;",
 
   selectByTypeAndDate:
     "SELECT * FROM events " +
     "WHERE type = :type " +
     "AND timestamp = date(:date);",
 
   deleteEventsRecords: "DELETE FROM events;",
 
--- a/toolkit/components/antitracking/test/browser/browser_storageAccessSandboxed.js
+++ b/toolkit/components/antitracking/test/browser/browser_storageAccessSandboxed.js
@@ -144,17 +144,17 @@ AntiTracking.runTest(
   false, // no window open test
   false, // no user-interaction test
   0, // no blocking notifications
   true, // run in private window
   null // iframe sandbox
 );
 
 AntiTracking.runTest(
-  "Verify that non-sandboxed contexts get the" + " saved permission",
+  "Verify that non-sandboxed contexts get the saved permission",
   // blocking callback
   async _ => {
     /* import-globals-from storageAccessAPIHelpers.js */
     await hasStorageAccessInitially();
 
     localStorage.foo = 42;
     ok(true, "LocalStorage can be used!");
   },
--- a/toolkit/components/asyncshutdown/AsyncShutdown.jsm
+++ b/toolkit/components/asyncshutdown/AsyncShutdown.jsm
@@ -66,18 +66,18 @@ Object.defineProperty(this, "gCrashRepor
   },
   configurable: true,
 });
 
 // `true` if this is a content process, `false` otherwise.
 // It would be nicer to go through `Services.appinfo`, but some tests need to be
 // able to replace that field with a custom implementation before it is first
 // called.
-// eslint-disable-next-line mozilla/use-services
 const isContent =
+  // eslint-disable-next-line mozilla/use-services
   Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).processType ==
   Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT;
 
 // Display timeout warnings after 10 seconds
 const DELAY_WARNING_MS = 10 * 1000;
 
 // Crash the process if shutdown is really too long
 // (allowing for sleep).
--- a/toolkit/components/backgroundhangmonitor/tests/child_cause_hang.js
+++ b/toolkit/components/backgroundhangmonitor/tests/child_cause_hang.js
@@ -18,13 +18,14 @@ function ensureProfilerInitialized() {
 
 add_task(async function childCauseHang() {
   if (!ensureProfilerInitialized()) {
     return;
   }
 
   executeSoon(() => {
     let startTime = Date.now();
+    // eslint-disable-next-line no-empty
     while (Date.now() - startTime < 2000) {}
   });
 
   await do_await_remote_message("bhr_hangs_detected");
 });
--- a/toolkit/components/backgroundhangmonitor/tests/test_BHRObserver.js
+++ b/toolkit/components/backgroundhangmonitor/tests/test_BHRObserver.js
@@ -62,21 +62,23 @@ add_task(async function test_BHRObserver
   });
 
   // We're going to trigger two hangs, of various lengths. One should be a
   // transient hang, and the other a permanent hang. We'll wait for the hangs to
   // be recorded.
 
   executeSoon(() => {
     let startTime = Date.now();
+    // eslint-disable-next-line no-empty
     while (Date.now() - startTime < 10000) {}
   });
 
   executeSoon(() => {
     let startTime = Date.now();
+    // eslint-disable-next-line no-empty
     while (Date.now() - startTime < 1000) {}
   });
 
   Services.prefs.setBoolPref(
     TelemetryUtils.Preferences.OverridePreRelease,
     true
   );
   let childDone = run_test_in_child("child_cause_hang.js");
--- a/toolkit/components/downloads/DownloadCore.jsm
+++ b/toolkit/components/downloads/DownloadCore.jsm
@@ -360,18 +360,17 @@ this.Download.prototype = {
           message: "Cannot start after finalization.",
         })
       );
     }
 
     if (this.error && this.error.becauseBlockedByReputationCheck) {
       return Promise.reject(
         new DownloadError({
-          message:
-            "Cannot start after being blocked " + "by a reputation check.",
+          message: "Cannot start after being blocked by a reputation check.",
         })
       );
     }
 
     // Initialize all the status properties for a new or restarted download.
     this.stopped = false;
     this.canceled = false;
     this.error = null;
--- a/toolkit/components/downloads/test/unit/common_test_Download.js
+++ b/toolkit/components/downloads/test/unit/common_test_Download.js
@@ -371,43 +371,43 @@ add_task(async function test_windows_zon
   ]);
   longTargetFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o600);
 
   const httpSourceUrl = httpUrl("source.txt");
   const dataSourceUrl = "data:text/html," + TEST_DATA_SHORT;
   const tests = [
     {
       expectedZoneId:
-        "[ZoneTransfer]\r\nZoneId=3\r\n" + "HostUrl=" + httpSourceUrl + "\r\n",
+        "[ZoneTransfer]\r\nZoneId=3\r\nHostUrl=" + httpSourceUrl + "\r\n",
     },
     {
       targetFile: longTargetFile,
       expectedZoneId:
-        "[ZoneTransfer]\r\nZoneId=3\r\n" + "HostUrl=" + httpSourceUrl + "\r\n",
+        "[ZoneTransfer]\r\nZoneId=3\r\nHostUrl=" + httpSourceUrl + "\r\n",
     },
     {
       sourceUrl: dataSourceUrl,
       expectedZoneId:
-        "[ZoneTransfer]\r\nZoneId=3\r\n" + "HostUrl=about:internet\r\n",
+        "[ZoneTransfer]\r\nZoneId=3\r\nHostUrl=about:internet\r\n",
     },
     {
       options: { referrer: TEST_REFERRER_URL },
       expectedZoneId:
         "[ZoneTransfer]\r\nZoneId=3\r\n" +
         "ReferrerUrl=" +
         TEST_REFERRER_URL +
         "\r\n" +
         "HostUrl=" +
         httpSourceUrl +
         "\r\n",
     },
     {
       options: { referrer: dataSourceUrl },
       expectedZoneId:
-        "[ZoneTransfer]\r\nZoneId=3\r\n" + "HostUrl=" + httpSourceUrl + "\r\n",
+        "[ZoneTransfer]\r\nZoneId=3\r\nHostUrl=" + httpSourceUrl + "\r\n",
     },
     {
       options: { referrer: "http://example.com/a\rb\nc" },
       expectedZoneId:
         "[ZoneTransfer]\r\nZoneId=3\r\n" +
         "ReferrerUrl=http://example.com/abc\r\n" +
         "HostUrl=" +
         httpSourceUrl +
--- a/toolkit/components/extensions/Extension.jsm
+++ b/toolkit/components/extensions/Extension.jsm
@@ -2292,17 +2292,17 @@ class Extension extends ExtensionData {
 
       // Wait the data migration to complete.
       try {
         await ExtensionStorageIDB.selectedBackendPromises.get(this);
       } catch (err) {
         Cu.reportError(
           `Error while waiting for extension data migration on shutdown: ${
             this.policy.debugName
-          } - ` + `${err.message}::${err.stack}`
+          } - ${err.message}::${err.stack}`
         );
       }
       this.state = "Shutdown: Storage complete";
     }
 
     if (this.rootURI instanceof Ci.nsIJARURI) {
       this.state = "Shutdown: Flush jar cache";
       let file = this.rootURI.JARFile.QueryInterface(Ci.nsIFileURL).file;
--- a/toolkit/components/extensions/Schemas.jsm
+++ b/toolkit/components/extensions/Schemas.jsm
@@ -2248,17 +2248,17 @@ class FunctionType extends Type {
         throw new Error(
           `Internal error: Expected a callback parameter ` +
             `with name ${schema.async}`
         );
       }
 
       if (isAsync && schema.returns) {
         throw new Error(
-          "Internal error: Async functions must not " + "have return values."
+          "Internal error: Async functions must not have return values."
         );
       }
       if (
         isAsync &&
         schema.allowAmbiguousOptionalArguments &&
         !hasAsyncCallback
       ) {
         throw new Error(
@@ -2674,18 +2674,18 @@ FunctionEntry = class FunctionEntry exte
     };
   }
 };
 
 // Represents an "event" defined in a schema namespace.
 //
 // TODO Bug 1369722: we should be able to remove the eslint-disable-line that follows
 // once Bug 1369722 has been fixed.
+// eslint-disable-next-line no-global-assign
 Event = class Event extends CallEntry {
-  // eslint-disable-line no-global-assign
   static parseSchema(root, event, path) {
     let extraParameters = Array.from(event.extraParameters || [], param => ({
       type: root.parseSchema(param, path, ["name", "optional", "default"]),
       name: param.name,
       optional: param.optional || false,
       default: param.default == undefined ? null : param.default,
     }));
 
--- a/toolkit/components/extensions/child/ext-test.js
+++ b/toolkit/components/extensions/child/ext-test.js
@@ -172,17 +172,17 @@ this.test = class extends ExtensionAPI {
             },
             error => {
               let errorMessage = toSource(error && error.message);
 
               assertTrue(
                 errorMatches(error, expectedError, context),
                 `Promise rejected, expecting rejection to match ${toSource(
                   expectedError
-                )}, ` + `got ${errorMessage}${msg}`
+                )}, got ${errorMessage}${msg}`
               );
             }
           );
         },
 
         assertThrows(func, expectedError, msg) {
           if (msg) {
             msg = `: ${msg}`;
@@ -194,17 +194,17 @@ this.test = class extends ExtensionAPI {
             assertTrue(false, `Function did not throw, expected error${msg}`);
           } catch (error) {
             let errorMessage = toSource(error && error.message);
 
             assertTrue(
               errorMatches(error, expectedError, context),
               `Function threw, expecting error to match ${toSource(
                 expectedError
-              )}` + `got ${errorMessage}${msg}`
+              )}got ${errorMessage}${msg}`
             );
           }
         },
 
         onMessage: new TestEventManager({
           context,
           name: "test.onMessage",
           register: fire => {
--- a/toolkit/components/extensions/test/xpcshell/test_ext_userScripts_exports.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_userScripts_exports.js
@@ -179,18 +179,18 @@ add_task(async function test_apiScript_e
     });
   }
 
   function userScript() {
     const { assertTrue, notifyFinish, testAPIMethod } = this;
 
     // Redefine the includes method on the Array prototype, to explicitly verify that the method
     // redefined in the userScript is not used when accessing arrayParam.includes from the API script.
+    // eslint-disable-next-line no-extend-native
     Array.prototype.includes = () => {
-      // eslint-disable-line no-extend-native
       throw new Error("Unexpected prototype leakage");
     };
     const arrayParam = new Array(1, 2, 3); // eslint-disable-line no-array-constructor
     const result = testAPIMethod(
       "param1",
       123,
       true,
       null,
--- a/toolkit/components/normandy/test/browser/browser_RecipeRunner.js
+++ b/toolkit/components/normandy/test/browser/browser_RecipeRunner.js
@@ -638,18 +638,18 @@ decorate_task(
     ok(!runStub.called, "run() should still not be called if disabled");
     RecipeRunner.enable();
   }
 );
 
 decorate_task(
   withStub(RecipeRunner, "loadRecipes"),
   async function testRunCanRunOnlyOnce(loadRecipesStub) {
-    // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
     loadRecipesStub.returns(
+      // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
       new Promise(resolve => setTimeout(() => resolve([]), 10))
     );
 
     // // Run 2 in parallel.
     await Promise.all([RecipeRunner.run(), RecipeRunner.run()]);
 
     is(loadRecipesStub.callCount, 1, "run() is no-op if already running");
   }
--- a/toolkit/components/osfile/modules/osfile_async_front.jsm
+++ b/toolkit/components/osfile/modules/osfile_async_front.jsm
@@ -1529,18 +1529,18 @@ Object.defineProperty(OS.File, "queue", 
     return Scheduler.queue;
   },
 });
 
 // `true` if this is a content process, `false` otherwise.
 // It would be nicer to go through `Services.appinfo`, but some tests need to be
 // able to replace that field with a custom implementation before it is first
 // called.
-// eslint-disable-next-line mozilla/use-services
 const isContent =
+  // eslint-disable-next-line mozilla/use-services
   Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).processType ==
   Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT;
 
 /**
  * Shutdown barriers, to let clients register to be informed during shutdown.
  */
 var Barriers = {
   shutdown: new AsyncShutdown.Barrier(
--- a/toolkit/components/passwordmgr/LoginManagerPrompter.jsm
+++ b/toolkit/components/passwordmgr/LoginManagerPrompter.jsm
@@ -196,17 +196,17 @@ LoginManagerPromptFactory.prototype = {
               e instanceof Components.Exception &&
               e.result == Cr.NS_ERROR_NOT_AVAILABLE
             ) {
               self.log(
                 "_doAsyncPrompt:run bypassed, UI is not available in this context"
               );
             } else {
               Cu.reportError(
-                "LoginManagerPrompter: " + "_doAsyncPrompt:run: " + e + "\n"
+                "LoginManagerPrompter: _doAsyncPrompt:run: " + e + "\n"
               );
             }
           }
 
           delete self._asyncPrompts[hashKey];
           prompt.inProgress = false;
           self._asyncPromptInProgress = false;
         }
@@ -711,17 +711,17 @@ LoginManagerPrompter.prototype = {
       notifyObj = this._getPopupNote();
       if (canRememberLogin && !notifyObj) {
         checkboxLabel = this._getLocalizedString("rememberPassword");
       }
     } catch (e) {
       // Ignore any errors and display the prompt anyway.
       epicfail = true;
       Cu.reportError(
-        "LoginManagerPrompter: " + "Epic fail in promptAuth: " + e + "\n"
+        "LoginManagerPrompter: Epic fail in promptAuth: " + e + "\n"
       );
     }
 
     var ok = canAutologin;
     let browser = this._browser;
     let baseDomain;
 
     // We might not have a browser or browser.currentURI.host could fail
@@ -830,19 +830,17 @@ LoginManagerPrompter.prototype = {
         } else {
           this._updateLogin(selectedLogin, newLogin);
         }
       } else {
         this.log("Login unchanged, no further action needed.");
         this._updateLogin(selectedLogin);
       }
     } catch (e) {
-      Cu.reportError(
-        "LoginManagerPrompter: " + "Fail2 in promptAuth: " + e + "\n"
-      );
+      Cu.reportError("LoginManagerPrompter: Fail2 in promptAuth: " + e + "\n");
     }
 
     return ok;
   },
 
   asyncPromptAuth(aChannel, aCallback, aContext, aLevel, aAuthInfo) {
     var cancelable = null;
 
--- a/toolkit/components/passwordmgr/LoginRecipes.jsm
+++ b/toolkit/components/passwordmgr/LoginRecipes.jsm
@@ -344,18 +344,18 @@ this.LoginRecipesContent = {
       return null;
     }
     let field = aParent.ownerDocument.querySelector(aSelector);
     if (!field) {
       log.debug("Login field selector wasn't matched:", aSelector);
       return null;
     }
     // ownerGlobal doesn't exist in content privileged windows.
-    // eslint-disable-next-line mozilla/use-ownerGlobal
     if (
+      // eslint-disable-next-line mozilla/use-ownerGlobal
       !(field instanceof aParent.ownerDocument.defaultView.HTMLInputElement)
     ) {
       log.warn("Login field isn't an <input> so ignoring it:", aSelector);
       return null;
     }
     return field;
   },
 };
--- a/toolkit/components/passwordmgr/storage-mozStorage.js
+++ b/toolkit/components/passwordmgr/storage-mozStorage.js
@@ -1279,17 +1279,17 @@ LoginManagerStorage_mozStorage.prototype
     try {
       let stmt = this._dbConnection.createStatement(query);
       // (no need to execute statement, if it compiled we're good)
       stmt.finalize();
     } catch (e) {
       return false;
     }
 
-    query = "SELECT " + "id, " + "hostname " + "FROM moz_disabledHosts";
+    query = "SELECT id, hostname FROM moz_disabledHosts";
     try {
       let stmt = this._dbConnection.createStatement(query);
       // (no need to execute statement, if it compiled we're good)
       stmt.finalize();
     } catch (e) {
       return false;
     }
 
--- a/toolkit/components/passwordmgr/test/unit/test_module_LoginImport.js
+++ b/toolkit/components/passwordmgr/test/unit/test_module_LoginImport.js
@@ -115,17 +115,17 @@ function promiseInsertLoginInfo(aConnect
   );
 }
 
 /**
  * Inserts a new disabled host entry in the database.
  */
 function promiseInsertDisabledHost(aConnection, aOrigin) {
   return aConnection.execute(
-    "INSERT INTO moz_disabledHosts (hostname) " + "VALUES (?)",
+    "INSERT INTO moz_disabledHosts (hostname) VALUES (?)",
     [aOrigin]
   );
 }
 
 // Tests
 
 /**
  * Imports login data from a SQLite file constructed using the test data.
--- a/toolkit/components/passwordmgr/test/unit/test_module_LoginStore.js
+++ b/toolkit/components/passwordmgr/test/unit/test_module_LoginStore.js
@@ -145,17 +145,17 @@ add_task(async function test_load_string
 });
 
 /**
  * Loads login data from a malformed JSON string.
  */
 add_task(async function test_load_string_malformed() {
   let store = new LoginStore(getTempFile(TEST_STORE_FILE_NAME).path);
 
-  let string = '{"logins":[{"hostname":"http://www.example.com",' + '"id":1,';
+  let string = '{"logins":[{"hostname":"http://www.example.com","id":1,';
 
   await OS.File.writeAtomic(store.path, new TextEncoder().encode(string), {
     tmpPath: store.path + ".tmp",
   });
 
   await store.load();
 
   // A backup file should have been created.
@@ -168,17 +168,17 @@ add_task(async function test_load_string
 
 /**
  * Loads login data from a malformed JSON string, using the synchronous
  * initialization path.
  */
 add_task(async function test_load_string_malformed_sync() {
   let store = new LoginStore(getTempFile(TEST_STORE_FILE_NAME).path);
 
-  let string = '{"logins":[{"hostname":"http://www.example.com",' + '"id":1,';
+  let string = '{"logins":[{"hostname":"http://www.example.com","id":1,';
 
   await OS.File.writeAtomic(store.path, new TextEncoder().encode(string), {
     tmpPath: store.path + ".tmp",
   });
 
   store.ensureDataReady();
 
   // A backup file should have been created.
--- a/toolkit/components/places/BookmarkHTMLUtils.jsm
+++ b/toolkit/components/places/BookmarkHTMLUtils.jsm
@@ -925,17 +925,17 @@ BookmarkExporter.prototype = {
   },
 
   _writeHeader() {
     this._writeLine("<!DOCTYPE NETSCAPE-Bookmark-file-1>");
     this._writeLine("<!-- This is an automatically generated file.");
     this._writeLine("     It will be read and overwritten.");
     this._writeLine("     DO NOT EDIT! -->");
     this._writeLine(
-      '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; ' + 'charset=UTF-8">'
+      '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">'
     );
     this._writeLine("<TITLE>Bookmarks</TITLE>");
   },
 
   async _writeContainer(aItem, aIndent = "") {
     if (aItem == this._root) {
       this._writeLine("<H1>" + escapeHtmlEntities(this._root.title) + "</H1>");
       this._writeLine("");
--- a/toolkit/components/places/PlacesSyncUtils.jsm
+++ b/toolkit/components/places/PlacesSyncUtils.jsm
@@ -523,17 +523,17 @@ const BookmarkSyncUtils = (PlacesSyncUti
           });
           return;
         }
 
         // Otherwise, we have a sync ID, but it doesn't match, so we were likely
         // node reassigned. Take the server's sync ID and reset all items to
         // "UNKNOWN" so that we can merge.
         BookmarkSyncLog.info(
-          "Bookmarks sync ID changed; resetting sync " + "statuses",
+          "Bookmarks sync ID changed; resetting sync statuses",
           { existingSyncId, newSyncId }
         );
         await db.executeTransaction(async function() {
           await setBookmarksSyncId(db, newSyncId);
           await resetAllSyncStatuses(
             db,
             PlacesUtils.bookmarks.SYNC_STATUS.UNKNOWN
           );
@@ -1046,17 +1046,17 @@ const BookmarkSyncUtils = (PlacesSyncUti
           let kind = await getKindForItem(db, bookmarkItem);
           if (kind == BookmarkSyncUtils.KINDS.FOLDER) {
             folderGuids.push(bookmarkItem.guid);
             continue;
           }
           let wasRemoved = await deleteSyncedAtom(bookmarkItem);
           if (wasRemoved) {
             BookmarkSyncLog.trace(
-              `remove: Removed item ${guid} with ` + `kind ${kind}`
+              `remove: Removed item ${guid} with kind ${kind}`
             );
           }
         }
 
         for (let guid of folderGuids) {
           let bookmarkItem = await PlacesUtils.bookmarks.fetch(guid);
           if (!bookmarkItem) {
             BookmarkSyncLog.trace(`remove: Folder ${guid} already removed`);
@@ -2194,24 +2194,24 @@ function addRowToChangeRecords(row, chan
     if (existingRecord.tombstone == isTombstone) {
       // Should never happen: `moz_bookmarks.guid` has a unique index, and
       // `moz_bookmarks_deleted.guid` is the primary key.
       throw new Error(`Duplicate item or tombstone ${recordId} in changeset`);
     }
     if (!existingRecord.tombstone && isTombstone) {
       // Don't replace undeleted items with tombstones...
       BookmarkSyncLog.warn(
-        "addRowToChangeRecords: Ignoring tombstone for " + "undeleted item",
+        "addRowToChangeRecords: Ignoring tombstone for undeleted item",
         recordId
       );
       return;
     }
     // ...But replace undeleted tombstones with items.
     BookmarkSyncLog.warn(
-      "addRowToChangeRecords: Replacing tombstone for " + "undeleted item",
+      "addRowToChangeRecords: Replacing tombstone for undeleted item",
       recordId
     );
   }
   let modifiedAsPRTime = row.getResultByName("modified");
   let modified = modifiedAsPRTime / MICROSECONDS_PER_SECOND;
   if (Number.isNaN(modified) || modified <= 0) {
     BookmarkSyncLog.error(
       "addRowToChangeRecords: Invalid modified date for " + recordId,
--- a/toolkit/components/places/TaggingService.jsm
+++ b/toolkit/components/places/TaggingService.jsm
@@ -539,16 +539,17 @@ TagAutoCompleteSearch.prototype = {
           if (i % 10 == 0) {
             this.notifyResult(result, count, listener, true);
             yield true;
           }
         }
         yield false;
       }.bind(this)();
 
+      // eslint-disable-next-line no-empty
       while (gen.next().value) {}
       this.notifyResult(result, count, listener, false);
     })();
   },
 
   /**
    * Stop an asynchronous search that is in progress
    */
--- a/toolkit/components/places/tests/favicons/test_replaceFaviconDataFromDataURL.js
+++ b/toolkit/components/places/tests/favicons/test_replaceFaviconDataFromDataURL.js
@@ -499,16 +499,17 @@ add_task(
     await PlacesUtils.history.clear();
   }
 );
 
 /* toBase64 copied from image/test/unit/test_encoder_png.js */
 
 /* Convert data (an array of integers) to a Base64 string. */
 const toBase64Table =
+  // eslint-disable-next-line no-useless-concat
   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789+/";
 const base64Pad = "=";
 function toBase64(data) {
   let result = "";
   let length = data.length;
   let i;
   // Convert every three bytes to 4 ascii characters.
   for (i = 0; i < length - 2; i += 3) {
--- a/toolkit/components/places/tests/queries/test_tags.js
+++ b/toolkit/components/places/tests/queries/test_tags.js
@@ -11,19 +11,17 @@
 "use strict";
 
 add_task(async function tags_getter_setter() {
   info("Tags getter/setter should work correctly");
   info("Without setting tags, tags getter should return empty array");
   var [query] = makeQuery();
   Assert.equal(query.tags.length, 0);
 
-  info(
-    "Setting tags to an empty array, tags getter should return " + "empty array"
-  );
+  info("Setting tags to an empty array, tags getter should return empty array");
   [query] = makeQuery([]);
   Assert.equal(query.tags.length, 0);
 
   info("Setting a few tags, tags getter should return correct array");
   var tags = ["bar", "baz", "foo"];
   [query] = makeQuery(tags);
   setsAreEqual(query.tags, tags, true);
 
@@ -48,31 +46,27 @@ add_task(async function invalid_setter_c
 
   try {
     makeQuery([null]);
     do_throw("Passing one-element array with null to SetTags should fail");
   } catch (exc) {}
 
   try {
     makeQuery([undefined]);
-    do_throw(
-      "Passing one-element array with undefined to SetTags " + "should fail"
-    );
+    do_throw("Passing one-element array with undefined to SetTags should fail");
   } catch (exc) {}
 
   try {
     makeQuery(["foo", null, "bar"]);
     do_throw("Passing mixture of tags and null to SetTags should fail");
   } catch (exc) {}
 
   try {
     makeQuery(["foo", undefined, "bar"]);
-    do_throw(
-      "Passing mixture of tags and undefined to SetTags " + "should fail"
-    );
+    do_throw("Passing mixture of tags and undefined to SetTags should fail");
   } catch (exc) {}
 
   try {
     makeQuery([1, 2, 3]);
     do_throw("Passing numbers to SetTags should fail");
   } catch (exc) {}
 
   try {
@@ -284,19 +278,17 @@ add_task(async function duplicate_tags()
       "same name) should not throw off query results"
   );
   var tagName = "foo";
 
   info("Add bookmark and tag it normally");
   await addBookmark(TEST_URI);
   PlacesUtils.tagging.tagURI(TEST_URI, [tagName]);
 
-  info(
-    "Manually create tag folder with same name as tag and insert " + "bookmark"
-  );
+  info("Manually create tag folder with same name as tag and insert bookmark");
   let dupTag = await PlacesUtils.bookmarks.insert({
     parentGuid: PlacesUtils.bookmarks.tagsGuid,
     type: PlacesUtils.bookmarks.TYPE_FOLDER,
     title: tagName,
   });
 
   await PlacesUtils.bookmarks.insert({
     parentGuid: dupTag.guid,
--- a/toolkit/components/places/tests/unit/test_keywords.js
+++ b/toolkit/components/places/tests/unit/test_keywords.js
@@ -321,16 +321,17 @@ add_task(async function test_addBookmark
     keyword: "keyword",
     url: "http://example.com/",
   });
 
   observer = expectBookmarkNotifications();
   await PlacesUtils.bookmarks.remove(bookmark.guid);
   // the notification is synchronous but the removal process is async.
   // Unfortunately there's nothing explicit we can wait for.
+  // eslint-disable-next-line no-empty
   while (await foreign_count("http://example.com/")) {}
   // We don't get any itemChanged notification since the bookmark has been
   // removed already.
   observer.check([]);
 
   await check_keyword(false, "http://example.com/", "keyword");
 
   await check_no_orphans();
@@ -401,16 +402,17 @@ add_task(async function test_addBookmark
   });
   Assert.equal(await foreign_count("http://example.com/"), fc + 2); // +1 bookmark
   observer.check([]);
 
   observer = expectBookmarkNotifications();
   await PlacesUtils.bookmarks.remove(bookmark.guid);
   // the notification is synchronous but the removal process is async.
   // Unfortunately there's nothing explicit we can wait for.
+  // eslint-disable-next-line no-empty
   while (await foreign_count("http://example.com/")) {}
   // We don't get any itemChanged notification since the bookmark has been
   // removed already.
   observer.check([]);
 
   await check_keyword(false, "http://example.com/", "keyword");
 
   await check_no_orphans();
@@ -509,16 +511,17 @@ add_task(async function test_sameKeyword
   await check_keyword(false, "http://example1.com/", "keyword");
   await check_keyword(false, "http://example2.com/", "keyword");
   Assert.equal(await foreign_count("http://example1.com/"), fc1 + 1);
   Assert.equal(await foreign_count("http://example2.com/"), fc2 + 1); // -1 keyword
 
   await PlacesUtils.bookmarks.remove(bookmark1);
   await PlacesUtils.bookmarks.remove(bookmark2);
   Assert.equal(await foreign_count("http://example1.com/"), fc1); // -1 bookmark
+  // eslint-disable-next-line no-empty
   while (await foreign_count("http://example2.com/")) {} // -1 keyword
 
   await check_no_orphans();
 });
 
 add_task(async function test_sameURIDifferentKeyword() {
   let fc = await foreign_count("http://example.com/");
 
@@ -578,16 +581,17 @@ add_task(async function test_sameURIDiff
         "",
         Ci.nsINavBookmarksService.SOURCE_DEFAULT,
       ],
     },
   ]);
 
   // Now remove the bookmark.
   await PlacesUtils.bookmarks.remove(bookmark);
+  // eslint-disable-next-line no-empty
   while (await foreign_count("http://example.com/")) {}
   await check_keyword(false, "http://example.com/", "keyword");
   await check_keyword(false, "http://example.com/", "keyword2");
 
   await check_no_orphans();
 });
 
 add_task(async function test_deleteKeywordMultipleBookmarks() {
--- a/toolkit/components/satchel/test/unit/test_autocomplete.js
+++ b/toolkit/components/satchel/test/unit/test_autocomplete.js
@@ -311,17 +311,17 @@ add_test(function test_token_limit_DB() 
       null,
       previousResult,
       null,
       {
         onSearchCompletion(aResults) {
           Assert.equal(
             aResults.matchCount,
             0,
-            "All search tokens should be used with " + "previous results"
+            "All search tokens should be used with previous results"
           );
           run_next_test();
         },
       }
     );
   }
 
   do_log_info(
--- a/toolkit/components/satchel/test/unit/test_history_api.js
+++ b/toolkit/components/satchel/test/unit/test_history_api.js
@@ -29,17 +29,17 @@ function countDeletedEntries(expected) {
       },
     });
   });
 }
 
 function checkTimeDeleted(guid, checkFunction) {
   return new Promise((resolve, reject) => {
     let stmt = dbConnection.createAsyncStatement(
-      "SELECT timeDeleted FROM moz_deleted_formhistory " + "WHERE guid = :guid"
+      "SELECT timeDeleted FROM moz_deleted_formhistory WHERE guid = :guid"
     );
     stmt.params.guid = guid;
     stmt.executeAsync({
       handleResult(resultSet) {
         checkFunction(resultSet.getNextRow().getResultByName("timeDeleted"));
         resolve();
       },
       handleError(error) {
--- a/toolkit/components/url-classifier/tests/browser/classifierHelper.js
+++ b/toolkit/components/url-classifier/tests/browser/classifierHelper.js
@@ -107,18 +107,17 @@ classifierHelper.addUrlToDB = function(u
 };
 
 // This API is used to expire all add/sub chunks we have updated
 // by using addUrlToDB.
 // Returns a Promise.
 classifierHelper.resetDatabase = function() {
   var testUpdate = "";
   for (var update of classifierHelper._updatesToCleanup) {
-    testUpdate +=
-      "n:1000\n" + "i:" + update.db + "\n" + "ad:" + update.addChunk + "\n";
+    testUpdate += "n:1000\ni:" + update.db + "\nad:" + update.addChunk + "\n";
   }
 
   return classifierHelper._update(testUpdate);
 };
 
 classifierHelper.reloadDatabase = function() {
   dbService.reloadDatabase();
 };
--- a/toolkit/components/url-classifier/tests/mochitest/classifierHelper.js
+++ b/toolkit/components/url-classifier/tests/mochitest/classifierHelper.js
@@ -91,17 +91,17 @@ classifierHelper.addUrlToDB = function(u
 // This API is used to expire all add/sub chunks we have updated
 // by using addUrlToDB.
 classifierHelper.resetDatabase = function() {
   function removeDatabase() {
     return new Promise(function(resolve, reject) {
       var testUpdate = "";
       for (var update of classifierHelper._updatesToCleanup) {
         testUpdate +=
-          "n:1000\n" + "i:" + update.db + "\n" + "ad:" + update.addChunk + "\n";
+          "n:1000\ni:" + update.db + "\nad:" + update.addChunk + "\n";
       }
 
       classifierHelper._update(testUpdate, resolve, reject);
     });
   }
 
   // Remove and then reload will ensure both database and cache will
   // be cleared.
--- a/toolkit/components/url-classifier/tests/unit/test_dbservice.js
+++ b/toolkit/components/url-classifier/tests/unit/test_dbservice.js
@@ -126,17 +126,17 @@ function tablesCallbackWithSub(tables) {
   // there's a leading \n here because splitting left an empty string
   // after the trailing newline, which will sort first
   Assert.equal(
     parts.join("\n"),
     "\ntest-block-simple;a:1\ntest-malware-simple;a:1\ntest-phish-simple;a:2:s:3\ntest-unwanted-simple;a:1"
   );
 
   // verify that expiring a sub chunk removes its name from the list
-  var data = "n:1000\n" + "i:test-phish-simple\n" + "sd:3\n";
+  var data = "n:1000\ni:test-phish-simple\nsd:3\n";
 
   doSimpleUpdate(data, expireSubSuccess, testFailure);
 }
 
 function checkChunksWithSub() {
   dbservice.getTables(tablesCallbackWithSub);
 }
 
--- a/toolkit/components/url-classifier/tests/unit/test_partial.js
+++ b/toolkit/components/url-classifier/tests/unit/test_partial.js
@@ -455,17 +455,17 @@ function testCachedResultsWithSub() {
   });
 }
 
 function testCachedResultsWithExpire() {
   setupCachedResults(["foo.com/a"], function() {
     // install a new completer, this one should never be queried.
     var newCompleter = installCompleter("test-phish-simple", [[1, []]], []);
 
-    var expireUpdate = "n:1000\n" + "i:test-phish-simple\n" + "ad:1\n";
+    var expireUpdate = "n:1000\ni:test-phish-simple\nad:1\n";
 
     var assertions = {
       urlsDontExist: ["foo.com/a"],
       completerQueried: [newCompleter, []],
     };
     doTest([expireUpdate], assertions);
   });
 }
--- a/toolkit/components/viewsource/content/viewSource-content.js
+++ b/toolkit/components/viewsource/content/viewSource-content.js
@@ -499,16 +499,17 @@ var ViewSourceContent = {
    *  a range spanning the specified line. If the (node, offset,
    *  interlinePosition) are specified, result.line and result.col are the line
    *  and column number of the specified offset in the specified node relative to
    *  the whole file."
    */
   findLocation(pre, lineNumber, node, offset, interlinePosition, result) {
     if (node && !pre) {
       // Look upwards to find the current pre element.
+      // eslint-disable-next-line no-empty
       for (pre = node; pre.nodeName != "PRE"; pre = pre.parentNode) {}
     }
 
     // The source document is made up of a number of pre elements with
     // id attributes in the format <pre id="line123">, meaning that
     // the first line in the pre element is number 123.
     // However, in the plain text case, there is only one <pre> without an id,
     // so assume line 1.
--- a/toolkit/content/widgets/findbar.js
+++ b/toolkit/content/widgets/findbar.js
@@ -196,19 +196,19 @@
       this.nsISelectionController = Ci.nsISelectionController;
       this._findSelection = this.nsISelectionController.SELECTION_FIND;
 
       this._findResetTimeout = -1;
 
       // Make sure the FAYT keypress listener is attached by initializing the
       // browser property
       if (this.getAttribute("browserid")) {
-        // eslint-disable-next-line no-self-assign
         setTimeout(
           function(aSelf) {
+            // eslint-disable-next-line no-self-assign
             aSelf.browser = aSelf.browser;
           },
           0,
           this
         );
       }
 
       window.addEventListener("unload", this.destroy);
--- a/toolkit/modules/CertUtils.jsm
+++ b/toolkit/modules/CertUtils.jsm
@@ -83,17 +83,17 @@ function validateCert(aCertificate, aCer
   var errors = [];
   for (var i = 0; i < aCerts.length; ++i) {
     var error = false;
     var certAttrs = aCerts[i];
     for (var name in certAttrs) {
       if (!(name in aCertificate)) {
         error = true;
         errors.push(
-          "Expected attribute '" + name + "' not present in " + "certificate."
+          "Expected attribute '" + name + "' not present in certificate."
         );
         break;
       }
       if (aCertificate[name] != certAttrs[name]) {
         error = true;
         errors.push(
           "Expected certificate attribute '" +
             name +
@@ -111,17 +111,17 @@ function validateCert(aCertificate, aCer
     if (!error) {
       break;
     }
   }
 
   if (error) {
     errors.forEach(Cu.reportError.bind(Cu));
     const certCheckErr =
-      "Certificate checks failed. See previous errors " + "for details.";
+      "Certificate checks failed. See previous errors for details.";
     Cu.reportError(certCheckErr);
     throw new Ce(certCheckErr, Cr.NS_ERROR_ILLEGAL_VALUE);
   }
 }
 
 /**
  * Checks if the connection must be HTTPS and if so, only allows built-in
  * certificates and validates application specified certificate attribute
@@ -164,16 +164,17 @@ function checkCert(aChannel, aAllowNonBu
 
   validateCert(cert, aCerts);
 
   if (aAllowNonBuiltInCerts === true) {
     return;
   }
 
   let issuerCert = null;
+  // eslint-disable-next-line no-empty
   for (issuerCert of secInfo.succeededCertChain.getEnumerator()) {
   }
 
   const certNotBuiltInErr = "Certificate issuer is not built-in.";
   if (!issuerCert) {
     throw new Ce(certNotBuiltInErr, Cr.NS_ERROR_ABORT);
   }
 
--- a/toolkit/modules/UpdateUtils.jsm
+++ b/toolkit/modules/UpdateUtils.jsm
@@ -356,17 +356,17 @@ function getMemoryMB() {
   let memoryMB = "unknown";
   try {
     memoryMB = Services.sysinfo.getProperty("memsize");
     if (memoryMB) {
       memoryMB = Math.round(memoryMB / 1024 / 1024);
     }
   } catch (e) {
     Cu.reportError(
-      "Error getting system info memsize property. " + "Exception: " + e
+      "Error getting system info memsize property. Exception: " + e
     );
   }
   return memoryMB;
 }
 
 /**
  * Gets the supported CPU instruction set.
  */
@@ -447,19 +447,17 @@ XPCOMUtils.defineLazyGetter(this, "gWinC
         case 6:
           arch = "IA64";
           break;
         case 0:
           arch = "x86";
           break;
       }
     } catch (e) {
-      Cu.reportError(
-        "Error getting processor architecture. " + "Exception: " + e
-      );
+      Cu.reportError("Error getting processor architecture. Exception: " + e);
     } finally {
       kernel32.close();
     }
   }
 
   return arch;
 });
 
--- a/toolkit/modules/sessionstore/SessionHistory.jsm
+++ b/toolkit/modules/sessionstore/SessionHistory.jsm
@@ -431,16 +431,17 @@ var SessionHistoryInternal = {
       shEntry.cacheKey = entry.cacheKey;
     }
 
     if (entry.ID) {
       // get a new unique ID for this frame (since the one from the last
       // start might already be in use)
       var id = idMap[entry.ID] || 0;
       if (!id) {
+        // eslint-disable-next-line no-empty
         for (id = Date.now(); id in idMap.used; id++) {}
         idMap[entry.ID] = id;
         idMap.used[id] = true;
       }
       shEntry.ID = id;
     }
 
     // If we have the legacy docshellID on our entry, upgrade it to a
--- a/toolkit/modules/tests/browser/browser_Deprecated.js
+++ b/toolkit/modules/tests/browser/browser_Deprecated.js
@@ -104,17 +104,17 @@ function test() {
 
   nextTest();
 }
 
 // Test Consle Message attributes.
 function testAMessage(aMessage) {
   ok(
     aMessage.errorMessage.indexOf(
-      "DEPRECATION WARNING: " + "this method is deprecated."
+      "DEPRECATION WARNING: this method is deprecated."
     ) === 0,
     "Deprecation is correctly logged."
   );
   ok(
     aMessage.errorMessage.indexOf("http://example.com") > 0,
     "URL is correctly logged."
   );
 }
--- a/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
+++ b/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
@@ -664,29 +664,29 @@ add_task(async function test_simpleCheck
     GMPUtils.OPEN_H264_ID
   );
 });
 
 /**
  * Tests simpleCheckAndInstall nothing to install
  */
 add_task(async function test_simpleCheckAndInstall_nothingToInstall() {
-  let responseXML = '<?xml version="1.0"?>' + "<updates>" + "</updates>";
+  let responseXML = '<?xml version="1.0"?><updates></updates>';
 
   overrideXHR(200, responseXML);
   let installManager = new GMPInstallManager();
   let result = await installManager.simpleCheckAndInstall();
   Assert.equal(result.status, "nothing-new-to-install");
 });
 
 /**
  * Tests simpleCheckAndInstall too frequent
  */
 add_task(async function test_simpleCheckAndInstall_tooFrequent() {
-  let responseXML = '<?xml version="1.0"?>' + "<updates>" + "</updates>";
+  let responseXML = '<?xml version="1.0"?><updates></updates>';
 
   overrideXHR(200, responseXML);
   let installManager = new GMPInstallManager();
   let result = await installManager.simpleCheckAndInstall();
   Assert.equal(result.status, "too-frequent-no-check");
 });
 
 /**
--- a/toolkit/modules/tests/xpcshell/test_Promise.js
+++ b/toolkit/modules/tests/xpcshell/test_Promise.js
@@ -463,17 +463,17 @@ tests.push(
     d3.resolve(d2.promise);
     d2.resolve(d1.promise);
     d1.resolve(RESULT);
 
     return d3.promise.then(function onSuccess(value) {
       Assert.equal(
         value,
         RESULT,
-        "Resolution with a promise eventually yielded " + " the correct result"
+        "Resolution with a promise eventually yielded  the correct result"
       );
     });
   })
 );
 
 // Test sequences of |then| and |catch|
 tests.push(
   make_promise_test(function test_chaining(test) {
@@ -528,17 +528,17 @@ tests.push(
     promise = promise.catch(function onReject(reason) {
       Assert.ok(reason == error_1, "Reason was propagated correctly");
       throw error_2;
     });
 
     promise = promise.catch(function onReject(reason) {
       Assert.ok(
         reason == error_2,
-        "Throwing an error altered the reason " + "as expected"
+        "Throwing an error altered the reason as expected"
       );
       return result_3;
     });
 
     promise = promise.then(function onResolve(result) {
       Assert.equal(result, result_3, "Error was correctly recovered");
     });
 
--- a/toolkit/modules/tests/xpcshell/test_sqlite.js
+++ b/toolkit/modules/tests/xpcshell/test_sqlite.js
@@ -1151,17 +1151,17 @@ add_task(async function test_error_messa
   failTestsOnAutoClose(false);
   let deferred = Promise.defer();
 
   let listener = {
     observe(msg) {
       let messageText = msg.message;
       if (
         messageText.includes(
-          "Error: Attempt to finalize unknown " + "Sqlite connection: foo"
+          "Error: Attempt to finalize unknown Sqlite connection: foo"
         )
       ) {
         deferred.resolve();
       }
     },
   };
   Services.console.registerListener(listener);
   Services.obs.notifyObservers(null, "sqlite-finalization-witness", "foo");
--- a/toolkit/mozapps/extensions/content/aboutaddons.js
+++ b/toolkit/mozapps/extensions/content/aboutaddons.js
@@ -682,17 +682,18 @@ class PanelList extends HTMLElement {
         // triggering target.
         if (
           this.triggeringEvent &&
           e.target == this.triggeringEvent.target &&
           !this.focusHasChanged
         ) {
           this.focusHasChanged = true;
           // If the target isn't in the panel, hide. This will close when focus
-          // moves out of the panel, or there's a click started outside the panel.
+          // moves out of the panel, or there's a click started outside the
+          // panel.
         } else if (!e.target || e.target.closest("panel-list") != this) {
           this.hide();
           // Just record that there was a focusin event.
         } else {
           this.focusHasChanged = true;
         }
         break;
     }
@@ -930,19 +931,19 @@ class ContentSelectDropdown extends HTML
     `)
     );
   }
 }
 customElements.define("content-select-dropdown", ContentSelectDropdown);
 
 class ProxyContextMenu extends HTMLElement {
   openPopupAtScreen(...args) {
-    const parentContextMenuPopup = windowRoot.ownerGlobal.document.getElementById(
-      "contentAreaContextMenu"
-    );
+    // prettier-ignore
+    const parentContextMenuPopup =
+      windowRoot.ownerGlobal.document.getElementById("contentAreaContextMenu");
     return parentContextMenuPopup.openPopupAtScreen(...args);
   }
 }
 customElements.define("proxy-context-menu", ProxyContextMenu);
 
 class InlineOptionsBrowser extends HTMLElement {
   constructor() {
     super();
@@ -1111,18 +1112,20 @@ class InlineOptionsBrowser extends HTMLE
       };
 
       if (optionsBrowserStyle) {
         browserOptions.stylesheets = extensionStylesheets;
       }
 
       mm.sendAsyncMessage("Extension:InitBrowser", browserOptions);
 
+      // prettier-ignore
       browser.loadURI(optionsURL, {
-        triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
+        triggeringPrincipal:
+          Services.scriptSecurityManager.getSystemPrincipal(),
       });
     });
   }
 }
 customElements.define("inline-options-browser", InlineOptionsBrowser);
 
 class UpdateReleaseNotes extends HTMLElement {
   connectedCallback() {
@@ -1592,35 +1595,38 @@ class AddonCard extends HTMLElement {
               this.sendEvent("no-update");
             },
           };
           addon.findUpdates(listener, AddonManager.UPDATE_WHEN_USER_REQUESTED);
           break;
         case "install-update":
           this.updateInstall.install().then(
             () => {
-              // The card will update with the new add-on when it gets installed.
+              // The card will update with the new add-on when it gets
+              // installed.
               this.sendEvent("update-installed");
             },
             () => {
               // Update our state if the install is cancelled.
               this.update();
               this.sendEvent("update-cancelled");
             }
           );
           // Clear the install since it will be removed from the global list of
           // available updates (whether it succeeds or fails).
           this.updateInstall = null;
           break;
         case "contribute":
           this.recordActionEvent("contribute");
+          // prettier-ignore
           windowRoot.ownerGlobal.openUILinkIn(addon.contributionURL, "tab", {
-            triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal(
-              {}
-            ),
+            triggeringPrincipal:
+              Services.scriptSecurityManager.createNullPrincipal(
+                {}
+              ),
           });
           break;
         case "preferences":
           if (getOptionsType(addon) == "tab") {
             this.recordActionEvent("preferences", "external");
             openOptionsInTab(addon.optionsURL);
           } else if (getOptionsType(addon) == "inline") {
             this.recordActionEvent("preferences", "inline");
--- a/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIDatabase.jsm
@@ -2428,17 +2428,17 @@ this.XPIDatabase = {
     aSoftDisabled,
     aBecauseSelecting
   ) {
     if (!aAddon.inDatabase) {
       throw new Error("Can only update addon states for installed addons.");
     }
     if (aUserDisabled !== undefined && aSoftDisabled !== undefined) {
       throw new Error(
-        "Cannot change userDisabled and softDisabled at the " + "same time"
+        "Cannot change userDisabled and softDisabled at the same time"
       );
     }
 
     if (aUserDisabled === undefined) {
       aUserDisabled = aAddon.userDisabled;
     } else if (!aUserDisabled) {
       // If enabling the add-on then remove softDisabled
       aSoftDisabled = false;
--- a/toolkit/mozapps/extensions/test/browser/browser_html_discover_view.js
+++ b/toolkit/mozapps/extensions/test/browser/browser_html_discover_view.js
@@ -223,17 +223,18 @@ async function promiseAddonInstall(amoSe
   info("Waiting for post-install doorhanger");
   await installedPromise;
 
   let addon = await AddonManager.getAddonByID(addonId);
   Assert.deepEqual(
     addon.installTelemetryInfo,
     {
       // This is the expected source because before the HTML-based discopane,
-      // "disco" was already used to mark installs from the AMO-hosted discopane.
+      // "disco" was already used to mark installs from the AMO-hosted
+      // discopane.
       source: "disco",
     },
     "The installed add-on should have the expected telemetry info"
   );
 }
 
 // Install an add-on by clicking on the card.
 // The promise resolves once the card has been updated.
--- a/toolkit/mozapps/update/UpdateService.jsm
+++ b/toolkit/mozapps/update/UpdateService.jsm
@@ -691,17 +691,17 @@ function LOG(string) {
         let logfile = Services.dirsvc.get(KEY_PROFILE_DIR, Ci.nsIFile);
         logfile.append(FILE_UPDATE_MESSAGES);
         gLogfileWritePromise = OS.File.open(logfile.path, {
           write: true,
           append: true,
         }).catch(error => {
           dump("*** AUS:SVC Unable to open messages file: " + error + "\n");
           Services.console.logStringMessage(
-            "AUS:SVC Unable to open messages " + "file: " + error
+            "AUS:SVC Unable to open messages file: " + error
           );
           // Reject on failure so that writes are not attempted without a file
           // handle.
           return Promise.reject(error);
         });
       }
       gLogfileWritePromise = gLogfileWritePromise.then(async logfile => {
         // Catch failures from write promises and always return the logfile.
@@ -710,17 +710,17 @@ function LOG(string) {
         // be properly closed on shutdown.
         try {
           let encoded = new TextEncoder().encode(string + "\n");
           await logfile.write(encoded);
           await logfile.flush();
         } catch (e) {
           dump("*** AUS:SVC Unable to write to messages file: " + e + "\n");
           Services.console.logStringMessage(
-            "AUS:SVC Unable to write to " + "messages file: " + e
+            "AUS:SVC Unable to write to messages file: " + e
           );
         }
         return logfile;
       });
     }
   }
 }
 
@@ -2454,17 +2454,17 @@ UpdateService.prototype = {
         LOG(
           "UpdateService:_postUpdateProcessing - status is pending-elevate " +
             "but there isn't an active update, removing update"
         );
         cleanupActiveUpdate();
       } else {
         let uri = "chrome://mozapps/content/update/updateElevation.xul";
         let features =
-          "chrome,centerscreen,resizable=no,titlebar,toolbar=no," + "dialog=no";
+          "chrome,centerscreen,resizable=no,titlebar,toolbar=no,dialog=no";
         Services.ww.openWindow(null, uri, "Update:Elevation", features, null);
       }
     } else {
       // If there was an I/O error it is assumed that the patch is not invalid
       // and it is set to pending so an attempt to apply it again will happen
       // when the application is restarted.
       if (update.state == STATE_FAILED && update.errorCode) {
         if (handleUpdateFailure(update, update.errorCode)) {
@@ -4016,16 +4016,17 @@ Checker.prototype = {
     // built-in or not.
     try {
       let sslStatus = request.channel
         .QueryInterface(Ci.nsIRequest)
         .securityInfo.QueryInterface(Ci.nsITransportSecurityInfo);
       if (sslStatus && sslStatus.succeededCertChain) {
         let rootCert = null;
         // The root cert is the last cert in the chain.
+        // eslint-disable-next-line no-empty
         for (rootCert of sslStatus.succeededCertChain.getEnumerator()) {
         }
         if (rootCert) {
           Services.prefs.setStringPref(
             "security.pki.mitm_detected",
             !rootCert.isBuiltInRoot
           );
         }
--- a/toolkit/mozapps/update/tests/data/shared.js
+++ b/toolkit/mozapps/update/tests/data/shared.js
@@ -90,16 +90,17 @@ const FILE_UPDATE_SETTINGS_INI_BAK = "up
 const FILE_UPDATE_STATUS = "update.status";
 const FILE_UPDATE_TEST = "update.test";
 const FILE_UPDATE_VERSION = "update.version";
 const FILE_UPDATER_INI = "updater.ini";
 const FILE_UPDATES_XML = "updates.xml";
 const FILE_UPDATES_XML_TMP = "updates.xml.tmp";
 
 const UPDATE_SETTINGS_CONTENTS =
+  // eslint-disable-next-line no-useless-concat
   "[Settings]\n" + "ACCEPTED_MAR_CHANNEL_IDS=xpcshell-test\n";
 const PRECOMPLETE_CONTENTS = 'rmdir "nonexistent_dir/"\n';
 
 const PR_RDWR = 0x04;
 const PR_CREATE_FILE = 0x08;
 const PR_TRUNCATE = 0x20;
 
 var gChannel;
--- a/toolkit/mozapps/update/tests/data/sharedUpdateXML.js
+++ b/toolkit/mozapps/update/tests/data/sharedUpdateXML.js
@@ -105,16 +105,17 @@ const DEFAULT_UPDATE_VERSION = "999999.0
 /**
  * Constructs a string representing a remote update xml file.
  *
  * @param  aUpdates
  *         The string representing the update elements.
  * @return The string representing a remote update xml file.
  */
 function getRemoteUpdatesXMLString(aUpdates) {
+  // eslint-disable-next-line no-useless-concat
   return '<?xml version="1.0"?>' + "<updates>" + aUpdates + "</updates>";
 }
 
 /**
  * Constructs a string representing an update element for a remote update xml
  * file. See getUpdateString for parameter information not provided below.
  *
  * @param  aUpdateProps
--- a/toolkit/mozapps/update/tests/data/xpcshellUtilsAUS.js
+++ b/toolkit/mozapps/update/tests/data/xpcshellUtilsAUS.js
@@ -2304,17 +2304,17 @@ function shouldRunServiceTest() {
         !isBinSigned,
         "the updater.exe binary should not be signed when the test " +
           "registry key doesn't exist (if it is, build system " +
           "configuration bug?)"
       );
     }
 
     logTestInfo(
-      "this test can only run on the buildbot build system at this " + "time"
+      "this test can only run on the buildbot build system at this time"
     );
     return false;
   }
 
   // Check to make sure the service is installed
   let args = ["wait-for-service-stop", "MozillaMaintenance", "10"];
   let exitValue = runTestHelperSync(args);
   Assert.notEqual(
@@ -3274,16 +3274,17 @@ function checkUpdateLogContents(
   );
   // Remove carriage returns.
   updateLogContents = updateLogContents.replace(/\r/g, "");
 
   if (AppConstants.platform == "win") {
     // The FindFile results when enumerating the filesystem on Windows is not
     // determistic so the results matching the following need to be fixed.
     let re = new RegExp(
+      // eslint-disable-next-line no-useless-concat
       "([^\n]* 7/7text1[^\n]*)\n" + "([^\n]* 7/7text0[^\n]*)\n",
       "g"
     );
     updateLogContents = updateLogContents.replace(re, "$2\n$1\n");
   }
 
   if (aReplace) {
     // Remove the lines which contain absolute paths
@@ -4672,19 +4673,17 @@ function resetEnvironment() {
       gEnv.set("DYLD_LIBRARY_PATH", gEnvDyldLibraryPath);
     } else if (gEnvDyldLibraryPath !== null) {
       debugDump("removing DYLD_LIBRARY_PATH environment variable");
       gEnv.set("DYLD_LIBRARY_PATH", "");
     }
   }
 
   if (AppConstants.platform == "win" && gAddedEnvXRENoWindowsCrashDialog) {
-    debugDump(
-      "removing the XRE_NO_WINDOWS_CRASH_DIALOG environment " + "variable"
-    );
+    debugDump("removing the XRE_NO_WINDOWS_CRASH_DIALOG environment variable");
     gEnv.set("XRE_NO_WINDOWS_CRASH_DIALOG", "");
   }
 
   if (gIsServiceTest) {
     debugDump("removing MOZ_NO_SERVICE_FALLBACK environment variable");
     gEnv.set("MOZ_NO_SERVICE_FALLBACK", "");
   }
 }
--- a/toolkit/mozapps/update/tests/unit_aus_update/canCheckForAndCanApplyUpdates.js
+++ b/toolkit/mozapps/update/tests/unit_aus_update/canCheckForAndCanApplyUpdates.js
@@ -28,17 +28,17 @@ function run_test() {
       "should not be able to check for " +
         "updates when there is an update mutex"
     );
 
     // Check if updates cannot be applied when there is a mutex for this
     // installation.
     Assert.ok(
       !gAUS.canApplyUpdates,
-      "should not be able to apply updates " + "when there is an update mutex"
+      "should not be able to apply updates when there is an update mutex"
     );
 
     debugDump("destroying mutex");
     closeHandle(handle);
   }
 
   // Check if available updates can be checked for
   Assert.ok(gAUS.canCheckForUpdates, "should be able to check for updates");
--- a/toolkit/mozapps/update/tests/unit_aus_update/updateAutoPrefMigrate.js
+++ b/toolkit/mozapps/update/tests/unit_aus_update/updateAutoPrefMigrate.js
@@ -45,30 +45,30 @@ async function run_test() {
   // returned, regardless of the pref value.
   debugDump("about to remove config file");
   configFile.remove(false);
   Assert.ok(!configFile.exists(), "Pref file should have been removed");
   let configValue = await UpdateUtils.getAppUpdateAutoEnabled();
   Assert.equal(
     configValue,
     true,
-    "getAppUpdateAutoEnabled should have " + "returned the default value (true)"
+    "getAppUpdateAutoEnabled should have returned the default value (true)"
   );
 
   // Setting a new value should cause the value to get written out again
   await UpdateUtils.setAppUpdateAutoEnabled(false);
   await verifyPref(configFile, false);
 
   // Test migration of a |true| value
   Services.prefs.setBoolPref("app.update.auto.migrated", false);
   Services.prefs.setBoolPref("app.update.auto", true);
   configFile.remove(false);
   Assert.ok(
     !configFile.exists(),
-    "App update config file should have been " + "removed"
+    "App update config file should have been removed"
   );
   await verifyPref(configFile, true);
 
   // Test that setting app.update.auto without migrating also works
   await UpdateUtils.setAppUpdateAutoEnabled(false);
   await verifyPref(configFile, false);
 
   doTestFinish();
--- a/toolkit/xre/test/test_launch_without_hang.js
+++ b/toolkit/xre/test/test_launch_without_hang.js
@@ -112,17 +112,17 @@ function terminateFirefox(completion) {
       Assert.equal(
         process.exitValue,
         0,
         "Terminate firefox process exit value should be 0"
       );
       Assert.equal(
         aTopic,
         "process-finished",
-        "Terminate firefox observer topic should be " + "process-finished"
+        "Terminate firefox observer topic should be process-finished"
       );
 
       if (completion) {
         completion();
       }
     },
     QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver]),
   };
@@ -161,17 +161,17 @@ function launchProcess(file, args, env, 
       Assert.equal(
         state.process.exitValue,
         0,
         "the application process exit value should be 0"
       );
       Assert.equal(
         aTopic,
         "process-finished",
-        "the application process observer topic should be " + "process-finished"
+        "the application process observer topic should be process-finished"
       );
 
       handler(true);
     },
     QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver]),
   };
 
   // The timer callback to kill the process if it takes too long.