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 437161 40106dd2c532d701000e54a855c3a10291828836
parent 437160 237e09de43a1c7967f7a8b5a9343ab37f9ac5a77
child 437162 2e36423069468756547b41e0bf7550c2d7493fdf
push id117
push userfmarier@mozilla.com
push dateTue, 28 Nov 2017 20:17:16 +0000
reviewersstandard8
bugs1367704
milestone59.0a1
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));
 }