Bug 1367704 - Enable the semi ESLint rule across the tree. r=standard8
authorDan Banner <dbugs@thebanners.uk>
Sun, 28 May 2017 19:57:46 +0100
changeset 446892 40106dd2c532d701000e54a855c3a10291828836
parent 446891 237e09de43a1c7967f7a8b5a9343ab37f9ac5a77
child 446893 2e36423069468756547b41e0bf7550c2d7493fdf
push id1648
push usermtabara@mozilla.com
push dateThu, 01 Mar 2018 12:45:47 +0000
treeherdermozilla-release@cbb9688c2eeb [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersstandard8
bugs1367704
milestone59.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 1367704 - Enable the semi ESLint rule across the tree. r=standard8 MozReview-Commit-ID: GrlcOI9K2hJ
accessible/tests/browser/.eslintrc.js
accessible/tests/mochitest/events/docload/test_docload_root.html
accessible/tests/mochitest/events/docload/test_docload_shutdown.html
browser/base/content/tabbrowser.xml
browser/base/content/test/plugins/browser_CTP_overlay_styles.js
browser/base/content/test/plugins/browser_CTP_shouldShowOverlay.js
browser/base/content/test/plugins/browser_private_clicktoplay.js
browser/base/content/test/urlbar/browser_urlbarOneOffs.js
browser/base/content/urlbarBindings.xml
browser/components/migration/.eslintrc.js
browser/components/migration/360seProfileMigrator.js
browser/components/migration/AutoMigrate.jsm
browser/components/migration/ChromeProfileMigrator.js
browser/components/migration/EdgeProfileMigrator.js
browser/components/migration/MSMigrationUtils.jsm
browser/components/migration/MigrationUtils.jsm
browser/components/migration/SafariProfileMigrator.js
browser/components/migration/tests/browser/browser_undo_notification.js
browser/components/migration/tests/unit/test_automigration.js
browser/components/places/content/tree.xml
browser/components/places/tests/browser/browser_library_left_pane_middleclick.js
browser/components/places/tests/browser/browser_library_middleclick.js
browser/components/places/tests/browser/pageopeningwindow.html
browser/components/preferences/in-content/tests/browser_extension_controlled.js
browser/components/search/content/search.xml
browser/components/uitour/test/browser_UITour_sync.js
browser/extensions/formautofill/.eslintrc.js
browser/extensions/pdfjs/content/PdfJs.jsm
browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm
browser/modules/ProcessHangMonitor.jsm
browser/modules/SchedulePressure.jsm
browser/modules/test/browser/browser_ProcessHangNotifications.js
browser/modules/test/browser/browser_SitePermissions_tab_urls.js
browser/modules/test/unit/test_SitePermissions.js
chrome/test/unit/test_bug564667.js
chrome/test/unit/test_data_protocol_registration.js
chrome/test/unit/test_no_remote_registration.js
js/src/builtin/Array.js
js/src/builtin/Intl.js
js/src/builtin/Module.js
js/src/builtin/Sorting.js
js/src/builtin/TypedArray.js
js/src/builtin/Utilities.js
js/src/shell/ModuleLoader.js
security/.eslintrc.js
services/sync/tests/unit/test_clients_engine.js
services/sync/tests/unit/test_telemetry.js
testing/modules/tests/xpcshell/test_assert.js
testing/modules/tests/xpcshell/test_structuredlog.js
testing/mozbase/mozlog/mozlog/formatters/html/main.js
testing/profiles/prefs_general.js
testing/specialpowers/content/SpecialPowersObserverAPI.js
testing/specialpowers/content/specialpowers.js
testing/specialpowers/content/specialpowersAPI.js
testing/talos/talos/pageloader/chrome/MozillaFileLogger.js
testing/talos/talos/pageloader/chrome/pageloader.js
testing/talos/talos/pageloader/chrome/report.js
testing/talos/talos/pageloader/chrome/tscroll.js
testing/talos/talos/scripts/MozillaFileLogger.js
testing/talos/talos/scripts/talos-debug.js
testing/talos/talos/scripts/xpigen.js
testing/talos/talos/startup_test/tresize/addon/content/framescript.js
testing/talos/talos/talos-powers/content/TalosParentProfiler.js
testing/talos/talos/tests/devtools/addon/content/damp.js
testing/talos/talos/tests/perf-reftest-singletons/util.js
testing/talos/talos/tests/perf-reftest/util.js
testing/talos/talos/tests/tart/addon/content/framescript.js
testing/talos/talos/tests/tart/addon/content/tart.js
testing/xpcshell/example/unit/test_sample.js
testing/xpcshell/head.js
toolkit/components/extensions/.eslintrc.js
toolkit/components/narrate/.eslintrc.js
toolkit/components/passwordmgr/.eslintrc.js
toolkit/components/places/tests/bookmarks/test_818587_compress-bookmarks-backups.js
toolkit/components/reader/.eslintrc.js
toolkit/content/tests/widgets/test_bug1319301.html
toolkit/content/tests/widgets/test_videocontrols.html
toolkit/content/tests/widgets/test_videocontrols_video_noaudio.html
toolkit/content/widgets/autocomplete.xml
toolkit/content/widgets/button.xml
toolkit/content/widgets/colorpicker.xml
toolkit/content/widgets/datetimebox.xml
toolkit/content/widgets/datetimepopup.xml
toolkit/content/widgets/findbar.xml
toolkit/content/widgets/numberbox.xml
toolkit/content/widgets/popup.xml
toolkit/content/widgets/preferences.xml
toolkit/content/widgets/richlistbox.xml
toolkit/content/widgets/text.xml
toolkit/content/widgets/tree.xml
toolkit/content/widgets/videocontrols.xml
toolkit/crashreporter/test/unit/head_win64cfi.js
toolkit/modules/tests/browser/browser_FinderHighlighter2.js
toolkit/modules/tests/browser/browser_Finder_offscreen_text.js
toolkit/modules/tests/browser/browser_Finder_pointer_events_none.js
toolkit/mozapps/extensions/content/extensions.xml
toolkit/mozapps/extensions/test/xpcshell/test_bug659772.js
tools/lint/eslint/.eslintrc.js
tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
tools/lint/eslint/eslint-plugin-mozilla/package-lock.json
tools/lint/eslint/eslint-plugin-mozilla/package.json
xpcom/tests/unit/test_streams.js
xpcom/tests/unit/test_systemInfo.js
xpcom/tests/unit/test_windows_shortcut.js
--- a/accessible/tests/browser/.eslintrc.js
+++ b/accessible/tests/browser/.eslintrc.js
@@ -71,17 +71,16 @@ module.exports = {
     "no-use-before-define": "off",
     "no-var": "off",
     "no-warning-comments": "off",
     "object-shorthand": "off",
     "one-var": ["error", "never"],
     "padded-blocks": ["error", "never"],
     "quote-props": "off",
     "radix": "error",
-    "semi": ["error", "always"],
     "semi-spacing": ["error", {"before": false, "after": true}],
     "sort-vars": "off",
     "space-in-brackets": "off",
     "space-in-parens": ["error", "never"],
     "space-unary-word-ops": "off",
     "strict": ["error", "global"],
     "valid-jsdoc": "off",
     "vars-on-top": "off",
--- a/accessible/tests/mochitest/events/docload/test_docload_root.html
+++ b/accessible/tests/mochitest/events/docload/test_docload_root.html
@@ -74,31 +74,31 @@
               role: ROLE_CHROME_WINDOW
             },
             {
               role: ROLE_CHROME_WINDOW
             }
           ]
         };
 
-        testAccessibleTree(gRootAcc, accTree)
+        testAccessibleTree(gRootAcc, accTree);
 
         gDialogDoc = gDialog.document;
         ok(isAccessibleInCache(gDialogDoc),
           `The document accessible for '${aURL}' is not in cache!`);
       };
 
       this.getID = () => `open dialog '${aURL}'`;
     }
 
     function closeDialogWnd() {
       this.eventSeq = [ new invokerChecker(EVENT_FOCUS, getAccessible(document)) ];
 
       this.invoke = () => {
-        gDialog.close()
+        gDialog.close();
         window.focus();
       };
 
       this.finalCheck = () => {
         ok(!isAccessibleInCache(gDialogDoc),
           `The document accessible for dialog is in cache still!`);
 
         gDialog = gDialogDoc = gRootAcc = null;
--- a/accessible/tests/mochitest/events/docload/test_docload_shutdown.html
+++ b/accessible/tests/mochitest/events/docload/test_docload_shutdown.html
@@ -37,17 +37,17 @@
 
   <script type="application/javascript">
     // //////////////////////////////////////////////////////////////////////////
     // Invokers
 
     let gDialog;
     let gDialogDoc;
     let gRootAcc;
-    let gIframeDoc
+    let gIframeDoc;
 
     function openWndShutdownDoc(aURL) {
       // Get application root accessible.
       let docAcc = getAccessible(document);
       while (docAcc) {
         gRootAcc = docAcc;
         try {
           docAcc = docAcc.parent;
@@ -90,33 +90,33 @@
               role: ROLE_CHROME_WINDOW
             },
             {
               role: ROLE_CHROME_WINDOW
             }
           ]
         };
 
-        testAccessibleTree(gRootAcc, accTree)
+        testAccessibleTree(gRootAcc, accTree);
         // After timeout after event hide for iframe was handled the document
         // accessible for iframe's document should no longer be in cache.
         ok(!isAccessibleInCache(gIframeDoc),
           "The document accessible for iframe is in cache still after iframe hide!");
         ok(isAccessibleInCache(gDialogDoc),
           `The document accessible for '${aURL}' is not in cache!`);
       };
 
       this.getID = () => `open dialog '${aURL}'`;
     }
 
     function closeWndShutdownDoc() {
       this.eventSeq = [ new invokerChecker(EVENT_FOCUS, getAccessible(document)) ];
 
       this.invoke = () => {
-        gDialog.close()
+        gDialog.close();
         window.focus();
       };
 
       this.finalCheck = () => {
         ok(!isAccessibleInCache(gDialogDoc),
           "The document accessible for dialog is in cache still!");
         // After the window is closed all alive subdocument accessibles should
         // be shut down.
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -257,17 +257,17 @@
             this.showTab(aTab);
 
           this.moveTabTo(aTab, this._numPinnedTabs);
           aTab.setAttribute("pinned", "true");
           this.tabContainer._unlockTabSizing();
           this.tabContainer._positionPinnedTabs();
           this.tabContainer._updateCloseButtons();
 
-          this.getBrowserForTab(aTab).messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: true })
+          this.getBrowserForTab(aTab).messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: true });
 
           if (aTab.selected)
             this._setCloseKeyState(false);
 
           let event = document.createEvent("Events");
           event.initEvent("TabPinned", true, false);
           aTab.dispatchEvent(event);
         ]]></body>
@@ -281,17 +281,17 @@
 
           this.moveTabTo(aTab, this._numPinnedTabs - 1);
           aTab.removeAttribute("pinned");
           aTab.style.marginInlineStart = "";
           this.tabContainer._unlockTabSizing();
           this.tabContainer._positionPinnedTabs();
           this.tabContainer._updateCloseButtons();
 
-          this.getBrowserForTab(aTab).messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: false })
+          this.getBrowserForTab(aTab).messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: false });
 
           if (aTab.selected)
             this._setCloseKeyState(true);
 
           let event = document.createEvent("Events");
           event.initEvent("TabUnpinned", true, false);
           aTab.dispatchEvent(event);
         ]]></body>
@@ -689,17 +689,17 @@
             onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
               if (!aRequest)
                 return;
 
               const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
               const nsIChannel = Components.interfaces.nsIChannel;
               let location, originalLocation;
               try {
-                aRequest.QueryInterface(nsIChannel)
+                aRequest.QueryInterface(nsIChannel);
                 location = aRequest.URI;
                 originalLocation = aRequest.originalURI;
               } catch (ex) {}
 
               let ignoreBlank = this._isForInitialAboutBlank(aWebProgress, aStateFlags,
                                                              location);
 
               // If we were ignoring some messages about the initial about:blank, and we
@@ -1083,17 +1083,17 @@
 
       <method name="setPageInfo">
         <parameter name="aURL"/>
         <parameter name="aDescription"/>
         <parameter name="aPreviewImage"/>
         <body>
           <![CDATA[
             if (aURL) {
-              let pageInfo = {url: aURL, description: aDescription, previewImageURL: aPreviewImage}
+              let pageInfo = {url: aURL, description: aDescription, previewImageURL: aPreviewImage};
               PlacesUtils.history.update(pageInfo).catch(Components.utils.reportError);
             }
           ]]>
         </body>
       </method>
 
       <method name="shouldLoadFavIcon">
         <parameter name="aURI"/>
@@ -1243,17 +1243,17 @@
                 this._tabSwitchID = tabSwitchID;
 
                 let onMozAfterPaint = () => {
                   if (this._tabSwitchID === tabSwitchID) {
                     TelemetryStopwatch.finish("FX_TAB_SWITCH_TOTAL_MS");
                     this._tabSwitchID = null;
                   }
                   window.removeEventListener("MozAfterPaint", onMozAfterPaint);
-                }
+                };
                 window.addEventListener("MozAfterPaint", onMozAfterPaint);
               }
             }
 
             var oldTab = this.mCurrentTab;
 
             // Preview mode should not reset the owner
             if (!this._previewMode && !oldTab.selected)
@@ -1770,17 +1770,17 @@
             var aCreateLazyBrowser;
             var aNextTabParentId;
             var aFocusUrlBar;
             var aName;
             if (arguments.length == 2 &&
                 typeof arguments[1] == "object" &&
                 !(arguments[1] instanceof Ci.nsIURI)) {
               let params = arguments[1];
-              aTriggeringPrincipal      = params.triggeringPrincipal
+              aTriggeringPrincipal      = params.triggeringPrincipal;
               aReferrerURI              = params.referrerURI;
               aReferrerPolicy           = params.referrerPolicy;
               aCharset                  = params.charset;
               aPostData                 = params.postData;
               aLoadInBackground         = params.inBackground;
               aAllowThirdPartyFixup     = params.allowThirdPartyFixup;
               aFromExternal             = params.fromExternal;
               aRelatedToCurrent         = params.relatedToCurrent;
@@ -2074,17 +2074,17 @@
                                         true, false);
 
             if (aShouldBeRemote) {
               // Switching the browser to be remote will connect to a new child
               // process so the browser can no longer be considered to be
               // crashed.
               tab.removeAttribute("crashed");
             } else {
-              aBrowser.messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: tab.pinned })
+              aBrowser.messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: tab.pinned });
 
               // Register the new outerWindowID.
               this._outerWindowIDBrowserMap.set(aBrowser.outerWindowID, aBrowser);
             }
 
             if (wasActive)
               aBrowser.focus();
 
@@ -2434,26 +2434,26 @@
                 case "userTypedClear":
                 case "mediaBlocked":
                   getter = () => SessionStore.getLazyTabValue(aTab, name);
                   break;
                 default:
                   getter = () => {
                     if (AppConstants.NIGHTLY_BUILD) {
                       let message =
-                        `[bug 1345098] Lazy browser prematurely inserted via '${name}' property access:\n`
+                        `[bug 1345098] Lazy browser prematurely inserted via '${name}' property access:\n`;
                       console.log(message + new Error().stack);
                     }
                     this._insertBrowser(aTab);
                     return browser[name];
                   };
                   setter = value => {
                     if (AppConstants.NIGHTLY_BUILD) {
                       let message =
-                        `[bug 1345098] Lazy browser prematurely inserted via '${name}' property access:\n`
+                        `[bug 1345098] Lazy browser prematurely inserted via '${name}' property access:\n`;
                       console.log(message + new Error().stack);
                     }
                     this._insertBrowser(aTab);
                     return browser[name] = value;
                   };
               }
               Object.defineProperty(browser, name, {
                 get: getter,
@@ -3056,17 +3056,17 @@
             let tabs = this.visibleTabs.reverse();
             this.selectedTab = aTab;
 
             let tabsWithBeforeUnload = [];
             for (let i = tabs.length - 1; i >= 0; --i) {
               let tab = tabs[i];
               if (tab != aTab && !tab.pinned) {
                 if (this._hasBeforeUnload(tab))
-                  tabsWithBeforeUnload.push(tab)
+                  tabsWithBeforeUnload.push(tab);
                 else
                   this.removeTab(tab, {animate: true});
               }
             }
             for (let tab of tabsWithBeforeUnload) {
               this.removeTab(tab, {animate: true});
             }
           ]]>
