Bug 1374670 - Enabled the ESLint no-tabs rule across mozilla-central r=standard8
authorRajesh Kathiriya <rajesh.kathiriya507@gmail.com>
Tue, 04 Jul 2017 21:30:18 +0530
changeset 367855 fe520e82e9666dc975f02948b9864668c8f911c9
parent 367854 f64cc2ca04b0097d4c6b72a2a054847901f38c5c
child 367856 d8fb762465567cb1ec23d7cb76096b41b5025023
push id32147
push userkwierso@gmail.com
push dateSat, 08 Jul 2017 00:22:09 +0000
treeherdermozilla-central@06c1a0dc0fd8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersstandard8
bugs1374670
milestone56.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1374670 - Enabled the ESLint no-tabs rule across mozilla-central r=standard8 MozReview-Commit-ID: RT5QTipaOW
accessible/jsat/AccessFu.jsm
accessible/jsat/Utils.jsm
accessible/tests/crashtests/448064.xhtml
accessible/tests/mochitest/jsat/output.js
accessible/tests/mochitest/table/test_css_tables.html
accessible/tests/mochitest/textattrs/test_general.html
browser/base/content/browser.js
browser/base/content/test/general/browser_gestureSupport.js
browser/components/customizableui/CustomizableWidgets.jsm
browser/components/migration/ESEDBReader.jsm
browser/components/places/content/bookmarkProperties.js
browser/components/preferences/in-content-new/preferences.js
browser/components/preferences/in-content/preferences.js
browser/components/uitour/UITour-lib.js
browser/extensions/pocket/content/panels/js/messages.js
browser/modules/ContentWebRTC.jsm
devtools/client/inspector/rules/test/browser_rules_invalid.js
dom/indexedDB/test/unit/test_storage_manager_estimate.js
mobile/android/chrome/content/InputWidgetHelper.js
mobile/android/modules/WebsiteMetadata.jsm
security/.eslintrc.js
services/sync/tests/unit/test_utils_passphrase.js
testing/modules/MockRegistry.jsm
testing/specialpowers/content/SpecialPowersObserverAPI.js
testing/talos/talos/pageloader/chrome/report.js
toolkit/components/contextualidentity/ContextualIdentityService.jsm
toolkit/components/extensions/Schemas.jsm
toolkit/components/filepicker/nsFilePicker.js
toolkit/components/microformats/update/update.js
toolkit/components/passwordmgr/test/browser/browser_DOMFormHasPassword.js
toolkit/components/passwordmgr/test/browser/browser_DOMInputPasswordAdded.js
toolkit/components/passwordmgr/test/chrome/notification_common.js
toolkit/components/passwordmgr/test/pwmgr_common.js
toolkit/components/passwordmgr/test/test_prompt_async.html
toolkit/components/passwordmgr/test/unit/test_getPasswordFields.js
toolkit/components/printing/content/printProgress.js
toolkit/components/prompts/src/nsPrompter.js
toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js
toolkit/components/telemetry/tests/unit/test_TelemetryLockCount.js
toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
toolkit/components/windowcreator/test/test_bug1170334_wbp_xmlstyle.html
toolkit/content/aboutUrlClassifier.js
toolkit/forgetaboutsite/ForgetAboutSite.jsm
toolkit/modules/ClientID.jsm
toolkit/modules/sessionstore/FormData.jsm
toolkit/modules/tests/browser/browser_Troubleshoot.js
toolkit/mozapps/extensions/test/xpinstall/bug645699.html
toolkit/mozapps/handling/content/dialog.js
tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
tools/profiler/tests/test_enterjit_osr_disabling.js
tools/profiler/tests/test_enterjit_osr_enabling.js
--- a/accessible/jsat/AccessFu.jsm
+++ b/accessible/jsat/AccessFu.jsm
@@ -372,21 +372,21 @@ this.AccessFu = { // jshint ignore:line
         break;
       }
       case 'TabSelect':
       {
         if (this._focused) {
           // We delay this for half a second so the awesomebar could close,
           // and we could use the current coordinates for the content item.
           // XXX TODO figure out how to avoid magic wait here.
-	  this.autoMove({
-	    delay: 500,
-	    forcePresent: true,
-	    noOpIfOnScreen: true,
-	    moveMethod: 'moveFirst' });
+          this.autoMove({
+            delay: 500,
+            forcePresent: true,
+            noOpIfOnScreen: true,
+            moveMethod: 'moveFirst' });
         }
         break;
       }
       default:
       {
         // A settings change, it does not have an event type
         if (aEvent.settingName == SCREENREADER_SETTING) {
           this._systemPref = aEvent.settingValue;
--- a/accessible/jsat/Utils.jsm
+++ b/accessible/jsat/Utils.jsm
@@ -655,17 +655,17 @@ this.Logger = { // jshint ignore:line
     }
 
     if (aEvent.eventType == Events.VIRTUALCURSOR_CHANGED) {
       let event = aEvent.QueryInterface(
         Ci.nsIAccessibleVirtualCursorChangeEvent);
       let pivot = aEvent.accessible.QueryInterface(
         Ci.nsIAccessibleDocument).virtualCursor;
       str += ' (' + this.accessibleToString(event.oldAccessible) + ' -> ' +
-	this.accessibleToString(pivot.position) + ')';
+        this.accessibleToString(pivot.position) + ')';
     }
 
     return str;
   },
 
   statesToString: function statesToString(aAccessible) {
     return Utils.getState(aAccessible).toString();
   },
--- a/accessible/tests/crashtests/448064.xhtml
+++ b/accessible/tests/crashtests/448064.xhtml
@@ -14,41 +14,41 @@
 </div>
 </div>
 
 <input id="mw_a"/>
 
 
 <script>
 function dumpAccessibleNode(aNode, level) {
-	var msg = "";
+  var msg = "";
 
-	try {
-		msg += "name=\"" + aNode.name + "\" ";
-	} catch (e) {
-		msg += " noName ";
-	}
+  try {
+    msg += "name=\"" + aNode.name + "\" ";
+  } catch (e) {
+    msg += " noName ";
+  }
 
-	dump(msg + '\n');
+  dump(msg + '\n');
 }
 
 
 function dumpAccessibleTree(aNode, level) {
-	level = level || 0;
+  level = level || 0;
 
-	dumpAccessibleNode(aNode, level);
-	try {
-		var child = aNode.firstChild;
-		while (child) {
-			dumpAccessibleTree(child, level + 1);
-			child = child.nextSibling;
-		}
-	} catch (e) {
-		dump("Error visiting child nodes: " + e + '\n');
-	}
+  dumpAccessibleNode(aNode, level);
+  try {
+    var child = aNode.firstChild;
+    while (child) {
+      dumpAccessibleTree(child, level + 1);
+      child = child.nextSibling;
+    }
+  } catch (e) {
+    dump("Error visiting child nodes: " + e + '\n');
+  }
 }
 
 function A(o) {
   var acc = SpecialPowers.Cc['@mozilla.org/accessibilityService;1']
                          .getService(SpecialPowers.Ci.nsIAccessibilityService);
   return acc.getAccessibleFor(o);
 }
 
--- a/accessible/tests/mochitest/jsat/output.js
+++ b/accessible/tests/mochitest/jsat/output.js
@@ -15,17 +15,17 @@ Cu.import("resource://gre/modules/access
  *                         output
  *
  * Note: if |aOldAccOrElmOrID| is not provided, the |aAccOrElmOrID| must be
  * scoped to the "root" element in markup.
  */
 function testContextOutput(expected, aAccOrElmOrID, aOldAccOrElmOrID, aGenerator) {
   var accessible = getAccessible(aAccOrElmOrID);
   var oldAccessible = aOldAccOrElmOrID !== null ?
-	getAccessible(aOldAccOrElmOrID || 'root') : null;
+    getAccessible(aOldAccOrElmOrID || 'root') : null;
   var context = new PivotContext(accessible, oldAccessible);
   var output = aGenerator.genForContext(context);
 
   // Create a version of the output that has null members where we have
   // null members in the expected output. Those are indexes that are not testable
   // because of the changing nature of the test (different window names), or strings
   // that are inaccessible to us, like the title of parent documents.
   var masked_output = [];
--- a/accessible/tests/mochitest/table/test_css_tables.html
+++ b/accessible/tests/mochitest/table/test_css_tables.html
@@ -28,17 +28,17 @@
         ] };
       testAccessibleTree("table1", accTree);
 
       // only display:table and display:table-cell
       accTree =
         { SECTION: [
           { SECTION: [
             { TEXT_LEAF: [ ] }
-	        ] }
+          ] }
       ] };
       testAccessibleTree("table2", accTree);
 
       // display:table, display:table-row, and display:table-cell
       accTree =
         { SECTION: [
           { SECTION: [
             { TEXT_LEAF: [ ] }
--- a/accessible/tests/mochitest/textattrs/test_general.html
+++ b/accessible/tests/mochitest/textattrs/test_general.html
@@ -143,17 +143,17 @@
       testTextAttrs(ID, 9, attrs, defAttrs, 8, 11);
 
       // Normal
       attrs = {};
       testTextAttrs(ID, 11, attrs, defAttrs, 11, 18);
 
       //////////////////////////////////////////////////////////////////////////
       // area6 (CSS vertical-align property, refer to bug 445938 for details
-      // 	and sup and sub elements, refer to bug 735645 for details)
+      // and sup and sub elements, refer to bug 735645 for details)
       ID = "area6";
       defAttrs = buildDefaultTextAttrs(ID, "12pt");
       testDefaultTextAttrs(ID, defAttrs);
 
       attrs = {};
       testTextAttrs(ID, 0, attrs, defAttrs, 0, 5);
 
       attrs = { "text-position": "super", "font-size": "10pt" };
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -5780,18 +5780,18 @@ function contentAreaClick(event, isPanel
       // allows to add a sidebar panel.  The link's title attribute contains
       // the title that should be used for the sidebar panel.
       PlacesUIUtils.showBookmarkDialog({ action: "add",
                                          type: "bookmark",
                                          uri: makeURI(href),
                                          title: linkNode.getAttribute("title"),
                                          loadBookmarkInSidebar: true,
                                          hiddenRows: [ "description",
-																																																							"location",
-																																																							"keyword" ]
+                                                       "location",
+                                                       "keyword" ]
                                        }, window);
       event.preventDefault();
       return;
     }
   }
 
   handleLinkClick(event, href, linkNode);
 
--- a/browser/base/content/test/general/browser_gestureSupport.js
+++ b/browser/base/content/test/general/browser_gestureSupport.js
@@ -295,17 +295,17 @@ function test_emitLatchedEvents(eventPre
       let delta = Math.random() * (isIncreasing ? 100 : -100);
     test_utils.sendSimpleGestureEvent(eventPrefix + "Update", 0, 0, 0, delta, 0);
     cumulativeDelta += delta;
     checkBoth(2, "Increasing command was triggered", "Decreasing command was triggered");
   }
 
   // Now go back in the opposite direction.
   test_utils.sendSimpleGestureEvent(eventPrefix + "Update", 0, 0, 0,
-				    -initialDelta, 0);
+                                    -initialDelta, 0);
   cumulativeDelta += -initialDelta;
   if (isIncreasing) {
     expect.dec++;
     checkBoth(3, "Increasing command was triggered", "Decreasing command was not triggered");
   } else {
     expect.inc++;
     checkBoth(3, "Increasing command was not triggered", "Decreasing command was triggered");
   }
@@ -316,17 +316,17 @@ function test_emitLatchedEvents(eventPre
     let delta = Math.random() * (isIncreasing ? -100 : 100);
     test_utils.sendSimpleGestureEvent(eventPrefix + "Update", 0, 0, 0, delta, 0);
     cumulativeDelta += delta;
     checkBoth(4, "Increasing command was triggered", "Decreasing command was triggered");
   }
 
   // Go back to the original direction. The original command should trigger.
   test_utils.sendSimpleGestureEvent(eventPrefix + "Update", 0, 0, 0,
-				    initialDelta, 0);
+                                    initialDelta, 0);
   cumulativeDelta += initialDelta;
   if (isIncreasing) {
     expect.inc++;
     checkBoth(5, "Increasing command was not triggered", "Decreasing command was triggered");
   } else {
     expect.dec++;
     checkBoth(5, "Increasing command was triggered", "Decreasing command was not triggered");
   }
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -1178,19 +1178,19 @@ const CustomizableWidgets = [
 
     updateVisibility(aNode) {
       aNode.hidden = !Services.prefs.getBoolPref("privacy.userContext.enabled");
     },
 
     observe(aSubject, aTopic, aData) {
       let {instances} = CustomizableUI.getWidget("containers-panelmenu");
       for (let {node} of instances) {
-	if (node) {
-	  this.updateVisibility(node);
-	}
+        if (node) {
+          this.updateVisibility(node);
+        }
       }
     },
 
     QueryInterface: XPCOMUtils.generateQI([
       Ci.nsISupportsWeakReference,
       Ci.nsIObserver
     ]),
   }];
