Bug 1374670 - Enabled the ESLint no-tabs rule across mozilla-central r?Standard8 draft
authorRajesh Kathiriya <rajesh.kathiriya507@gmail.com>
Tue, 04 Jul 2017 21:30:18 +0530
changeset 604917 1d717fdc9b08666c931f95281c7041b6e38a1c8e
parent 604916 e6e5a96d8f6b94d440baa0a072a4228487f86d76
child 636333 cf57f9bde1a1a4789a670c56ad2b88d2c1b04510
push id67232
push userbmo:rajesh.kathiriya507@gmail.com
push dateThu, 06 Jul 2017 17:52:53 +0000
reviewersStandard8
bugs1374670
milestone56.0a1
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
@@ -6,19 +6,16 @@
 
 this.EXPORTED_SYMBOLS = ["FormData"];
 
 const Cu = Components.utils;
 const Ci = Components.interfaces;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
-XPCOMUtils.defineLazyModuleGetter(this, "XPathGenerator",
-                                  "resource://gre/modules/XPathGenerator.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();
 }