@@ -5665,17 +5665,17 @@
               break;
             }
             case "Browser:Init": {
               let tab = this.getTabForBrowser(browser);
               if (!tab)
                 return undefined;
 
               this._outerWindowIDBrowserMap.set(browser.outerWindowID, browser);
-              browser.messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: tab.pinned })
+              browser.messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: tab.pinned });
               break;
             }
             case "Browser:WindowCreated": {
               let tab = this.getTabForBrowser(browser);
               if (tab && data.userContextId) {
                 ContextualIdentityService.telemetry(data.userContextId);
                 tab.setUserContextId(data.userContextId);
               }
@@ -6220,17 +6220,17 @@
           }
 
           tab.removeAttribute("soundplaying");
           this.setIcon(tab, icon, browser.contentPrincipal, browser.contentRequestContextID);
         ]]>
       </handler>
       <handler event="DOMAudioPlaybackStarted">
         <![CDATA[
-          var tab = this.getTabFromAudioEvent(event)
+          var tab = this.getTabFromAudioEvent(event);
           if (!tab) {
             return;
           }
 
           clearTimeout(tab._soundPlayingAttrRemovalTimer);
           tab._soundPlayingAttrRemovalTimer = 0;
 
           let modifiedAttrs = [];
@@ -6250,17 +6250,17 @@
             getComputedStyle(tab).opacity;
           }
 
           this._tabAttrModified(tab, modifiedAttrs);
         ]]>
       </handler>
       <handler event="DOMAudioPlaybackStopped">
         <![CDATA[
-          var tab = this.getTabFromAudioEvent(event)
+          var tab = this.getTabFromAudioEvent(event);
           if (!tab) {
             return;
           }
 
           if (tab.hasAttribute("soundplaying")) {
             let removalDelay = Services.prefs.getIntPref("browser.tabs.delayHidingAudioPlayingIconMS");
 
             tab.style.setProperty("--soundplaying-removal-delay", `${removalDelay - 300}ms`);
@@ -6272,31 +6272,31 @@
               tab.removeAttribute("soundplaying");
               this._tabAttrModified(tab, ["soundplaying", "soundplaying-scheduledremoval"]);
             }, removalDelay);
           }
         ]]>
       </handler>
       <handler event="DOMAudioPlaybackBlockStarted">
         <![CDATA[
-          var tab = this.getTabFromAudioEvent(event)
+          var tab = this.getTabFromAudioEvent(event);
           if (!tab) {
             return;
           }
 
           if (!tab.hasAttribute("activemedia-blocked")) {
             tab.setAttribute("activemedia-blocked", true);
             this._tabAttrModified(tab, ["activemedia-blocked"]);
             tab.startMediaBlockTimer();
           }
         ]]>
       </handler>
       <handler event="DOMAudioPlaybackBlockStopped">
         <![CDATA[
-          var tab = this.getTabFromAudioEvent(event)
+          var tab = this.getTabFromAudioEvent(event);
           if (!tab) {
             return;
           }
 
           if (tab.hasAttribute("activemedia-blocked")) {
             tab.removeAttribute("activemedia-blocked");
             this._tabAttrModified(tab, ["activemedia-blocked"]);
             let hist = Services.telemetry.getHistogramById("TAB_AUDIO_INDICATOR_USED");
@@ -6523,17 +6523,17 @@
 
               // If longPressBehavior pref is set to 0 (or any invalid value)
               // long press menu is disabled.
               if (containersEnabled && (longPressBehavior <= 0 || longPressBehavior > 2)) {
                 containersEnabled = false;
               }
 
               const newTab = document.getElementById("new-tab-button");
-              const newTab2 = document.getAnonymousElementByAttribute(this, "anonid", "tabs-newtab-button")
+              const newTab2 = document.getAnonymousElementByAttribute(this, "anonid", "tabs-newtab-button");
 
               for (let parent of [newTab, newTab2]) {
                 if (!parent)
                   continue;
 
                 gClickAndHoldListenersOnElement.remove(parent);
                 parent.removeAttribute("type");
                 if (parent.firstChild) {
@@ -7415,17 +7415,17 @@
 
           let captureListener;
           let platform = AppConstants.platform;
           // On Windows and Mac we can update the drag image during a drag
           // using updateDragImage. On Linux, we can use a panel.
           if (platform == "win" || platform == "macosx") {
             captureListener = function() {
               dt.updateDragImage(canvas, dragImageOffset, dragImageOffset);
-            }
+            };
           } else {
             // Create a panel to use it in setDragImage
             // which will tell xul to render a panel that follows
             // the pointer while a dnd session is on.
             if (!this._dndPanel) {
               this._dndCanvas = canvas;
               this._dndPanel = document.createElement("panel");
               this._dndPanel.className = "dragfeedback-tab";
@@ -7610,17 +7610,17 @@
 
               draggedTab.removeAttribute("tabdrop-samewindow");
 
               this._finishAnimateTabMove();
               if (dropIndex !== false)
                 this.tabbrowser.moveTabTo(draggedTab, dropIndex);
 
               this.tabbrowser.syncThrobberAnimations(draggedTab);
-            }
+            };
             draggedTab.addEventListener("transitionend", onTransitionEnd);
           } else {
             this._finishAnimateTabMove();
             if (dropIndex !== false)
               this.tabbrowser.moveTabTo(draggedTab, dropIndex);
           }
         } else if (draggedTab) {
           let newIndex = this._getDropIndex(event, false);
--- a/browser/base/content/test/plugins/browser_CTP_overlay_styles.js
+++ b/browser/base/content/test/plugins/browser_CTP_overlay_styles.js
@@ -39,17 +39,17 @@ const gTestcases = {
     notext: "notext",
   },
 
   // 300x300
   testcase5: {
     sizing: null,
     notext: null,
   },
-}
+};
 
 
 add_task(async function() {
   registerCleanupFunction(function() {
     clearAllPluginPermissions();
     setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED, "Test Plug-in");
     gBrowser.removeCurrentTab();
     gTestBrowser = null;
--- a/browser/base/content/test/plugins/browser_CTP_shouldShowOverlay.js
+++ b/browser/base/content/test/plugins/browser_CTP_shouldShowOverlay.js
@@ -53,10 +53,10 @@ add_task(async function() {
 
       let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
       Assert.ok(overlay, `overlay exists in ${testcase.id}`);
 
       let expectedVisibility = (testcase.getAttribute("shouldshow") == "true");
       Assert.ok((overlay.getAttribute("sizing") != "blank") == expectedVisibility,
                 `The expected visibility is correct in ${testcase.id}`);
     }
-  })
+  });
 });
--- a/browser/base/content/test/plugins/browser_private_clicktoplay.js
+++ b/browser/base/content/test/plugins/browser_private_clicktoplay.js
@@ -62,17 +62,17 @@ add_task(async function test1b() {
   });
 
   // Check the button status
   let promiseShown = BrowserTestUtils.waitForEvent(gPrivateWindow.PopupNotifications.panel,
                                                    "Shown");
   popupNotification.reshow();
 
   await promiseShown;
-  is(gPrivateWindow.PopupNotifications.panel.firstChild.checkbox.hidden, true, "'Remember' checkbox should be hidden in private windows")
+  is(gPrivateWindow.PopupNotifications.panel.firstChild.checkbox.hidden, true, "'Remember' checkbox should be hidden in private windows");
 
   gPrivateWindow.close();
   BrowserTestUtils.loadURI(gTestBrowser, gHttpTestRoot + "plugin_test.html");
   await BrowserTestUtils.browserLoaded(gTestBrowser);
 });
 
 add_task(async function test2a() {
   // enable test plugin on this site
--- a/browser/base/content/test/urlbar/browser_urlbarOneOffs.js
+++ b/browser/base/content/test/urlbar/browser_urlbarOneOffs.js
@@ -31,17 +31,17 @@ add_task(async function init() {
 });
 
 // Keys up and down through the history panel, i.e., the panel that's shown when
 // there's no text in the textbox.
 add_task(async function history() {
   gURLBar.focus();
   EventUtils.synthesizeKey("VK_DOWN", {});
   await promisePopupShown(gURLBar.popup);
-  await waitForAutocompleteResultAt(gMaxResults - 1)
+  await waitForAutocompleteResultAt(gMaxResults - 1);
 
   assertState(-1, -1, "");
 
   // Key down through each result.
   for (let i = 0; i < gMaxResults; i++) {
     EventUtils.synthesizeKey("VK_DOWN", {});
     assertState(i, -1,
       "example.com/browser_urlbarOneOffs.js/?" + (gMaxResults - i - 1));
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -1873,17 +1873,17 @@ file, You can obtain one at http://mozil
           let width = documentRect.right - documentRect.left;
           this.setAttribute("width", width);
 
           // Now make its starting margin negative so that its leading edge
           // aligns with the window border.
           let elementRect =
             this.DOMWindowUtils.getBoundsWithoutFlushing(aElement);
           if (popupDirection == "rtl") {
-            let offset = elementRect.right - documentRect.right
+            let offset = elementRect.right - documentRect.right;
             this.style.marginRight = offset + "px";
           } else {
             let offset = documentRect.left - elementRect.left;
             this.style.marginLeft = offset + "px";
           }
 
           // Keep the popup items' site icons aligned with the urlbar's identity
           // icon if it's not too far from the edge of the window.  We define
--- a/browser/components/migration/.eslintrc.js
+++ b/browser/components/migration/.eslintrc.js
@@ -12,15 +12,14 @@ module.exports = {
     "no-fallthrough": ["error", { "commentPattern": ".*[Ii]ntentional(?:ly)?\\s+fall(?:ing)?[\\s-]*through.*" }],
     "no-multi-str": "error",
     "no-return-assign": "error",
     "no-sequences": "error",
     "no-shadow": "error",
     "no-throw-literal": "error",
     "no-unused-vars": ["error", { "varsIgnorePattern": "^C[ciur]$" }],
     "padded-blocks": ["error", "never"],
-    "semi": ["error", "always", {"omitLastInOneLineBlock": true }],
     "semi-spacing": ["error", {"before": false, "after": true}],
     "space-in-parens": ["error", "never"],
     "strict": ["error", "global"],
     "yoda": "error"
   }
 };
--- a/browser/components/migration/360seProfileMigrator.js
+++ b/browser/components/migration/360seProfileMigrator.js
@@ -176,17 +176,17 @@ Bookmarks.prototype = {
         let parentGuid = PlacesUtils.bookmarks.toolbarGuid;
         if (!MigrationUtils.isStartupMigration) {
           parentGuid =
             await MigrationUtils.createImportedBookmarksFolder("360se", parentGuid);
         }
         await MigrationUtils.insertManyBookmarksWrapper(toolbarBMs, parentGuid);
       }
     })().then(() => aCallback(true),
-                        e => { Cu.reportError(e); aCallback(false) });
+                        e => { Cu.reportError(e); aCallback(false); });
   }
 };
 
 function Qihoo360seProfileMigrator() {
   let paths = [
     // for v6 and above
     {
       users: ["360se6", "apps", "data", "users"],
--- a/browser/components/migration/AutoMigrate.jsm
+++ b/browser/components/migration/AutoMigrate.jsm
@@ -499,17 +499,17 @@ const AutoMigrate = {
   _saveUndoStateTrackerForShutdown: "not running",
   /**
    * Store the information required for using 'undo' of the automatic
    * migration in the user's profile.
    */
   async saveUndoState() {
     let resolveSavingPromise;
     this._saveUndoStateTrackerForShutdown = "processing undo history";
-    this._savingPromise = new Promise(resolve => { resolveSavingPromise = resolve });
+    this._savingPromise = new Promise(resolve => { resolveSavingPromise = resolve; });
     let state = await MigrationUtils.stopAndRetrieveUndoData();
 
     if (!state || ![...state.values()].some(ary => ary.length > 0)) {
       // If we didn't import anything, abort now.
       resolveSavingPromise();
       return Promise.resolve();
     }
 
--- a/browser/components/migration/ChromeProfileMigrator.js
+++ b/browser/components/migration/ChromeProfileMigrator.js
@@ -250,17 +250,17 @@ function GetBookmarksResource(aProfileFo
     return null;
 
   return {
     type: MigrationUtils.resourceTypes.BOOKMARKS,
 
     migrate(aCallback) {
       return (async function() {
         let gotErrors = false;
-        let errorGatherer = function() { gotErrors = true };
+        let errorGatherer = function() { gotErrors = true; };
         // Parse Chrome bookmark file that is JSON format
         let bookmarkJSON = await OS.File.read(bookmarksFile.path, {encoding: "UTF-8"});
         let roots = JSON.parse(bookmarkJSON).roots;
 
         // Importing bookmark bar items
         if (roots.bookmark_bar.children &&
             roots.bookmark_bar.children.length > 0) {
           // Toolbar
@@ -352,17 +352,17 @@ function GetHistoryResource(aProfileFold
                   resolve();
                 } else {
                   reject(new Error("Couldn't add visits"));
                 }
               }
             });
           });
         }
-      })().then(() => { aCallback(true) },
+      })().then(() => { aCallback(true); },
               ex => {
                 Cu.reportError(ex);
                 aCallback(false);
               });
     }
   };
 }
 