--- a/browser/components/migration/ESEDBReader.jsm
+++ b/browser/components/migration/ESEDBReader.jsm
@@ -84,18 +84,18 @@ ESE.JET_INSTANCE = ESE.JET_API_ITEM;
 ESE.JET_SESID = ESE.JET_API_ITEM;
 ESE.JET_TABLEID = ESE.JET_API_ITEM;
 ESE.JET_COLUMNID = ctypes.unsigned_long;
 ESE.JET_GRBIT = ctypes.unsigned_long;
 ESE.JET_COLTYP = ctypes.unsigned_long;
 ESE.JET_DBID = ctypes.unsigned_long;
 
 ESE.JET_COLUMNDEF = new ctypes.StructType("JET_COLUMNDEF", [
-  {"cbStruct": ctypes.unsigned_long},
-  {"columnid": ESE.JET_COLUMNID	},
+  {"cbStruct": ctypes.unsigned_long },
+  {"columnid": ESE.JET_COLUMNID },
   {"coltyp": ESE.JET_COLTYP },
   {"wCountry": ctypes.unsigned_short }, // sepcifies the country/region for the column definition
   {"langid": ctypes.unsigned_short },
   {"cp": ctypes.unsigned_short },
   {"wCollate": ctypes.unsigned_short }, /* Must be 0 */
   {"cbMax": ctypes.unsigned_long },
   {"grbit": ESE.JET_GRBIT }
 ]);
--- a/browser/components/places/content/bookmarkProperties.js
+++ b/browser/components/places/content/bookmarkProperties.js
@@ -366,19 +366,19 @@ var BookmarkPropertiesPanel = {
           let newHeight = document.getElementById(id).boxObject.height;
           this._height += -oldHeight + newHeight;
           elementsHeight.set(id, newHeight);
         }
         break;
     }
   },
 