--- a/browser/components/migration/EdgeProfileMigrator.js
+++ b/browser/components/migration/EdgeProfileMigrator.js
@@ -152,17 +152,17 @@ EdgeTypedURLMigrator.prototype = {
 
 function EdgeReadingListMigrator(dbOverride) {
   this.dbOverride = dbOverride;
 }
 
 EdgeReadingListMigrator.prototype = {
   type: MigrationUtils.resourceTypes.BOOKMARKS,
 
-  get db() { return this.dbOverride || gEdgeDatabase },
+  get db() { return this.dbOverride || gEdgeDatabase; },
 
   get exists() {
     return !!this.db;
   },
 
   migrate(callback) {
     this._migrateReadingList(PlacesUtils.bookmarks.menuGuid).then(
       () => callback(true),
@@ -228,19 +228,19 @@ EdgeReadingListMigrator.prototype = {
 
 function EdgeBookmarksMigrator(dbOverride) {
   this.dbOverride = dbOverride;
 }
 
 EdgeBookmarksMigrator.prototype = {
   type: MigrationUtils.resourceTypes.BOOKMARKS,
 
-  get db() { return this.dbOverride || gEdgeDatabase },
+  get db() { return this.dbOverride || gEdgeDatabase; },
 
-  get TABLE_NAME() { return "Favorites" },
+  get TABLE_NAME() { return "Favorites"; },
 
   get exists() {
     if (!("_exists" in this)) {
       this._exists = !!this.db;
     }
     return this._exists;
   },
 
--- a/browser/components/migration/MSMigrationUtils.jsm
+++ b/browser/components/migration/MSMigrationUtils.jsm
@@ -367,17 +367,17 @@ Bookmarks.prototype = {
       // Import to the bookmarks menu.
       let folderGuid = PlacesUtils.bookmarks.menuGuid;
       if (!MigrationUtils.isStartupMigration) {
         folderGuid =
           await MigrationUtils.createImportedBookmarksFolder(this.importedAppLabel, folderGuid);
       }
       await this._migrateFolder(this._favoritesFolder, folderGuid);
     })().then(() => aCallback(true),
-                       e => { Cu.reportError(e); aCallback(false) });
+                       e => { Cu.reportError(e); aCallback(false); });
   },
 
   async _migrateFolder(aSourceFolder, aDestFolderGuid) {
     let bookmarks = await this._getBookmarksInFolder(aSourceFolder);
     if (bookmarks.length) {
       await MigrationUtils.insertManyBookmarksWrapper(bookmarks, aDestFolderGuid);
     }
   },
--- a/browser/components/migration/MigrationUtils.jsm
+++ b/browser/components/migration/MigrationUtils.jsm
@@ -207,17 +207,17 @@ this.MigratorPrototype = {
    * @see nsIBrowserProfileMigrator
    */
   getMigrateData: function MP_getMigrateData(aProfile) {
     let resources = this._getMaybeCachedResources(aProfile);
     if (!resources) {
       return [];
     }
     let types = resources.map(r => r.type);
-    return types.reduce((a, b) => { a |= b; return a }, 0);
+    return types.reduce((a, b) => { a |= b; return a; }, 0);
   },
 
   getBrowserKey: function MP_getBrowserKey() {
     return this.contractID.match(/\=([^\=]+)$/)[1];
   },
 
   /**
    * DO NOT OVERRIDE - After deCOMing migration, the UI will just call
@@ -694,23 +694,23 @@ this.MigrationUtils = Object.freeze({
   getMigrator: function MU_getMigrator(aKey) {
     let migrator = null;
     if (this._migrators.has(aKey)) {
       migrator = this._migrators.get(aKey);
     } else {
       try {
         migrator = Cc["@mozilla.org/profile/migrator;1?app=browser&type=" +
                       aKey].createInstance(Ci.nsIBrowserProfileMigrator);
-      } catch (ex) { Cu.reportError(ex) }
+      } catch (ex) { Cu.reportError(ex); }
       this._migrators.set(aKey, migrator);
     }
 
     try {
       return migrator && migrator.sourceExists ? migrator : null;
-    } catch (ex) { Cu.reportError(ex); return null }
+    } catch (ex) { Cu.reportError(ex); return null; }
   },
 
   /**
    * Figure out what is the default browser, and if there is a migrator
    * for it, return that migrator's internal name.
    * For the time being, the "internal name" of a migrator is its contract-id
    * trailer (e.g. ie for @mozilla.org/profile/migrator;1?app=browser&type=ie),
    * but it will soon be exposed properly.
--- a/browser/components/migration/SafariProfileMigrator.js
+++ b/browser/components/migration/SafariProfileMigrator.js
@@ -44,17 +44,17 @@ Bookmarks.prototype = {
       let children = dict.get("Children");
       if (!children)
         throw new Error("Invalid Bookmarks.plist format");
 
       let collection = dict.get("Title") == "com.apple.ReadingList" ?
         this.READING_LIST_COLLECTION : this.ROOT_COLLECTION;
       await this._migrateCollection(children, collection);
     })().then(() => aCallback(true),
-                        e => { Cu.reportError(e); aCallback(false) });
+                        e => { Cu.reportError(e); aCallback(false); });
   },
 
   // Bookmarks collections in Safari.  Constants for migrateCollection.
   ROOT_COLLECTION:         0,
   MENU_COLLECTION:         1,
   TOOLBAR_COLLECTION:      2,
   READING_LIST_COLLECTION: 3,
 
--- a/browser/components/migration/tests/browser/browser_undo_notification.js
+++ b/browser/components/migration/tests/browser/browser_undo_notification.js
@@ -12,17 +12,17 @@ registerCleanupFunction(function() {
 const kExpectedNotificationId = "automigration-undo";
 
 add_task(async function autoMigrationUndoNotificationShows() {
   let getNotification = browser =>
     gBrowser.getNotificationBox(browser).getNotificationWithValue(kExpectedNotificationId);
 
   scope.AutoMigrate.canUndo = () => true;
   let undoCalled;
-  scope.AutoMigrate.undo = () => { undoCalled = true };
+  scope.AutoMigrate.undo = () => { undoCalled = true; };
 
   for (let url of ["about:newtab", "about:home"]) {
     undoCalled = false;
     // Can't use pushPrefEnv because of bug 1323779
     Services.prefs.setCharPref("browser.migrate.automigrate.browser", "someunknownbrowser");
     let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url, false);
     let browser = tab.linkedBrowser;
     if (!getNotification(browser)) {
--- a/browser/components/migration/tests/unit/test_automigration.js
+++ b/browser/components/migration/tests/unit/test_automigration.js
@@ -14,17 +14,17 @@ const kUsecPerMin = 60 * 1000000;
 let AutoMigrateBackstage = Cu.import("resource:///modules/AutoMigrate.jsm", {});
 
 AutoMigrateBackstage.MigrationUtils = new Proxy({}, {
   get(target, name) {
     if (name == "getMigratorKeyForDefaultBrowser" && gShimmedMigratorKeyPicker) {
       return gShimmedMigratorKeyPicker;
     }
     if (name == "getMigrator" && gShimmedMigrator) {
-      return function() { return gShimmedMigrator };
+      return function() { return gShimmedMigrator; };
     }
     return MigrationUtils[name];
   },
 });
 
 do_register_cleanup(function() {
   AutoMigrateBackstage.MigrationUtils = MigrationUtils;
 });
--- a/browser/components/places/content/tree.xml
+++ b/browser/components/places/content/tree.xml
@@ -635,17 +635,17 @@
             node.containerOpen = previousOpenness;
             return foundOne;
           }
 
           // Disable notifications while looking for nodes.
           let result = this.result;
           let didSuppressNotifications = result.suppressNotifications;
           if (!didSuppressNotifications)
-            result.suppressNotifications = true
+            result.suppressNotifications = true;
           try {
             findNodes(this.result.root);
           } finally {
             if (!didSuppressNotifications)
               result.suppressNotifications = false;
           }
 
           // For all the nodes we've found, highlight the corresponding
--- a/browser/components/places/tests/browser/browser_library_left_pane_middleclick.js
+++ b/browser/components/places/tests/browser/browser_library_left_pane_middleclick.js
@@ -32,17 +32,17 @@ add_task(async function test_setup() {
   });
 });
 
 add_task(async function test_open_folder_in_tabs() {
   let children = URIs.map(url => {
     return {
       title: "Title",
       url
-    }
+    };
   });
 
   // Create a new folder.
   await PlacesUtils.bookmarks.insertTree({
     guid: PlacesUtils.bookmarks.unfiledGuid,
     children: [{
       title: "Folder",
       type: PlacesUtils.bookmarks.TYPE_FOLDER,
--- a/browser/components/places/tests/browser/browser_library_middleclick.js
+++ b/browser/components/places/tests/browser/browser_library_middleclick.js
@@ -76,17 +76,17 @@ gTests.push({
   _bookmarks: null,
 
   async setup() {
     // Create a new folder.
     let children = this.URIs.map(url => {
       return {
         title: "Title",
         url,
-      }
+      };
     });
 
     this._bookmarks = await PlacesUtils.bookmarks.insertTree({
       guid: PlacesUtils.bookmarks.unfiledGuid,
       children: [{
         title: "Folder",
         type: PlacesUtils.bookmarks.TYPE_FOLDER,
         children,
@@ -116,17 +116,17 @@ gTests.push({
   _bookmarks: null,
   _query: null,
 
   async setup() {
     let children = this.URIs.map(url => {
       return {
         title: "Title",
         url,
-      }
+      };
     });
 
     this._bookmarks = await PlacesUtils.bookmarks.insertTree({
       guid: PlacesUtils.bookmarks.unfiledGuid,
       children: [{
         title: "Folder",
         type: PlacesUtils.bookmarks.TYPE_FOLDER,
         children,
--- a/browser/components/places/tests/browser/pageopeningwindow.html
+++ b/browser/components/places/tests/browser/pageopeningwindow.html
@@ -1,11 +1,11 @@
 <meta charset="UTF-8">
 Hi, I was opened via a <script>
 // eslint-disable-next-line no-unsanitized/method
 document.write(location.search ?
   "popup call from the opened window... uh oh, that shouldn't happen!" :
-  "bookmarklet, and I will open a new window myself.")</script><br>
+  "bookmarklet, and I will open a new window myself.");</script><br>
 <script>
   if (!location.search) {
     open(location.href + "?donotopen=true", "_blank");
   }
 </script>
--- a/browser/components/preferences/in-content/tests/browser_extension_controlled.js
+++ b/browser/components/preferences/in-content/tests/browser_extension_controlled.js
@@ -427,17 +427,17 @@ add_task(async function testExtensionCon
   // Verify that the setting is reported as set, but the homepage is still enabled
   // since there is no matching installed extension.
   is(ExtensionSettingsStore.getSetting("prefs", "homepage_override").value,
       "https://developer.mozilla.org",
       "The homepage_override appears to be set");
   await checkHomepageEnabled();
 
   // Remove the bad store file that we used.
-  await OS.File.remove(storePath)
+  await OS.File.remove(storePath);
 
   // Reload the ExtensionSettingsStore again so it clears the data we added.
   // Don't finalize the current store since it will write out the bad data.
   await ExtensionSettingsStore._reloadFile(false);
 
   is(ExtensionSettingsStore.getSetting("prefs", "homepage_override"), null,
      "The ExtensionSettingsStore is left empty.");
 });
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -486,17 +486,17 @@
       <handler event="command"><![CDATA[
         const target = event.originalTarget;
         if (target.engine) {
           this.currentEngine = target.engine;
         } else if (target.classList.contains("addengine-item")) {
           // Select the installed engine if the installation succeeds
           var installCallback = {
             onSuccess: engine => this.currentEngine = engine
-          }
+          };
           Services.search.addEngine(target.getAttribute("uri"), null,
                                     target.getAttribute("src"), false,
                                     installCallback);
         } else
           return;
 
         this.focus();
         this.select();
@@ -653,17 +653,17 @@
           element.setAttribute("type", "checkbox");
           element.setAttribute("autocheck", "false");
           suggestMenuItem = element;
           aMenu.appendChild(element);
 
           if (AppConstants.platform == "macosx") {
             this.addEventListener("keypress", aEvent => {
               if (aEvent.keyCode == KeyEvent.DOM_VK_F4)
-                this.openSearch()
+                this.openSearch();
             }, true);
           }
 
           this.controllers.appendController(this.searchbarController);
 
           let onpopupshowing = function() {
             BrowserSearch.searchBar._textbox.closePopup();
             if (suggestMenuItem) {
@@ -2359,17 +2359,17 @@
               let text = searchBundle.formatStringFromName("error_duplicate_engine_msg",
                                                            [brandName, target.getAttribute("uri")], 2);
               Services.prompt.QueryInterface(Ci.nsIPromptFactory);
               let prompt = Services.prompt.getPrompt(gBrowser.contentWindow, Ci.nsIPrompt);
               prompt.QueryInterface(Ci.nsIWritablePropertyBag2);
               prompt.setPropertyAsBool("allowTabModal", true);
               prompt.alert(title, text);
             }
-          }
+          };
           Services.search.addEngine(target.getAttribute("uri"), null,
                                     target.getAttribute("image"), false,
                                     installCallback);
         }
         let anonid = target.getAttribute("anonid");
         if (anonid == "search-one-offs-context-open-in-new-tab") {
           // Select the context-clicked button so that consumers can easily
           // tell which button was acted on.
--- a/browser/components/uitour/test/browser_UITour_sync.js
+++ b/browser/components/uitour/test/browser_UITour_sync.js
@@ -12,17 +12,17 @@ registerCleanupFunction(function() {
 
 add_task(setup_UITourTest);
 
 add_task(async function setup() {
   Services.prefs.setCharPref("identity.fxaccounts.remote.signup.uri",
                              "https://example.com/signup");
   Services.prefs.setCharPref("identity.fxaccounts.remote.email.uri",
                              "https://example.com/?action=email");
-})
+});
 
 add_UITour_task(async function test_checkSyncSetup_disabled() {
   let result = await getConfigurationPromise("sync");
   is(result.setup, false, "Sync shouldn't be setup by default");
 });
 
 add_UITour_task(async function test_checkSyncSetup_enabled() {
   Services.prefs.setCharPref("services.sync.username", "uitour@tests.mozilla.org");
--- a/browser/extensions/formautofill/.eslintrc.js
+++ b/browser/extensions/formautofill/.eslintrc.js
@@ -44,19 +44,16 @@ module.exports = {
     "no-unused-expressions": "error",
 
     // No declaring variables that are never used
     "no-unused-vars": ["error", {"args": "none", "varsIgnorePattern": "^(Cc|Ci|Cr|Cu|EXPORTED_SYMBOLS)$"}],
 
     // No using variables before defined
     "no-use-before-define": "error",
 
-    // Always require semicolon at end of statement
-    "semi": ["error", "always"],
-
     // Disallow using variables outside the blocks they are defined (especially
     // since only let and const are used, see "no-var").
     "block-scoped-var": "error",
 
     // Allow trailing commas for easy list extension.  Having them does not
     // impair readability, but also not required either.
     "comma-dangle": ["error", "always-multiline"],
 
--- a/browser/extensions/pdfjs/content/PdfJs.jsm
+++ b/browser/extensions/pdfjs/content/PdfJs.jsm
@@ -96,17 +96,17 @@ function initializeDefaultPreferences() 
   "useOnlyCssZoom": false,
   "externalLinkTarget": 0,
   "enhanceTextSelection": false,
   "renderer": "canvas",
   "renderInteractiveForms": false,
   "enablePrintAutoRotate": false,
   "disablePageMode": false,
   "disablePageLabels": false
-}
+};
 
 
   var defaultBranch = Services.prefs.getDefaultBranch(PREF_PREFIX + ".");
   var defaultValue;
   for (var key in DEFAULT_PREFERENCES) {
     defaultValue = DEFAULT_PREFERENCES[key];
     switch (typeof defaultValue) {
       case "boolean":
--- a/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm
+++ b/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm
@@ -50,17 +50,17 @@ var DEFAULT_PREFERENCES =
   "useOnlyCssZoom": false,
   "externalLinkTarget": 0,
   "enhanceTextSelection": false,
   "renderer": "canvas",
   "renderInteractiveForms": false,
   "enablePrintAutoRotate": false,
   "disablePageMode": false,
   "disablePageLabels": false
-}
+};
 
 
 var PdfjsChromeUtils = {
   // For security purposes when running remote, we restrict preferences
   // content can access.
   _allowedPrefNames: Object.keys(DEFAULT_PREFERENCES),
   _ppmm: null,
   _mmg: null,
--- a/browser/modules/ProcessHangMonitor.jsm
+++ b/browser/modules/ProcessHangMonitor.jsm
@@ -294,17 +294,17 @@ var ProcessHangMonitor = {
         }
       } else if (report.hangType == report.PLUGIN_HANG) {
         // If any window has closed during a plug-in hang, we'll
         // do the conservative thing and terminate the plug-in.
         this.stopHang(report);
         return true;
       }
       return false;
-    }
+    };
 
     // If there are any script hangs for browsers that are in this window
     // that is closing, we can stop them now.
     for (let report of this._activeReports) {
       if (maybeStopHang(report)) {
         this._activeReports.delete(report);
       }
     }
--- a/browser/modules/SchedulePressure.jsm
+++ b/browser/modules/SchedulePressure.jsm
@@ -41,17 +41,17 @@ this.SchedulePressure = {
       if (!this._telemetryCallbackWeakMap.has(window) &&
           TelemetryStopwatch.start("FX_SCHEDULE_PRESSURE_IDLE_SAMPLE_MS", window)) {
         let telemetryCallbackId = window.requestIdleCallback(() => {
           TelemetryStopwatch.finish("FX_SCHEDULE_PRESSURE_IDLE_SAMPLE_MS", window);
           this._telemetryCallbackWeakMap.delete(window);
         });
         this._telemetryCallbackWeakMap.set(window, telemetryCallbackId);
       }
-    }
+    };
   },
 
   /**
    * Starts an interval timeout that periodically waits for
    * an idle callback. If the idle callback fails to get called
    * within the timeout specified by TIMEOUT_AMOUNT, the
    * highPressureFn callback will get called. Otherwise the
    * lowPressureFn callback will get called.
--- a/browser/modules/test/browser/browser_ProcessHangNotifications.js
+++ b/browser/modules/test/browser/browser_ProcessHangNotifications.js
@@ -60,17 +60,17 @@ let TestHangReport = function(hangType =
     // add-on ID for us to blame.
     this._hangType = SLOW_SCRIPT;
     this._addonId = ADDON_ID;
   } else {
     this._hangType = hangType;
   }
 
   this._browser = browser;
-}
+};
 
 TestHangReport.prototype = {
   SLOW_SCRIPT,
   PLUGIN_HANG,
 
   get addonId() {
     return this._addonId;
   },
--- a/browser/modules/test/browser/browser_SitePermissions_tab_urls.js
+++ b/browser/modules/test/browser/browser_SitePermissions_tab_urls.js
@@ -20,22 +20,22 @@ add_task(async function testTemporaryPer
 
   // This usually takes about 60 seconds on 32bit Linux debug,
   // due to the combinatory nature of the test that is hard to fix.
   requestLongerTimeout(2);
 
 
   let same = [ newURI("https://example.com"),
                newURI("https://example.com/sub/path"),
-               newURI("https://example.com:443") ]
+               newURI("https://example.com:443") ];
   let different = [ newURI("https://example.com"),
                     newURI("https://name:password@example.com"),
                     newURI("https://test1.example.com"),
                     newURI("http://example.com"),
-                    newURI("http://example.org") ]
+                    newURI("http://example.org") ];
 
   let id = "microphone";
 
   await BrowserTestUtils.withNewTab("about:blank", async function(browser) {
     for (let uri of same) {
         let loaded = BrowserTestUtils.browserLoaded(browser, false, uri.spec);
         browser.loadURI(uri.spec);
         await loaded;
--- a/browser/modules/test/unit/test_SitePermissions.js
+++ b/browser/modules/test/unit/test_SitePermissions.js
@@ -133,17 +133,17 @@ add_task(async function testExactHostMat
     Assert.equal(SitePermissions.get(uri, permission).state, SitePermissions.ALLOW);
 
     SitePermissions.remove(subUri, permission);
     SitePermissions.remove(uri, permission);
   }
 });
 
 add_task(function* testDefaultPrefs() {
-  let uri = Services.io.newURI("https://example.com")
+  let uri = Services.io.newURI("https://example.com");
 
   // Check that without a pref the default return value is UNKNOWN.
   Assert.deepEqual(SitePermissions.get(uri, "camera"), {
     state: SitePermissions.UNKNOWN,
     scope: SitePermissions.SCOPE_PERSISTENT,
   });
 
   // Check that the default return value changed after setting the pref.
--- a/chrome/test/unit/test_bug564667.js
+++ b/chrome/test/unit/test_bug564667.js
@@ -74,17 +74,17 @@ function testManifest(manifestPath, base
   // Test Adding Skin URL
   test_mapping("chrome://test1/skin", baseURI + "test/test1.css");
 
   // Test Adding Manifest URL
   test_mapping("chrome://test2/content", baseURI + "test/test2.xul");
   test_mapping("chrome://test2/locale", baseURI + "test/test2.dtd");
 
   // Test Adding Override
-  test_mapping("chrome://testOverride/content", "file:///test1/override")
+  test_mapping("chrome://testOverride/content", "file:///test1/override");
 
   // Test Not-Adding Overlays
   test_no_overlays("chrome://test1/content/overlay.xul",
                    "chrome://test1/content/test1.xul");
 
   // Test Not-Adding Styles
   test_no_overlays("chrome://test1/content/style.xul",
                    "chrome://test1/content/test1.css", "styles");
--- a/chrome/test/unit/test_data_protocol_registration.js
+++ b/chrome/test/unit/test_data_protocol_registration.js
@@ -45,25 +45,25 @@ function run_test() {
 
     // Make sure the class ID has not already been registered
     if (!registrar.isCIDRegistered(factory.CID)) {
 
       // Check to see if a contract was already registered and
       // register it if it is not. Otherwise, store the previous one
       // to be restored later and register the new one.
       if (registrar.isContractIDRegistered(factory.contractID)) {
-        dump(factory.scheme + " is already registered. Storing currently registered object for restoration later.")
+        dump(factory.scheme + " is already registered. Storing currently registered object for restoration later.");
         old_factories.push({
           CID: registrar.contractIDToCID(factory.contractID),
           factory: Components.manager.getClassObject(Cc[factory.contractID], Ci.nsIFactory)
         });
         old_factories_inds.push(true);
         registrar.unregisterFactory(old_factories[i].CID, old_factories[i].factory);
       } else {
-        dump(factory.scheme + " has never been registered. Registering...")
+        dump(factory.scheme + " has never been registered. Registering...");
         old_factories.push({CID: "", factory: null});
         old_factories_inds.push(false);
       }
 
       registrar.registerFactory(factory.CID, "test-" + factory.scheme, factory.contractID, factory);
     } else {
       do_throw("CID " + factory.CID + " has already been registered!");
     }
--- a/chrome/test/unit/test_no_remote_registration.js
+++ b/chrome/test/unit/test_no_remote_registration.js
@@ -27,18 +27,18 @@ ProtocolHandler.prototype =
               createInstance(Ci.nsIURI);
     uri.spec = aSpec;
     if (!uri.scheme) {
       // We got a partial uri, so let's resolve it with the base one
       uri.spec = aBaseURI.resolve(aSpec);
     }
     return uri;
   },
-  newChannel2() { throw Cr.NS_ERROR_NOT_IMPLEMENTED },
-  newChannel() { throw Cr.NS_ERROR_NOT_IMPLEMENTED },
+  newChannel2() { throw Cr.NS_ERROR_NOT_IMPLEMENTED; },
+  newChannel() { throw Cr.NS_ERROR_NOT_IMPLEMENTED; },
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIProtocolHandler
   ])
 };
 
 var testProtocols = [
   // It doesn't matter if it has this flag - the only flag we accept is
   // URI_IS_LOCAL_RESOURCE.
@@ -120,22 +120,22 @@ function run_test() {
   // Make sure the class ID has not already been registered
   let old_factory = {CID: "", factory: null};
   if (!registrar.isCIDRegistered(XULAppInfoFactory.CID)) {
 
     // Check to see if a contract was already registered and
     // register it if it is not. Otherwise, store the previous one
     // to be restored later and register the new one.
     if (registrar.isContractIDRegistered(XULAppInfoFactory.contractID)) {
-      dump(XULAppInfoFactory.scheme + " is already registered. Storing currently registered object for restoration later.")
+      dump(XULAppInfoFactory.scheme + " is already registered. Storing currently registered object for restoration later.");
       old_factory.CID = registrar.contractIDToCID(XULAppInfoFactory.contractID);
       old_factory.factory = Components.manager.getClassObject(Cc[XULAppInfoFactory.contractID], Ci.nsIFactory);
       registrar.unregisterFactory(old_factory.CID, old_factory.factory);
     } else {
-      dump(XULAppInfoFactory.scheme + " has never been registered. Registering...")
+      dump(XULAppInfoFactory.scheme + " has never been registered. Registering...");
     }
 
     registrar.registerFactory(XULAppInfoFactory.CID, "test-" + XULAppInfoFactory.scheme, XULAppInfoFactory.contractID, XULAppInfoFactory);
   } else {
     do_throw("CID " + XULAppInfoFactory.CID + " has already been registered!");
   }
 
   // Check for new chrome
--- a/js/src/builtin/Array.js
+++ b/js/src/builtin/Array.js
@@ -216,17 +216,17 @@ function ArraySort(comparefn) {
         if (y === undefined)
             return -1;
 
         /* Step 4.a. */
         var v = ToNumber(wrappedCompareFn(x, y));
 
         /* Step 4.b-c. */
         return v !== v ? 0 : v;
-    }
+    };
 
     return MergeSort(O, len, comparefn);
 }
 
 /* ES5 15.4.4.18. */
 function ArrayForEach(callbackfn/*, thisArg*/) {
     /* Step 1. */
     var O = ToObject(this);
--- a/js/src/builtin/Intl.js
+++ b/js/src/builtin/Intl.js
@@ -504,17 +504,17 @@ function ArrayJoinRange(array, separator
  * Returns true if the input contains only ASCII alphabetical characters.
  */
 function IsASCIIAlphaString(s) {
     assert(typeof s === "string", "IsASCIIAlphaString");
 
     for (var i = 0; i < s.length; i++) {
         var c = callFunction(std_String_charCodeAt, s, i);
         if (!((0x41 <= c && c <= 0x5A) || (0x61 <= c && c <= 0x7A)))
-            return false
+            return false;
     }
     return true;
 }
 
 
 /**
  * Validates and canonicalizes the given language tag.
  */
@@ -1497,23 +1497,23 @@ function getInternals(obj) {
     // If internal properties have already been computed, use them.
     var internalProps = maybeInternalProperties(internals);
     if (internalProps)
         return internalProps;
 
     // Otherwise it's time to fully create them.
     var type = internals.type;
     if (type === "Collator")
-        internalProps = resolveCollatorInternals(internals.lazyData)
+        internalProps = resolveCollatorInternals(internals.lazyData);
     else if (type === "DateTimeFormat")
-        internalProps = resolveDateTimeFormatInternals(internals.lazyData)
+        internalProps = resolveDateTimeFormatInternals(internals.lazyData);
     else if (type === "NumberFormat")
         internalProps = resolveNumberFormatInternals(internals.lazyData);
     else
-        internalProps = resolvePluralRulesInternals(internals.lazyData)
+        internalProps = resolvePluralRulesInternals(internals.lazyData);
     setInternalProperties(internals, internalProps);
     return internalProps;
 }
 
 
 /********** Intl.Collator **********/
 
 
@@ -3693,17 +3693,17 @@ function InitializeRelativeTimeFormat(re
     opt.localeMatcher = matcher;
 
     lazyRelativeTimeFormatData.opt = opt;
 
     // Steps 13-14.
     const style = GetOption(options, "style", "string", ["long", "short", "narrow"], "long");
     lazyRelativeTimeFormatData.style = style;
 
-    initializeIntlObject(relativeTimeFormat, "RelativeTimeFormat", lazyRelativeTimeFormatData)
+    initializeIntlObject(relativeTimeFormat, "RelativeTimeFormat", lazyRelativeTimeFormatData);
 }
 
 /**
  * Returns the subset of the given locale list for which this locale list has a
  * matching (possibly fallback) locale. Locales appear in the same order in the
  * returned list as in the input list.
  *
  * Spec: ECMAScript 402 API, RelativeTimeFormat, 1.3.2.
@@ -3996,9 +3996,8 @@ function Intl_getLocaleInfo(locales) {
   const r = ResolveLocale(callFunction(DateTimeFormat.availableLocales, DateTimeFormat),
                           requestedLocales,
                           localeOpt,
                           DateTimeFormat.relevantExtensionKeys,
                           localeData);
 
   return intl_GetLocaleInfo(r.locale);
 }
-
--- a/js/src/builtin/Module.js
+++ b/js/src/builtin/Module.js
@@ -433,17 +433,17 @@ function ModuleDeclarationEnvironmentSet
     let indirectExportEntries = module.indirectExportEntries;
     for (let i = 0; i < indirectExportEntries.length; i++) {
         let e = indirectExportEntries[i];
         let resolution = callFunction(module.resolveExport, module, e.exportName);
         assert(resolution.resolved || resolution.module,
                "Unexpected failure to resolve export in ModuleDeclarationEnvironmentSetup");
         if (!resolution.resolved) {
             return ResolutionError(resolution, "indirectExport", e.exportName,
-                                   e.lineNumber, e.columnNumber)
+                                   e.lineNumber, e.columnNumber);
         }
     }
 
     // Steps 5-6
     CreateModuleEnvironment(module);
     let env = GetModuleEnvironment(module);
 
     // Step 8
--- a/js/src/builtin/Sorting.js
+++ b/js/src/builtin/Sorting.js
@@ -134,23 +134,23 @@ function RadixSort(array, len, buffer, n
         view = new Int32Array(buffer);
 
         // Flip sign bit for positive numbers; flip all bits for negative
         // numbers
         for (let i = 0; i < len; i++) {
             if (view[i] & signMask) {
                 view[i] ^= 0xFFFFFFFF;
             } else {
-                view[i] ^= signMask
+                view[i] ^= signMask;
             }
         }
     } else if (signed) {
         // Flip sign bit
         for (let i = 0; i < len; i++) {
-            view[i] ^= signMask
+            view[i] ^= signMask;
         }
     }
 
     /* eslint-disable comma-spacing */
     // 32 * 8 + 1 = 256 + 1 entries.
     let counts = [
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -175,17 +175,17 @@ function RadixSort(array, len, buffer, n
             if (view[i] & signMask) {
                 view[i] ^= signMask;
             } else {
                 view[i] ^= 0xFFFFFFFF;
             }
         }
     } else if (signed) {
         for (let i = 0; i < len; i++) {
-            view[i] ^= signMask
+            view[i] ^= signMask;
         }
     }
     return array;
 }
 
 
 // For sorting small arrays.
 function InsertionSort(array, from, to, comparefn) {
--- a/js/src/builtin/TypedArray.js
+++ b/js/src/builtin/TypedArray.js
@@ -1231,17 +1231,17 @@ function TypedArraySort(comparefn) {
                    "Length can only change from non-zero to zero when the buffer was detached");
             ThrowTypeError(JSMSG_TYPED_ARRAY_DETACHED);
         }
 
         // Step c. is redundant, see:
         // https://bugzilla.mozilla.org/show_bug.cgi?id=1121937#c36
         // Step d.
         return v;
-    }
+    };
 
     return QuickSort(obj, len, wrappedCompareFn);
 }
 
 // ES2017 draft rev f8a9be8ea4bd97237d176907a1e3080dce20c68f
 //   22.2.3.28 %TypedArray%.prototype.toLocaleString ([ reserved1 [ , reserved2 ] ])
 // ES2017 Intl draft rev 78bbe7d1095f5ff3760ac4017ed366026e4cb276
 //   13.4.1 Array.prototype.toLocaleString ([ locales [ , options ]])
@@ -1534,17 +1534,17 @@ function TypedArrayStaticOf(/*...items*/
     if (!IsConstructor(C))
         ThrowTypeError(JSMSG_NOT_CONSTRUCTOR, typeof C);
 
     // Step 5.
     var newObj = TypedArrayCreateWithLength(C, len);
 
     // Steps 6-7.
     for (var k = 0; k < len; k++)
-        newObj[k] = items[k]
+        newObj[k] = items[k];
 
     // Step 8.
     return newObj;
 }
 
 // ES 2016 draft Mar 25, 2016 22.2.2.4.
 function TypedArraySpecies() {
     // Step 1.
--- a/js/src/builtin/Utilities.js
+++ b/js/src/builtin/Utilities.js
@@ -303,10 +303,10 @@ function CopyDataPropertiesUnfiltered(ta
 
     // Step 6 (Return).
 }
 
 /*************************************** Testing functions ***************************************/
 function outer() {
     return function inner() {
         return "foo";
-    }
+    };
 }
--- a/js/src/shell/ModuleLoader.js
+++ b/js/src/shell/ModuleLoader.js
@@ -172,13 +172,13 @@ const ReflectLoader = new class {
     ["import"](name, referrer) {
         let path = this.resolve(name, null);
         return this.loadAndExecute(path);
     }
 };
 
 setModuleResolveHook((module, requestName) => {
     let path = ReflectLoader.resolve(requestName, module);
-    return ReflectLoader.loadAndParse(path)
+    return ReflectLoader.loadAndParse(path);
 });
 
 Reflect.Loader = ReflectLoader;
 }