-	// Hack for implementing batched-Undo around the editBookmarkOverlay
-	// instant-apply code. For all the details see the comment above beginBatch
-	// in browser-places.js
+  // Hack for implementing batched-Undo around the editBookmarkOverlay
+  // instant-apply code. For all the details see the comment above beginBatch
+  // in browser-places.js
   _batchBlockingDeferred: null,
   _beginBatch() {
     if (this._batching)
       return;
     if (PlacesUIUtils.useAsyncTransactions) {
       this._batchBlockingDeferred = PromiseUtils.defer();
       PlacesTransactions.batch(async () => {
         await this._batchBlockingDeferred.promise;
--- a/browser/components/preferences/in-content-new/preferences.js
+++ b/browser/components/preferences/in-content-new/preferences.js
@@ -273,17 +273,17 @@ function internalPrefCategoryNameToFrien
 // altough the later still lets us revert by using the escape key.
 //
 // The constants are useful to interpret the return value of the function.
 const CONFIRM_RESTART_PROMPT_RESTART_NOW = 0;
 const CONFIRM_RESTART_PROMPT_CANCEL = 1;
 const CONFIRM_RESTART_PROMPT_RESTART_LATER = 2;
 function confirmRestartPrompt(aRestartToEnable, aDefaultButtonIndex,
                               aWantRevertAsCancelButton,
-			      aWantRestartLaterButton) {
+                              aWantRestartLaterButton) {
   let brandName = document.getElementById("bundleBrand").getString("brandShortName");
   let bundle = document.getElementById("bundlePreferences");
   let msg = bundle.getFormattedString(aRestartToEnable ?
                                       "featureEnableRequiresRestart" :
                                       "featureDisableRequiresRestart",
                                       [brandName]);
   let title = bundle.getFormattedString("shouldRestartTitle", [brandName]);
   let prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);
--- a/browser/components/preferences/in-content/preferences.js
+++ b/browser/components/preferences/in-content/preferences.js
@@ -240,17 +240,17 @@ function internalPrefCategoryNameToFrien
 // altough the later still lets us revert by using the escape key.
 //
 // The constants are useful to interpret the return value of the function.
 const CONFIRM_RESTART_PROMPT_RESTART_NOW = 0;
 const CONFIRM_RESTART_PROMPT_CANCEL = 1;
 const CONFIRM_RESTART_PROMPT_RESTART_LATER = 2;
 function confirmRestartPrompt(aRestartToEnable, aDefaultButtonIndex,
                               aWantRevertAsCancelButton,
-			      aWantRestartLaterButton) {
+                              aWantRestartLaterButton) {
   let brandName = document.getElementById("bundleBrand").getString("brandShortName");
   let bundle = document.getElementById("bundlePreferences");
   let msg = bundle.getFormattedString(aRestartToEnable ?
                                       "featureEnableRequiresRestart" :
                                       "featureDisableRequiresRestart",
                                       [brandName]);
   let title = bundle.getFormattedString("shouldRestartTitle", [brandName]);
   let prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);
--- a/browser/components/uitour/UITour-lib.js
+++ b/browser/components/uitour/UITour-lib.js
@@ -54,19 +54,19 @@ if (typeof Mozilla == "undefined") {
     return Math.random().toString(36).replace(/[^a-z]+/g, "");
   }
 
   function _waitForCallback(callback) {
     var id = _generateCallbackID();
 
     function listener(event) {
       if (typeof event.detail != "object")
-	return;
+        return;
       if (event.detail.callbackID != id)
-	return;
+        return;
 
       document.removeEventListener("mozUITourResponse", listener);
       callback(event.detail.data);
     }
     document.addEventListener("mozUITourResponse", listener);
 
     return id;
   }
@@ -261,22 +261,22 @@ if (typeof Mozilla == "undefined") {
    * };
    *
    * Mozilla.UITour.showInfo('appMenu', 'my title', 'my text', icon, buttons, options);
    */
   Mozilla.UITour.showInfo = function(target, title, text, icon, buttons, options) {
     var buttonData = [];
     if (Array.isArray(buttons)) {
       for (var i = 0; i < buttons.length; i++) {
-	buttonData.push({
-	  label: buttons[i].label,
-	  icon: buttons[i].icon,
-	  style: buttons[i].style,
-	  callbackID: _waitForCallback(buttons[i].callback)
-	});
+        buttonData.push({
+          label: buttons[i].label,
+          icon: buttons[i].icon,
+          style: buttons[i].style,
+          callbackID: _waitForCallback(buttons[i].callback)
+        });
       }
     }
 
     var closeButtonCallbackID, targetCallbackID;
     if (options && options.closeButtonCallback)
       closeButtonCallbackID = _waitForCallback(options.closeButtonCallback);
     if (options && options.targetCallback)
       targetCallbackID = _waitForCallback(options.targetCallback);
@@ -366,18 +366,18 @@ if (typeof Mozilla == "undefined") {
       delay = Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY;
     }
 
     function nextTheme() {
       var theme = themes.shift();
       themes.push(theme);
 
       _sendEvent("previewTheme", {
-	theme: JSON.stringify(theme),
-	state: true
+        theme: JSON.stringify(theme),
+        state: true
       });
 
       callback(theme);
     }
 
     themeIntervalId = setInterval(nextTheme, delay);
     nextTheme();
   };
--- a/browser/extensions/pocket/content/panels/js/messages.js
+++ b/browser/extensions/pocket/content/panels/js/messages.js
@@ -18,57 +18,57 @@ var pktPanelMessaging = (function() {
 
  function panelPrefixedMessageId(panelId, messageId) {
    return prefixedMessageId(panelId + "_" + messageId);
  }
 
  function addMessageListener(panelId, messageId, callback) {
    document.addEventListener(panelPrefixedMessageId(panelId, messageId), function(e) {
 
-			callback(JSON.parse(e.target.getAttribute("payload"))[0]);
+    callback(JSON.parse(e.target.getAttribute("payload"))[0]);
 
-			// TODO: Figure out why e.target.parentNode is null
-			// e.target.parentNode.removeChild(e.target);
+    // TODO: Figure out why e.target.parentNode is null
+    // e.target.parentNode.removeChild(e.target);
 
-		});
+    });
 
-	}
+  }
 
-	function removeMessageListener(panelId, messageId, callback) {
+  function removeMessageListener(panelId, messageId, callback) {
    document.removeEventListener(panelPrefixedMessageId(panelId, messageId), callback);
-	}
+  }
 
  function sendMessage(panelId, messageId, payload, callback) {
    // Payload needs to be an object in format:
    // { panelId: panelId, data: {} }
    var messagePayload = {
      panelId,
      data: (payload || {})
    };
 
-		// Create a callback to listen for a response
-		if (callback) {
-	        var messageResponseId = messageId + "Response";
-	        var responseListener = function(responsePayload) {
-	            callback(responsePayload);
-	            removeMessageListener(panelId, messageResponseId, responseListener);
-	        }
+    // Create a callback to listen for a response
+    if (callback) {
+      var messageResponseId = messageId + "Response";
+      var responseListener = function(responsePayload) {
+        callback(responsePayload);
+        removeMessageListener(panelId, messageResponseId, responseListener);
+      }
 
-	        addMessageListener(panelId, messageResponseId, responseListener);
-	    }
+      addMessageListener(panelId, messageResponseId, responseListener);
+    }
 
-	    // Send message
-		var element = document.createElement("PKTMessageFromPanelElement");
-		element.setAttribute("payload", JSON.stringify([messagePayload]));
-		document.documentElement.appendChild(element);
+      // Send message
+    var element = document.createElement("PKTMessageFromPanelElement");
+    element.setAttribute("payload", JSON.stringify([messagePayload]));
+    document.documentElement.appendChild(element);
 
-		var evt = document.createEvent("Events");
-		evt.initEvent(prefixedMessageId(messageId), true, false);
-		element.dispatchEvent(evt);
-	}
+    var evt = document.createEvent("Events");
+    evt.initEvent(prefixedMessageId(messageId), true, false);
+    element.dispatchEvent(evt);
+  }
 
 
     /**
      * Public functions
      */
     return {
       panelIdFromURL,
         addMessageListener,
--- a/browser/modules/ContentWebRTC.jsm
+++ b/browser/modules/ContentWebRTC.jsm
@@ -29,30 +29,30 @@ this.ContentWebRTC = {
     }
   },
 
   // This observer is registered in ContentObservers.js to avoid
   // loading this .jsm when WebRTC is not in use.
   observe(aSubject, aTopic, aData) {
     switch (aTopic) {
       case "getUserMedia:request":
-	handleGUMRequest(aSubject, aTopic, aData);
-	break;
+        handleGUMRequest(aSubject, aTopic, aData);
+        break;
       case "recording-device-stopped":
-	handleGUMStop(aSubject, aTopic, aData);
-	break;
+        handleGUMStop(aSubject, aTopic, aData);
+        break;
       case "PeerConnection:request":
-	handlePCRequest(aSubject, aTopic, aData);
-	break;
+        handlePCRequest(aSubject, aTopic, aData);
+        break;
       case "recording-device-events":
-	updateIndicators(aSubject, aTopic, aData);
-	break;
+        updateIndicators(aSubject, aTopic, aData);
+        break;
       case "recording-window-ended":
-	removeBrowserSpecificIndicator(aSubject, aTopic, aData);
-	break;
+        removeBrowserSpecificIndicator(aSubject, aTopic, aData);
+        break;
     }
   },
 
   receiveMessage(aMessage) {
     switch (aMessage.name) {
       case "rtcpeer:Allow":
       case "rtcpeer:Deny": {
         let callID = aMessage.data.callID;
--- a/devtools/client/inspector/rules/test/browser_rules_invalid.js
+++ b/devtools/client/inspector/rules/test/browser_rules_invalid.js
@@ -5,20 +5,20 @@
 "use strict";
 
 // Test that an invalid property still lets us display the rule view
 // Bug 1235603.
 
 const TEST_URI = `
   <style>
     div {
-	background: #fff;
-	font-family: sans-serif;
-	url(display-table.min.htc);
-   }
+        background: #fff;
+        font-family: sans-serif;
+        url(display-table.min.htc);
+    }
  </style>
  <body>
     <div id="testid" class="testclass">Styled Node</div>
  </body>
 `;
 
 add_task(function* () {
   yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
--- a/dom/indexedDB/test/unit/test_storage_manager_estimate.js
+++ b/dom/indexedDB/test/unit/test_storage_manager_estimate.js
@@ -1,14 +1,14 @@
 var testGenerator = testSteps();
 
 function* testSteps()
 {
   const name = this.window ? window.location.pathname :
-	       "test_storage_manager_estimate.js";
+               "test_storage_manager_estimate.js";
   const objectStoreName = "storagesManager";
   const arraySize = 1e6;
 
   ok("estimate" in navigator.storage, "Has estimate function");
   is(typeof navigator.storage.estimate, "function", "estimate is function");
   ok(navigator.storage.estimate() instanceof Promise,
      "estimate() method exists and returns a Promise");
 
--- a/mobile/android/chrome/content/InputWidgetHelper.js
+++ b/mobile/android/chrome/content/InputWidgetHelper.js
@@ -94,15 +94,15 @@ var InputWidgetHelper = {
       aElement.dispatchEvent(evt);
     }, 0);
   },
 
   _isDisabledElement : function(aElement) {
     let currentElement = aElement;
     while (currentElement) {
       if (currentElement.disabled)
-	return true;
+        return true;
 
       currentElement = currentElement.parentElement;
     }
     return false;
   }
 };
--- a/mobile/android/modules/WebsiteMetadata.jsm
+++ b/mobile/android/modules/WebsiteMetadata.jsm
@@ -43,17 +43,17 @@ var WebsiteMetadata = {
   }
 };
 
 // #################################################################################################
 // # Modified version of makeUrlAbsolute() to not import url parser library (and dependencies)
 // #################################################################################################
 
 function makeUrlAbsolute(context, relative) {
-	var a = context.doc.createElement('a');
+    var a = context.doc.createElement('a');
     a.href = relative;
     return a.href;
 }
 
 // #################################################################################################
 // # page-metadata-parser
 // # https://github.com/mozilla/page-metadata-parser/
 // # 61c58cbd0f0bf2153df832a388a79c66b288b98c
--- a/security/.eslintrc.js
+++ b/security/.eslintrc.js
@@ -57,19 +57,16 @@ module.exports = {
     "no-new-wrappers": "error",
 
     // Disallow use of assignment in return statement.
     "no-return-assign": ["error", "always"],
 
     // Disallow use of the comma operator.
     "no-sequences": "error",
 
-    // Disallow tabs.
-    "no-tabs": "error",
-
     // Disallow template literal placeholder syntax in regular strings.
     "no-template-curly-in-string": "error",
 
     // Disallow use of this/super before calling super() in constructors.
     "no-this-before-super": "error",
 
     // Disallow throwing literals (eg. |throw "error"| instead of
     // |throw new Error("error")|)
--- a/services/sync/tests/unit/test_utils_passphrase.js
+++ b/services/sync/tests/unit/test_utils_passphrase.js
@@ -1,8 +1,9 @@
+/* eslint no-tabs:"off" */
 Cu.import("resource://services-sync/util.js");
 
 function run_test() {
   _("Normalize passphrase recognizes hyphens.");
   const pp = "26ect2thczm599m2ffqarbicjq";
   const hyphenated = "2-6ect2-thczm-599m2-ffqar-bicjq";
   do_check_eq(Utils.normalizePassphrase(hyphenated), pp);
 
--- a/testing/modules/MockRegistry.jsm
+++ b/testing/modules/MockRegistry.jsm
@@ -65,17 +65,17 @@ class MockRegistry {
 
       getValueType(name) {
         return Ci.nsIWindowsRegKey.TYPE_STRING;
       },
 
       getValueName(index) {
         if (!this.values || index >= this.values.size)
           throw Components.results.NS_ERROR_FAILURE;
-	let names = Array.from(this.values.keys());
+        let names = Array.from(this.values.keys());
         return names[index];
       },
 
       readStringValue(name) {
         if (!this.values) {
           throw new Error("invalid registry path");
         }
         return this.values.get(name);
--- a/testing/specialpowers/content/SpecialPowersObserverAPI.js
+++ b/testing/specialpowers/content/SpecialPowersObserverAPI.js
@@ -367,17 +367,17 @@ SpecialPowersObserverAPI.prototype = {
               return prefs.getComplexValue(prefName, iid);
             return prefs.setComplexValue(prefName, iid, prefValue);
           case "":
             if (aMessage.json.op == "clear") {
               prefs.clearUserPref(prefName);
               return undefined;
             }
         }
-        return undefined;	// See comment at the beginning of this function.
+        return undefined; // See comment at the beginning of this function.
       }
 
       case "SPProcessCrashService": {
         switch (aMessage.json.op) {
           case "register-observer":
             this._addProcessCrashObservers();
             break;
           case "unregister-observer":
@@ -387,17 +387,17 @@ SpecialPowersObserverAPI.prototype = {
             return this._deleteCrashDumpFiles(aMessage.json.filenames);
           case "find-crash-dump-files":
             return this._findCrashDumpFiles(aMessage.json.crashDumpFilesToIgnore);
           case "delete-pending-crash-dump-files":
             return this._deletePendingCrashDumpFiles();
           default:
             throw new SpecialPowersError("Invalid operation for SPProcessCrashService");
         }
-        return undefined;	// See comment at the beginning of this function.
+        return undefined; // See comment at the beginning of this function.
       }
 
       case "SPPermissionManager": {
         let msg = aMessage.json;
         let principal = msg.principal;
 
         switch (msg.op) {
           case "add":
@@ -411,17 +411,17 @@ SpecialPowersObserverAPI.prototype = {
             return hasPerm == Ci.nsIPermissionManager.ALLOW_ACTION;
           case "test":
             let testPerm = Services.perms.testPermissionFromPrincipal(principal, msg.type);
             return testPerm == msg.value;
           default:
             throw new SpecialPowersError(
               "Invalid operation for SPPermissionManager");
         }
-        return undefined;	// See comment at the beginning of this function.
+        return undefined; // See comment at the beginning of this function.
       }
 
       case "SPSetTestPluginEnabledState": {
         var plugin = getTestPlugin(aMessage.data.pluginName);
         if (!plugin) {
           return undefined;
         }
         var oldEnabledState = plugin.enabledState;
@@ -508,17 +508,17 @@ SpecialPowersObserverAPI.prototype = {
         try {
           Components.utils.evalInSandbox(jsScript, sb, "1.8", scriptName, 1);
         } catch (e) {
           throw new SpecialPowersError(
             "Error while executing chrome script '" + scriptName + "':\n" +
             e + "\n" +
             e.fileName + ":" + e.lineNumber);
         }
-        return undefined;	// See comment at the beginning of this function.
+        return undefined; // See comment at the beginning of this function.
       }
 
       case "SPChromeScriptMessage": {
         let id = aMessage.json.id;
         let name = aMessage.json.name;
         let message = aMessage.json.message;
         return this._chromeScriptListeners
                    .filter(o => (o.name == name && o.id == id))
--- a/testing/talos/talos/pageloader/chrome/report.js
+++ b/testing/talos/talos/pageloader/chrome/report.js
@@ -14,26 +14,26 @@ function findCommonPrefixLength(strs) {
 
   var len = 0;
   do {
     var newlen = len + 1;
     var newprefix = null;
     var failed = false;
     for (var i = 0; i < strs.length; i++) {
       if (newlen > strs[i].length) {
-	failed = true;
-	break;
+        failed = true;
+        break;
       }
 
       var s = strs[i].substr(0, newlen);
       if (newprefix == null) {
-	newprefix = s;
+        newprefix = s;
       } else if (newprefix != s) {
-	failed = true;
-	break;
+        failed = true;
+        break;
       }
     }
 
     if (failed)
       break;
 
     len++;
   } while (true);
--- a/toolkit/components/contextualidentity/ContextualIdentityService.jsm
+++ b/toolkit/components/contextualidentity/ContextualIdentityService.jsm
@@ -315,27 +315,27 @@ function _ContextualIdentityService(path
   },
 
   _forEachContainerTab(callback, userContextId = 0) {
     let windowList = Services.wm.getEnumerator("navigator:browser");
     while (windowList.hasMoreElements()) {
       let win = windowList.getNext();
 
       if (win.closed || !win.gBrowser) {
-	continue;
+        continue;
       }
 
       let tabbrowser = win.gBrowser;
       for (let i = tabbrowser.tabContainer.childNodes.length - 1; i >= 0; --i) {
         let tab = tabbrowser.tabContainer.childNodes[i];
-	if (tab.hasAttribute("usercontextid") &&
-            (!userContextId ||
-             parseInt(tab.getAttribute("usercontextid"), 10) == userContextId)) {
-	  callback(tab, tabbrowser);
-	}
+        if (tab.hasAttribute("usercontextid") &&
+                  (!userContextId ||
+                   parseInt(tab.getAttribute("usercontextid"), 10) == userContextId)) {
+          callback(tab, tabbrowser);
+        }
       }
     }
   },
 
   telemetry(userContextId) {
     let identity = this.getPublicIdentityFromId(userContextId);
 
     // Let's ignore unknown identities for now.
--- a/toolkit/components/extensions/Schemas.jsm
+++ b/toolkit/components/extensions/Schemas.jsm
@@ -20,19 +20,19 @@ Cu.import("resource://gre/modules/XPCOMU
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 var {
   DefaultMap,
   DefaultWeakMap,
   instanceOf,
 } = ExtensionUtils;
 
 XPCOMUtils.defineLazyModuleGetter(this, "ExtensionParent",
-				  "resource://gre/modules/ExtensionParent.jsm");
+                                  "resource://gre/modules/ExtensionParent.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
-				  "resource://gre/modules/NetUtil.jsm");
+                                  "resource://gre/modules/NetUtil.jsm");
 XPCOMUtils.defineLazyServiceGetter(this, "contentPolicyService",
                                    "@mozilla.org/addons/content-policy;1",
                                    "nsIAddonContentPolicy");
 
 XPCOMUtils.defineLazyGetter(this, "StartupCache", () => ExtensionParent.StartupCache);
 
 this.EXPORTED_SYMBOLS = ["Schemas"];
 
--- a/toolkit/components/filepicker/nsFilePicker.js
+++ b/toolkit/components/filepicker/nsFilePicker.js
@@ -326,12 +326,12 @@ function srGetStrBundle(path) {
     } catch (ex) {
       dump("\n--** strBundleService createInstance failed **--\n");
       return null;
     }
   }
 
   strBundle = strBundleService.createBundle(path);
   if (!strBundle) {
-	dump("\n--** strBundle createInstance failed **--\n");
+    dump("\n--** strBundle createInstance failed **--\n");
   }
   return strBundle;
 }
--- a/toolkit/components/microformats/update/update.js
+++ b/toolkit/components/microformats/update/update.js
@@ -1,266 +1,266 @@
 /* !
-	update.js
+  update.js
 
-	run $ npm install
-	run $ node unpdate.js
+  run $ npm install
+  run $ node unpdate.js
 
-	Downloads latest version of microformat-shiv and it tests form github repo
-	Files downloaded:
-	* microformat-shiv.js (note: modern version)
-	* lib
-	* test/interface-tests
-	* test/module-tests
-	* test/standards-tests
-	* test/static
+  Downloads latest version of microformat-shiv and it tests form github repo
+  Files downloaded:
+  * microformat-shiv.js (note: modern version)
+  * lib
+  * test/interface-tests
+  * test/module-tests
+  * test/standards-tests
+  * test/static
 
-	Copyright (C) 2015 Glenn Jones. All Rights Reserved.
-	MIT License: https://raw.github.com/glennjones/microformat-shiv/master/license.txt
-	*/
+  Copyright (C) 2015 Glenn Jones. All Rights Reserved.
+  MIT License: https://raw.github.com/glennjones/microformat-shiv/master/license.txt
+*/
 
 // configuration
 var deployDir = "../";
 var exportedSymbol = 'try {\n    // mozilla jsm support\n    Components.utils.importGlobalProperties(["URL"]);\n} catch(e) {}\nthis.EXPORTED_SYMBOLS = [\'Microformats\'];';
 
 
 
-var path			= require("path"),
-	request 		= require("request"),
-	fs 				= require("fs-extra"),
-	download 		= require("download-github-repo");
+var path     = require("path"),
+    request  = require("request"),
+    fs       = require("fs-extra"),
+    download = require("download-github-repo");
 
 
 var repo = "glennjones/microformat-shiv",
-	tempDir = path.resolve(__dirname, "temp-repo"),
-	deployDirResolved = path.resolve(__dirname, deployDir),
-	pathList = [
-		["/modern/microformat-shiv-modern.js", "/microformat-shiv.js"],
-		["/lib", "/test/lib"],
-		["/test/interface-tests", "/test/interface-tests"],
-		["/test/module-tests", "/test/module-tests"],
-		["/test/standards-tests", "/test/standards-tests"],
-		["/test/static", "/test/static"]
-		];
+    tempDir = path.resolve(__dirname, "temp-repo"),
+    deployDirResolved = path.resolve(__dirname, deployDir),
+    pathList = [
+      ["/modern/microformat-shiv-modern.js", "/microformat-shiv.js"],
+      ["/lib", "/test/lib"],
+      ["/test/interface-tests", "/test/interface-tests"],
+      ["/test/module-tests", "/test/module-tests"],
+      ["/test/standards-tests", "/test/standards-tests"],
+      ["/test/static", "/test/static"]
+    ];
 
 
 
 getLastBuildState( repo, function( err, buildState) {
-	if (buildState) {
-		console.log("last build state:", buildState);
+  if (buildState) {
+    console.log("last build state:", buildState);
 
-		if (buildState === "passed") {
+    if (buildState === "passed") {
 
-			console.log("downloading git repo", repo);
-			getLastCommitDate( repo, function( err, date) {
-				if (date) {
-					console.log( "last commit:", new Date(date).toString() );
-				}
-			});
-			updateFromRepo();
+      console.log("downloading git repo", repo);
+      getLastCommitDate( repo, function( err, date) {
+      if (date) {
+        console.log( "last commit:", new Date(date).toString() );
+      }
+      });
+      updateFromRepo();
 
-		} else {
-			console.log("not updating because of build state is failing please contact Glenn Jones glennjones@gmail.com");
-		}
+    } else {
+      console.log("not updating because of build state is failing please contact Glenn Jones glennjones@gmail.com");
+    }
 
-	} else {
-		console.log("could not get build state from travis-ci:", err);
-	}
+    } else {
+      console.log("could not get build state from travis-ci:", err);
+  }
 });
 
 
 /**
  * updates from directories and files from repo
  *
  */
 function updateFromRepo() {
-	download(repo, tempDir, function(err, data) {
+  download(repo, tempDir, function(err, data) {
 
-		// the err and data from download-github-repo give false negatives
-		if ( fs.existsSync( tempDir ) ) {
+    // the err and data from download-github-repo give false negatives
+    if ( fs.existsSync( tempDir ) ) {
 
-			var version = getRepoVersion();
-			removeCurrentFiles( pathList, deployDirResolved );
-			addNewFiles( pathList, deployDirResolved );
-			fs.removeSync(tempDir);
+      var version = getRepoVersion();
+      removeCurrentFiles( pathList, deployDirResolved );
+      addNewFiles( pathList, deployDirResolved );
+      fs.removeSync(tempDir);
 
-			// changes files for firefox
-			replaceInFile("/test/module-tests/index.html", /..\/..\/lib\//g, "../lib/" );
-			addExportedSymbol( "/microformat-shiv.js" );
+      // changes files for firefox
+      replaceInFile("/test/module-tests/index.html", /..\/..\/lib\//g, "../lib/" );
+      addExportedSymbol( "/microformat-shiv.js" );
 
-			console.log("microformat-shiv is now uptodate to v" + version);
+      console.log("microformat-shiv is now uptodate to v" + version);
 
-		} else {
-			console.log("error getting repo", err);
-		}
+    } else {
+      console.log("error getting repo", err);
+    }
 
-	});
+  });
 }
 
 
 /**
  * removes old version of delpoyed directories and files
  *
  * @param  {Array} pathList
  * @param  {String} deployDirResolved
  */
 function removeCurrentFiles( pathList, deployDirResolved ) {
-	pathList.forEach( function( path ) {
-		console.log("removed:", deployDirResolved + path[1]);
-		fs.removeSync(deployDirResolved + path[1]);
-	});
+  pathList.forEach( function( path ) {
+    console.log("removed:", deployDirResolved + path[1]);
+    fs.removeSync(deployDirResolved + path[1]);
+  });
 }
 
 
 /**
  * copies over required directories and files into deployed path
  *
  * @param  {Array} pathList
  * @param  {String} deployDirResolved
  */
 function addNewFiles( pathList, deployDirResolved ) {
-	pathList.forEach( function( path ) {
-		console.log("added:", deployDirResolved + path[1]);
-		fs.copySync(tempDir + path[0], deployDirResolved + path[1]);
-	});
+  pathList.forEach( function( path ) {
+    console.log("added:", deployDirResolved + path[1]);
+    fs.copySync(tempDir + path[0], deployDirResolved + path[1]);
+  });
 
 }
 
 
 /**
  * gets the repo version number
  *
  * @return {String}
  */
 function getRepoVersion() {
-	var pack = fs.readFileSync(path.resolve(tempDir, "package.json"), {encoding: "utf8"});
-	if (pack) {
-		pack = JSON.parse(pack)
-		if (pack && pack.version) {
-			return pack.version;
-		}
-	}
-	return "";
+  var pack = fs.readFileSync(path.resolve(tempDir, "package.json"), {encoding: "utf8"});
+  if (pack) {
+    pack = JSON.parse(pack)
+    if (pack && pack.version) {
+      return pack.version;
+    }
+  }
+  return "";
 }
 
 
 /**
  * get the last commit date from github repo
  *
  * @param  {String} repo
  * @param  {Function} callback
  */
 function getLastCommitDate( repo, callback ) {
 
-	var options = {
-	  url: "https://api.github.com/repos/" + repo + "/commits?per_page=1",
-	  headers: {
-	    "User-Agent": "request"
-	  }
-	};
+  var options = {
+    url: "https://api.github.com/repos/" + repo + "/commits?per_page=1",
+    headers: {
+      "User-Agent": "request"
+    }
+  };
 
-	request(options, function(error, response, body) {
-	  if (!error && response.statusCode == 200) {
-		var date = null,
-			json = JSON.parse(body);
-			if (json && json.length && json[0].commit && json[0].commit.author ) {
-				date = json[0].commit.author.date;
-			}
-	    callback(null, date);
-	  } else {
-		  console.log(error, response, body);
-		  callback("fail to get last commit date", null);
-	  }
-	});
+  request(options, function(error, response, body) {
+    if (!error && response.statusCode == 200) {
+      var date = null,
+      json = JSON.parse(body);
+      if (json && json.length && json[0].commit && json[0].commit.author ) {
+        date = json[0].commit.author.date;
+      }
+      callback(null, date);
+    } else {
+      console.log(error, response, body);
+      callback("fail to get last commit date", null);
+    }
+  });
 }
 
 
 /**
  * get the last build state from travis-ci
  *
  * @param  {String} repo
  * @param  {Function} callback
  */
 function getLastBuildState( repo, callback ) {
 
-	var options = {
-	  url: "https://api.travis-ci.org/repos/" + repo,
-	  headers: {
-	    "User-Agent": "request",
-		"Accept": "application/vnd.travis-ci.2+json"
-	  }
-	};
+  var options = {
+    url: "https://api.travis-ci.org/repos/" + repo,
+    headers: {
+      "User-Agent": "request",
+      "Accept": "application/vnd.travis-ci.2+json"
+    }
+  };
 
-	request(options, function(error, response, body) {
-	  if (!error && response.statusCode == 200) {
-		var buildState = null,
-			json = JSON.parse(body);
-			if (json && json.repo && json.repo.last_build_state ) {
-				buildState = json.repo.last_build_state;
-			}
-	    callback(null, buildState);
-	  } else {
-		  console.log(error, response, body);
-		  callback("fail to get last build state", null);
-	  }
-	});
+  request(options, function(error, response, body) {
+    if (!error && response.statusCode == 200) {
+      var buildState = null,
+      json = JSON.parse(body);
+      if (json && json.repo && json.repo.last_build_state ) {
+        buildState = json.repo.last_build_state;
+      }
+      callback(null, buildState);
+    } else {
+      console.log(error, response, body);
+      callback("fail to get last build state", null);
+    }
+  });
 }
 
 
 /**
  * adds exported symbol to microformat-shiv.js file
  *
  * @param  {String} path
  * @param  {String} content
  */
 function addExportedSymbol( path ) {
-	if (path === "/microformat-shiv.js") {
-		fs.appendFileSync(deployDirResolved + "/microformat-shiv.js", "\r\n" + exportedSymbol + "\r\n");
-		console.log("appended exported symbol to microformat-shiv.js");
-	}
+  if (path === "/microformat-shiv.js") {
+    fs.appendFileSync(deployDirResolved + "/microformat-shiv.js", "\r\n" + exportedSymbol + "\r\n");
+    console.log("appended exported symbol to microformat-shiv.js");
+  }
 }
 
 
 /**
  * adds exported symbol to microformat-shiv.js file
  *
  * @param  {String} path
  * @param  {String} content
  */
 function replaceInFile( path, findStr, replaceStr ) {
-	readFile(deployDirResolved + path, function(err, fileStr) {
-		if (fileStr) {
-			fileStr = fileStr.replace(findStr, replaceStr)
-			writeFile(deployDirResolved + path, fileStr);
-			console.log("replaced " + findStr + " with " + replaceStr + " in " + path);
-		} else {
-			console.log("error replaced strings in " + path);
-		}
-	})
+  readFile(deployDirResolved + path, function(err, fileStr) {
+    if (fileStr) {
+      fileStr = fileStr.replace(findStr, replaceStr)
+      writeFile(deployDirResolved + path, fileStr);
+      console.log("replaced " + findStr + " with " + replaceStr + " in " + path);
+    } else {
+      console.log("error replaced strings in " + path);
+    }
+  })
 }
 
 
 /**
  * write a file
  *
  * @param  {String} path
  * @param  {String} content
  */
 function writeFile(path, content) {
-	fs.writeFile(path, content, "utf8", function(err) {
-		if (err) {
-			console.log(err);
-		} else {
-			console.log("The file: " + path + " was saved");
-		}
-	});
+  fs.writeFile(path, content, "utf8", function(err) {
+    if (err) {
+      console.log(err);
+    } else {
+      console.log("The file: " + path + " was saved");
+    }
+  });
 }
 
 
 /**
  * read a file
  *
  * @param  {String} path
  * @param  {Function} callback
  */
 function readFile(path, callback) {
-	fs.readFile(path, "utf8", callback);
+  fs.readFile(path, "utf8", callback);
 }
--- a/toolkit/components/passwordmgr/test/browser/browser_DOMFormHasPassword.js
+++ b/toolkit/components/passwordmgr/test/browser/browser_DOMFormHasPassword.js
@@ -77,18 +77,18 @@ function task(contentIds) {
   return promise;
 }
 
 add_task(async function() {
   let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
 
   let promise = ContentTask.spawn(tab.linkedBrowser, ids, task);
   tab.linkedBrowser.loadURI("data:text/html;charset=utf-8," +
-			    "<html><body>" +
-			    "<form id='" + ids.FORM1_ID + "'>" +
+                            "<html><body>" +
+                            "<form id='" + ids.FORM1_ID + "'>" +
                             "<input id='" + ids.CHANGE_INPUT_ID + "'></form>" +
-			    "<form id='" + ids.FORM2_ID + "'></form>" +
-			    "</body></html>");
+                            "<form id='" + ids.FORM2_ID + "'></form>" +
+                            "</body></html>");
   await promise;
 
   ok(true, "Test completed");
   gBrowser.removeCurrentTab();
 });
--- a/toolkit/components/passwordmgr/test/browser/browser_DOMInputPasswordAdded.js
+++ b/toolkit/components/passwordmgr/test/browser/browser_DOMInputPasswordAdded.js
@@ -83,17 +83,17 @@ function task(contentConsts) {
 
   return promise;
 }
 
 add_task(async function() {
   let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
   let promise = ContentTask.spawn(tab.linkedBrowser, consts, task);
   tab.linkedBrowser.loadURI("data:text/html;charset=utf-8," +
-			    "<html><body>" +
-			    "<form id='" + consts.FORM1_ID + "'>" +
+                            "<html><body>" +
+                            "<form id='" + consts.FORM1_ID + "'>" +
                             "<input id='" + consts.CHANGE_INPUT_ID + "'></form>" +
-			    "<form id='" + consts.FORM2_ID + "'></form>" +
-			    "</body></html>");
+                            "<form id='" + consts.FORM2_ID + "'></form>" +
+                            "</body></html>");
   await promise;
   gBrowser.removeCurrentTab();
 });
 
--- a/toolkit/components/passwordmgr/test/chrome/notification_common.js
+++ b/toolkit/components/passwordmgr/test/chrome/notification_common.js
@@ -1,17 +1,17 @@
 /*
  * Initialization: for each test, remove any prior notifications.
  */
 function cleanUpPopupNotifications() {
     var container = getPopupNotifications(window.top);
     var notes = container._currentNotifications;
     info(true, "Removing " + notes.length + " popup notifications.");
     for (var i = notes.length - 1; i >= 0; i--) {
-	notes[i].remove();
+      notes[i].remove();
     }
 }
 cleanUpPopupNotifications();
 
 /*
  * getPopupNotifications
  *
  * Fetches the popup notification for the specified window.
--- a/toolkit/components/passwordmgr/test/pwmgr_common.js
+++ b/toolkit/components/passwordmgr/test/pwmgr_common.js
@@ -473,17 +473,17 @@ if (this.addMessageListener) {
       // Cleanup PopupNotifications (if on a relevant platform)
       let chromeWin = Services.wm.getMostRecentWindow("navigator:browser");
       if (chromeWin && chromeWin.PopupNotifications) {
         let notes = chromeWin.PopupNotifications._currentNotifications;
         if (notes.length > 0) {
           dump("Removing " + notes.length + " popup notifications.\n");
         }
         for (let note of notes) {
-	  note.remove();
+          note.remove();
         }
       }
     });
   });
 
 
   let { LoginHelper } = SpecialPowers.Cu.import("resource://gre/modules/LoginHelper.jsm", {});
   /**
--- a/toolkit/components/passwordmgr/test/test_prompt_async.html
+++ b/toolkit/components/passwordmgr/test/test_prompt_async.html
@@ -121,58 +121,58 @@
             var authMgr = SpecialPowers.Cc["@mozilla.org/network/http-auth-manager;1"]
                                        .getService(Ci.nsIHttpAuthManager);
             authMgr.clearAll();
 
             monitor.shutdown();
             SimpleTest.finish();
         }
 
-	var resolveCallback = SpecialPowers.wrapCallbackObject({
-	QueryInterface(iid) {
-	const interfaces = [Ci.nsIProtocolProxyCallback, Ci.nsISupports];
+        var resolveCallback = SpecialPowers.wrapCallbackObject({
+        QueryInterface(iid) {
+        const interfaces = [Ci.nsIProtocolProxyCallback, Ci.nsISupports];
 
         if (!interfaces.some( function(v) { return iid.equals(v); } ))
           throw SpecialPowers.Cr.NS_ERROR_NO_INTERFACE;
-	  return this;
-	},
+          return this;
+        },
 
-	onProxyAvailable(req, uri, pi, status) {
+        onProxyAvailable(req, uri, pi, status) {
           initLogins(pi);
           doTest(testNum);
-	}
-	});
+        }
+        });
 
-	function startup() {
+        function startup() {
             // Need to allow for arbitrary network servers defined in PAC instead of a hardcoded moz-proxy.
             var channel = NetUtil.newChannel({
                 uri: "http://example.com",
                 loadUsingSystemPrincipal: true
             });
 
             var pps = SpecialPowers.Cc["@mozilla.org/network/protocol-proxy-service;1"]
                                    .getService();
 
             pps.asyncResolve(channel, 0, resolveCallback);
-	}
+        }
 
         // --------------- Test loop spin ----------------
         var testNum = 1;
         var iframe1;
         var iframe2a;
         var iframe2b;
         window.onload = function() {
             iframe1 = document.getElementById("iframe1");
             iframe2a = document.getElementById("iframe2a");
             iframe2b = document.getElementById("iframe2b");
             iframe1.onload = onFrameLoad;
             iframe2a.onload = onFrameLoad;
             iframe2b.onload = onFrameLoad;
 
-	    startup();
+            startup();
         };
 
         var expectedLoads;
         var expectedDialogs;
         function onFrameLoad()
         {
             if (--expectedLoads == 0) {
                 // All pages expected to load has loaded, continue with the next test
--- a/toolkit/components/passwordmgr/test/unit/test_getPasswordFields.js
+++ b/toolkit/components/passwordmgr/test/unit/test_getPasswordFields.js
@@ -73,21 +73,23 @@ const TESTCASES = [
     description: "2 password fields outside of a <form> with 1 linked via @form + skipEmpty",
     document: `<input id="pw1" type=password><input id="pw2" type=password form="form1">
       <form id="form1"></form>`,
     returnedFieldIDsByFormLike: [[], []],
     skipEmptyFields: true,
   },
   {
     description: "skipEmptyFields should also skip white-space only fields",
+    /* eslint-disable no-tabs */
     document: `<input id="pw-space" type=password value=" ">
                <input id="pw-tab" type=password value="	">
                <input id="pw-newline" type=password form="form1" value="
 ">
       <form id="form1"></form>`,
+    /* eslint-disable no-tabs */
     returnedFieldIDsByFormLike: [[], []],
     skipEmptyFields: true,
   },
   {
     description: "2 password fields outside of a <form> with 1 linked via @form + skipEmpty with 1 empty",
     document: `<input id="pw1" type=password value=" pass1 "><input id="pw2" type=password form="form1">
       <form id="form1"></form>`,
     returnedFieldIDsByFormLike: [["pw1"], []],
--- a/toolkit/components/printing/content/printProgress.js
+++ b/toolkit/components/printing/content/printProgress.js
@@ -126,17 +126,17 @@ var progressListener = {
       } else {
         // Progress meter should be barber-pole in this case.
         dialog.progress.setAttribute( "mode", "undetermined" );
         // Update percentage label on progress meter.
         dialog.progressText.setAttribute("value", "");
       }
     },
 
-	  onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
+    onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
       // we can ignore this notification
     },
 
     onStatusChange(aWebProgress, aRequest, aStatus, aMessage) {
       if (aMessage != "")
         dialog.title.setAttribute("value", aMessage);
     },
 
--- a/toolkit/components/prompts/src/nsPrompter.js
+++ b/toolkit/components/prompts/src/nsPrompter.js
@@ -423,17 +423,17 @@ function openTabPrompt(domWin, tabPrompt
         args.promptActive = true;
 
         newPrompt = tabPrompt.appendPrompt(args, onPromptClose);
 
         // TODO since we don't actually open a window, need to check if
         // there's other stuff in nsWindowWatcher::OpenWindowInternal
         // that we might need to do here as well.
 
-	Services.tm.spinEventLoopUntil(() => !args.promptActive);
+        Services.tm.spinEventLoopUntil(() => !args.promptActive);
         delete args.promptActive;
 
         if (args.promptAborted)
             throw Components.Exception("prompt aborted by user", Cr.NS_ERROR_NOT_AVAILABLE);
     } finally {
         // If the prompt unexpectedly failed to invoke the callback, do so here.
         if (!callbackInvoked)
             onPromptClose(true);
--- a/toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js
@@ -516,17 +516,17 @@ function checkSystemSection(data) {
   for (let f of EXPECTED_FIELDS) {
     Assert.ok(f in data.system, f + " must be available.");
   }
 
   Assert.ok(Number.isFinite(data.system.memoryMB), "MemoryMB must be a number.");
 
   if (gIsWindows || gIsMac || gIsLinux) {
     let EXTRA_CPU_FIELDS = ["cores", "model", "family", "stepping",
-			    "l2cacheKB", "l3cacheKB", "speedMHz", "vendor"];
+                            "l2cacheKB", "l3cacheKB", "speedMHz", "vendor"];
 
     for (let f of EXTRA_CPU_FIELDS) {
       // Note this is testing TelemetryEnvironment.js only, not that the
       // values are valid - null is the fallback.
       Assert.ok(f in data.system.cpu, f + " must be available under cpu.");
     }
 
     if (gIsWindows) {
@@ -534,28 +534,28 @@ function checkSystemSection(data) {
              "isWow64 must be available on Windows and have the correct type.");
       Assert.ok("virtualMaxMB" in data.system, "virtualMaxMB must be available.");
       Assert.ok(Number.isFinite(data.system.virtualMaxMB),
                 "virtualMaxMB must be a number.");
     }
 
     // We insist these are available
     for (let f of ["cores"]) {
-	Assert.ok(!(f in data.system.cpu) ||
-		  Number.isFinite(data.system.cpu[f]),
-		  f + " must be a number if non null.");
+      Assert.ok(!(f in data.system.cpu) ||
+                Number.isFinite(data.system.cpu[f]),
+                f + " must be a number if non null.");
     }
 
     // These should be numbers if they are not null
     for (let f of ["model", "family", "stepping", "l2cacheKB",
-		   "l3cacheKB", "speedMHz"]) {
-	Assert.ok(!(f in data.system.cpu) ||
-		  data.system.cpu[f] === null ||
-		  Number.isFinite(data.system.cpu[f]),
-		  f + " must be a number if non null.");
+                   "l3cacheKB", "speedMHz"]) {
+      Assert.ok(!(f in data.system.cpu) ||
+                data.system.cpu[f] === null ||
+                Number.isFinite(data.system.cpu[f]),
+                f + " must be a number if non null.");
     }
   }
 
   let cpuData = data.system.cpu;
   Assert.ok(Number.isFinite(cpuData.count), "CPU count must be a number.");
   Assert.ok(Array.isArray(cpuData.extensions), "CPU extensions must be available.");
 
   // Device data is only available on Android.
@@ -932,17 +932,17 @@ add_task(async function test_prefWatchPo
 
   Assert.equal(userPrefs[PREF_TEST_1], expectedValue,
                "Environment contains the correct preference value.");
   Assert.equal(userPrefs[PREF_TEST_2], "<user-set>",
                "Report that the pref was user set but the value is not shown.");
   Assert.ok(!(PREF_TEST_3 in userPrefs),
             "Do not report if preference not user set.");
   Assert.equal(userPrefs[PREF_TEST_5], expectedValue,
-	      "The pref value in the environment data should still be the same");
+               "The pref value in the environment data should still be the same");
 });
 
 add_task(async function test_prefWatch_prefReset() {
   const PREF_TEST = "toolkit.telemetry.test.pref1";
   const PREFS_TO_WATCH = new Map([
     [PREF_TEST, {what: TelemetryEnvironment.RECORD_PREF_STATE}],
   ]);
 
--- a/toolkit/components/telemetry/tests/unit/test_TelemetryLockCount.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryLockCount.js
@@ -13,17 +13,17 @@ const PR_WRONLY = 0x2;
 const PR_CREATE_FILE = 0x8;
 const PR_TRUNCATE = 0x20;
 const RW_OWNER = parseInt("0600", 8);
 
 function write_string_to_file(file, contents) {
   let ostream = Cc["@mozilla.org/network/safe-file-output-stream;1"]
                 .createInstance(Ci.nsIFileOutputStream);
   ostream.init(file, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE,
-	       RW_OWNER, ostream.DEFER_OPEN);
+               RW_OWNER, ostream.DEFER_OPEN);
   ostream.write(contents, contents.length);
   ostream.QueryInterface(Ci.nsISafeOutputStream).finish();
   ostream.close();
 }
 
 function construct_file() {
   let profileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile);
   let file = profileDirectory.clone();
--- a/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js
@@ -442,17 +442,17 @@ function checkPayload(payload, reason, s
   checkScalars(payload.processes);
   checkEvents(payload.processes);
 }
 
 function writeStringToFile(file, contents) {
   let ostream = Cc["@mozilla.org/network/safe-file-output-stream;1"]
                 .createInstance(Ci.nsIFileOutputStream);
   ostream.init(file, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE,
-	       RW_OWNER, ostream.DEFER_OPEN);
+               RW_OWNER, ostream.DEFER_OPEN);
   ostream.write(contents, contents.length);
   ostream.QueryInterface(Ci.nsISafeOutputStream).finish();
   ostream.close();
 }
 
 function write_fake_shutdown_file() {
   let profileDirectory = Services.dirsvc.get("ProfD", Ci.nsIFile);
   let file = profileDirectory.clone();
--- a/toolkit/components/windowcreator/test/test_bug1170334_wbp_xmlstyle.html
+++ b/toolkit/components/windowcreator/test/test_bug1170334_wbp_xmlstyle.html
@@ -42,28 +42,28 @@ iframe.onload = function iframe_onload1(
   // When the document in the iframe is saved, try to load the result.
   wbp.progressListener = {
     onProgressChange() {},
     onLocationChange() {},
     onStatusChange() {},
     onSecurityChange() {},
     onStateChange: function wbp_stateChange(_wbp, _req, state, status) {
       if ((state & Ci.nsIWebProgressListener.STATE_STOP) == 0) {
-	return;
+        return;
       }
       is(status, Cr.NS_OK, "nsWebBrowserPersist status");
       iframe.onload = function iframe_onload2() {
-	let elem = iframe.contentDocument.documentElement;
-	is(elem && elem.tagName, "thing", "document element tag");
-	if (elem && elem.tagName == "parsererror") {
-	  ok(false, "Parser error: " + elem.textContent);
-	}
+        let elem = iframe.contentDocument.documentElement;
+        is(elem && elem.tagName, "thing", "document element tag");
+        if (elem && elem.tagName == "parsererror") {
+          ok(false, "Parser error: " + elem.textContent);
+        }
 
-	cleanUp();
-	SimpleTest.finish();
+        cleanUp();
+        SimpleTest.finish();
       };
       iframe.src = ios.newFileURI(tmpFile).spec;
     }
   };
   wbp.saveDocument(doc, tmpFile, tmpDir, null, 0, 0);
 
   function cleanUp() {
     if (tmpFile.exists()) {
--- a/toolkit/content/aboutUrlClassifier.js
+++ b/toolkit/content/aboutUrlClassifier.js
@@ -128,17 +128,17 @@ var Provider = {
         if (column.id === "col-update") {
           let btn = document.createElement("button");
           btn.id = "update-" + provider;
           btn.addEventListener("click", () => { this.update(provider); });
 
           let str = bundle.GetStringFromName("TriggerUpdate")
           btn.appendChild(document.createTextNode(str));
           td.appendChild(btn);
-	      } else {
+        } else {
           let str = column.id === "col-lastupdateresult" ? STR_NA : "";
           td.appendChild(document.createTextNode(str));
         }
         tr.appendChild(td);
       }
       tbody.appendChild(tr);
     }
   },
--- a/toolkit/forgetaboutsite/ForgetAboutSite.jsm
+++ b/toolkit/forgetaboutsite/ForgetAboutSite.jsm
@@ -144,18 +144,18 @@ this.ForgetAboutSite = {
       promises.push(new Promise((resolve, reject) => {
         try {
           if (hasRootDomain(perm.principal.URI.host, aDomain)) {
             pm.removePermission(perm);
           }
         } catch (ex) {
           // Ignore entry
         } finally {
-	  resolve();
-	}
+          resolve();
+        }
       }));
     }
 
     // Offline Storages
     promises.push((async function() {
       let qms = Cc["@mozilla.org/dom/quota-manager-service;1"].
                 getService(Ci.nsIQuotaManagerService);
       // delete data from both HTTP and HTTPS sites
--- a/toolkit/modules/ClientID.jsm
+++ b/toolkit/modules/ClientID.jsm
@@ -13,17 +13,17 @@ Cu.import("resource://gre/modules/Prefer
 Cu.import("resource://gre/modules/Log.jsm");
 
 const LOGGER_NAME = "Toolkit.Telemetry";
 const LOGGER_PREFIX = "ClientID::";
 
 XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils",
                                   "resource://services-common/utils.js");
 XPCOMUtils.defineLazyModuleGetter(this, "OS",
-				  "resource://gre/modules/osfile.jsm");
+                                  "resource://gre/modules/osfile.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "gDatareportingPath", () => {
   return OS.Path.join(OS.Constants.Path.profileDir, "datareporting");
 });
 
 XPCOMUtils.defineLazyGetter(this, "gStateFilePath", () => {
   return OS.Path.join(gDatareportingPath, "state.json");
 });
--- a/toolkit/modules/sessionstore/FormData.jsm
+++ b/toolkit/modules/sessionstore/FormData.jsm
@@ -5,17 +5,16 @@
 "use strict";
 
 this.EXPORTED_SYMBOLS = ["FormData"];
 
 const Cu = Components.utils;
 const Ci = Components.interfaces;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
 /**
  * Returns whether the given URL very likely has input
  * fields that contain serialized session store data.
  */
 function isRestorationPage(url) {
   return url == "about:sessionrestore" || url == "about:welcomeback";
 }
 
--- a/toolkit/modules/tests/browser/browser_Troubleshoot.js
+++ b/toolkit/modules/tests/browser/browser_Troubleshoot.js
@@ -534,52 +534,52 @@ const SNAPSHOT_SCHEMA = {
         contentSandboxLevel: {
           required: AppConstants.MOZ_CONTENT_SANDBOX,
           type: "number"
         },
         effectiveContentSandboxLevel: {
           required: AppConstants.MOZ_CONTENT_SANDBOX,
           type: "number"
         },
-	syscallLog: {
-	  required: AppConstants.platform == "linux",
-	  type: "array",
-	  items: {
-	    type: "object",
-	    properties: {
-	      index: {
-		required: true,
-		type: "number",
-	      },
-	      pid: {
-		required: true,
-		type: "number",
-	      },
-	      tid: {
-		required: true,
-		type: "number",
-	      },
-	      procType: {
-		required: true,
-		type: "string",
-	      },
-	      syscall: {
-		required: true,
-		type: "number",
-	      },
-	      args: {
-		required: true,
-		type: "array",
-		items: {
-		  type: "string",
-		},
-	      },
-	    },
-	  },
-	},
+        syscallLog: {
+          required: AppConstants.platform == "linux",
+          type: "array",
+          items: {
+            type: "object",
+            properties: {
+              index: {
+                required: true,
+                type: "number",
+              },
+              pid: {
+                required: true,
+                type: "number",
+              },
+              tid: {
+                required: true,
+                type: "number",
+              },
+              procType: {
+                required: true,
+                type: "string",
+              },
+              syscall: {
+                required: true,
+                type: "number",
+              },
+              args: {
+                required: true,
+                type: "array",
+                items: {
+                  type: "string",
+                },
+              },
+            },
+          },
+        },
       },
     },
   },
 };
 
 /**
  * Throws an Error if obj doesn't conform to schema.  That way you get a nice
  * error message and a stack to help you figure out what went wrong, which you
--- a/toolkit/mozapps/extensions/test/xpinstall/bug645699.html
+++ b/toolkit/mozapps/extensions/test/xpinstall/bug645699.html
@@ -7,23 +7,23 @@
 <title>InstallTrigger tests</title>
 <script type="text/javascript">
 /* globals InstallTrigger */
 /* exported startInstall */
 function startInstall() {
   var whiteUrl = "https://example.org/";
 
   try {
-    Object.defineProperty(window, "location", { value: { href: whiteUrl }	});
+    Object.defineProperty(window, "location", { value: { href: whiteUrl } });
     throw new Error("Object.defineProperty(window, 'location', ...) should have thrown");
   } catch (exc) {
     if (!(exc instanceof TypeError))
       throw exc;
   }
-  Object.defineProperty(document, "documentURIObject", { spec: { href: whiteUrl }	});
+  Object.defineProperty(document, "documentURIObject", { spec: { href: whiteUrl } });
 
   InstallTrigger.install({
     "Unsigned XPI": "http://example.com/browser/toolkit/mozapps/extensions/test/xpinstall/amosigned.xpi"
   });
 }
 </script>
 </head>
 <body onload="startInstall()">
--- a/toolkit/mozapps/handling/content/dialog.js
+++ b/toolkit/mozapps/handling/content/dialog.js
@@ -127,17 +127,17 @@ var dialog = {
           // it, and users won't have such records for URLs they don't visit,
           // and users won't visit the handler's URL template, they'll only
           // visit URLs derived from that template (i.e. with %s in the template
           // replaced by the URL of the content being handled).
           elm.setAttribute("image", uri.prePath + "/favicon.ico");
         }
         elm.setAttribute("description", uri.prePath);
       } else if (app instanceof Ci.nsIDBusHandlerApp) {
-	  elm.setAttribute("description", app.method);
+        elm.setAttribute("description", app.method);
       } else
         throw "unknown handler type";
 
       items.insertBefore(elm, this._itemChoose);
       if (preferredHandler && app == preferredHandler)
         this.selectedItem = elm;
     }
 
--- a/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
+++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js
@@ -274,16 +274,19 @@ module.exports = {
     // "no-shadow": "error",
 
     // No declaring variables that hide things like arguments
     "no-shadow-restricted-names": "error",
 
     // Disallow sparse arrays
     "no-sparse-arrays": "error",
 
+    // Disallow tabs.
+    "no-tabs": "error",
+
     // No trailing whitespace
     "no-trailing-spaces": "error",
 
     // No using undeclared variables
     "no-undef": "error",
 
     // Error on newline where a semicolon is needed
     "no-unexpected-multiline": "error",
--- a/tools/profiler/tests/test_enterjit_osr_disabling.js
+++ b/tools/profiler/tests/test_enterjit_osr_disabling.js
@@ -1,21 +1,21 @@
 function run_test() {
     let p = Cc["@mozilla.org/tools/profiler;1"];
     // Just skip the test if the profiler component isn't present.
     if (!p)
-	return;
+      return;
     p = p.getService(Ci.nsIProfiler);
     if (!p)
-	return;
+      return;
 
     do_check_true(!p.IsActive());
 
     p.StartProfiler(100, 10, ["js"], 1);
     // The function is entered with the profiler enabled
     (function() {
-	p.StopProfiler();
-	let n = 10000;
-	while (--n);  // OSR happens here with the profiler disabled.
-	// An assertion will fail when this function returns, if the
-	// profiler stack was misbalanced.
+      p.StopProfiler();
+      let n = 10000;
+      while (--n);  // OSR happens here with the profiler disabled.
+      // An assertion will fail when this function returns, if the
+      // profiler stack was misbalanced.
     })();
 }
--- a/tools/profiler/tests/test_enterjit_osr_enabling.js
+++ b/tools/profiler/tests/test_enterjit_osr_enabling.js
@@ -1,21 +1,21 @@
 function run_test() {
     let p = Cc["@mozilla.org/tools/profiler;1"];
     // Just skip the test if the profiler component isn't present.
     if (!p)
-	return;
+      return;
     p = p.getService(Ci.nsIProfiler);
     if (!p)
-	return;
+      return;
 
     do_check_true(!p.IsActive());
 
     // The function is entered with the profiler disabled.
     (function() {
-	p.StartProfiler(100, 10, ["js"], 1);
-	let n = 10000;
-	while (--n); // OSR happens here with the profiler enabled.
-	// An assertion will fail when this function returns, if the
-	// profiler stack was misbalanced.
+      p.StartProfiler(100, 10, ["js"], 1);
+      let n = 10000;
+      while (--n); // OSR happens here with the profiler enabled.
+      // An assertion will fail when this function returns, if the
+      // profiler stack was misbalanced.
     })();
     p.StopProfiler();
 }