--- a/security/.eslintrc.js
+++ b/security/.eslintrc.js
@@ -66,19 +66,16 @@ module.exports = {
     "no-unused-expressions": "error",
 
     // Disallow unnecessary escape usage in strings and regular expressions.
     "no-useless-escape": "error",
 
     // Disallow blank line padding within blocks.
     "padded-blocks": ["error", "never"],
 
-    // Always require semicolon at end of statement
-    "semi": ["error", "always"],
-
     // Enforce spacing after semicolons.
     "semi-spacing": ["error", { "before": false, "after": true }],
 
     // Never use spaces before named function parentheses, but always for async
     // arrow functions.
     "space-before-function-paren": ["error", {
       "anonymous": "ignore",
       "asyncArrow": "always",
--- a/services/sync/tests/unit/test_clients_engine.js
+++ b/services/sync/tests/unit/test_clients_engine.js
@@ -1857,30 +1857,30 @@ add_task(async function test_create_reco
     equal(parsedServerRecord.commands.length, 5);
 
     await engine.sendCommand("wipeEngine", ["history"], remoteId);
 
     _("Send a not-sane number of commands.");
     // Much higher than the maximum number of commands we could actually fit.
     for (let i = 0; i < 500; ++i) {
       await engine.sendURIToClientForDisplay(
-        `https://www.example.com/2/${i}`, remoteId, `Page 2.${i}`)
+        `https://www.example.com/2/${i}`, remoteId, `Page 2.${i}`);
     }
 
     await syncClientsEngine(server);
 
     _("Ensure we didn't overflow the server limit.");
     let payload = user.collection("clients").payload(remoteId);
     less(payload.length, fakeLimit);
 
-    _("And that the data we uploaded is both sane json and containing some commands.")
+    _("And that the data we uploaded is both sane json and containing some commands.");
     let remoteCommands = JSON.parse(JSON.parse(payload).ciphertext).commands;
     greater(remoteCommands.length, 2);
     let firstCommand = remoteCommands[0];
-    _("The first command should still be present, since it had a high priority")
+    _("The first command should still be present, since it had a high priority");
     equal(firstCommand.command, "wipeEngine");
     _("And the last command in the list should be the last command we sent.");
     let lastCommand = remoteCommands[remoteCommands.length - 1];
     equal(lastCommand.command, "displayURI");
     deepEqual(lastCommand.args, ["https://www.example.com/2/499", engine.localID, "Page 2.499"]);
   } finally {
     maxSizeStub.restore();
     await cleanup();
--- a/services/sync/tests/unit/test_telemetry.js
+++ b/services/sync/tests/unit/test_telemetry.js
@@ -535,17 +535,17 @@ add_task(async function test_sync_why() 
   await SyncTestingInfrastructure(server);
   let e = new Error("generic failure message");
   engine._errToThrow = e;
 
   try {
     _(`test_generic_engine_fail: Steam tracker contents: ${
       JSON.stringify(engine._tracker.changedIDs)}`);
     let ping = await wait_for_ping(() => Service.sync({why: "user"}), true, false);
-    _(JSON.stringify(ping))
+    _(JSON.stringify(ping));
     equal(ping.why, "user");
   } finally {
     await cleanAndGo(engine, server);
     Service.engineManager.unregister(engine);
   }
 });
 
 add_task(async function test_discarding() {
--- a/testing/modules/tests/xpcshell/test_assert.js
+++ b/testing/modules/tests/xpcshell/test_assert.js
@@ -256,23 +256,23 @@ function run_test() {
     assert.equal(e.message, "Missing expected exception..");
   }
   assert.ok(threw);
 
   // https://github.com/joyent/node/issues/5292
   try {
     assert.equal(1, 2);
   } catch (e) {
-    assert.equal(e.toString().split("\n")[0], "AssertionError: 1 == 2")
+    assert.equal(e.toString().split("\n")[0], "AssertionError: 1 == 2");
   }
 
   try {
     assert.equal(1, 2, "oh no");
   } catch (e) {
-    assert.equal(e.toString().split("\n")[0], "AssertionError: oh no - 1 == 2")
+    assert.equal(e.toString().split("\n")[0], "AssertionError: oh no - 1 == 2");
   }
 
   // Test XPCShell-test integration:
   ok(true, "OK, this went well");
   deepEqual(/a/g, /a/g, "deep equal should work on RegExp");
   deepEqual(/a/igm, /a/igm, "deep equal should work on RegExp");
   deepEqual({a: 4, b: "1"}, {b: "1", a: 4}, "deep equal should work on regular Object");
   deepEqual(a1, a2, "deep equal should work on Array with Object properties");
--- a/testing/modules/tests/xpcshell/test_structuredlog.js
+++ b/testing/modules/tests/xpcshell/test_structuredlog.js
@@ -3,34 +3,34 @@
 
 function run_test() {
   Components.utils.import("resource://testing-common/StructuredLog.jsm");
 
   let testBuffer = [];
 
   let appendBuffer = function(msg) {
     testBuffer.push(JSON.stringify(msg));
-  }
+  };
 
   let assertLastMsg = function(refData) {
     // Check all fields in refData agree with those in the
     // last message logged, and pop that message.
     let lastMsg = JSON.parse(testBuffer.pop());
     for (let field in refData) {
       deepEqual(lastMsg[field], refData[field]);
     }
     // The logger should always set the source to the logger name.
     equal(lastMsg.source, "test_log");
     // The source_file field is always set by the mutator function.
     equal(lastMsg.source_file, "test_structuredlog.js");
-  }
+  };
 
   let addFileName = function(data) {
     data.source_file = "test_structuredlog.js";
-  }
+  };
 
   let logger = new StructuredLogger("test_log", appendBuffer, [addFileName]);
 
   // Test unstructured logging
   logger.info("Test message");
   assertLastMsg({
     action: "log",
     message: "Test message",
--- a/testing/mozbase/mozlog/mozlog/formatters/html/main.js
+++ b/testing/mozbase/mozlog/mozlog/formatters/html/main.js
@@ -38,35 +38,35 @@ addEventListener("DOMContentLoaded", fun
                                   if (node != null) {
                                       if (node.nextSibling &&
                                           node.nextSibling.classList.contains("debug")) {
                                           var href = find(".screenshot img", node.nextSibling).src;
                                           window.open(href);
                                       }
                                   }
                                   event.preventDefault();
-                              })
+                              });
     });
 
     find_all(".screenshot a").forEach(function(elem) {
         elem.addEventListener("click",
                               function(event) {
                                   window.open(find("img", elem).getAttribute("src"));
                                   event.preventDefault();
-                              })
+                              });
     });
 
     find_all(".sortable").forEach(function(elem) {
         elem.addEventListener("click",
                               function(event) {
                                   toggle_sort_states(elem);
                                   var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem);
                                   var key = elem.classList.contains("numeric") ? key_num : key_alpha;
                                   sort_table(elem, key(colIndex));
-                              })
+                              });
     });
 
 });
 
 function sort_table(clicked, key_func) {
     one_row_for_data();
     var rows = find_all(".results-table-row");
     var reversed = !clicked.classList.contains("asc");
@@ -137,17 +137,17 @@ function toggle_sort_states(elem) {
         reset_sort_headers();
         elem.classList.remove("inactive");
         elem.classList.add("active");
     }
 }
 
 function split_debug_onto_two_rows() {
     find_all("tr.results-table-row").forEach(function(elem) {
-        var new_row = document.createElement("tr")
+        var new_row = document.createElement("tr");
         new_row.className = "debug";
         elem.parentNode.insertBefore(new_row, elem.nextSibling);
         find_all(".debug", elem).forEach(function(td_elem) {
             if (find(".log", td_elem)) {
                 new_row.appendChild(td_elem);
                 td_elem.colSpan = 5;
             } else {
                 td_elem.remove();
@@ -157,16 +157,16 @@ function split_debug_onto_two_rows() {
 }
 
 function one_row_for_data() {
     find_all("tr.results-table-row").forEach(function(elem) {
         if (elem.nextSibling.classList.contains("debug")) {
             toArray(elem.nextSibling.childNodes).forEach(
                 function(td_elem) {
                     elem.appendChild(td_elem);
-                })
+                });
         } else {
             var new_td = document.createElement("td");
             new_td.className = "debug";
             elem.appendChild(new_td);
         }
     });
 }
--- a/testing/profiles/prefs_general.js
+++ b/testing/profiles/prefs_general.js
@@ -234,22 +234,22 @@ user_pref("general.useragent.updates.url
 
 // Disable webapp updates.  Yes, it is supposed to be an integer.
 user_pref("browser.webapps.checkForUpdates", 0);
 
 user_pref("dom.presentation.testing.simulate-receiver", false);
 
 // Don't connect to Yahoo! for RSS feed tests.
 // en-US only uses .types.0.uri, but set all of them just to be sure.
-user_pref("browser.contentHandlers.types.0.uri", "http://test1.example.org/rss?url=%%s")
-user_pref("browser.contentHandlers.types.1.uri", "http://test1.example.org/rss?url=%%s")
-user_pref("browser.contentHandlers.types.2.uri", "http://test1.example.org/rss?url=%%s")
-user_pref("browser.contentHandlers.types.3.uri", "http://test1.example.org/rss?url=%%s")
-user_pref("browser.contentHandlers.types.4.uri", "http://test1.example.org/rss?url=%%s")
-user_pref("browser.contentHandlers.types.5.uri", "http://test1.example.org/rss?url=%%s")
+user_pref("browser.contentHandlers.types.0.uri", "http://test1.example.org/rss?url=%%s");
+user_pref("browser.contentHandlers.types.1.uri", "http://test1.example.org/rss?url=%%s");
+user_pref("browser.contentHandlers.types.2.uri", "http://test1.example.org/rss?url=%%s");
+user_pref("browser.contentHandlers.types.3.uri", "http://test1.example.org/rss?url=%%s");
+user_pref("browser.contentHandlers.types.4.uri", "http://test1.example.org/rss?url=%%s");
+user_pref("browser.contentHandlers.types.5.uri", "http://test1.example.org/rss?url=%%s");
 
 // We want to collect telemetry, but we don't want to send in the results.
 user_pref("toolkit.telemetry.server", "https://%(server)s/telemetry-dummy/");
 // Don't send 'new-profile' ping on new profiles during tests, otherwise the testing framework
 // might wait on the pingsender to finish and slow down tests.
 user_pref("toolkit.telemetry.newProfilePing.enabled", false);
 // Don't send 'bhr' ping during tests, otherwise the testing framework might
 // wait on the pingsender to finish and slow down tests.
--- a/testing/specialpowers/content/SpecialPowersObserverAPI.js
+++ b/testing/specialpowers/content/SpecialPowersObserverAPI.js
@@ -15,29 +15,29 @@ if (typeof(Cc) == "undefined") {
   var Cc = Components.classes;
 }
 
 this.SpecialPowersError = function(aMsg) {
   Error.call(this);
   // let {stack} = new Error();
   this.message = aMsg;
   this.name = "SpecialPowersError";
-}
+};
 SpecialPowersError.prototype = Object.create(Error.prototype);
 
 SpecialPowersError.prototype.toString = function() {
   return `${this.name}: ${this.message}`;
 };
 
 this.SpecialPowersObserverAPI = function SpecialPowersObserverAPI() {
   this._crashDumpDir = null;
   this._processCrashObserversRegistered = false;
   this._chromeScriptListeners = [];
   this._extensions = new Map();
-}
+};
 
 function parseKeyValuePairs(text) {
   var lines = text.split("\n");
   var data = {};
   for (let i = 0; i < lines.length; i++) {
     if (lines[i] == "")
       continue;
 
@@ -441,17 +441,17 @@ SpecialPowersObserverAPI.prototype = {
         plugin.enabledState = aMessage.data.newEnabledState;
         return oldEnabledState;
       }
 
       case "SPObserverService": {
         let topic = aMessage.json.observerTopic;
         switch (aMessage.json.op) {
           case "notify":
-            let data = aMessage.json.observerData
+            let data = aMessage.json.observerData;
             Services.obs.notifyObservers(null, topic, data);
             break;
           case "add":
             this._registerObservers._self = this;
             this._registerObservers._add(topic);
             break;
           default:
             throw new SpecialPowersError("Invalid operation for SPObserverervice");
@@ -476,17 +476,17 @@ SpecialPowersObserverAPI.prototype = {
         }
 
         // Setup a chrome sandbox that has access to sendAsyncMessage
         // and addMessageListener in order to communicate with
         // the mochitest.
         let systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
         let sandboxOptions = aMessage.json.sandboxOptions;
         if (!sandboxOptions) {
-          sandboxOptions = {}
+          sandboxOptions = {};
         }
         let sb = Components.utils.Sandbox(systemPrincipal, sandboxOptions);
         let mm = aMessage.target.frameLoader
                          .messageManager;
         sb.sendAsyncMessage = (name, message) => {
           mm.sendAsyncMessage("SPChromeScriptMessage",
                               { id, name, message });
         };
--- a/testing/specialpowers/content/specialpowers.js
+++ b/testing/specialpowers/content/specialpowers.js
@@ -276,12 +276,12 @@ SpecialPowersManager.prototype = {
 var specialpowersmanager = new SpecialPowersManager();
 
 this.SpecialPowers = SpecialPowers;
 this.attachSpecialPowersToWindow = attachSpecialPowersToWindow;
 
 // In the case of Chrome mochitests that inject specialpowers.js as
 // a regular content script
 if (typeof window != "undefined") {
-  window.addMessageListener = function() {}
-  window.removeMessageListener = function() {}
+  window.addMessageListener = function() {};
+  window.removeMessageListener = function() {};
   window.wrappedJSObject.SpecialPowers = new SpecialPowers(window);
 }
--- a/testing/specialpowers/content/specialpowersAPI.js
+++ b/testing/specialpowers/content/specialpowersAPI.js
@@ -355,17 +355,17 @@ SPConsoleListener.prototype = {
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIConsoleListener])
 };
 
 function wrapCallback(cb) {
   return function SpecialPowersCallbackWrapper() {
     var args = Array.prototype.map.call(arguments, wrapIfUnwrapped);
     return cb.apply(this, args);
-  }
+  };
 }
 
 function wrapCallbackObject(obj) {
   obj = Cu.waiveXrays(obj);
   var wrapper = {};
   for (var i in obj) {
     if (typeof obj[i] == "function")
       wrapper[i] = wrapCallback(obj[i]);
@@ -1005,17 +1005,17 @@ SpecialPowersAPI.prototype = {
     var self = this;
     this._permissionObserver._self = self;
     this._permissionObserver._lastPermission = lastPermission;
     this._permissionObserver._callback = callback;
     this._permissionObserver._nextCallback = function() {
         self._applyingPermissions = false;
         // Now apply any permissions that may have been queued while we were applying
         self._applyPermissions();
-    }
+    };
 
     for (var idx in pendingActions) {
       var perm = pendingActions[idx];
       this._sendSyncMessage("SPPermissionManager", perm)[0];
     }
   },
 
   /**
@@ -1547,17 +1547,17 @@ SpecialPowersAPI.prototype = {
     function genGCCallback(cb) {
       return function() {
         Cu.forceCC();
         if (++count < 2) {
           Cu.schedulePreciseGC(genGCCallback(cb));
         } else if (cb) {
           cb();
         }
-      }
+      };
     }
 
     Cu.schedulePreciseGC(genGCCallback(callback));
   },
 
   getMemoryReports() {
     try {
       Cc["@mozilla.org/memory-reporter-manager;1"]
@@ -1640,17 +1640,17 @@ SpecialPowersAPI.prototype = {
 
   getDOMRequestService() {
     var serv = Services.DOMRequest;
     var res = {};
     var props = ["createRequest", "createCursor", "fireError", "fireSuccess",
                  "fireDone", "fireDetailedError"];
     for (var i in props) {
       let prop = props[i];
-      res[prop] = function() { return serv[prop].apply(serv, arguments) };
+      res[prop] = function() { return serv[prop].apply(serv, arguments); };
     }
     return res;
   },
 
   setLogFile(path) {
     this._mfl = new MozillaFileLogger(path);
   },
 
--- a/testing/talos/talos/pageloader/chrome/MozillaFileLogger.js
+++ b/testing/talos/talos/pageloader/chrome/MozillaFileLogger.js
@@ -48,45 +48,44 @@ var MozillaFileLogger = {};
 
 
 MozillaFileLogger.init = function(path) {
   MozillaFileLogger._file = Cc[LF_CID].createInstance(Ci.nsIFile);
   MozillaFileLogger._file.initWithPath(path);
   MozillaFileLogger._foStream = Cc[FOSTREAM_CID].createInstance(Ci.nsIFileOutputStream);
   MozillaFileLogger._foStream.init(this._file, PR_WRITE_ONLY | PR_CREATE_FILE | PR_APPEND,
                                    0o664, 0);
-}
+};
 
 MozillaFileLogger.getLogCallback = function() {
   return function(msg) {
     var data = msg.num + " " + msg.level + " " + msg.info.join(" ") + "\n";
     if (MozillaFileLogger._foStream)
       MozillaFileLogger._foStream.write(data, data.length);
 
     if (data.indexOf("SimpleTest FINISH") >= 0) {
       MozillaFileLogger.close();
     }
-  }
-}
+  };
+};
 
 // This is only used from chrome space by the reftest harness
 MozillaFileLogger.log = function(msg) {
   try {
     if (MozillaFileLogger._foStream)
       MozillaFileLogger._foStream.write(msg, msg.length);
   } catch (ex) {}
-}
+};
 
 MozillaFileLogger.close = function() {
   if (MozillaFileLogger._foStream)
     MozillaFileLogger._foStream.close();
 
   MozillaFileLogger._foStream = null;
   MozillaFileLogger._file = null;
-}
+};
 
 try {
   var prefs = Cc["@mozilla.org/preferences-service;1"]
     .getService(Ci.nsIPrefBranch);
   var filename = prefs.getCharPref("talos.logfile");
   MozillaFileLogger.init(filename);
 } catch (ex) {} // pref does not exist, return empty string
-
--- a/testing/talos/talos/pageloader/chrome/pageloader.js
+++ b/testing/talos/talos/pageloader/chrome/pageloader.js
@@ -147,17 +147,17 @@ function plInit() {
     if (args.filter) pageFilterRegexp = new RegExp(args.filter);
     if (args.noisy) noisy = true;
     if (args.timeout) timeout = parseInt(args.timeout);
     if (args.delay) delay = parseInt(args.delay);
     if (args.mozafterpaint) useMozAfterPaint = true;
     if (args.fnbpaint) useFNBPaint = true;
     if (args.loadnocache) loadNoCache = true;
     if (args.scrolltest) scrollTest = true;
-    if (args.profilinginfo) profilingInfo = JSON.parse(args.profilinginfo)
+    if (args.profilinginfo) profilingInfo = JSON.parse(args.profilinginfo);
 
     if (profilingInfo) {
       TalosParentProfiler.initFromObject(profilingInfo);
     }
 
     forceCC = !args.noForceCC;
     doRenderTest = args.doRender;
 
@@ -528,17 +528,17 @@ function forceContentGC() {
       resolve();
     });
     mm.sendAsyncMessage("Talos:ForceGC");
   });
 }
 
 function plRecordTime(time) {
   var pageName = pages[pageIndex].url.spec;
-  var i = pageIndex
+  var i = pageIndex;
   if (i < pages.length - 1) {
     i++;
   } else {
     i = 0;
   }
   var nextName = pages[i].url.spec;
   if (!recordedName) {
     // when doing base vs ref type of test, add pre 'base' or 'ref' to reported page name;
@@ -576,23 +576,23 @@ function plLoadHandlerCapturing(evt) {
       return;
 
   // set the tpRecordTime function (called from test pages we load) to store a global time.
   content.contentWindow.wrappedJSObject.tpRecordTime = function(time, startTime, testName) {
     gTime = time;
     gStartTime = startTime;
     recordedName = testName;
     setTimeout(plWaitForPaintingCapturing, 0);
-  }
+  };
 
   content.contentWindow.wrappedJSObject.plGarbageCollect = function() {
     window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
           .getInterface(Components.interfaces.nsIDOMWindowUtils)
           .garbageCollect();
-  }
+  };
 
   content.removeEventListener("load", plLoadHandlerCapturing, true);
   removeLastAddedListener = null;
 
   setTimeout(plWaitForPaintingCapturing, 0);
 }
 
 // Shim function this is really defined in tscroll.js
@@ -985,9 +985,8 @@ function plLoadURLsFromURI(manifestUri) 
 }
 
 function dumpLine(str) {
   if (MozillaFileLogger && MozillaFileLogger._foStream)
     MozillaFileLogger.log(str + "\n");
   dump(str);
   dump("\n");
 }
-
--- a/testing/talos/talos/pageloader/chrome/report.js
+++ b/testing/talos/talos/pageloader/chrome/report.js
@@ -48,17 +48,17 @@ function Report() {
 }
 
 Report.prototype.pageNames = function() {
   var retval = [];
   for (var page in this.timeVals) {
     retval.push(page);
   }
   return retval;
-}
+};
 
 Report.prototype.getReport = function() {
 
   var report;
   var pages = this.pageNames();
   var prefixLen = findCommonPrefixLength(pages);
 
   report = "__start_tp_report\n";
@@ -79,17 +79,17 @@ Report.prototype.getReport = function() 
     report += "__start_cc_report\n";
     report += "_x_x_mozilla_cycle_collect," + this.totalCCTime + "\n";
     report += "__end_cc_report\n";
   }
   var now = (new Date()).getTime(); // eslint-disable-line mozilla/avoid-Date-timing
   report += "__startTimestamp" + now + "__endTimestamp\n"; // timestamp for determning shutdown time, used by talos
 
   return report;
-}
+};
 
 Report.prototype.getReportSummary = function() {
 
   function average(arr) {
     var sum = 0;
     for (var i in arr)
       sum += arr[i];
     return sum / (arr.length || 1);
@@ -144,21 +144,21 @@ Report.prototype.getReportSummary = func
             + "\nValues: " + results.map(function(v) {
                                            return v.toFixed(1);
                                          }).join("  ")
             + "\n";
   }
   report += "-------- Summary: end --------\n";
 
   return report;
-}
+};
 
 Report.prototype.recordTime = function(pageName, ms) {
   if (this.timeVals[pageName] == undefined) {
     this.timeVals[pageName] = [];
   }
   this.timeVals[pageName].push(ms);
-}
+};
 
 Report.prototype.recordCCTime = function(ms) {
   this.totalCCTime += ms;
   this.showTotalCCTime = true;
-}
+};
--- a/testing/talos/talos/pageloader/chrome/tscroll.js
+++ b/testing/talos/talos/pageloader/chrome/tscroll.js
@@ -75,17 +75,17 @@ function testScroll(target, stepSize, op
    */
   function P_setupReportFn() {
     return new Promise(function(resolve) {
       report = opt_reportFunc || win.tpRecordTime;
       if (report == "PageLoader:RecordTime") {
         report = function(duration, start, name) {
           var msg = { time: duration, startTime: start, testName: name };
           sendAsyncMessage("PageLoader:RecordTime", msg);
-        }
+        };
         resolve();
         return;
       }
 
       // Not part of the test and does nothing if we're within talos.
       // Provides an alternative tpRecordTime (with some stats display) if running in a browser.
       if (!report && document.head) {
         var imported = document.createElement("script");
--- a/testing/talos/talos/scripts/MozillaFileLogger.js
+++ b/testing/talos/talos/scripts/MozillaFileLogger.js
@@ -74,56 +74,55 @@ var MozFileLogger = {};
 MozFileLogger.init = function(path) {
   netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
   MozFileLogger._file = Cc[LF_CID].createInstance(Ci.nsIFile);
   MozFileLogger._file.initWithPath(path);
   MozFileLogger._foStream = Cc[FOSTREAM_CID].createInstance(Ci.nsIFileOutputStream);
   MozFileLogger._foStream.init(this._file, PR_WRITE_ONLY | PR_CREATE_FILE | PR_APPEND,
                                    0o664, 0);
-}
+};
 
 MozFileLogger.getLogCallback = function() {
   return function(msg) {
     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
     var data = msg.num + " " + msg.level + " " + msg.info.join(" ") + "\n";
     if (MozFileLogger._foStream)
       MozFileLogger._foStream.write(data, data.length);
 
     if (data.indexOf("SimpleTest FINISH") >= 0) {
       MozFileLogger.close();
     }
-  }
-}
+  };
+};
 
 // This is only used from chrome space by the reftest harness
 MozFileLogger.log = function(msg) {
   netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
   try {
     if (MozFileLogger._foStream)
       MozFileLogger._foStream.write(msg, msg.length);
   } catch (ex) {}
-}
+};
 
 MozFileLogger.close = function() {
   if (ipcMode) {
     contentAsyncEvent("LoggerClose");
     return;
   }
 
   netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
   if (MozFileLogger._foStream)
     MozFileLogger._foStream.close();
 
   MozFileLogger._foStream = null;
   MozFileLogger._file = null;
-}
+};
 
 try {
   var prefs = Components.classes["@mozilla.org/preferences-service;1"]
     .getService(Components.interfaces.nsIPrefBranch);
   var filename = prefs.getCharPref("talos.logfile");
   MozFileLogger.init(filename);
 } catch (ex) {} // pref does not exist, return empty string
-
--- a/testing/talos/talos/scripts/talos-debug.js
+++ b/testing/talos/talos/scripts/talos-debug.js
@@ -161,14 +161,14 @@ window.talosDebug = {
         disp.splice(warmup, 0, "[warmed-up:]");
       res += disp.join(", ");
     } else {
       res += "\n\n[set window.talosDebug.displayData=true for data]";
     }
 
     alert(res);
   }
-}
+};
 
 // Enable testing outside of talos by providing an alternative report function.
 if (typeof (tpRecordTime) === "undefined") {
   tpRecordTime = window.talosDebug.tpRecordTime;
 }
--- a/testing/talos/talos/scripts/xpigen.js
+++ b/testing/talos/talos/scripts/xpigen.js
@@ -26,17 +26,17 @@ function createXpiDataUri(base, files, c
       throw ("FileNotRetrieved: " + url + " - " + r.status + " " + r.statusText);
 
     return r.response;
   }
 
   // Create base64 string for a binary array (btoa fails on arbitrary binary data)
   function base64EncArr(aBytes) {
     // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding
-    "use strict;"
+    "use strict;";
     function uint6ToB64(nUint6) {
       return nUint6 < 26 ? nUint6 + 65 : nUint6 < 52 ? nUint6 + 71 : nUint6 < 62 ?
           nUint6 - 4 : nUint6 === 62 ? 43 : nUint6 === 63 ? 47 : 65;
     }
 
     var nMod3 = 2, sB64Enc = "";
     for (var nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
       nMod3 = nIdx % 3;
--- a/testing/talos/talos/startup_test/tresize/addon/content/framescript.js
+++ b/testing/talos/talos/startup_test/tresize/addon/content/framescript.js
@@ -12,9 +12,9 @@
       }
     });
 
     sendAsyncMessage(TRESIZE_PREFIX + "chrome-run-message", {
       id: uniqueMessageId,
       locationSearch: e.detail.locationSearch
     });
   }, false);
-})()
+})();
--- a/testing/talos/talos/talos-powers/content/TalosParentProfiler.js
+++ b/testing/talos/talos/talos-powers/content/TalosParentProfiler.js
@@ -109,17 +109,17 @@ var TalosParentProfiler;
      *        The name of the test to use in Profiler markers.
      */
     beginTest(testName) {
       if (initted) {
         currentTest = testName;
         TalosPowers.profilerBegin({ entries, interval, threadsArray });
       } else {
         let msg = "You should not call beginTest without having first " +
-                  "initted the Profiler"
+                  "initted the Profiler";
         console.error(msg);
       }
     },
 
     /**
      * A Talos test has finished. This will stop the Gecko Profiler from
      * sampling, and return a Promise that resolves once the Profiler has
      * finished dumping the multi-process profile to disk.
--- a/testing/talos/talos/tests/devtools/addon/content/damp.js
+++ b/testing/talos/talos/tests/devtools/addon/content/damp.js
@@ -778,9 +778,9 @@ async _consoleOpenWithCachedMessagesTest
         }
 
         sequenceArray.push(tests[config.subtests[i]]);
       }
     }
 
     this._doSequence(sequenceArray, this._doneInternal);
   }
-}
+};
--- a/testing/talos/talos/tests/perf-reftest-singletons/util.js
+++ b/testing/talos/talos/tests/perf-reftest-singletons/util.js
@@ -1,12 +1,12 @@
 var perf_data = {
   start: null,
   end: null,
-}
+};
 
 function build_dom(n, elemName, options) {
   // By default we use different elements in the DOM to defeat the style sharing
   // cache, otherwise this sythetic DOM is trivially stylable by engines with that
   // optimization.
   options = options || {};
   var elemNameLeft = options.elemNameLeft || "div";
   var elemNameRight = options.elemNameRight || "span";
--- a/testing/talos/talos/tests/perf-reftest/util.js
+++ b/testing/talos/talos/tests/perf-reftest/util.js
@@ -1,12 +1,12 @@
 var perf_data = {
   start: null,
   end: null,
-}
+};
 
 function build_dom(n, elemName, options) {
   // By default we use different elements in the DOM to defeat the style sharing
   // cache, otherwise this sythetic DOM is trivially stylable by engines with that
   // optimization.
   options = options || {};
   var elemNameLeft = options.elemNameLeft || "div";
   var elemNameRight = options.elemNameRight || "span";
--- a/testing/talos/talos/tests/tart/addon/content/framescript.js
+++ b/testing/talos/talos/tests/tart/addon/content/framescript.js
@@ -17,9 +17,9 @@
       }
     });
 
     sendAsyncMessage(TART_PREFIX + "chrome-exec-message", {
       command: e.detail.command,
       id: uniqueMessageId
     });
   }, false);
-})()
+})();
--- a/testing/talos/talos/tests/tart/addon/content/tart.js
+++ b/testing/talos/talos/tests/tart/addon/content/tart.js
@@ -690,9 +690,9 @@ Tart.prototype = {
     this._win = wm.getMostRecentWindow("navigator:browser");
     this._tartTab = this._win.gBrowser.selectedTab;
     this._win.gBrowser.selectedBrowser.focus(); // Unfocus the URL bar to avoid caret blink
 
     Profiler.mark("TART - start", true);
 
     return this._startTest();
   }
-}
+};
--- a/testing/xpcshell/example/unit/test_sample.js
+++ b/testing/xpcshell/example/unit/test_sample.js
@@ -7,15 +7,15 @@
 /* This is the most basic testcase.  It makes some trivial assertions,
  * then sets a timeout, and exits the test harness when that timeout
  * fires. This is meant to demonstrate that there is a complete event
  * system available to test scripts.
  * Available functions are described at:
  * http://developer.mozilla.org/en/docs/Writing_xpcshell-based_unit_tests
  */
 function run_test() {
-  do_check_eq(57, 57)
-  do_check_neq(1, 2)
+  do_check_eq(57, 57);
+  do_check_neq(1, 2);
   do_check_true(true);
 
   do_test_pending();
   do_timeout(100, do_test_finished);
 }
--- a/testing/xpcshell/head.js
+++ b/testing/xpcshell/head.js
@@ -59,17 +59,17 @@ var Assert = new AssertCls(function(err,
 var _add_params = function(params) {
   if (typeof _XPCSHELL_PROCESS != "undefined") {
     params.xpcshell_process = _XPCSHELL_PROCESS;
   }
 };
 
 var _dumpLog = function(raw_msg) {
   dump("\n" + JSON.stringify(raw_msg) + "\n");
-}
+};
 
 var _LoggerClass = Components.utils.import("resource://testing-common/StructuredLog.jsm", null).StructuredLogger;
 var _testLogger = new _LoggerClass("xpcshell/head.js", _dumpLog, [_add_params]);
 
 // Disable automatic network detection, so tests work correctly when
 // not connected to a network.
 {
   let ios = Components.classes["@mozilla.org/network/io-service;1"]
@@ -126,17 +126,17 @@ try {
     crashReporter.UpdateCrashEventsDir();
     crashReporter.minidumpPath = do_get_minidumpdir();
   }
 } catch (e) { }
 
 // Configure a console listener so messages sent to it are logged as part
 // of the test.
 try {
-  let levelNames = {}
+  let levelNames = {};
   for (let level of ["debug", "info", "warn", "error"]) {
     levelNames[Components.interfaces.nsIConsoleMessage[level]] = level;
   }
 
   let listener = {
     QueryInterface(iid) {
       if (!iid.equals(Components.interfaces.nsISupports) &&
           !iid.equals(Components.interfaces.nsIConsoleListener)) {
@@ -311,17 +311,17 @@ var _fakeIdleService = {
       return this.factory;
     }
     if (aIID.equals(Components.interfaces.nsIIdleService) ||
         aIID.equals(Components.interfaces.nsISupports)) {
       return this;
     }
     throw Components.results.NS_ERROR_NO_INTERFACE;
   }
-}
+};
 
 /**
  * Restores the idle service factory if needed and returns the service's handle.
  * @return A handle to the idle service.
  */
 function do_get_idle() {
   _fakeIdleService.deactivate();
   return Components.classes[_fakeIdleService.contractID]
@@ -401,17 +401,17 @@ function _setupDebuggerServer(breakpoint
     throw new Error("resource://devtools appears to be inaccessible from the " +
                     "xpcshell environment.\n" +
                     "This can usually be resolved by adding:\n" +
                     "  firefox-appdir = browser\n" +
                     "to the xpcshell.ini manifest.\n" +
                     "It is possible for this to alter test behevior by " +
                     "triggering additional browser code to run, so check " +
                     "test behavior after making this change.\n" +
-                    "See also https://bugzil.la/1215378.")
+                    "See also https://bugzil.la/1215378.");
   }
   let { DebuggerServer } = require("devtools/server/main");
   let { OriginalLocation } = require("devtools/server/actors/common");
   DebuggerServer.init();
   DebuggerServer.addBrowserActors();
   DebuggerServer.addActors("resource://testing-common/dbg-actors.js");
   DebuggerServer.allowChromeProcess = true;
 
@@ -456,22 +456,22 @@ function _setupDebuggerServer(breakpoint
 }
 
 function _initDebugging(port) {
   let initialized = false;
   let DebuggerServer = _setupDebuggerServer(_TEST_FILE, () => { initialized = true; });
 
   do_print("");
   do_print("*******************************************************************");
-  do_print("Waiting for the debugger to connect on port " + port)
-  do_print("")
+  do_print("Waiting for the debugger to connect on port " + port);
+  do_print("");
   do_print("To connect the debugger, open a Firefox instance, select 'Connect'");
   do_print("from the Developer menu and specify the port as " + port);
   do_print("*******************************************************************");
-  do_print("")
+  do_print("");
 
   let AuthenticatorType = DebuggerServer.Authenticators.get("PROMPT");
   let authenticator = new AuthenticatorType.Server();
   authenticator.allowConnection = () => {
     return DebuggerServer.AuthenticationResult.ALLOW;
   };
 
   let listener = DebuggerServer.createListener();
@@ -646,17 +646,17 @@ function _execute_test() {
  */
 function _load_files(aFiles) {
   function load_file(element, index, array) {
     try {
       load(element);
     } catch (e) {
       let extra = {
         source_file: element
-      }
+      };
       if (e.stack) {
         extra.stack = _format_stack(e.stack);
       }
       _testLogger.error(_exception_message(e), extra);
     }
   }
 
   aFiles.forEach(load_file);
@@ -1465,17 +1465,17 @@ function run_next_test() {
       _PromiseTestUtils.assertNoUncaughtRejections();
       let _properties;
       [_properties, _gRunningTest, ] = _gTests[_gTestIndex++];
       if ((typeof(_properties.skip_if) == "function" && _properties.skip_if()) ||
           (_gRunOnlyThisTest && _gRunningTest != _gRunOnlyThisTest)) {
         let _condition = _gRunOnlyThisTest ? "only one task may run." :
           _properties.skip_if.toSource().replace(/\(\)\s*=>\s*/, "");
         if (_condition == "true")
-          _condition = "explicitly skipped."
+          _condition = "explicitly skipped.";
         let _message = _gRunningTest.name
           + " skipped because the following conditions were"
           + " met: (" + _condition + ")";
         _testLogger.testStatus(_TEST_NAME,
                                _gRunningTest.name,
                                "SKIP",
                                "SKIP",
                                _message);
--- a/toolkit/components/extensions/.eslintrc.js
+++ b/toolkit/components/extensions/.eslintrc.js
@@ -80,19 +80,16 @@ module.exports = {
     "no-unused-expressions": "error",
 
     // No declaring variables that are never used
     "no-unused-vars": ["error", {"args": "none", "varsIgnorePattern": "^(Cc|Ci|Cr|Cu|EXPORTED_SYMBOLS)$"}],
 
     // No using variables before defined
     "no-use-before-define": "error",
 
-    // Always require semicolon at end of statement
-    "semi": ["error", "always"],
-
     // Never use spaces before function parentheses
     "space-before-function-paren": ["error", {"anonymous": "never", "named": "never"}],
 
     // ++ and -- should not need spacing
     "space-unary-ops": ["error", {"nonwords": false, "words": true, "overrides": {"typeof": false}}],
 
     // Disallow using variables outside the blocks they are defined (especially
     // since only let and const are used, see "no-var").
--- a/toolkit/components/narrate/.eslintrc.js
+++ b/toolkit/components/narrate/.eslintrc.js
@@ -25,15 +25,14 @@ module.exports = {
     "no-multiple-empty-lines": ["error", {"max": 1}],
     "no-return-assign": "error",
     "no-sequences": "error",
     "no-shadow": "error",
     "no-throw-literal": "error",
     "no-unused-vars": "error",
     "padded-blocks": ["error", "never"],
     "quotes": ["error", "double", "avoid-escape"],
-    "semi": ["error", "always"],
     "semi-spacing": ["error", {"before": false, "after": true}],
     "space-in-parens": ["error", "never"],
     "strict": ["error", "global"],
     "yoda": "error"
   }
 };
--- a/toolkit/components/passwordmgr/.eslintrc.js
+++ b/toolkit/components/passwordmgr/.eslintrc.js
@@ -3,11 +3,10 @@
 module.exports = {
 
   "rules": {
     // XXX Bug 1358949 - This should be reduced down - probably to 20 or to
     // be removed & synced with the mozilla/recommended value.
     "complexity": ["error", 43],
 
     "no-unused-vars": ["error", {"args": "none", "vars": "local", "varsIgnorePattern": "^(ids|ignored|unused)$"}],
-    "semi": ["error", "always"],
   }
 };
--- a/toolkit/components/places/tests/bookmarks/test_818587_compress-bookmarks-backups.js
+++ b/toolkit/components/places/tests/bookmarks/test_818587_compress-bookmarks-backups.js
@@ -25,17 +25,17 @@ add_task(async function compress_bookmar
 
   // Check that, if the user created a custom backup out of the default
   // backups folder, it gets copied (compressed) into it.
   let jsonFile = OS.Path.join(OS.Constants.Path.profileDir, "bookmarks.json");
   await PlacesBackups.saveBookmarksToJSONFile(jsonFile);
   do_check_eq((await PlacesBackups.getBackupFiles()).length, 1);
 
   // Check if import works from lz4 compressed json
-  let url = "http://www.mozilla.org/en-US/"
+  let url = "http://www.mozilla.org/en-US/";
   let bm = await PlacesUtils.bookmarks.insert({
     parentGuid: PlacesUtils.bookmarks.unfiledGuid,
     title: "bookmark",
     url,
   });
 
   // Force create a compressed backup, Remove the bookmark, the restore the backup
   await PlacesBackups.create(undefined, true);
--- a/toolkit/components/reader/.eslintrc.js
+++ b/toolkit/components/reader/.eslintrc.js
@@ -2,11 +2,10 @@
 
 module.exports = {
   "rules": {
     "indent-legacy": ["error", 2, { "SwitchCase": 1 }],
     "new-parens": "error",
     "no-inner-declarations": "error",
     "no-shadow": "error",
     "no-unused-vars": ["error", {"vars": "all", "args": "none"}],
-    "semi": ["error", "always"],
   },
 }
--- a/toolkit/content/tests/widgets/test_bug1319301.html
+++ b/toolkit/content/tests/widgets/test_bug1319301.html
@@ -27,16 +27,16 @@
 
   add_task(async function play_fadeout() {
     isnot(controlsSpacer.getAttribute("fadeout"), "true", "controlsSpacer should not fadeout before playing");
 
     await new Promise(resolve => {
       video.addEventListener("canplaythrough", video.play);
       video.addEventListener("play", () => SimpleTest.executeSoon(resolve));
       video.src = "seek_with_sound.ogg";
-    })
+    });
 
     is(controlsSpacer.getAttribute("fadeout"), "true", "controlsSpacer should fadeout once video starts playing");
   });
 </script>
 </pre>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/test_videocontrols.html
+++ b/toolkit/content/tests/widgets/test_videocontrols.html
@@ -105,17 +105,17 @@ async function waitForEvent(...eventType
   });
 }
 
 add_task(async function setup() {
   await SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]});
   await new Promise(resolve => {
     video.addEventListener("canplaythrough", resolve, {once: true});
     video.src = "seek_with_sound.ogg";
-  })
+  });
 
   video.addEventListener("play", verifyExpectedEvent);
   video.addEventListener("pause", verifyExpectedEvent);
   video.addEventListener("volumechange", verifyExpectedEvent);
   video.addEventListener("seeking", verifyExpectedEvent);
   video.addEventListener("seeked", verifyExpectedEvent);
   document.addEventListener("mozfullscreenchange", verifyExpectedEvent);
 
@@ -137,17 +137,17 @@ add_task(async function setup() {
 add_task(async function click_playbutton() {
   synthesizeMouse(video, playButtonCenterX, playButtonCenterY, {});
   await waitForEvent("play");
   is(video.paused, false, "checking video play state");
   is(video.muted, false, "checking video mute state");
 });
 
 add_task(async function click_pausebutton() {
-  synthesizeMouse(video, playButtonCenterX, playButtonCenterY, {})
+  synthesizeMouse(video, playButtonCenterX, playButtonCenterY, {});
   await waitForEvent("pause");
   is(video.paused, true, "checking video play state");
   is(video.muted, false, "checking video mute state");
 });
 
 add_task(async function mute_volume() {
   synthesizeMouse(video, muteButtonCenterX, muteButtonCenterY, {});
   await waitForEvent("volumechange");
--- a/toolkit/content/tests/widgets/test_videocontrols_video_noaudio.html
+++ b/toolkit/content/tests/widgets/test_videocontrols_video_noaudio.html
@@ -22,17 +22,17 @@
   const volumeStack = getAnonElementWithinVideoByAttribute(video, "anonid", "volumeStack");
 
   add_task(async function setup() {
     await new Promise(resolve => window.addEventListener("load", resolve));
     await SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]});
     await new Promise(resolve => {
       video.src = "video.ogg";
       video.addEventListener("loadedmetadata", () => SimpleTest.executeSoon(resolve));
-    })
+    });
   });
 
   add_task(async function mute_button_icon() {
     is(muteButton.getAttribute("noAudio"), "true");
     is(muteButton.getAttribute("disabled"), "true");
 
     if (volumeStack) {
       ok(volumeStack.hidden);
--- a/toolkit/content/widgets/autocomplete.xml
+++ b/toolkit/content/widgets/autocomplete.xml
@@ -1627,17 +1627,17 @@ extends="chrome://global/content/binding
           <![CDATA[
             // This property is a string that is read aloud by screen readers,
             // so it must not contain anything that should not be user-facing.
 
             let parts = [
               this.getAttribute("title"),
               this.getAttribute("displayurl"),
             ];
-            let label = parts.filter(str => str).join(" ")
+            let label = parts.filter(str => str).join(" ");
 
             // allow consumers that have extended popups to override
             // the label values for the richlistitems
             let panel = this.parentNode.parentNode;
             if (panel.createResultLabel) {
               return panel.createResultLabel(this, label);
             }
 
@@ -2391,17 +2391,17 @@ extends="chrome://global/content/binding
               action.params[key] = decodeURIComponent(action.params[key]);
             }
           } catch (e) {
             // If this failed, we assume that params is not a JSON object, and
             // is instead just a flat string. This may happen for legacy
             // search components.
             action.params = {
               url: params,
-            }
+            };
           }
 
           return action;
         ]]></body>
       </method>
     </implementation>
 
     <handlers>
--- a/toolkit/content/widgets/button.xml
+++ b/toolkit/content/widgets/button.xml
@@ -194,17 +194,17 @@
           this.click();
           return;
         }
 
         // Search for accesskey in the list of buttons for this doc and each subdoc
         // Get the buttons for the main document and all sub-frames
         for (var frameCount = -1; frameCount < window.top.frames.length; frameCount++) {
           var doc = (frameCount == -1) ? window.top.document :
-            window.top.frames[frameCount].document
+            window.top.frames[frameCount].document;
           if (this.fireAccessKeyButton(doc.documentElement, charPressedLower))
             return;
         }
 
         // Test anonymous buttons
         var dlg = window.top.document;
         var buttonBox = dlg.getAnonymousElementByAttribute(dlg.documentElement,
                                                          "anonid", "buttons");
--- a/toolkit/content/widgets/colorpicker.xml
+++ b/toolkit/content/widgets/colorpicker.xml
@@ -209,17 +209,17 @@
             el.setAttribute("src", dataURI);
           }
 
           this.hoverCell(this.mBox.childNodes[0].childNodes[0]);
 
           // used to capture keydown at the document level
           this.mPickerKeyDown = function(aEvent) {
             document._focusedPicker.pickerKeyDown(aEvent);
-          }
+          };
 
         ]]></body>
       </method>
 
       <method name="_fireEvent">
         <parameter name="aTarget"/>
         <parameter name="aEventName"/>
         <body>
@@ -462,20 +462,20 @@
       <method name="initialize">
         <body><![CDATA[
           this.mColorBox = document.getAnonymousElementByAttribute(this, "anonid", "colorbox");
           this.mColorBox.setAttribute("src",
             "data:image/svg+xml,<svg style='background-color: " +
             encodeURIComponent(this.color) +
             "' xmlns='http://www.w3.org/2000/svg' />");
 
-          var popup = document.getAnonymousElementByAttribute(this, "anonid", "colorpopup")
+          var popup = document.getAnonymousElementByAttribute(this, "anonid", "colorpopup");
           popup._colorPicker = this;
 
-          this.mPicker = document.getAnonymousElementByAttribute(this, "anonid", "colorpicker")
+          this.mPicker = document.getAnonymousElementByAttribute(this, "anonid", "colorpicker");
         ]]></body>
       </method>
 
       <method name="_fireEvent">
         <parameter name="aTarget"/>
         <parameter name="aEventName"/>
         <body>
         <![CDATA[
@@ -527,17 +527,17 @@
           document.removeEventListener("keydown", this.mPicker, true);
           this.mPicker.mIsPopup = false;
         ]]></body>
       </method>
 
       <method name="pickerChange">
         <body><![CDATA[
           this.color = this.mPicker.color;
-          setTimeout(function(aPopup) { aPopup.hidePopup() }, 1, this.mPicker.parentNode);
+          setTimeout(function(aPopup) { aPopup.hidePopup(); }, 1, this.mPicker.parentNode);
 
           this._fireEvent(this, "change");
         ]]></body>
       </method>
 
       <constructor><![CDATA[
         this.initialize();
       ]]></constructor>
--- a/toolkit/content/widgets/datetimebox.xml
+++ b/toolkit/content/widgets/datetimebox.xml
@@ -55,17 +55,17 @@
 
       <method name="buildEditFields">
         <body>
         <![CDATA[
           const HTML_NS = "http://www.w3.org/1999/xhtml";
           let root =
             document.getAnonymousElementByAttribute(this, "anonid", "edit-wrapper");
 
-          let yearMaxLength = this.mMaxYear.toString().length
+          let yearMaxLength = this.mMaxYear.toString().length;
           this.mYearField = this.createEditField(this.mYearPlaceHolder,
             true, this.mYearLength, yearMaxLength, this.mMinYear, this.mMaxYear,
             this.mYearPageUpDownInterval);
           this.mMonthField = this.createEditField(this.mMonthPlaceHolder,
             true, this.mMonthDayLength, this.mMonthDayLength, this.mMinMonth,
             this.mMaxMonth, this.mMonthPageUpDownInterval);
           this.mDayField = this.createEditField(this.mDayPlaceHolder,
             true, this.mMonthDayLength, this.mMonthDayLength, this.mMinDay,
--- a/toolkit/content/widgets/datetimepopup.xml
+++ b/toolkit/content/widgets/datetimepopup.xml
@@ -263,17 +263,17 @@
           // If the start and end is the same day, then weekends only has one day.
           for (let day = weekendStart; day <= weekendEnd; day++) {
             weekends.push(day % 7);
           }
 
           return {
             firstDayOfWeek,
             weekends
-          }
+          };
         ]]></body>
       </method>
       <method name="getDisplayNames">
         <parameter name="locale"/>
         <parameter name="keys"/>
         <parameter name="style"/>
         <body><![CDATA[
           const displayNames = this.mozIntl.getDisplayNames(locale, {keys, style});
--- a/toolkit/content/widgets/findbar.xml
+++ b/toolkit/content/widgets/findbar.xml
@@ -241,17 +241,17 @@
                 onget="return this.getAttribute('prefillwithselection') != 'false'"
                 onset="this.setAttribute('prefillwithselection', val); return val;"/>
 
       <method name="getElement">
         <parameter name="aAnonymousID"/>
         <body><![CDATA[
           return document.getAnonymousElementByAttribute(this,
                                                          "anonid",
-                                                         aAnonymousID)
+                                                         aAnonymousID);
         ]]></body>
       </method>
 
       <property name="findMode"
                 readonly="true"
                 onget="return this._findMode;"/>
 
       <property name="hasTransactions" readonly="true">
--- a/toolkit/content/widgets/numberbox.xml
+++ b/toolkit/content/widgets/numberbox.xml
@@ -57,17 +57,17 @@
           this._validateValue(val, false);
           return val;
         </setter>
       </property>
 
       <property name="wrapAround">
         <getter>
         <![CDATA[
-          return (this.getAttribute("wraparound") == "true")
+          return (this.getAttribute("wraparound") == "true");
         ]]>
         </getter>
         <setter>
         <![CDATA[
           if (val)
             this.setAttribute("wraparound", "true");
           else
             this.removeAttribute("wraparound");
--- a/toolkit/content/widgets/popup.xml
+++ b/toolkit/content/widgets/popup.xml
@@ -299,17 +299,17 @@
         if (this.getAttribute("backdrag") == "true" && !this._draggableStarted) {
           this._draggableStarted = true;
           try {
             let tmp = {};
             Components.utils.import("resource://gre/modules/WindowDraggingUtils.jsm", tmp);
             let draghandle = new tmp.WindowDraggingElement(this);
             draghandle.mouseDownCheck = function() {
               return this._dragBindingAlive;
-            }
+            };
           } catch (e) {}
         }
       ]]>
       </constructor>
     </implementation>
 
     <handlers>
       <handler event="popupshowing"><![CDATA[
--- a/toolkit/content/widgets/preferences.xml
+++ b/toolkit/content/widgets/preferences.xml
@@ -773,17 +773,17 @@
         <![CDATA[
           if (!aPaneElement)
             return;
 
           this._selector.selectedItem = document.getAnonymousElementByAttribute(this, "pane", aPaneElement.id);
           if (!aPaneElement.loaded) {
             let OverlayLoadObserver = function(aPane) {
               this._pane = aPane;
-            }
+            };
             OverlayLoadObserver.prototype = {
               _outer: this,
               observe(aSubject, aTopic, aData) {
                 this._pane.loaded = true;
                 this._outer._fireEvent("paneload", this._pane);
                 this._outer._selectPane(this._pane);
               }
             };
--- a/toolkit/content/widgets/richlistbox.xml
+++ b/toolkit/content/widgets/richlistbox.xml
@@ -55,17 +55,17 @@
             // make sure not to modify last-selected when suppressing select events
             // (otherwise we'll lose the selection when a template gets rebuilt)
             if (this._suppressOnSelect || this.suppressOnSelect)
               return;
 
             // remember the current item and all selected items with IDs
             var state = this.currentItem ? this.currentItem.id : "";
             if (this.selType == "multiple" && this.selectedCount) {
-              let getId = function getId(aItem) { return aItem.id; }
+              let getId = function getId(aItem) { return aItem.id; };
               state += " " + [...this.selectedItems].filter(getId).map(getId).join(" ");
             }
             if (state)
               this.setAttribute("last-selected", state);
             else
               this.removeAttribute("last-selected");
 
             // preserve the index just in case no IDs are available
--- a/toolkit/content/widgets/text.xml
+++ b/toolkit/content/widgets/text.xml
@@ -209,17 +209,17 @@
         </body>
       </method>
 
       <method name="mergeElement">
         <parameter name="element"/>
         <body>
           <![CDATA[
             if (element.previousSibling instanceof Text) {
-              element.previousSibling.appendData(element.textContent)
+              element.previousSibling.appendData(element.textContent);
             } else {
               element.parentNode.insertBefore(element.firstChild, element);
             }
             element.remove();
           ]]>
         </body>
       </method>
 
@@ -331,17 +331,17 @@
             const cID = "@mozilla.org/uriloader/external-protocol-service;1";
             const nsIEPS = Components.interfaces.nsIExternalProtocolService;
             var protocolSvc = Components.classes[cID].getService(nsIEPS);
 
             // if the scheme is not an exposed protocol, then opening this link
             // should be deferred to the system's external protocol handler
             if (!protocolSvc.isExposedProtocol(uri.scheme)) {
               protocolSvc.loadURI(uri);
-              aEvent.preventDefault()
+              aEvent.preventDefault();
               return;
             }
 
           } catch (ex) {
             Components.utils.reportError(ex);
           }
 
           aEvent.preventDefault();
--- a/toolkit/content/widgets/tree.xml
+++ b/toolkit/content/widgets/tree.xml
@@ -376,17 +376,17 @@
                            parseInt(style.paddingBottom);
             input.width = cellRect.width - widthdiff;
             input.hidden = false;
 
             input.value = this.view.getCellText(row, column);
             var selectText = function selectText() {
               input.select();
               input.inputField.focus();
-            }
+            };
             setTimeout(selectText, 0);
 
             this._editingRow = row;
             this._editingColumn = column;
             this.setAttribute("editing", "true");
 
             box.invalidateCell(row, column);
             return true;
--- a/toolkit/content/widgets/videocontrols.xml
+++ b/toolkit/content/widgets/videocontrols.xml
@@ -2136,17 +2136,17 @@
         // the controls to remain visible. this.controlsTimeout is a full
         // 5s, which feels too long after the transition.
         if (this.video.currentTime !== 0) {
           this.delayHideControls(this.Utils.HIDE_CONTROLS_TIMEOUT_MS);
         }
       }
     };
 
-    this.TouchUtils.init(this)
+    this.TouchUtils.init(this);
     this.dispatchEvent(new CustomEvent("VideoBindingAttached"));
     ]]>
   </constructor>
   <destructor>
     <![CDATA[
     // XBL destructors don't appear to be inherited properly, so we need
     // to do this here in addition to the videoControls destructor. :-(
     delete this.randomID;
--- a/toolkit/crashreporter/test/unit/head_win64cfi.js
+++ b/toolkit/crashreporter/test/unit/head_win64cfi.js
@@ -39,17 +39,17 @@ function findNearestTestCrasherSymbol(ad
         closestDistance = thisDistance;
         closestSym = sym;
       }
     }
   }
   if (closestSym === null) {
     return null;
   }
-  return { symbol: closestSym, offset: closestDistance }
+  return { symbol: closestSym, offset: closestDistance };
 }
 
 // Populate known symbols for testcrasher.dll.
 // Use the same prop names as from CrashTestUtils to avoid the need for mapping.
 function initTestCrasherSymbols() {
   gTestCrasherSyms = { };
   for (let k in CrashTestUtils) {
     // Not all keys here are valid symbol names. getWin64CFITestFnAddrOffset
--- a/toolkit/modules/tests/browser/browser_FinderHighlighter2.js
+++ b/toolkit/modules/tests/browser/browser_FinderHighlighter2.js
@@ -32,17 +32,17 @@ add_task(async function testIframeOffset
         { x: 21, y: 215 },
         { x: 78, y: 264 },
         { x: 21, y: 375 },
         { x: 78, y: 424 },
         { x: 20, y: 534 },
         { x: 93, y: 534 },
         { x: 71, y: 577 },
         { x: 145, y: 577 }
-      ]
+      ];
       for (let i = 1, l = rects.length - 1; i < l; ++i) {
         let rect = rects[i];
         let expected = expectedOffsets[i - 1];
         Assert.equal(Math.floor(rect.x), expected.x, "Horizontal offset should match for rect " + i);
         Assert.equal(Math.floor(rect.y), expected.y, "Vertical offset should match for rect " + i);
       }
     });
     await promiseEnterStringIntoFindField(findbar, word);
--- a/toolkit/modules/tests/browser/browser_Finder_offscreen_text.js
+++ b/toolkit/modules/tests/browser/browser_Finder_offscreen_text.js
@@ -29,17 +29,17 @@ add_task(async function test_offscreen_t
           ok(false, "callback wasn't replaced");
         }
       };
       finder.addResultListener(listener);
 
       function waitForFind() {
         return new Promise(resolve => {
           listener.onFindResult = resolve;
-        })
+        });
       }
 
       // Find each of the targets.
       for (let t = 0; t < targetCount; ++t) {
         let promiseFind = waitForFind();
         if (t == 0) {
           finder.fastFind(TARGET_TEXT, false, false);
         } else {
--- a/toolkit/modules/tests/browser/browser_Finder_pointer_events_none.js
+++ b/toolkit/modules/tests/browser/browser_Finder_pointer_events_none.js
@@ -11,17 +11,17 @@ add_task(async function test_offscreen_t
           ok(false, "callback wasn't replaced");
         }
       };
       finder.addResultListener(listener);
 
       function waitForFind() {
         return new Promise(resolve => {
           listener.onFindResult = resolve;
-        })
+        });
       }
 
       // Find the target text.
       let promiseFind = waitForFind();
       finder.fastFind("find this", false, false);
       let findResult = await promiseFind;
       is(findResult.result, Ci.nsITypeAheadFind.FIND_FOUND, "Found target text.");
 
--- a/toolkit/mozapps/extensions/content/extensions.xml
+++ b/toolkit/mozapps/extensions/content/extensions.xml
@@ -1473,17 +1473,17 @@
           this._relNotesLoaded = true;
           this._relNotesLoading.hidden = false;
           this._relNotesError.hidden = true;
 
           let sendToggleEvent = () => {
             var event = document.createEvent("Events");
             event.initEvent("RelNotesToggle", true, true);
             this.dispatchEvent(event);
-          }
+          };
 
           let showRelNotes = () => {
             if (!relNotesData || !transformData)
               return;
 
             this._relNotesLoading.hidden = true;
 
             var processor = Components.classes["@mozilla.org/document-transformer;1?type=xslt"]
@@ -1493,26 +1493,26 @@
             processor.importStylesheet(transformData);
             var fragment = processor.transformToFragment(relNotesData, document);
             this._relNotes.appendChild(fragment);
             if (this.hasAttribute("show-relnotes")) {
               var container = this._relNotesContainer;
               container.style.height = container.scrollHeight + "px";
             }
             sendToggleEvent();
-          }
+          };
 
           let handleError = () => {
             dataReq.abort();
             styleReq.abort();
             this._relNotesLoading.hidden = true;
             this._relNotesError.hidden = false;
             this._relNotesLoaded = false; // allow loading to be re-tried
             sendToggleEvent();
-          }
+          };
 
           function handleResponse(aEvent) {
             var req = aEvent.target;
             var ct = req.getResponseHeader("content-type");
             if ((!ct || ct.indexOf("text/html") < 0) &&
                 req.responseXML &&
                 req.responseXML.documentElement.namespaceURI != XMLURI_PARSE_ERROR) {
               if (req == dataReq)
--- a/toolkit/mozapps/extensions/test/xpcshell/test_bug659772.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_bug659772.js
@@ -122,17 +122,17 @@ async function run_test_1() {
       // Remove an unnecessary property from the cached manifest
       let file = await File.createFromNsIFile(jsonfile);
 
       let addonObj = await new Promise(resolve => {
         let fr = new FileReader();
         fr.readAsText(file);
         fr.onloadend = () => {
           resolve(JSON.parse(fr.result));
-        }
+        };
       });
 
       delete addonObj.optionsType;
 
       let stream = AM_Cc["@mozilla.org/network/file-output-stream;1"].
                    createInstance(AM_Ci.nsIFileOutputStream);
       let converter = AM_Cc["@mozilla.org/intl/converter-output-stream;1"].
                       createInstance(AM_Ci.nsIConverterOutputStream);
@@ -266,17 +266,17 @@ async function run_test_2() {
       // Remove an unnecessary property from the cached manifest
       let file = await File.createFromNsIFile(jsonfile);
 
       let addonObj = await new Promise(resolve => {
         let fr = new FileReader();
         fr.readAsText(file);
         fr.onloadend = () => {
           resolve(JSON.parse(fr.result));
-        }
+        };
       });
 
       delete addonObj.optionsType;
 
       let stream = AM_Cc["@mozilla.org/network/file-output-stream;1"].
                    createInstance(AM_Ci.nsIFileOutputStream);
       let converter = AM_Cc["@mozilla.org/intl/converter-output-stream;1"].
                       createInstance(AM_Ci.nsIConverterOutputStream);
--- a/tools/lint/eslint/.eslintrc.js
+++ b/tools/lint/eslint/.eslintrc.js
@@ -23,12 +23,11 @@ module.exports = {
     // Longer max-len due to AST selectors
     "max-len": ["error", 150, 2],
     "no-multiple-empty-lines": ["error", {"max": 1}],
     "no-shadow": "error",
     "no-undef-init": "error",
     "object-curly-spacing": "off",
     "one-var": ["error", "never"],
     "operator-linebreak": ["error", "after"],
-    "semi": ["error", "always"],
     "strict": ["error", "global"],
   },
 };
--- a/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
+++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
@@ -355,17 +355,17 @@ module.exports = {
       "allowTemplateLiterals": true,
       "avoidEscape": true
     }],
 
     // No spacing inside rest or spread expressions
     "rest-spread-spacing": "error",
 
     // Always require semicolon at end of statement
-    // "semi": ["error", "always"],
+    "semi": ["error", "always"],
 
     // Require space before blocks
     "space-before-blocks": "error",
 
     // Never use spaces before function parentheses
     "space-before-function-paren": ["error", {
       "anonymous": "never",
       "asyncArrow": "always",
--- a/tools/lint/eslint/eslint-plugin-mozilla/package-lock.json
+++ b/tools/lint/eslint/eslint-plugin-mozilla/package-lock.json
@@ -1,11 +1,11 @@
 {
   "name": "eslint-plugin-mozilla",
-  "version": "0.4.8",
+  "version": "0.4.9",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
     "acorn": {
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz",
       "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==",
       "dev": true
--- a/tools/lint/eslint/eslint-plugin-mozilla/package.json
+++ b/tools/lint/eslint/eslint-plugin-mozilla/package.json
@@ -1,11 +1,11 @@
 {
   "name": "eslint-plugin-mozilla",
-  "version": "0.4.8",
+  "version": "0.4.9",
   "description": "A collection of rules that help enforce JavaScript coding standard in the Mozilla project.",
   "keywords": [
     "eslint",
     "eslintplugin",
     "eslint-plugin",
     "mozilla",
     "firefox"
   ],
--- a/xpcom/tests/unit/test_streams.js
+++ b/xpcom/tests/unit/test_streams.js
@@ -24,17 +24,17 @@ function test_binary_streams() {
 
   p = new Pipe(false, false, 1024, 1, null);
   is = new BinaryInput(p.inputStream);
   os = new BinaryOutput(p.outputStream);
 
   const LargeNum = Math.pow(2, 18) + Math.pow(2, 12) + 1;
   const HugeNum = Math.pow(2, 62);
   const HelloStr = "Hello World";
-  const HelloArray = Array.map(HelloStr, function(c) { return c.charCodeAt(0) });
+  const HelloArray = Array.map(HelloStr, function(c) { return c.charCodeAt(0); });
   var countObj = {};
   var msg = {};
   var buffer = new ArrayBuffer(HelloArray.length);
 
   // Test reading immediately after writing.
   os.writeBoolean(true);
   do_check_eq(is.readBoolean(), true);
   os.write8(4);
@@ -64,17 +64,17 @@ function test_binary_streams() {
   os.writeBytes(HelloStr, HelloStr.length);
   do_check_eq(is.available(), HelloStr.length);
   msg = is.readBytes(HelloStr.length);
   do_check_eq(msg, HelloStr);
   msg = null;
   countObj.value = -1;
   os.writeByteArray(HelloArray, HelloArray.length);
   do_check_eq(is.available(), HelloStr.length);
-  msg = is.readByteArray(HelloStr.length)
+  msg = is.readByteArray(HelloStr.length);
   do_check_eq(typeof msg, typeof HelloArray);
   do_check_eq(msg.toSource(), HelloArray.toSource());
   do_check_eq(is.available(), 0);
   os.writeByteArray(HelloArray, HelloArray.length);
   do_check_eq(is.readArrayBuffer(buffer.byteLength, buffer), HelloArray.length);
   do_check_eq([...(new Uint8Array(buffer))].toSource(), HelloArray.toSource());
   do_check_eq(is.available(), 0);
 
@@ -113,17 +113,17 @@ function test_binary_streams() {
   do_check_eq(is.readString(), "Gecko");
   // Remember, we wrote HelloStr twice - once as a string, and then as an array.
   do_check_eq(is.available(), HelloStr.length * 2);
   msg = is.readBytes(HelloStr.length);
   do_check_eq(msg, HelloStr);
   msg = null;
   countObj.value = -1;
   do_check_eq(is.available(), HelloStr.length);
-  msg = is.readByteArray(HelloStr.length)
+  msg = is.readByteArray(HelloStr.length);
   do_check_eq(typeof msg, typeof HelloArray);
   do_check_eq(msg.toSource(), HelloArray.toSource());
   do_check_eq(is.available(), 0);
 
   // Test for invalid actions.
   os.close();
   is.close();
 
--- a/xpcom/tests/unit/test_systemInfo.js
+++ b/xpcom/tests/unit/test_systemInfo.js
@@ -10,11 +10,11 @@ function run_test() {
 
   PROPERTIES.forEach(function(aPropertyName) {
     print("Testing property: " + aPropertyName);
     let value = sysInfo.getProperty(aPropertyName);
     do_check_true(!!value);
   });
 
   // This property must exist, but its value might be zero.
-  print("Testing property: umask")
+  print("Testing property: umask");
   do_check_eq(typeof sysInfo.getProperty("umask"), "number");
 }
--- a/xpcom/tests/unit/test_windows_shortcut.js
+++ b/xpcom/tests/unit/test_windows_shortcut.js
@@ -106,17 +106,17 @@ function test_create_normal(tempDir) {
   let win = shortcutFile.QueryInterface(Ci.nsILocalFileWin);
 
   win.setShortcut(targetFile,
                   do_get_cwd(),
                   "arg1 arg2",
                   "Ordinary shortcut");
 
   let shortcutTarget = LocalFile(shortcutFile.target);
-  do_check_true(shortcutTarget.equals(targetFile))
+  do_check_true(shortcutTarget.equals(targetFile));
 }
 
 function test_create_unicode(tempDir) {
   let shortcutFile = tempDir.clone();
   shortcutFile.append("createdShortcut.lnk");
   shortcutFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   let targetFile = tempDir.clone();
@@ -126,17 +126,17 @@ function test_create_unicode(tempDir) {
   let win = shortcutFile.QueryInterface(Ci.nsILocalFileWin);
 
   win.setShortcut(targetFile,
                   do_get_cwd(), // XXX: This should probably be a unicode dir
                   "ᾶṟǵ1 ᾶṟǵ2",
                   "ῧṋіḉѻₑ");
 
   let shortcutTarget = LocalFile(shortcutFile.target);
-  do_check_true(shortcutTarget.equals(targetFile))
+  do_check_true(shortcutTarget.equals(targetFile));
 }
 
 function test_update_noargs(tempDir) {
   let shortcutFile = tempDir.clone();
   shortcutFile.append("createdShortcut.lnk");
   shortcutFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   let targetFile = tempDir.clone();
@@ -148,17 +148,17 @@ function test_update_noargs(tempDir) {
   win.setShortcut(targetFile,
                   do_get_cwd(),
                   "arg1 arg2",
                   "A sample shortcut");
 
   win.setShortcut();
 
   let shortcutTarget = LocalFile(shortcutFile.target);
-  do_check_true(shortcutTarget.equals(targetFile))
+  do_check_true(shortcutTarget.equals(targetFile));
 }
 
 function test_update_notarget(tempDir) {
   let shortcutFile = tempDir.clone();
   shortcutFile.append("createdShortcut.lnk");
   shortcutFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   let targetFile = tempDir.clone();
@@ -173,17 +173,17 @@ function test_update_notarget(tempDir) {
                   "A sample shortcut");
 
   win.setShortcut(null,
                   do_get_profile(),
                   "arg3 arg4",
                   "An UPDATED shortcut");
 
   let shortcutTarget = LocalFile(shortcutFile.target);
-  do_check_true(shortcutTarget.equals(targetFile))
+  do_check_true(shortcutTarget.equals(targetFile));
 }
 
 function test_update_targetonly(tempDir) {
   let shortcutFile = tempDir.clone();
   shortcutFile.append("createdShortcut.lnk");
   shortcutFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   let targetFile = tempDir.clone();
@@ -199,17 +199,17 @@ function test_update_targetonly(tempDir)
 
   let newTargetFile = tempDir.clone();
   newTargetFile.append("shortcutTarget.exe");
   shortcutFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   win.setShortcut(newTargetFile);
 
   let shortcutTarget = LocalFile(shortcutFile.target);
-  do_check_true(shortcutTarget.equals(newTargetFile))
+  do_check_true(shortcutTarget.equals(newTargetFile));
 }
 
 function test_update_normal(tempDir) {
   let shortcutFile = tempDir.clone();
   shortcutFile.append("createdShortcut.lnk");
   shortcutFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   let targetFile = tempDir.clone();
@@ -228,17 +228,17 @@ function test_update_normal(tempDir) {
   newTargetFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   win.setShortcut(newTargetFile,
                   do_get_profile(),
                   "arg3 arg4",
                   "An UPDATED shortcut");
 
   let shortcutTarget = LocalFile(shortcutFile.target);
-  do_check_true(shortcutTarget.equals(newTargetFile))
+  do_check_true(shortcutTarget.equals(newTargetFile));
 }
 
 function test_update_unicode(tempDir) {
   let shortcutFile = tempDir.clone();
   shortcutFile.append("createdShortcut.lnk");
   shortcutFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   let targetFile = tempDir.clone();
@@ -257,10 +257,10 @@ function test_update_unicode(tempDir) {
   shortcutFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
 
   win.setShortcut(newTargetFile,
                   do_get_profile(), // XXX: This should probably be unicode
                   "ᾶṟǵ3 ᾶṟǵ4",
                   "A ῧṋіḉѻₑ shortcut");
 
   let shortcutTarget = LocalFile(shortcutFile.target);
-  do_check_true(shortcutTarget.equals(newTargetFile))
+  do_check_true(shortcutTarget.equals(newTargetFile));
 }